disp: Update secure world communication from display

As scm_call2 is deprecated, update the secure world
communication.

Change-Id: Id971b2b71af9203340eab892d6a3398dbb943370
Signed-off-by: Prasad Sodagudi <psodagud@codeaurora.org>
Signed-off-by: Abhijit Kulkarni <kabhijit@codeaurora.org>
This commit is contained in:
Prasad Sodagudi 2019-10-11 17:30:35 -07:00 committed by Abhijit Kulkarni
parent e5d0b99899
commit 91721d8d2f
3 changed files with 40 additions and 52 deletions

View File

@ -49,7 +49,7 @@
#include "sde_reg_dma.h" #include "sde_reg_dma.h"
#include "sde_connector.h" #include "sde_connector.h"
#include <soc/qcom/scm.h> #include <linux/qcom_scm.h>
#include "soc/qcom/secure_buffer.h" #include "soc/qcom/secure_buffer.h"
#include <linux/qtee_shmbridge.h> #include <linux/qtee_shmbridge.h>
@ -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) static int _sde_kms_scm_call(struct sde_kms *sde_kms, int vmid)
{ {
struct drm_device *dev; struct drm_device *dev;
struct scm_desc desc = {0};
uint32_t num_sids; uint32_t num_sids;
uint32_t *sec_sid; 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; struct sde_mdss_cfg *sde_cfg = sde_kms->catalog;
int ret = 0, i; int ret = 0, i;
struct qtee_shm shm; struct qtee_shm shm;
bool qtee_en = qtee_shmbridge_is_enabled(); bool qtee_en = qtee_shmbridge_is_enabled();
phys_addr_t mem_addr;
u64 mem_size;
dev = sde_kms->dev; dev = sde_kms->dev;
@ -297,21 +297,17 @@ static int _sde_kms_scm_call(struct sde_kms *sde_kms, int vmid)
return -ENOMEM; return -ENOMEM;
sec_sid = (uint32_t *) shm.vaddr; sec_sid = (uint32_t *) shm.vaddr;
desc.args[1] = shm.paddr; mem_addr = shm.paddr;
desc.args[2] = shm.size; mem_size = shm.size;
} else { } else {
sec_sid = kcalloc(num_sids, sizeof(uint32_t), GFP_KERNEL); sec_sid = kcalloc(num_sids, sizeof(uint32_t), GFP_KERNEL);
if (!sec_sid) if (!sec_sid)
return -ENOMEM; return -ENOMEM;
desc.args[1] = SCM_BUFFER_PHYS(sec_sid); mem_addr = virt_to_phys(sec_sid);
desc.args[2] = sizeof(uint32_t) * num_sids; 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++) { for (i = 0; i < num_sids; i++) {
sec_sid[i] = sde_cfg->sec_sid_mask[i]; sec_sid[i] = sde_cfg->sec_sid_mask[i];
SDE_DEBUG("sid_mask[%d]: %d\n", i, sec_sid[i]); SDE_DEBUG("sid_mask[%d]: %d\n", i, sec_sid[i]);
@ -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", SDE_DEBUG("calling scm_call for vmid 0x%x, num_sids %d, qtee_en %d",
vmid, num_sids, qtee_en); vmid, num_sids, qtee_en);
ret = scm_call2(SCM_SIP_FNID(SCM_SVC_MP, ret = qcom_scm_mem_protect_sd_ctrl(MDP_DEVICE_ID, mem_addr,
mem_protect_sd_ctrl_id), &desc); mem_size, vmid);
if (ret) if (ret)
SDE_ERROR("Error:scm_call2, vmid %lld, ret%d\n", SDE_ERROR("Error:scm_call2, vmid %lld, ret%d\n",
desc.args[3], ret); vmid, ret);
SDE_EVT32(mem_protect_sd_ctrl_id, desc.args[0], desc.args[2], SDE_EVT32(MEM_PROTECT_SD_CTRL_SWITCH, MDP_DEVICE_ID, mem_size,
desc.args[3], qtee_en, num_sids, ret); vmid, qtee_en, num_sids, ret);
if (qtee_en) if (qtee_en)
qtee_shmbridge_free_shm(&shm); qtee_shmbridge_free_shm(&shm);

View File

@ -6,8 +6,6 @@
#ifndef __SDE_HDCP_H__ #ifndef __SDE_HDCP_H__
#define __SDE_HDCP_H__ #define __SDE_HDCP_H__
#include <soc/qcom/scm.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/bitops.h> #include <linux/bitops.h>
#include <linux/debugfs.h> #include <linux/debugfs.h>

View File

@ -15,7 +15,7 @@
#include <linux/debugfs.h> #include <linux/debugfs.h>
#include <linux/regulator/consumer.h> #include <linux/regulator/consumer.h>
#include <linux/dma-direction.h> #include <linux/dma-direction.h>
#include <soc/qcom/scm.h> #include <linux/qcom_scm.h>
#include <soc/qcom/secure_buffer.h> #include <soc/qcom/secure_buffer.h>
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
#include <uapi/linux/sched/types.h> #include <uapi/linux/sched/types.h>
@ -554,17 +554,15 @@ static int sde_rotator_secure_session_ctrl(bool enable)
{ {
struct sde_rot_data_type *mdata = sde_rot_get_mdata(); struct sde_rot_data_type *mdata = sde_rot_get_mdata();
uint32_t *sid_info = NULL; uint32_t *sid_info = NULL;
struct scm_desc desc = {0};
unsigned int resp = 0;
int ret = 0; int ret = 0;
phys_addr_t mem_addr;
u64 mem_size;
u32 vmid;
struct qtee_shm shm; struct qtee_shm shm;
bool qtee_en = qtee_shmbridge_is_enabled(); bool qtee_en = qtee_shmbridge_is_enabled();
if (test_bit(SDE_CAPS_SEC_ATTACH_DETACH_SMMU, mdata->sde_caps_map)) { 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) { if (qtee_en) {
ret = qtee_shmbridge_allocate_shm(sizeof(uint32_t), ret = qtee_shmbridge_allocate_shm(sizeof(uint32_t),
&shm); &shm);
@ -572,15 +570,15 @@ static int sde_rotator_secure_session_ctrl(bool enable)
return -ENOMEM; return -ENOMEM;
sid_info = (uint32_t *) shm.vaddr; sid_info = (uint32_t *) shm.vaddr;
desc.args[1] = shm.paddr; mem_addr = shm.paddr;
desc.args[2] = shm.size; mem_size = shm.size;
} else { } else {
sid_info = kzalloc(sizeof(uint32_t), GFP_KERNEL); sid_info = kzalloc(sizeof(uint32_t), GFP_KERNEL);
if (!sid_info) if (!sid_info)
return -ENOMEM; return -ENOMEM;
desc.args[1] = SCM_BUFFER_PHYS(sid_info); mem_addr = virt_to_phys(sid_info);
desc.args[2] = sizeof(uint32_t); mem_size = sizeof(uint32_t);
} }
sid_info[0] = mdata->sde_smmu[SDE_IOMMU_DOMAIN_ROT_SECURE].sid; sid_info[0] = mdata->sde_smmu[SDE_IOMMU_DOMAIN_ROT_SECURE].sid;
@ -591,18 +589,16 @@ static int sde_rotator_secure_session_ctrl(bool enable)
* Send SCM call to hypervisor to switch the * Send SCM call to hypervisor to switch the
* secure_vmid to secure context * secure_vmid to secure context
*/ */
desc.args[3] = VMID_CP_CAMERA_PREVIEW; vmid = VMID_CP_CAMERA_PREVIEW;
mdata->sec_cam_en = 1; mdata->sec_cam_en = 1;
sde_smmu_secure_ctrl(0); 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, ret = qcom_scm_mem_protect_sd_ctrl(SDE_ROTATOR_DEVICE,
MEM_PROTECT_SD_CTRL_SWITCH), &desc); mem_addr, mem_size, vmid);
resp = desc.ret[0];
if (ret) { if (ret) {
SDEROT_ERR("scm_call(1) ret=%d, resp=%x\n", SDEROT_ERR("qcom_scm_mem_protect ret=%d\n", ret);
ret, resp);
/* failure, attach smmu */ /* failure, attach smmu */
mdata->sec_cam_en = 0; mdata->sec_cam_en = 0;
sde_smmu_secure_ctrl(1); sde_smmu_secure_ctrl(1);
@ -611,35 +607,36 @@ static int sde_rotator_secure_session_ctrl(bool enable)
} }
SDEROT_DBG( SDEROT_DBG(
"scm(1) sid0x%x dev0x%llx vmid0x%llx qtee_en%d ret%d resp%x\n", "scm(1) sid0x%x dev0x%llx vmid0x%llx qtee_en%d ret%d\n",
sid_info[0], desc.args[0], desc.args[3], sid_info[0], SDE_ROTATOR_DEVICE, vmid,
qtee_en, ret, resp); qtee_en, ret);
SDEROT_EVTLOG(1, sid_info, sid_info[0], desc.args[0], SDEROT_EVTLOG(1, sid_info, sid_info[0], SDE_ROTATOR_DEVICE,
desc.args[3], qtee_en, ret, resp); vmid, qtee_en, ret);
} else if (mdata->sec_cam_en && !enable) { } else if (mdata->sec_cam_en && !enable) {
/* /*
* Disable secure camera operation * Disable secure camera operation
* Send SCM call to hypervisor to switch the * Send SCM call to hypervisor to switch the
* secure_vmid to non-secure context * secure_vmid to non-secure context
*/ */
desc.args[3] = VMID_CP_PIXEL; vmid = VMID_CP_PIXEL;
mdata->sec_cam_en = 0; 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, ret = qcom_scm_mem_protect_sd_ctrl(SDE_ROTATOR_DEVICE,
MEM_PROTECT_SD_CTRL_SWITCH), &desc); mem_addr, mem_size, vmid);
resp = desc.ret[0]; if (ret)
SDEROT_ERR("qcom_scm_mem_protect ret=%d\n", ret);
SDEROT_DBG( SDEROT_DBG(
"scm(0) sid0x%x dev0x%llx vmid0x%llx qtee_en%d ret%d resp%d\n", "scm(0) sid0x%x dev0x%llx vmid0x%llx qtee_en%d ret%d\n",
sid_info[0], desc.args[0], desc.args[3], sid_info[0], SDE_ROTATOR_DEVICE, vmid,
qtee_en, ret, resp); qtee_en, ret);
/* force smmu to reattach */ /* force smmu to reattach */
sde_smmu_secure_ctrl(1); sde_smmu_secure_ctrl(1);
SDEROT_EVTLOG(0, sid_info, sid_info[0], desc.args[0], SDEROT_EVTLOG(0, sid_info, sid_info[0], SDE_ROTATOR_DEVICE,
desc.args[3], qtee_en, ret, resp); vmid, qtee_en, ret);
} }
} else { } else {
return 0; return 0;
@ -651,10 +648,7 @@ end:
else else
kfree(sid_info); kfree(sid_info);
if (ret) return ret;
return ret;
return resp;
} }