Loading msm/sde/sde_kms.c +12 −16 Original line number Diff line number Diff line Loading @@ -49,7 +49,7 @@ #include "sde_reg_dma.h" #include "sde_connector.h" #include <soc/qcom/scm.h> #include <linux/qcom_scm.h> #include "soc/qcom/secure_buffer.h" #include <linux/qtee_shmbridge.h> Loading Loading @@ -273,14 +273,14 @@ static int _sde_kms_secure_ctrl_xin_clients(struct sde_kms *sde_kms, static int _sde_kms_scm_call(struct sde_kms *sde_kms, int vmid) { struct drm_device *dev; struct scm_desc desc = {0}; uint32_t num_sids; uint32_t *sec_sid; uint32_t mem_protect_sd_ctrl_id = MEM_PROTECT_SD_CTRL_SWITCH; struct sde_mdss_cfg *sde_cfg = sde_kms->catalog; int ret = 0, i; struct qtee_shm shm; bool qtee_en = qtee_shmbridge_is_enabled(); phys_addr_t mem_addr; u64 mem_size; dev = sde_kms->dev; Loading @@ -297,21 +297,17 @@ static int _sde_kms_scm_call(struct sde_kms *sde_kms, int vmid) return -ENOMEM; sec_sid = (uint32_t *) shm.vaddr; desc.args[1] = shm.paddr; desc.args[2] = shm.size; mem_addr = shm.paddr; mem_size = shm.size; } else { sec_sid = kcalloc(num_sids, sizeof(uint32_t), GFP_KERNEL); if (!sec_sid) return -ENOMEM; desc.args[1] = SCM_BUFFER_PHYS(sec_sid); desc.args[2] = sizeof(uint32_t) * num_sids; mem_addr = virt_to_phys(sec_sid); mem_size = sizeof(uint32_t) * num_sids; } desc.arginfo = SCM_ARGS(4, SCM_VAL, SCM_RW, SCM_VAL, SCM_VAL); desc.args[0] = MDP_DEVICE_ID; desc.args[3] = vmid; for (i = 0; i < num_sids; i++) { sec_sid[i] = sde_cfg->sec_sid_mask[i]; SDE_DEBUG("sid_mask[%d]: %d\n", i, sec_sid[i]); Loading @@ -322,13 +318,13 @@ static int _sde_kms_scm_call(struct sde_kms *sde_kms, int vmid) SDE_DEBUG("calling scm_call for vmid 0x%x, num_sids %d, qtee_en %d", vmid, num_sids, qtee_en); ret = scm_call2(SCM_SIP_FNID(SCM_SVC_MP, mem_protect_sd_ctrl_id), &desc); ret = qcom_scm_mem_protect_sd_ctrl(MDP_DEVICE_ID, mem_addr, mem_size, vmid); if (ret) SDE_ERROR("Error:scm_call2, vmid %lld, ret%d\n", desc.args[3], ret); SDE_EVT32(mem_protect_sd_ctrl_id, desc.args[0], desc.args[2], desc.args[3], qtee_en, num_sids, ret); vmid, ret); SDE_EVT32(MEM_PROTECT_SD_CTRL_SWITCH, MDP_DEVICE_ID, mem_size, vmid, qtee_en, num_sids, ret); if (qtee_en) qtee_shmbridge_free_shm(&shm); Loading msm/sde_hdcp.h +0 −2 Original line number Diff line number Diff line Loading @@ -6,8 +6,6 @@ #ifndef __SDE_HDCP_H__ #define __SDE_HDCP_H__ #include <soc/qcom/scm.h> #include <linux/types.h> #include <linux/bitops.h> #include <linux/debugfs.h> Loading rotator/sde_rotator_core.c +28 −34 Original line number Diff line number Diff line Loading @@ -15,7 +15,7 @@ #include <linux/debugfs.h> #include <linux/regulator/consumer.h> #include <linux/dma-direction.h> #include <soc/qcom/scm.h> #include <linux/qcom_scm.h> #include <soc/qcom/secure_buffer.h> #include <asm/cacheflush.h> #include <uapi/linux/sched/types.h> Loading Loading @@ -554,17 +554,15 @@ static int sde_rotator_secure_session_ctrl(bool enable) { struct sde_rot_data_type *mdata = sde_rot_get_mdata(); uint32_t *sid_info = NULL; struct scm_desc desc = {0}; unsigned int resp = 0; int ret = 0; phys_addr_t mem_addr; u64 mem_size; u32 vmid; struct qtee_shm shm; bool qtee_en = qtee_shmbridge_is_enabled(); if (test_bit(SDE_CAPS_SEC_ATTACH_DETACH_SMMU, mdata->sde_caps_map)) { desc.arginfo = SCM_ARGS(4, SCM_VAL, SCM_RW, SCM_VAL, SCM_VAL); desc.args[0] = SDE_ROTATOR_DEVICE; if (qtee_en) { ret = qtee_shmbridge_allocate_shm(sizeof(uint32_t), &shm); Loading @@ -572,15 +570,15 @@ static int sde_rotator_secure_session_ctrl(bool enable) return -ENOMEM; sid_info = (uint32_t *) shm.vaddr; desc.args[1] = shm.paddr; desc.args[2] = shm.size; mem_addr = shm.paddr; mem_size = shm.size; } else { sid_info = kzalloc(sizeof(uint32_t), GFP_KERNEL); if (!sid_info) return -ENOMEM; desc.args[1] = SCM_BUFFER_PHYS(sid_info); desc.args[2] = sizeof(uint32_t); mem_addr = virt_to_phys(sid_info); mem_size = sizeof(uint32_t); } sid_info[0] = mdata->sde_smmu[SDE_IOMMU_DOMAIN_ROT_SECURE].sid; Loading @@ -591,18 +589,16 @@ static int sde_rotator_secure_session_ctrl(bool enable) * Send SCM call to hypervisor to switch the * secure_vmid to secure context */ desc.args[3] = VMID_CP_CAMERA_PREVIEW; vmid = VMID_CP_CAMERA_PREVIEW; mdata->sec_cam_en = 1; sde_smmu_secure_ctrl(0); dmac_flush_range(sid_info, sid_info + 1); ret = scm_call2(SCM_SIP_FNID(SCM_SVC_MP, MEM_PROTECT_SD_CTRL_SWITCH), &desc); resp = desc.ret[0]; ret = qcom_scm_mem_protect_sd_ctrl(SDE_ROTATOR_DEVICE, mem_addr, mem_size, vmid); if (ret) { SDEROT_ERR("scm_call(1) ret=%d, resp=%x\n", ret, resp); SDEROT_ERR("qcom_scm_mem_protect ret=%d\n", ret); /* failure, attach smmu */ mdata->sec_cam_en = 0; sde_smmu_secure_ctrl(1); Loading @@ -611,35 +607,36 @@ static int sde_rotator_secure_session_ctrl(bool enable) } SDEROT_DBG( "scm(1) sid0x%x dev0x%llx vmid0x%llx qtee_en%d ret%d resp%x\n", sid_info[0], desc.args[0], desc.args[3], qtee_en, ret, resp); SDEROT_EVTLOG(1, sid_info, sid_info[0], desc.args[0], desc.args[3], qtee_en, ret, resp); "scm(1) sid0x%x dev0x%llx vmid0x%llx qtee_en%d ret%d\n", sid_info[0], SDE_ROTATOR_DEVICE, vmid, qtee_en, ret); SDEROT_EVTLOG(1, sid_info, sid_info[0], SDE_ROTATOR_DEVICE, vmid, qtee_en, ret); } else if (mdata->sec_cam_en && !enable) { /* * Disable secure camera operation * Send SCM call to hypervisor to switch the * secure_vmid to non-secure context */ desc.args[3] = VMID_CP_PIXEL; vmid = VMID_CP_PIXEL; mdata->sec_cam_en = 0; dmac_flush_range(sid_info, sid_info + 1); ret = scm_call2(SCM_SIP_FNID(SCM_SVC_MP, MEM_PROTECT_SD_CTRL_SWITCH), &desc); resp = desc.ret[0]; ret = qcom_scm_mem_protect_sd_ctrl(SDE_ROTATOR_DEVICE, mem_addr, mem_size, vmid); if (ret) SDEROT_ERR("qcom_scm_mem_protect ret=%d\n", ret); SDEROT_DBG( "scm(0) sid0x%x dev0x%llx vmid0x%llx qtee_en%d ret%d resp%d\n", sid_info[0], desc.args[0], desc.args[3], qtee_en, ret, resp); "scm(0) sid0x%x dev0x%llx vmid0x%llx qtee_en%d ret%d\n", sid_info[0], SDE_ROTATOR_DEVICE, vmid, qtee_en, ret); /* force smmu to reattach */ sde_smmu_secure_ctrl(1); SDEROT_EVTLOG(0, sid_info, sid_info[0], desc.args[0], desc.args[3], qtee_en, ret, resp); SDEROT_EVTLOG(0, sid_info, sid_info[0], SDE_ROTATOR_DEVICE, vmid, qtee_en, ret); } } else { return 0; Loading @@ -651,10 +648,7 @@ static int sde_rotator_secure_session_ctrl(bool enable) else kfree(sid_info); if (ret) return ret; return resp; } Loading Loading
msm/sde/sde_kms.c +12 −16 Original line number Diff line number Diff line Loading @@ -49,7 +49,7 @@ #include "sde_reg_dma.h" #include "sde_connector.h" #include <soc/qcom/scm.h> #include <linux/qcom_scm.h> #include "soc/qcom/secure_buffer.h" #include <linux/qtee_shmbridge.h> Loading Loading @@ -273,14 +273,14 @@ static int _sde_kms_secure_ctrl_xin_clients(struct sde_kms *sde_kms, static int _sde_kms_scm_call(struct sde_kms *sde_kms, int vmid) { struct drm_device *dev; struct scm_desc desc = {0}; uint32_t num_sids; uint32_t *sec_sid; uint32_t mem_protect_sd_ctrl_id = MEM_PROTECT_SD_CTRL_SWITCH; struct sde_mdss_cfg *sde_cfg = sde_kms->catalog; int ret = 0, i; struct qtee_shm shm; bool qtee_en = qtee_shmbridge_is_enabled(); phys_addr_t mem_addr; u64 mem_size; dev = sde_kms->dev; Loading @@ -297,21 +297,17 @@ static int _sde_kms_scm_call(struct sde_kms *sde_kms, int vmid) return -ENOMEM; sec_sid = (uint32_t *) shm.vaddr; desc.args[1] = shm.paddr; desc.args[2] = shm.size; mem_addr = shm.paddr; mem_size = shm.size; } else { sec_sid = kcalloc(num_sids, sizeof(uint32_t), GFP_KERNEL); if (!sec_sid) return -ENOMEM; desc.args[1] = SCM_BUFFER_PHYS(sec_sid); desc.args[2] = sizeof(uint32_t) * num_sids; mem_addr = virt_to_phys(sec_sid); mem_size = sizeof(uint32_t) * num_sids; } desc.arginfo = SCM_ARGS(4, SCM_VAL, SCM_RW, SCM_VAL, SCM_VAL); desc.args[0] = MDP_DEVICE_ID; desc.args[3] = vmid; for (i = 0; i < num_sids; i++) { sec_sid[i] = sde_cfg->sec_sid_mask[i]; SDE_DEBUG("sid_mask[%d]: %d\n", i, sec_sid[i]); Loading @@ -322,13 +318,13 @@ static int _sde_kms_scm_call(struct sde_kms *sde_kms, int vmid) SDE_DEBUG("calling scm_call for vmid 0x%x, num_sids %d, qtee_en %d", vmid, num_sids, qtee_en); ret = scm_call2(SCM_SIP_FNID(SCM_SVC_MP, mem_protect_sd_ctrl_id), &desc); ret = qcom_scm_mem_protect_sd_ctrl(MDP_DEVICE_ID, mem_addr, mem_size, vmid); if (ret) SDE_ERROR("Error:scm_call2, vmid %lld, ret%d\n", desc.args[3], ret); SDE_EVT32(mem_protect_sd_ctrl_id, desc.args[0], desc.args[2], desc.args[3], qtee_en, num_sids, ret); vmid, ret); SDE_EVT32(MEM_PROTECT_SD_CTRL_SWITCH, MDP_DEVICE_ID, mem_size, vmid, qtee_en, num_sids, ret); if (qtee_en) qtee_shmbridge_free_shm(&shm); Loading
msm/sde_hdcp.h +0 −2 Original line number Diff line number Diff line Loading @@ -6,8 +6,6 @@ #ifndef __SDE_HDCP_H__ #define __SDE_HDCP_H__ #include <soc/qcom/scm.h> #include <linux/types.h> #include <linux/bitops.h> #include <linux/debugfs.h> Loading
rotator/sde_rotator_core.c +28 −34 Original line number Diff line number Diff line Loading @@ -15,7 +15,7 @@ #include <linux/debugfs.h> #include <linux/regulator/consumer.h> #include <linux/dma-direction.h> #include <soc/qcom/scm.h> #include <linux/qcom_scm.h> #include <soc/qcom/secure_buffer.h> #include <asm/cacheflush.h> #include <uapi/linux/sched/types.h> Loading Loading @@ -554,17 +554,15 @@ static int sde_rotator_secure_session_ctrl(bool enable) { struct sde_rot_data_type *mdata = sde_rot_get_mdata(); uint32_t *sid_info = NULL; struct scm_desc desc = {0}; unsigned int resp = 0; int ret = 0; phys_addr_t mem_addr; u64 mem_size; u32 vmid; struct qtee_shm shm; bool qtee_en = qtee_shmbridge_is_enabled(); if (test_bit(SDE_CAPS_SEC_ATTACH_DETACH_SMMU, mdata->sde_caps_map)) { desc.arginfo = SCM_ARGS(4, SCM_VAL, SCM_RW, SCM_VAL, SCM_VAL); desc.args[0] = SDE_ROTATOR_DEVICE; if (qtee_en) { ret = qtee_shmbridge_allocate_shm(sizeof(uint32_t), &shm); Loading @@ -572,15 +570,15 @@ static int sde_rotator_secure_session_ctrl(bool enable) return -ENOMEM; sid_info = (uint32_t *) shm.vaddr; desc.args[1] = shm.paddr; desc.args[2] = shm.size; mem_addr = shm.paddr; mem_size = shm.size; } else { sid_info = kzalloc(sizeof(uint32_t), GFP_KERNEL); if (!sid_info) return -ENOMEM; desc.args[1] = SCM_BUFFER_PHYS(sid_info); desc.args[2] = sizeof(uint32_t); mem_addr = virt_to_phys(sid_info); mem_size = sizeof(uint32_t); } sid_info[0] = mdata->sde_smmu[SDE_IOMMU_DOMAIN_ROT_SECURE].sid; Loading @@ -591,18 +589,16 @@ static int sde_rotator_secure_session_ctrl(bool enable) * Send SCM call to hypervisor to switch the * secure_vmid to secure context */ desc.args[3] = VMID_CP_CAMERA_PREVIEW; vmid = VMID_CP_CAMERA_PREVIEW; mdata->sec_cam_en = 1; sde_smmu_secure_ctrl(0); dmac_flush_range(sid_info, sid_info + 1); ret = scm_call2(SCM_SIP_FNID(SCM_SVC_MP, MEM_PROTECT_SD_CTRL_SWITCH), &desc); resp = desc.ret[0]; ret = qcom_scm_mem_protect_sd_ctrl(SDE_ROTATOR_DEVICE, mem_addr, mem_size, vmid); if (ret) { SDEROT_ERR("scm_call(1) ret=%d, resp=%x\n", ret, resp); SDEROT_ERR("qcom_scm_mem_protect ret=%d\n", ret); /* failure, attach smmu */ mdata->sec_cam_en = 0; sde_smmu_secure_ctrl(1); Loading @@ -611,35 +607,36 @@ static int sde_rotator_secure_session_ctrl(bool enable) } SDEROT_DBG( "scm(1) sid0x%x dev0x%llx vmid0x%llx qtee_en%d ret%d resp%x\n", sid_info[0], desc.args[0], desc.args[3], qtee_en, ret, resp); SDEROT_EVTLOG(1, sid_info, sid_info[0], desc.args[0], desc.args[3], qtee_en, ret, resp); "scm(1) sid0x%x dev0x%llx vmid0x%llx qtee_en%d ret%d\n", sid_info[0], SDE_ROTATOR_DEVICE, vmid, qtee_en, ret); SDEROT_EVTLOG(1, sid_info, sid_info[0], SDE_ROTATOR_DEVICE, vmid, qtee_en, ret); } else if (mdata->sec_cam_en && !enable) { /* * Disable secure camera operation * Send SCM call to hypervisor to switch the * secure_vmid to non-secure context */ desc.args[3] = VMID_CP_PIXEL; vmid = VMID_CP_PIXEL; mdata->sec_cam_en = 0; dmac_flush_range(sid_info, sid_info + 1); ret = scm_call2(SCM_SIP_FNID(SCM_SVC_MP, MEM_PROTECT_SD_CTRL_SWITCH), &desc); resp = desc.ret[0]; ret = qcom_scm_mem_protect_sd_ctrl(SDE_ROTATOR_DEVICE, mem_addr, mem_size, vmid); if (ret) SDEROT_ERR("qcom_scm_mem_protect ret=%d\n", ret); SDEROT_DBG( "scm(0) sid0x%x dev0x%llx vmid0x%llx qtee_en%d ret%d resp%d\n", sid_info[0], desc.args[0], desc.args[3], qtee_en, ret, resp); "scm(0) sid0x%x dev0x%llx vmid0x%llx qtee_en%d ret%d\n", sid_info[0], SDE_ROTATOR_DEVICE, vmid, qtee_en, ret); /* force smmu to reattach */ sde_smmu_secure_ctrl(1); SDEROT_EVTLOG(0, sid_info, sid_info[0], desc.args[0], desc.args[3], qtee_en, ret, resp); SDEROT_EVTLOG(0, sid_info, sid_info[0], SDE_ROTATOR_DEVICE, vmid, qtee_en, ret); } } else { return 0; Loading @@ -651,10 +648,7 @@ static int sde_rotator_secure_session_ctrl(bool enable) else kfree(sid_info); if (ret) return ret; return resp; } Loading