In order to be able to update the SMMU registers from CP for page table updates we need to configure the LPAC aperture to include the context bank that will be associated with SID 1.
Signed-off-by: Anna Maniscalco <[email protected]> --- drivers/firmware/qcom/qcom_scm.c | 18 ++++++++++++++++++ drivers/gpu/drm/msm/adreno/adreno_gpu.c | 3 +++ include/linux/firmware/qcom/qcom_scm.h | 1 + 3 files changed, 22 insertions(+) diff --git a/drivers/firmware/qcom/qcom_scm.c b/drivers/firmware/qcom/qcom_scm.c index 9b06a69d3a6d..92093399f20d 100644 --- a/drivers/firmware/qcom/qcom_scm.c +++ b/drivers/firmware/qcom/qcom_scm.c @@ -1204,6 +1204,7 @@ int qcom_scm_restore_sec_cfg(u32 device_id, u32 spare) EXPORT_SYMBOL_GPL(qcom_scm_restore_sec_cfg); #define QCOM_SCM_CP_APERTURE_CONTEXT_MASK GENMASK(7, 0) +#define QCOM_SCM_LPAC_APERTURE_CONTEXT_MASK GENMASK(7, 1) bool qcom_scm_set_gpu_smmu_aperture_is_available(void) { @@ -1229,6 +1230,23 @@ int qcom_scm_set_gpu_smmu_aperture(unsigned int context_bank) } EXPORT_SYMBOL_GPL(qcom_scm_set_gpu_smmu_aperture); +int qcom_scm_set_gpu_smmu_lpac_aperture(unsigned int context_bank) +{ + struct qcom_scm_desc desc = { + .svc = QCOM_SCM_SVC_MP, + .cmd = QCOM_SCM_MP_CP_SMMU_APERTURE_ID, + .arginfo = QCOM_SCM_ARGS(4), + .args[0] = 0xffff0000 | (1 << 8 | context_bank), + .args[1] = 0xffffffff, + .args[2] = 0xffffffff, + .args[3] = 0xffffffff, + .owner = ARM_SMCCC_OWNER_SIP + }; + + return qcom_scm_call(__scm->dev, &desc, NULL); +} +EXPORT_SYMBOL_GPL(qcom_scm_set_gpu_smmu_lpac_aperture); + int qcom_scm_iommu_secure_ptbl_size(u32 spare, size_t *size) { struct qcom_scm_desc desc = { diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c index 71ce4cbbf27a..be374cf209f4 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c @@ -668,6 +668,9 @@ int adreno_hw_init(struct msm_gpu *gpu) ret = qcom_scm_set_gpu_smmu_aperture(0); if (ret) DRM_DEV_ERROR(gpu->dev->dev, "unable to set SMMU aperture: %d\n", ret); + ret = qcom_scm_set_gpu_smmu_lpac_aperture(1); + if (ret) + DRM_DEV_ERROR(gpu->dev->dev, "unable to set lpac SMMU aperture: %d\n", ret); } for (int i = 0; i < gpu->nr_rings; i++) { diff --git a/include/linux/firmware/qcom/qcom_scm.h b/include/linux/firmware/qcom/qcom_scm.h index 5747bd191bf1..70fb93e303e2 100644 --- a/include/linux/firmware/qcom/qcom_scm.h +++ b/include/linux/firmware/qcom/qcom_scm.h @@ -100,6 +100,7 @@ int qcom_scm_io_writel(phys_addr_t addr, unsigned int val); bool qcom_scm_restore_sec_cfg_available(void); int qcom_scm_restore_sec_cfg(u32 device_id, u32 spare); int qcom_scm_set_gpu_smmu_aperture(unsigned int context_bank); +int qcom_scm_set_gpu_smmu_lpac_aperture(unsigned int context_bank); bool qcom_scm_set_gpu_smmu_aperture_is_available(void); int qcom_scm_iommu_secure_ptbl_size(u32 spare, size_t *size); int qcom_scm_iommu_secure_ptbl_init(u64 addr, u32 size, u32 spare); -- 2.54.0
