Loading drivers/media/platform/msm/sde/rotator/sde_rotator_core.c +23 −12 Original line number Diff line number Diff line Loading @@ -584,17 +584,21 @@ static int sde_rotator_import_buffer(struct sde_layer_buffer *buffer, static int sde_rotator_secure_session_ctrl(bool enable) { struct sde_rot_data_type *mdata = sde_rot_get_mdata(); uint32_t sid_info; uint32_t *sid_info = NULL; struct scm_desc desc = {0}; unsigned int resp = 0; int ret = 0; if (test_bit(SDE_CAPS_SEC_ATTACH_DETACH_SMMU, mdata->sde_caps_map)) { sid_info = mdata->sde_smmu[SDE_IOMMU_DOMAIN_ROT_SECURE].sid; if (test_bit(SDE_CAPS_SEC_ATTACH_DETACH_SMMU, mdata->sde_caps_map)) { sid_info = kzalloc(sizeof(uint32_t), GFP_KERNEL); if (!sid_info) return -ENOMEM; sid_info[0] = mdata->sde_smmu[SDE_IOMMU_DOMAIN_ROT_SECURE].sid; desc.arginfo = SCM_ARGS(4, SCM_VAL, SCM_RW, SCM_VAL, SCM_VAL); desc.args[0] = SDE_ROTATOR_DEVICE; desc.args[1] = SCM_BUFFER_PHYS(&sid_info); desc.args[1] = SCM_BUFFER_PHYS(sid_info); desc.args[2] = sizeof(uint32_t); if (!mdata->sec_cam_en && enable) { Loading @@ -608,7 +612,7 @@ static int sde_rotator_secure_session_ctrl(bool enable) mdata->sec_cam_en = 1; sde_smmu_secure_ctrl(0); dmac_flush_range(&sid_info, &sid_info + 1); 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]; Loading @@ -618,14 +622,16 @@ static int sde_rotator_secure_session_ctrl(bool enable) /* failure, attach smmu */ mdata->sec_cam_en = 0; sde_smmu_secure_ctrl(1); return -EINVAL; ret = -EINVAL; goto end; } SDEROT_DBG( "scm(1) sid0x%x dev0x%llx vmid0x%llx ret%d resp%x\n", sid_info, desc.args[0], desc.args[3], sid_info[0], desc.args[0], desc.args[3], ret, resp); SDEROT_EVTLOG(1, sid_info, desc.args[0], desc.args[3], SDEROT_EVTLOG(1, sid_info, sid_info[0], desc.args[0], desc.args[3], ret, resp); } else if (mdata->sec_cam_en && !enable) { /* Loading @@ -636,25 +642,30 @@ static int sde_rotator_secure_session_ctrl(bool enable) desc.args[3] = VMID_CP_PIXEL; mdata->sec_cam_en = 0; dmac_flush_range(&sid_info, &sid_info + 1); 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]; SDEROT_DBG( "scm(0) sid0x%x dev0x%llx vmid0x%llx ret%d resp%d\n", sid_info, desc.args[0], desc.args[3], sid_info[0], desc.args[0], desc.args[3], ret, resp); /* force smmu to reattach */ sde_smmu_secure_ctrl(1); SDEROT_EVTLOG(0, sid_info, desc.args[0], desc.args[3], SDEROT_EVTLOG(0, sid_info, sid_info[0], desc.args[0], desc.args[3], ret, resp); } } else { return 0; } end: kfree(sid_info); if (ret) return ret; Loading Loading
drivers/media/platform/msm/sde/rotator/sde_rotator_core.c +23 −12 Original line number Diff line number Diff line Loading @@ -584,17 +584,21 @@ static int sde_rotator_import_buffer(struct sde_layer_buffer *buffer, static int sde_rotator_secure_session_ctrl(bool enable) { struct sde_rot_data_type *mdata = sde_rot_get_mdata(); uint32_t sid_info; uint32_t *sid_info = NULL; struct scm_desc desc = {0}; unsigned int resp = 0; int ret = 0; if (test_bit(SDE_CAPS_SEC_ATTACH_DETACH_SMMU, mdata->sde_caps_map)) { sid_info = mdata->sde_smmu[SDE_IOMMU_DOMAIN_ROT_SECURE].sid; if (test_bit(SDE_CAPS_SEC_ATTACH_DETACH_SMMU, mdata->sde_caps_map)) { sid_info = kzalloc(sizeof(uint32_t), GFP_KERNEL); if (!sid_info) return -ENOMEM; sid_info[0] = mdata->sde_smmu[SDE_IOMMU_DOMAIN_ROT_SECURE].sid; desc.arginfo = SCM_ARGS(4, SCM_VAL, SCM_RW, SCM_VAL, SCM_VAL); desc.args[0] = SDE_ROTATOR_DEVICE; desc.args[1] = SCM_BUFFER_PHYS(&sid_info); desc.args[1] = SCM_BUFFER_PHYS(sid_info); desc.args[2] = sizeof(uint32_t); if (!mdata->sec_cam_en && enable) { Loading @@ -608,7 +612,7 @@ static int sde_rotator_secure_session_ctrl(bool enable) mdata->sec_cam_en = 1; sde_smmu_secure_ctrl(0); dmac_flush_range(&sid_info, &sid_info + 1); 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]; Loading @@ -618,14 +622,16 @@ static int sde_rotator_secure_session_ctrl(bool enable) /* failure, attach smmu */ mdata->sec_cam_en = 0; sde_smmu_secure_ctrl(1); return -EINVAL; ret = -EINVAL; goto end; } SDEROT_DBG( "scm(1) sid0x%x dev0x%llx vmid0x%llx ret%d resp%x\n", sid_info, desc.args[0], desc.args[3], sid_info[0], desc.args[0], desc.args[3], ret, resp); SDEROT_EVTLOG(1, sid_info, desc.args[0], desc.args[3], SDEROT_EVTLOG(1, sid_info, sid_info[0], desc.args[0], desc.args[3], ret, resp); } else if (mdata->sec_cam_en && !enable) { /* Loading @@ -636,25 +642,30 @@ static int sde_rotator_secure_session_ctrl(bool enable) desc.args[3] = VMID_CP_PIXEL; mdata->sec_cam_en = 0; dmac_flush_range(&sid_info, &sid_info + 1); 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]; SDEROT_DBG( "scm(0) sid0x%x dev0x%llx vmid0x%llx ret%d resp%d\n", sid_info, desc.args[0], desc.args[3], sid_info[0], desc.args[0], desc.args[3], ret, resp); /* force smmu to reattach */ sde_smmu_secure_ctrl(1); SDEROT_EVTLOG(0, sid_info, desc.args[0], desc.args[3], SDEROT_EVTLOG(0, sid_info, sid_info[0], desc.args[0], desc.args[3], ret, resp); } } else { return 0; } end: kfree(sid_info); if (ret) return ret; Loading