From d98f9f01bfa7483a52d89663dc4fbe703a583378 Mon Sep 17 00:00:00 2001 From: Elliot Berman Date: Mon, 14 Oct 2019 14:04:19 -0700 Subject: [PATCH] firmware: qcom_scm: Add support for protecting videos Add secure world call to protect memory for video. Change-Id: I27a82d31054b8a2459738d3c7a2785abd357504f Signed-off-by: Elliot Berman --- drivers/firmware/qcom_scm-smc.c | 19 +++++++++++++++++++ drivers/firmware/qcom_scm.c | 8 ++++++++ drivers/firmware/qcom_scm.h | 4 ++++ include/linux/qcom_scm.h | 5 +++++ 4 files changed, 36 insertions(+) diff --git a/drivers/firmware/qcom_scm-smc.c b/drivers/firmware/qcom_scm-smc.c index 33e6a46aec7b..c05f7c1bb183 100644 --- a/drivers/firmware/qcom_scm-smc.c +++ b/drivers/firmware/qcom_scm-smc.c @@ -1054,6 +1054,25 @@ int __qcom_scm_iommu_secure_ptbl_init(struct device *dev, u64 addr, u32 size, return ret; } +int __qcom_scm_mem_protect_video(struct device *dev, + u32 cp_start, u32 cp_size, + u32 cp_nonpixel_start, u32 cp_nonpixel_size) +{ + struct qcom_scm_desc desc = { + .svc = QCOM_SCM_SVC_MP, + .cmd = QCOM_SCM_MP_MEM_PROTECT_VIDEO, + .owner = ARM_SMCCC_OWNER_SIP + }; + + desc.args[0] = cp_start; + desc.args[1] = cp_size; + desc.args[2] = cp_nonpixel_start; + desc.args[3] = cp_nonpixel_size; + desc.arginfo = QCOM_SCM_ARGS(4); + + return qcom_scm_call(dev, &desc); +} + int __qcom_scm_mem_protect_region_id(struct device *dev, phys_addr_t paddr, size_t size) { diff --git a/drivers/firmware/qcom_scm.c b/drivers/firmware/qcom_scm.c index 7c6b949fa110..5f4a42a4109b 100644 --- a/drivers/firmware/qcom_scm.c +++ b/drivers/firmware/qcom_scm.c @@ -388,6 +388,14 @@ int qcom_scm_iommu_secure_ptbl_init(u64 addr, u32 size, u32 spare) } EXPORT_SYMBOL(qcom_scm_iommu_secure_ptbl_init); +int qcom_scm_mem_protect_video(u32 cp_start, u32 cp_size, + u32 cp_nonpixel_start, u32 cp_nonpixel_size) +{ + return __qcom_scm_mem_protect_video(__scm->dev, cp_start, cp_size, + cp_nonpixel_start, cp_nonpixel_size); +} +EXPORT_SYMBOL(qcom_scm_mem_protect_video); + int qcom_scm_mem_protect_region_id(phys_addr_t paddr, size_t size) { return __qcom_scm_mem_protect_region_id(__scm->dev, paddr, size); diff --git a/drivers/firmware/qcom_scm.h b/drivers/firmware/qcom_scm.h index 6a0cd805ed62..5cfbe46b1971 100644 --- a/drivers/firmware/qcom_scm.h +++ b/drivers/firmware/qcom_scm.h @@ -71,6 +71,7 @@ extern void __qcom_scm_mmu_sync(struct device *dev, bool sync); #define QCOM_SCM_MP_RESTORE_SEC_CFG 0x02 #define QCOM_SCM_MP_IOMMU_SECURE_PTBL_SIZE 0x03 #define QCOM_SCM_MP_IOMMU_SECURE_PTBL_INIT 0x04 +#define QCOM_SCM_MP_MEM_PROTECT_VIDEO 0x08 #define QCOM_SCM_MP_MEM_PROTECT_REGION_ID 0x10 #define QCOM_SCM_MP_MEM_PROTECT_LOCK_ID2_FLAT 0x11 #define QCOM_SCM_MP_IOMMU_SECURE_MAP2_FLAT 0x12 @@ -87,6 +88,9 @@ extern int __qcom_scm_iommu_secure_ptbl_size(struct device *dev, u32 spare, size_t *size); extern int __qcom_scm_iommu_secure_ptbl_init(struct device *dev, u64 addr, u32 size, u32 spare); +extern int __qcom_scm_mem_protect_video(struct device *dev, + u32 cp_start, u32 cp_size, + u32 cp_nonpixel_start, u32 cp_nonpixel_size); extern int __qcom_scm_mem_protect_region_id(struct device *dev, phys_addr_t paddr, size_t size); extern int __qcom_scm_mem_protect_lock_id2_flat(struct device *dev, diff --git a/include/linux/qcom_scm.h b/include/linux/qcom_scm.h index 3086587fa367..aeec3199d410 100644 --- a/include/linux/qcom_scm.h +++ b/include/linux/qcom_scm.h @@ -57,6 +57,8 @@ extern void qcom_scm_mmu_sync(bool sync); extern int qcom_scm_restore_sec_cfg(u32 device_id, u32 spare); extern int qcom_scm_iommu_secure_ptbl_size(u32 spare, size_t *size); extern int qcom_scm_iommu_secure_ptbl_init(u64 addr, u32 size, u32 spare); +extern int qcom_scm_mem_protect_video(u32 cp_start, u32 cp_size, + u32 cp_nonpixel_start, u32 cp_nonpixel_size); extern int qcom_scm_mem_protect_region_id(phys_addr_t paddr, size_t size); extern int qcom_scm_mem_protect_lock_id2_flat(phys_addr_t list_addr, size_t list_size, size_t chunk_size, @@ -146,6 +148,9 @@ static inline int qcom_scm_iommu_secure_ptbl_size(u32 spare, size_t *size) { return -ENODEV; } static inline int qcom_scm_iommu_secure_ptbl_init(u64 addr, u32 size, u32 spare) { return -ENODEV; } +static inline int qcom_scm_mem_protect_video(u32 cp_start, u32 cp_size, + u32 cp_nonpixel_start, u32 cp_nonpixel_size) + { return -ENODEV; } static inline int qcom_scm_mem_protect_region_id(phys_addr_t paddr, size_t size) { return -ENODEV; } static inline int qcom_scm_mem_protect_lock_id2_flat(phys_addr_t list_addr,