Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

media: firmware: qcom_scm: Add memory protect virtual address ranges

This adds a new SCM memprotect command to set virtual address ranges.

Signed-off-by: Stanimir Varbanov <stanimir.varbanov@linaro.org>
Reviewed-by: Elliot Berman <eberman@codeaurora.org>
Acked-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>

authored by

Stanimir Varbanov and committed by
Mauro Carvalho Chehab
6d885330 435c53c3

+32
+24
drivers/firmware/qcom_scm.c
··· 756 756 } 757 757 EXPORT_SYMBOL(qcom_scm_iommu_secure_ptbl_init); 758 758 759 + int qcom_scm_mem_protect_video_var(u32 cp_start, u32 cp_size, 760 + u32 cp_nonpixel_start, 761 + u32 cp_nonpixel_size) 762 + { 763 + int ret; 764 + struct qcom_scm_desc desc = { 765 + .svc = QCOM_SCM_SVC_MP, 766 + .cmd = QCOM_SCM_MP_VIDEO_VAR, 767 + .arginfo = QCOM_SCM_ARGS(4, QCOM_SCM_VAL, QCOM_SCM_VAL, 768 + QCOM_SCM_VAL, QCOM_SCM_VAL), 769 + .args[0] = cp_start, 770 + .args[1] = cp_size, 771 + .args[2] = cp_nonpixel_start, 772 + .args[3] = cp_nonpixel_size, 773 + .owner = ARM_SMCCC_OWNER_SIP, 774 + }; 775 + struct qcom_scm_res res; 776 + 777 + ret = qcom_scm_call(__scm->dev, &desc, &res); 778 + 779 + return ret ? : res.result[0]; 780 + } 781 + EXPORT_SYMBOL(qcom_scm_mem_protect_video_var); 782 + 759 783 static int __qcom_scm_assign_mem(struct device *dev, phys_addr_t mem_region, 760 784 size_t mem_sz, phys_addr_t src, size_t src_sz, 761 785 phys_addr_t dest, size_t dest_sz)
+1
drivers/firmware/qcom_scm.h
··· 97 97 #define QCOM_SCM_MP_RESTORE_SEC_CFG 0x02 98 98 #define QCOM_SCM_MP_IOMMU_SECURE_PTBL_SIZE 0x03 99 99 #define QCOM_SCM_MP_IOMMU_SECURE_PTBL_INIT 0x04 100 + #define QCOM_SCM_MP_VIDEO_VAR 0x08 100 101 #define QCOM_SCM_MP_ASSIGN 0x16 101 102 102 103 #define QCOM_SCM_SVC_OCMEM 0x0f
+7
include/linux/qcom_scm.h
··· 84 84 extern int qcom_scm_restore_sec_cfg(u32 device_id, u32 spare); 85 85 extern int qcom_scm_iommu_secure_ptbl_size(u32 spare, size_t *size); 86 86 extern int qcom_scm_iommu_secure_ptbl_init(u64 addr, u32 size, u32 spare); 87 + extern int qcom_scm_mem_protect_video_var(u32 cp_start, u32 cp_size, 88 + u32 cp_nonpixel_start, 89 + u32 cp_nonpixel_size); 87 90 extern int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz, 88 91 unsigned int *src, 89 92 const struct qcom_scm_vmperm *newvm, ··· 143 140 static inline int qcom_scm_iommu_secure_ptbl_size(u32 spare, size_t *size) 144 141 { return -ENODEV; } 145 142 static inline int qcom_scm_iommu_secure_ptbl_init(u64 addr, u32 size, u32 spare) 143 + { return -ENODEV; } 144 + extern inline int qcom_scm_mem_protect_video_var(u32 cp_start, u32 cp_size, 145 + u32 cp_nonpixel_start, 146 + u32 cp_nonpixel_size) 146 147 { return -ENODEV; } 147 148 static inline int qcom_scm_assign_mem(phys_addr_t mem_addr, size_t mem_sz, 148 149 unsigned int *src, const struct qcom_scm_vmperm *newvm,