From c4a5719e6e1b68319daef8ee218b379bd415566f Mon Sep 17 00:00:00 2001 From: Srinu Gorle Date: Sat, 3 Nov 2012 21:08:56 +0530 Subject: [PATCH] msm: vidc: port heap mask change to ion for secure session Changes to pass ION_SECURE in the correct argument field while calling ion_alloc. Without this change secure session fails. Change-Id: Ifa4878b1c312beafc735cb649570913159799d7c Signed-off-by: Srinu Gorle --- drivers/media/video/msm_wfd/enc-mfc-subdev.c | 6 +++-- drivers/media/video/msm_wfd/wfd-ioctl.c | 6 +++-- .../video/msm/vidc/1080p/ddl/vcd_ddl_utils.c | 2 +- .../1080p/resource_tracker/vcd_res_tracker.c | 25 +++++++++++++++---- .../resource_tracker/vcd_res_tracker_api.h | 1 + .../720p/resource_tracker/vcd_res_tracker.c | 5 ++++ .../resource_tracker/vcd_res_tracker_api.h | 1 + drivers/video/msm/vidc/common/vcd/vcd_sub.c | 2 +- 8 files changed, 37 insertions(+), 11 deletions(-) diff --git a/drivers/media/video/msm_wfd/enc-mfc-subdev.c b/drivers/media/video/msm_wfd/enc-mfc-subdev.c index 09a5e32c63c..6db2ad19852 100644 --- a/drivers/media/video/msm_wfd/enc-mfc-subdev.c +++ b/drivers/media/video/msm_wfd/enc-mfc-subdev.c @@ -1975,6 +1975,7 @@ static long venc_alloc_recon_buffers(struct v4l2_subdev *sd, void *arg) unsigned long phy_addr; int i = 0; int heap_mask = 0; + u32 ion_flags = 0; u32 len; control.width = inst->width; control.height = inst->height; @@ -1988,7 +1989,8 @@ static long venc_alloc_recon_buffers(struct v4l2_subdev *sd, void *arg) goto err; } heap_mask = ION_HEAP(ION_CP_MM_HEAP_ID); - heap_mask |= inst->secure ? ION_SECURE : ION_HEAP(ION_IOMMU_HEAP_ID); + heap_mask |= inst->secure ? 0 : ION_HEAP(ION_IOMMU_HEAP_ID); + ion_flags |= inst->secure ? ION_SECURE : 0; if (vcd_get_ion_status()) { for (i = 0; i < 4; ++i) { @@ -1999,7 +2001,7 @@ static long venc_alloc_recon_buffers(struct v4l2_subdev *sd, void *arg) ctrl->user_virtual_addr = (void *)i; client_ctx->recon_buffer_ion_handle[i] = ion_alloc(client_ctx->user_ion_client, - control.size, SZ_8K, heap_mask, 0); + control.size, SZ_8K, heap_mask, ion_flags); ctrl->kernel_virtual_addr = ion_map_kernel( client_ctx->user_ion_client, diff --git a/drivers/media/video/msm_wfd/wfd-ioctl.c b/drivers/media/video/msm_wfd/wfd-ioctl.c index d8080ddbc3a..371ae3cc038 100644 --- a/drivers/media/video/msm_wfd/wfd-ioctl.c +++ b/drivers/media/video/msm_wfd/wfd-ioctl.c @@ -155,13 +155,15 @@ static int wfd_allocate_ion_buffer(struct ion_client *client, struct ion_handle *handle = NULL; void *kvaddr = NULL; unsigned int alloc_regions = 0; + unsigned int ion_flags = 0; int rc = 0; alloc_regions = ION_HEAP(ION_CP_MM_HEAP_ID); - alloc_regions |= secure ? ION_SECURE : + alloc_regions |= secure ? 0 : ION_HEAP(ION_IOMMU_HEAP_ID); + ion_flags |= secure ? ION_SECURE : 0; handle = ion_alloc(client, - mregion->size, SZ_4K, alloc_regions, 0); + mregion->size, SZ_4K, alloc_regions, ion_flags); if (IS_ERR_OR_NULL(handle)) { WFD_MSG_ERR("Failed to allocate input buffer\n"); diff --git a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_utils.c b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_utils.c index 9d5368b9b84..4b5fbf5da42 100644 --- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_utils.c +++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_utils.c @@ -70,7 +70,7 @@ void *ddl_pmem_alloc(struct ddl_buf_addr *addr, size_t sz, u32 alignment) alloc_size = (alloc_size+4095) & ~4095; addr->alloc_handle = ion_alloc( ddl_context->video_ion_client, alloc_size, SZ_4K, - res_trk_get_mem_type(), 0); + res_trk_get_mem_type(), res_trk_get_ion_flags()); if (IS_ERR_OR_NULL(addr->alloc_handle)) { DDL_MSG_ERROR("%s() :DDL ION alloc failed\n", __func__); diff --git a/drivers/video/msm/vidc/1080p/resource_tracker/vcd_res_tracker.c b/drivers/video/msm/vidc/1080p/resource_tracker/vcd_res_tracker.c index 75856b2ae42..d9cadefff02 100644 --- a/drivers/video/msm/vidc/1080p/resource_tracker/vcd_res_tracker.c +++ b/drivers/video/msm/vidc/1080p/resource_tracker/vcd_res_tracker.c @@ -209,7 +209,8 @@ static int res_trk_pmem_alloc addr->alloc_handle = ion_alloc( ddl_context->video_ion_client, alloc_size, SZ_4K, - res_trk_get_mem_type(), 0); + res_trk_get_mem_type(), + res_trk_get_ion_flags()); if (IS_ERR_OR_NULL(addr->alloc_handle)) { DDL_MSG_ERROR("%s() :DDL ION alloc failed\n", __func__); @@ -830,17 +831,31 @@ int res_trk_get_mem_type(void) if (resource_context.vidc_platform_data->enable_ion) { if (res_trk_check_for_sec_session()) { mem_type = ION_HEAP(mem_type); - if (resource_context.res_mem_type != DDL_FW_MEM) - mem_type |= ION_SECURE; - else if (res_trk_is_cp_enabled()) - mem_type |= ION_SECURE; } else mem_type = (ION_HEAP(mem_type) | ION_HEAP(ION_IOMMU_HEAP_ID)); } + return mem_type; } +unsigned int res_trk_get_ion_flags(void) +{ + unsigned int flags = 0; + if (resource_context.res_mem_type == DDL_FW_MEM) + return flags; + + if (resource_context.vidc_platform_data->enable_ion) { + if (res_trk_check_for_sec_session()) { + if (resource_context.res_mem_type != DDL_FW_MEM) + flags |= ION_SECURE; + else if (res_trk_is_cp_enabled()) + flags |= ION_SECURE; + } + } + return flags; +} + u32 res_trk_is_cp_enabled(void) { if (resource_context.vidc_platform_data->cp_enabled) diff --git a/drivers/video/msm/vidc/1080p/resource_tracker/vcd_res_tracker_api.h b/drivers/video/msm/vidc/1080p/resource_tracker/vcd_res_tracker_api.h index 2ae2512629c..ee876f48771 100644 --- a/drivers/video/msm/vidc/1080p/resource_tracker/vcd_res_tracker_api.h +++ b/drivers/video/msm/vidc/1080p/resource_tracker/vcd_res_tracker_api.h @@ -30,6 +30,7 @@ u32 res_trk_download_firmware(void); u32 res_trk_get_core_type(void); u32 res_trk_get_firmware_addr(struct ddl_buf_addr *firm_addr); int res_trk_get_mem_type(void); +unsigned int res_trk_get_ion_flags(void); u32 res_trk_get_enable_ion(void); u32 res_trk_is_cp_enabled(void); u32 res_trk_get_disable_fullhd(void); diff --git a/drivers/video/msm/vidc/720p/resource_tracker/vcd_res_tracker.c b/drivers/video/msm/vidc/720p/resource_tracker/vcd_res_tracker.c index d8b8f18a0f9..c83faa69f8d 100644 --- a/drivers/video/msm/vidc/720p/resource_tracker/vcd_res_tracker.c +++ b/drivers/video/msm/vidc/720p/resource_tracker/vcd_res_tracker.c @@ -764,6 +764,11 @@ u32 res_trk_get_disable_fullhd(void) return 0; } +u32 res_trk_get_ion_flags(void) +{ + return 0; +} + int res_trk_check_for_sec_session() { return 0; diff --git a/drivers/video/msm/vidc/720p/resource_tracker/vcd_res_tracker_api.h b/drivers/video/msm/vidc/720p/resource_tracker/vcd_res_tracker_api.h index 75fdb3e1bf9..a20d9f25b73 100644 --- a/drivers/video/msm/vidc/720p/resource_tracker/vcd_res_tracker_api.h +++ b/drivers/video/msm/vidc/720p/resource_tracker/vcd_res_tracker_api.h @@ -29,6 +29,7 @@ u32 res_trk_download_firmware(void); u32 res_trk_get_core_type(void); u32 res_trk_get_mem_type(void); u32 res_trk_get_disable_fullhd(void); +u32 res_trk_get_ion_flags(void); u32 res_trk_get_enable_ion(void); u32 res_trk_is_cp_enabled(void); struct ion_client *res_trk_get_ion_client(void); diff --git a/drivers/video/msm/vidc/common/vcd/vcd_sub.c b/drivers/video/msm/vidc/common/vcd/vcd_sub.c index 8d28fd5ffb1..a9709fbc57a 100644 --- a/drivers/video/msm/vidc/common/vcd/vcd_sub.c +++ b/drivers/video/msm/vidc/common/vcd/vcd_sub.c @@ -92,7 +92,7 @@ static int vcd_pmem_alloc(size_t sz, u8 **kernel_vaddr, u8 **phy_addr, } else { map_buffer->alloc_handle = ion_alloc( cctxt->vcd_ion_client, sz, SZ_4K, - memtype, 0); + memtype, res_trk_get_ion_flags()); if (IS_ERR_OR_NULL(map_buffer->alloc_handle)) { pr_err("%s() ION alloc failed", __func__); goto bailout;