drivers: scm: Add SCM call interface for SMMU-v3

Implement SCM calls interface to communicate with a
backend smmu-v3 driver.

This is the snapshot of SCM call interface for SMMU-v3 support from
msm-5.15 branch.
commit 1e05f5702 ("drivers: scm: Add SCM call interface for SMMU-v3").

Change-Id: I052465e67cc23ecdcbeace88e67a24f5e5dc134e
Signed-off-by: Singa Reddy Dasari <quic_singredd@quicinc.com>
This commit is contained in:
Singa Reddy Dasari 2023-09-28 15:17:12 +05:30
parent 80375855c2
commit db0a3c1b47
3 changed files with 108 additions and 0 deletions

View File

@ -1088,6 +1088,98 @@ void qcom_scm_deassert_ps_hold(void)
}
EXPORT_SYMBOL(qcom_scm_deassert_ps_hold);
static int __qcom_scm_paravirt_smmu_attach(struct device *dev, u64 sid,
u64 asid, u64 ste_pa, u64 ste_size,
u64 cd_pa, u64 cd_size)
{
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_SMMU_PROGRAM,
.cmd = ARM_SMMU_PARAVIRT_CMD,
.owner = ARM_SMCCC_OWNER_SIP,
};
int ret;
struct qcom_scm_res res;
desc.args[0] = SMMU_PARAVIRT_OP_ATTACH;
desc.args[1] = sid;
desc.args[2] = asid;
desc.args[3] = 0;
desc.args[4] = ste_pa;
desc.args[5] = ste_size;
desc.args[6] = cd_pa;
desc.args[7] = cd_size;
desc.arginfo = ARM_SMMU_PARAVIRT_DESCARG;
ret = qcom_scm_call(dev, &desc, &res);
return ret ? : res.result[0];
}
static int __qcom_scm_paravirt_tlb_inv(struct device *dev, u64 asid, u64 sid)
{
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_SMMU_PROGRAM,
.cmd = ARM_SMMU_PARAVIRT_CMD,
.owner = ARM_SMCCC_OWNER_SIP,
};
int ret;
struct qcom_scm_res res;
desc.args[0] = SMMU_PARAVIRT_OP_INVAL_ASID;
desc.args[1] = sid;
desc.args[2] = asid;
desc.args[3] = 0;
desc.args[4] = 0;
desc.args[5] = 0;
desc.args[6] = 0;
desc.args[7] = 0;
desc.arginfo = ARM_SMMU_PARAVIRT_DESCARG;
ret = qcom_scm_call_atomic(dev, &desc, &res);
return ret ? : res.result[0];
}
static int __qcom_scm_paravirt_smmu_detach(struct device *dev, u64 sid)
{
struct qcom_scm_desc desc = {
.svc = QCOM_SCM_SVC_SMMU_PROGRAM,
.cmd = ARM_SMMU_PARAVIRT_CMD,
.owner = ARM_SMCCC_OWNER_SIP,
};
int ret;
struct qcom_scm_res res;
desc.args[0] = SMMU_PARAVIRT_OP_DETACH;
desc.args[1] = sid;
desc.args[2] = 0;
desc.args[3] = 0;
desc.args[4] = 0;
desc.args[5] = 0;
desc.args[6] = 0;
desc.args[7] = 0;
desc.arginfo = ARM_SMMU_PARAVIRT_DESCARG;
ret = qcom_scm_call(dev, &desc, &res);
return ret ? : res.result[0];
}
int qcom_scm_paravirt_smmu_attach(u64 sid, u64 asid,
u64 ste_pa, u64 ste_size, u64 cd_pa,
u64 cd_size)
{
return __qcom_scm_paravirt_smmu_attach(__scm ? __scm->dev : NULL, sid, asid,
ste_pa, ste_size, cd_pa, cd_size);
}
EXPORT_SYMBOL_GPL(qcom_scm_paravirt_smmu_attach);
int qcom_scm_paravirt_tlb_inv(u64 asid, u64 sid)
{
return __qcom_scm_paravirt_tlb_inv(__scm ? __scm->dev : NULL, asid, sid);
}
EXPORT_SYMBOL_GPL(qcom_scm_paravirt_tlb_inv);
int qcom_scm_paravirt_smmu_detach(u64 sid)
{
return __qcom_scm_paravirt_smmu_detach(__scm ? __scm->dev : NULL, sid);
}
EXPORT_SYMBOL_GPL(qcom_scm_paravirt_smmu_detach);
void qcom_scm_mmu_sync(bool sync)
{
int ret;

View File

@ -42,6 +42,17 @@ enum qcom_scm_arg_types {
#define QCOM_SCM_ARGS(...) QCOM_SCM_ARGS_IMPL(__VA_ARGS__, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
/*SMMU Paravirt driver*/
#define SMMU_PARAVIRT_OP_ATTACH 0
#define SMMU_PARAVIRT_OP_DETACH 1
#define SMMU_PARAVIRT_OP_INVAL_ASID 2
#define SMMU_PARAVIRT_OP_INVAL_VA 3
#define SMMU_PARAVIRT_OP_ALL_S1_BYPASS 4
#define SMMU_PARAVIRT_OP_CFGI_CD_ALL 5
#define SMMU_PARAVIRT_OP_TLBI_NH_ALL 6
#define ARM_SMMU_PARAVIRT_CMD 0x6
#define ARM_SMMU_PARAVIRT_DESCARG 0x22200a
/**
* struct qcom_scm_desc

View File

@ -193,6 +193,11 @@ extern int qcom_scm_iommu_secure_map(phys_addr_t sg_list_addr, size_t num_sg,
unsigned long iova, size_t total_len);
extern int qcom_scm_iommu_secure_unmap(u64 sec_id, int cbndx,
unsigned long iova, size_t total_len);
extern int qcom_scm_paravirt_smmu_attach(u64 sid, u64 asid, u64 ste_pa,
u64 ste_size, u64 cd_pa, u64 cd_size);
extern int qcom_scm_paravirt_tlb_inv(u64 asid, u64 sid);
extern int qcom_scm_paravirt_smmu_detach(u64 sid);
extern int
qcom_scm_assign_mem_regions(struct qcom_scm_mem_map_info *mem_regions,
size_t mem_regions_sz, u32 *srcvms, size_t src_sz,