Просмотр исходного кода

Merge "disp: Update secure world communication from display" into display-kernel.lnx.5.4

Linux Build Service Account 5 лет назад
Родитель
Сommit
beb705e598
3 измененных файлов с 40 добавлено и 52 удалено
  1. 12 16
      msm/sde/sde_kms.c
  2. 0 2
      msm/sde_hdcp.h
  3. 28 34
      rotator/sde_rotator_core.c

+ 12 - 16
msm/sde/sde_kms.c

@@ -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>
 
@@ -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;
 
@@ -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]);
@@ -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);

+ 0 - 2
msm/sde_hdcp.h

@@ -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>

+ 28 - 34
rotator/sde_rotator_core.c

@@ -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>
@@ -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);
@@ -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;
@@ -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);
@@ -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;
@@ -651,10 +648,7 @@ end:
 	else
 		kfree(sid_info);
 
-	if (ret)
-		return ret;
-
-	return resp;
+	return ret;
 }