diff --git a/drivers/cam_req_mgr/cam_mem_mgr.c b/drivers/cam_req_mgr/cam_mem_mgr.c index 49c78ce69d..e4e7a3c13b 100644 --- a/drivers/cam_req_mgr/cam_mem_mgr.c +++ b/drivers/cam_req_mgr/cam_mem_mgr.c @@ -584,6 +584,11 @@ static int cam_mem_util_get_dma_buf(size_t len, perms[num_vmids] = PERM_READ | PERM_WRITE; num_vmids++; } + } else if (cam_flags & CAM_MEM_FLAG_EVA_NOPIXEL) { + heap = tbl.secure_display_heap; + vmids[num_vmids] = VMID_CP_NON_PIXEL; + perms[num_vmids] = PERM_READ | PERM_WRITE; + num_vmids++; } else if (use_cached_heap) { try_heap = tbl.camera_heap; heap = tbl.system_heap; @@ -624,7 +629,8 @@ static int cam_mem_util_get_dma_buf(size_t len, } } - if (cam_flags & CAM_MEM_FLAG_PROTECTED_MODE) { + if ((cam_flags & CAM_MEM_FLAG_PROTECTED_MODE) || + (cam_flags & CAM_MEM_FLAG_EVA_NOPIXEL)) { if (num_vmids >= CAM_MAX_VMIDS) { CAM_ERR(CAM_MEM, "Insufficient array size for vmids %d", num_vmids); rc = -EINVAL; @@ -771,6 +777,13 @@ static int cam_mem_util_check_alloc_flags(struct cam_mem_mgr_alloc_cmd *cmd) return -EINVAL; } + if ((cmd->flags & CAM_MEM_FLAG_EVA_NOPIXEL) && + (cmd->flags & CAM_MEM_FLAG_PROTECTED_MODE || + cmd->flags & CAM_MEM_FLAG_KMD_ACCESS)){ + CAM_ERR(CAM_MEM, + "Kernel mapping and secure mode not allowed in no pixel mode"); + return -EINVAL; + } return 0; } diff --git a/include/uapi/camera/media/cam_req_mgr.h b/include/uapi/camera/media/cam_req_mgr.h index fa02ec7cc2..201c3d90f1 100644 --- a/include/uapi/camera/media/cam_req_mgr.h +++ b/include/uapi/camera/media/cam_req_mgr.h @@ -290,6 +290,7 @@ struct cam_req_mgr_link_control { #define CAM_MEM_FLAG_CDSP_OUTPUT (1<<12) #define CAM_MEM_FLAG_DISABLE_DELAYED_UNMAP (1<<13) #define CAM_MEM_FLAG_KMD_DEBUG_FLAG (1<<14) +#define CAM_MEM_FLAG_EVA_NOPIXEL (1<<15) #define CAM_MEM_MMU_MAX_HANDLE 16