mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-07 12:25:00 -04:00
drivers: scm: Add SCM call interface for SMMU-v3
Implement SCM calls interface to communicate with a backend smmu-v3 driver in order to attach/detach a smmu client and invalidate a tlb entry. Change-Id: Ia7393e930161c9487aba93554465df407ca4fb3c Signed-off-by: Vivek Kumar <vivekuma@codeaurora.org>
This commit is contained in:
parent
eb6b3094be
commit
6e8ffee45b
4 changed files with 121 additions and 0 deletions
|
|
@ -2446,6 +2446,74 @@ int __qcom_scm_qseecom_do(struct device *dev, u32 cmd_id, struct scm_desc *desc,
|
|||
return _ret;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
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);
|
||||
return ret ? : desc.res[0];
|
||||
}
|
||||
|
||||
int __qcom_scm_paravirt_tlb_inv(struct device *dev, u64 asid)
|
||||
{
|
||||
struct qcom_scm_desc desc = {
|
||||
.svc = QCOM_SCM_SVC_SMMU_PROGRAM,
|
||||
.cmd = ARM_SMMU_PARAVIRT_CMD,
|
||||
.owner = ARM_SMCCC_OWNER_SIP,
|
||||
};
|
||||
int ret;
|
||||
|
||||
desc.args[0] = SMMU_PARAVIRT_OP_INVAL_ASID;
|
||||
desc.args[1] = 0;
|
||||
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);
|
||||
return ret ? : desc.res[0];
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
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);
|
||||
return ret ? : desc.res[0];
|
||||
}
|
||||
|
||||
#ifdef CONFIG_QCOM_RTIC
|
||||
|
||||
#define TZ_RTIC_ENABLE_MEM_PROTECTION 0x4
|
||||
|
|
|
|||
|
|
@ -475,6 +475,27 @@ void qcom_scm_deassert_ps_hold(void)
|
|||
}
|
||||
EXPORT_SYMBOL(qcom_scm_deassert_ps_hold);
|
||||
|
||||
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(qcom_scm_paravirt_smmu_attach);
|
||||
|
||||
int qcom_scm_paravirt_tlb_inv(u64 asid)
|
||||
{
|
||||
return __qcom_scm_paravirt_tlb_inv(__scm ? __scm->dev : NULL, asid);
|
||||
}
|
||||
EXPORT_SYMBOL(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(qcom_scm_paravirt_smmu_detach);
|
||||
|
||||
void qcom_scm_mmu_sync(bool sync)
|
||||
{
|
||||
__qcom_scm_mmu_sync(__scm ? __scm->dev : NULL, sync);
|
||||
|
|
|
|||
|
|
@ -241,6 +241,27 @@ extern int __qcom_scm_qseecom_do(struct device *dev, u32 cmd_id,
|
|||
#define QCOM_SCM_TSENS_INIT_ID 0x5
|
||||
extern int __qcom_scm_tsens_reinit(struct device *dev, int *tsens_ret);
|
||||
|
||||
//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
|
||||
|
||||
extern 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);
|
||||
|
||||
extern int __qcom_scm_paravirt_tlb_inv(struct device *dev, u64 asid);
|
||||
|
||||
extern int __qcom_scm_paravirt_smmu_detach(struct device *dev,
|
||||
u64 sid);
|
||||
|
||||
// OEM Services and Function IDs
|
||||
#define QCOM_SCM_SVC_OEM_POWER 0x09
|
||||
#define QCOM_SCM_OEM_POWER_REBOOT 0x22
|
||||
|
|
|
|||
|
|
@ -126,6 +126,10 @@ 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);
|
||||
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,
|
||||
|
|
@ -283,6 +287,13 @@ static inline int qcom_scm_iommu_secure_map(phys_addr_t sg_list_addr,
|
|||
unsigned long iova, size_t total_len) { return -ENODEV; }
|
||||
static inline int qcom_scm_iommu_secure_unmap(u64 sec_id, int cbndx,
|
||||
unsigned long iova, size_t total_len) { return -ENODEV; }
|
||||
static inline int qcom_scm_paravirt_smmu_attach(u64 sid, u64 asid, u64 ste_pa,
|
||||
u64 ste_size, u64 cd_pa, u64 cd_size)
|
||||
{ return -ENODEV; }
|
||||
static inline int qcom_scm_paravirt_tlb_inv(u64 asid)
|
||||
{ return -ENODEV; }
|
||||
static inline int qcom_scm_paravirt_smmu_detach(u64 sid)
|
||||
{ return -ENODEV; }
|
||||
static inline 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,
|
||||
|
|
|
|||
Loading…
Reference in a new issue