Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a82b79a7 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

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

parents 83020f31 6e8ffee4
Loading
Loading
Loading
Loading
+68 −0
Original line number Diff line number Diff line
@@ -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
+21 −0
Original line number Diff line number Diff line
@@ -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);
+21 −0
Original line number Diff line number Diff line
@@ -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
+11 −0
Original line number Diff line number Diff line
@@ -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,