msm: vidc: Downloads firmware using pil_get.
Downloads video codec firmware using pil_get
for secure sessions only. Firmware is not
downloaded using pil_get for non-secure
sessions
Change-Id: I1f870a0611b85ddfe0f34972f81e5e667387468d
Signed-off-by: Deepak Kotur <dkotur@codeaurora.org>
diff --git a/arch/arm/mach-msm/devices-8960.c b/arch/arm/mach-msm/devices-8960.c
index 8df1d7a..0f6d55f 100644
--- a/arch/arm/mach-msm/devices-8960.c
+++ b/arch/arm/mach-msm/devices-8960.c
@@ -654,6 +654,7 @@
#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
.memtype = ION_CP_MM_HEAP_ID,
.enable_ion = 1,
+ .cp_enabled = 1,
#else
.memtype = MEMTYPE_EBI1,
.enable_ion = 0,
diff --git a/arch/arm/mach-msm/devices-msm8x60.c b/arch/arm/mach-msm/devices-msm8x60.c
index 614f6ff..4dc1d0c 100644
--- a/arch/arm/mach-msm/devices-msm8x60.c
+++ b/arch/arm/mach-msm/devices-msm8x60.c
@@ -2260,6 +2260,7 @@
#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
.memtype = ION_CP_MM_HEAP_ID,
.enable_ion = 1,
+ .cp_enabled = 0,
#else
.memtype = MEMTYPE_SMI_KERNEL,
.enable_ion = 0,
diff --git a/arch/arm/mach-msm/include/mach/board.h b/arch/arm/mach-msm/include/mach/board.h
index c46c493..4c80a55 100644
--- a/arch/arm/mach-msm/include/mach/board.h
+++ b/arch/arm/mach-msm/include/mach/board.h
@@ -505,6 +505,7 @@
u32 enable_ion;
int disable_dmx;
int disable_fullhd;
+ u32 cp_enabled;
#ifdef CONFIG_MSM_BUS_SCALING
struct msm_bus_scale_pdata *vidc_bus_client_pdata;
#endif
diff --git a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl.h b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl.h
index d05e542..d137dcf 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl.h
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl.h
@@ -100,6 +100,7 @@
struct ion_handle *alloc_handle;
u32 buffer_size;
enum ddl_mem_area mem_type;
+ void *pil_cookie;
};
enum ddl_cmd_state{
DDL_CMD_INVALID = 0x0,
@@ -477,5 +478,5 @@
u32 ddl_fw_init(struct ddl_buf_addr *dram_base);
void ddl_get_fw_info(const unsigned char **fw_array_addr,
unsigned int *fw_size);
-void ddl_fw_release(void);
+void ddl_fw_release(struct ddl_buf_addr *);
#endif
diff --git a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_helper.c b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_helper.c
index 0d0ba3e..089744f 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_helper.c
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_helper.c
@@ -353,7 +353,7 @@
void ddl_release_context_buffers(struct ddl_context *ddl_context)
{
ddl_pmem_free(&ddl_context->metadata_shared_input);
- ddl_fw_release();
+ ddl_fw_release(&ddl_context->dram_base_a);
}
void ddl_release_client_internal_buffers(struct ddl_client_context *ddl)
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 27d3b5b..3fd09e2 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_utils.c
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_utils.c
@@ -11,7 +11,9 @@
*
*/
#include <linux/memory_alloc.h>
+#include <linux/delay.h>
#include <mach/msm_subsystem_map.h>
+#include <mach/peripheral-loader.h>
#include "vcd_ddl_utils.h"
#include "vcd_ddl.h"
#include "vcd_res_tracker_api.h"
@@ -103,7 +105,7 @@
addr->alloced_phys_addr = (phys_addr_t) iova;
if (!addr->alloced_phys_addr) {
DDL_MSG_ERROR("%s():DDL ION client physical failed\n",
- __func__);
+ __func__);
goto unmap_ion_alloc;
}
addr->mapped_buffer = NULL;
@@ -332,23 +334,67 @@
u32 ddl_fw_init(struct ddl_buf_addr *dram_base)
{
-
u8 *dest_addr;
-
dest_addr = DDL_GET_ALIGNED_VITUAL(*dram_base);
- if (vidc_video_codec_fw_size > dram_base->buffer_size ||
- !vidc_video_codec_fw)
- return false;
DDL_MSG_LOW("FW Addr / FW Size : %x/%d", (u32)vidc_video_codec_fw,
vidc_video_codec_fw_size);
- memcpy(dest_addr, vidc_video_codec_fw,
- vidc_video_codec_fw_size);
+ if (res_trk_check_for_sec_session() && res_trk_is_cp_enabled()) {
+ if (res_trk_enable_footswitch()) {
+ pr_err("Failed to enable footswitch");
+ return false;
+ }
+ if (res_trk_enable_iommu_clocks()) {
+ res_trk_disable_footswitch();
+ pr_err("Failed to enable iommu clocks\n");
+ return false;
+ }
+ dram_base->pil_cookie = pil_get("vidc");
+ if (res_trk_disable_iommu_clocks())
+ pr_err("Failed to disable iommu clocks\n");
+ if (IS_ERR_OR_NULL(dram_base->pil_cookie)) {
+ res_trk_disable_footswitch();
+ pr_err("pil_get failed\n");
+ return false;
+ }
+ } else {
+ if (vidc_video_codec_fw_size > dram_base->buffer_size ||
+ !vidc_video_codec_fw)
+ return false;
+ memcpy(dest_addr, vidc_video_codec_fw,
+ vidc_video_codec_fw_size);
+ }
return true;
}
-void ddl_fw_release(void)
+void ddl_fw_release(struct ddl_buf_addr *dram_base)
{
- res_trk_close_secure_session();
+ void *cookie = dram_base->pil_cookie;
+ if (res_trk_is_cp_enabled() &&
+ res_trk_check_for_sec_session()) {
+ res_trk_close_secure_session();
+ if (IS_ERR_OR_NULL(cookie)) {
+ pr_err("Invalid params");
+ return;
+ }
+ if (res_trk_enable_footswitch()) {
+ pr_err("Failed to enable footswitch");
+ return;
+ }
+ if (res_trk_enable_iommu_clocks()) {
+ res_trk_disable_footswitch();
+ pr_err("Failed to enable iommu clocks\n");
+ return;
+ }
+ pil_put(cookie);
+ if (res_trk_disable_iommu_clocks())
+ pr_err("Failed to disable iommu clocks\n");
+ if (res_trk_disable_footswitch())
+ pr_err("Failed to disable footswitch\n");
+ } else {
+ if (res_trk_check_for_sec_session())
+ res_trk_close_secure_session();
+ res_trk_release_fw_addr();
+ }
}
void ddl_set_core_start_time(const char *func_name, u32 index)
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 e94a302..c22236b 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
@@ -25,6 +25,9 @@
#include "vidc.h"
#include "vcd_res_tracker.h"
+#define PIL_FW_BASE_ADDR 0xafe00000
+#define PIL_FW_SIZE 0x200000
+
static unsigned int vidc_clk_table[3] = {
48000000, 133330000, 200000000
};
@@ -64,7 +67,7 @@
unsigned long *kernel_vaddr = NULL;
ddl_context = ddl_get_context();
- if (res_trk_get_enable_ion()) {
+ if (res_trk_get_enable_ion() && addr->alloc_handle) {
kernel_vaddr = (unsigned long *) ion_map_kernel(
ddl_context->video_ion_client,
addr->alloc_handle, UNCACHED);
@@ -97,31 +100,42 @@
addr->align_virtual_addr = addr->virtual_base_addr + offset;
addr->buffer_size = buffer_size;
} else {
- if (!addr->alloced_phys_addr) {
- pr_err(" %s() alloced addres NULL", __func__);
- goto bail_out;
+ if (!res_trk_check_for_sec_session()) {
+ if (!addr->alloced_phys_addr) {
+ pr_err(" %s() alloced addres NULL", __func__);
+ goto bail_out;
+ }
+ flags = MSM_SUBSYSTEM_MAP_IOVA |
+ MSM_SUBSYSTEM_MAP_KADDR;
+ if (alignment == DDL_KILO_BYTE(128))
+ index = 1;
+ else if (alignment > SZ_4K)
+ flags |= MSM_SUBSYSTEM_ALIGN_IOVA_8K;
+ addr->mapped_buffer =
+ msm_subsystem_map_buffer(
+ (unsigned long)addr->alloced_phys_addr,
+ sz, flags, &restrk_mmu_subsystem[index],
+ sizeof(restrk_mmu_subsystem[index])/
+ sizeof(unsigned int));
+ if (IS_ERR(addr->mapped_buffer)) {
+ pr_err(" %s() buffer map failed", __func__);
+ goto bail_out;
+ }
+ mapped_buffer = addr->mapped_buffer;
+ if (!mapped_buffer->vaddr || !mapped_buffer->iova[0]) {
+ pr_err("%s() map buffers failed\n", __func__);
+ goto bail_out;
+ }
+ addr->physical_base_addr =
+ (u8 *)mapped_buffer->iova[0];
+ addr->virtual_base_addr =
+ mapped_buffer->vaddr;
+ } else {
+ addr->physical_base_addr =
+ (u8 *) addr->alloced_phys_addr;
+ addr->virtual_base_addr =
+ (u8 *)addr->alloced_phys_addr;
}
- flags = MSM_SUBSYSTEM_MAP_IOVA | MSM_SUBSYSTEM_MAP_KADDR;
- if (alignment == DDL_KILO_BYTE(128))
- index = 1;
- else if (alignment > SZ_4K)
- flags |= MSM_SUBSYSTEM_ALIGN_IOVA_8K;
-
- addr->mapped_buffer =
- msm_subsystem_map_buffer((unsigned long)addr->alloced_phys_addr,
- sz, flags, &restrk_mmu_subsystem[index],
- sizeof(restrk_mmu_subsystem[index])/sizeof(unsigned int));
- if (IS_ERR(addr->mapped_buffer)) {
- pr_err(" %s() buffer map failed", __func__);
- goto bail_out;
- }
- mapped_buffer = addr->mapped_buffer;
- if (!mapped_buffer->vaddr || !mapped_buffer->iova[0]) {
- pr_err("%s() map buffers failed\n", __func__);
- goto bail_out;
- }
- addr->physical_base_addr = (u8 *)mapped_buffer->iova[0];
- addr->virtual_base_addr = mapped_buffer->vaddr;
addr->align_physical_addr = (u8 *) DDL_ALIGN((u32)
addr->physical_base_addr, alignment);
offset = (u32)(addr->align_physical_addr -
@@ -131,7 +145,7 @@
}
return addr->virtual_base_addr;
bail_out:
- if (addr->mapped_buffer)
+ if (IS_ERR(addr->mapped_buffer))
msm_subsystem_unmap_buffer(addr->mapped_buffer);
return NULL;
ion_unmap_bail_out:
@@ -143,62 +157,84 @@
return NULL;
}
-static void *res_trk_pmem_alloc
+static void res_trk_pmem_free(struct ddl_buf_addr *addr)
+{
+ struct ddl_context *ddl_context;
+ ddl_context = ddl_get_context();
+ if (ddl_context->video_ion_client) {
+ if (addr && addr->alloc_handle) {
+ ion_free(ddl_context->video_ion_client,
+ addr->alloc_handle);
+ addr->alloc_handle = NULL;
+ }
+ } else {
+ if (addr->mapped_buffer)
+ msm_subsystem_unmap_buffer(addr->mapped_buffer);
+ if (addr->alloced_phys_addr)
+ free_contiguous_memory_by_paddr(
+ (unsigned long)addr->alloced_phys_addr);
+ }
+ memset(addr, 0 , sizeof(struct ddl_buf_addr));
+}
+static int res_trk_pmem_alloc
(struct ddl_buf_addr *addr, size_t sz, u32 alignment)
{
u32 alloc_size;
struct ddl_context *ddl_context;
+ int rc = 0;
DBG_PMEM("\n%s() IN: Requested alloc size(%u)", __func__, (u32)sz);
if (!addr) {
DDL_MSG_ERROR("\n%s() Invalid Parameters", __func__);
+ rc = -EINVAL;
goto bail_out;
}
ddl_context = ddl_get_context();
res_trk_set_mem_type(addr->mem_type);
alloc_size = (sz + alignment);
if (res_trk_get_enable_ion()) {
- if (!ddl_context->video_ion_client)
- ddl_context->video_ion_client =
- res_trk_get_ion_client();
- if (!ddl_context->video_ion_client) {
- DDL_MSG_ERROR("%s() :DDL ION Client Invalid handle\n",
- __func__);
- goto bail_out;
+ if (!res_trk_is_cp_enabled() ||
+ !res_trk_check_for_sec_session()) {
+ if (!ddl_context->video_ion_client)
+ ddl_context->video_ion_client =
+ res_trk_get_ion_client();
+ if (!ddl_context->video_ion_client) {
+ DDL_MSG_ERROR(
+ "%s() :DDL ION Client Invalid handle\n",
+ __func__);
+ rc = -ENOMEM;
+ goto bail_out;
+ }
+ 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());
+ if (IS_ERR_OR_NULL(addr->alloc_handle)) {
+ DDL_MSG_ERROR("%s() :DDL ION alloc failed\n",
+ __func__);
+ rc = -ENOMEM;
+ goto bail_out;
+ }
+ } else {
+ addr->alloc_handle = NULL;
+ addr->alloced_phys_addr = PIL_FW_BASE_ADDR;
+ addr->buffer_size = sz;
}
- 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());
- if (IS_ERR_OR_NULL(addr->alloc_handle)) {
- DDL_MSG_ERROR("%s() :DDL ION alloc failed\n",
- __func__);
- goto free_acm_ion_alloc;
- }
- return (void *) addr->alloc_handle;
} else {
addr->alloced_phys_addr = (phys_addr_t)
- allocate_contiguous_memory_nomap(alloc_size,
- res_trk_get_mem_type(), SZ_4K);
+ allocate_contiguous_memory_nomap(alloc_size,
+ res_trk_get_mem_type(), SZ_4K);
if (!addr->alloced_phys_addr) {
DDL_MSG_ERROR("%s() : acm alloc failed (%d)\n",
- __func__, alloc_size);
+ __func__, alloc_size);
+ rc = -ENOMEM;
goto bail_out;
}
addr->buffer_size = sz;
- return (void *)addr->alloced_phys_addr;
- }
-
-
-free_acm_ion_alloc:
- if (ddl_context->video_ion_client) {
- if (addr->alloc_handle) {
- ion_free(ddl_context->video_ion_client,
- addr->alloc_handle);
- addr->alloc_handle = NULL;
- }
+ return rc;
}
bail_out:
- return NULL;
+ return rc;
}
static void res_trk_pmem_unmap(struct ddl_buf_addr *addr)
@@ -388,7 +424,8 @@
VCDRES_MSG_ERROR("Error : pm_runtime_get failed\n");
goto bail_out;
}
- resource_context.footswitch = regulator_get(NULL, "fs_ved");
+ if (!resource_context.footswitch)
+ resource_context.footswitch = regulator_get(NULL, "fs_ved");
if (IS_ERR(resource_context.footswitch)) {
VCDRES_MSG_ERROR("foot switch get failed\n");
resource_context.footswitch = NULL;
@@ -413,6 +450,35 @@
return video_client;
}
+int res_trk_enable_footswitch(void)
+{
+ int rc = 0;
+ mutex_lock(&resource_context.lock);
+ if (!resource_context.footswitch)
+ resource_context.footswitch = regulator_get(NULL, "fs_ved");
+ if (IS_ERR(resource_context.footswitch)) {
+ VCDRES_MSG_ERROR("foot switch get failed\n");
+ resource_context.footswitch = NULL;
+ rc = -EINVAL;
+ } else
+ rc = regulator_enable(resource_context.footswitch);
+ mutex_unlock(&resource_context.lock);
+ return rc;
+}
+
+int res_trk_disable_footswitch(void)
+{
+ mutex_lock(&resource_context.lock);
+ if (resource_context.footswitch) {
+ if (regulator_disable(resource_context.footswitch))
+ VCDRES_MSG_ERROR("Regulator disable failed\n");
+ regulator_put(resource_context.footswitch);
+ resource_context.footswitch = NULL;
+ }
+ mutex_unlock(&resource_context.lock);
+ return 0;
+}
+
u32 res_trk_power_up(void)
{
VCDRES_MSG_LOW("clk_regime_rail_enable");
@@ -438,6 +504,7 @@
{
VCDRES_MSG_LOW("clk_regime_rail_disable");
res_trk_pmem_unmap(&resource_context.firmware_addr);
+ res_trk_pmem_free(&resource_context.firmware_addr);
#ifdef CONFIG_MSM_BUS_SCALING
msm_bus_scale_client_update_request(resource_context.pcl, 0);
msm_bus_scale_unregister_client(resource_context.pcl);
@@ -640,14 +707,6 @@
}
resource_context.core_type = VCD_CORE_1080P;
resource_context.firmware_addr.mem_type = DDL_FW_MEM;
- if (!res_trk_pmem_alloc(&resource_context.firmware_addr,
- VIDC_FW_SIZE, DDL_KILO_BYTE(128))) {
- pr_err("%s() Firmware buffer allocation failed",
- __func__);
- if (!res_trk_check_for_sec_session())
- memset(&resource_context.firmware_addr, 0,
- sizeof(resource_context.firmware_addr));
- }
}
}
@@ -657,20 +716,47 @@
u32 res_trk_get_firmware_addr(struct ddl_buf_addr *firm_addr)
{
+ int rc = 0;
+ size_t size = 0;
if (!firm_addr || resource_context.firmware_addr.mapped_buffer) {
pr_err("%s() invalid params", __func__);
return -EINVAL;
}
+ if (res_trk_is_cp_enabled() && res_trk_check_for_sec_session())
+ size = PIL_FW_SIZE;
+ else
+ size = VIDC_FW_SIZE;
+
+ if (res_trk_pmem_alloc(&resource_context.firmware_addr,
+ size, DDL_KILO_BYTE(128))) {
+ pr_err("%s() Firmware buffer allocation failed",
+ __func__);
+ memset(&resource_context.firmware_addr, 0,
+ sizeof(resource_context.firmware_addr));
+ rc = -ENOMEM;
+ goto fail_alloc;
+ }
if (!res_trk_pmem_map(&resource_context.firmware_addr,
resource_context.firmware_addr.buffer_size,
DDL_KILO_BYTE(128))) {
pr_err("%s() Firmware buffer mapping failed",
__func__);
- return -EINVAL;
+ rc = -ENOMEM;
+ goto fail_map;
}
memcpy(firm_addr, &resource_context.firmware_addr,
sizeof(struct ddl_buf_addr));
return 0;
+fail_map:
+ res_trk_pmem_free(&resource_context.firmware_addr);
+fail_alloc:
+ return rc;
+}
+
+void res_trk_release_fw_addr(void)
+{
+ res_trk_pmem_unmap(&resource_context.firmware_addr);
+ res_trk_pmem_free(&resource_context.firmware_addr);
}
int res_trk_check_for_sec_session(void)
@@ -702,15 +788,27 @@
return mem_type;
}
if (resource_context.vidc_platform_data->enable_ion) {
- if (res_trk_check_for_sec_session())
- mem_type = (ION_HEAP(mem_type) | ION_SECURE);
- else
- mem_type = (ION_HEAP(mem_type) |
- ION_HEAP(ION_IOMMU_HEAP_ID));
+ 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;
}
+u32 res_trk_is_cp_enabled(void)
+{
+ if (resource_context.vidc_platform_data->cp_enabled)
+ return 1;
+ else
+ return 0;
+}
+
u32 res_trk_get_enable_ion(void)
{
if (resource_context.vidc_platform_data->enable_ion)
@@ -840,8 +938,8 @@
pr_err("IOMMU clock enabled failed while close");
goto error_close;
}
- msm_ion_unsecure_heap(ION_HEAP(resource_context.memtype));
msm_ion_unsecure_heap(ION_HEAP(resource_context.cmd_mem_type));
+ msm_ion_unsecure_heap(ION_HEAP(resource_context.memtype));
res_trk_disable_iommu_clocks();
mutex_unlock(&resource_context.secure_lock);
}
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 7d68412..80df34e 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
@@ -31,6 +31,7 @@
u32 res_trk_get_firmware_addr(struct ddl_buf_addr *firm_addr);
int res_trk_get_mem_type(void);
u32 res_trk_get_enable_ion(void);
+u32 res_trk_is_cp_enabled(void);
u32 res_trk_get_disable_fullhd(void);
struct ion_client *res_trk_get_ion_client(void);
u32 res_trk_get_disable_dmx(void);
@@ -43,4 +44,7 @@
void res_trk_secure_set(void);
void res_trk_secure_unset(void);
u32 get_res_trk_perf_level(enum vcd_perf_level);
+int res_trk_enable_footswitch(void);
+int res_trk_disable_footswitch(void);
+void res_trk_release_fw_addr(void);
#endif
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 f8ec0dc..e123ab1 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
@@ -757,3 +757,10 @@
{
return -ENOTSUPP;
}
+u32 res_trk_is_cp_enabled(void)
+{
+ if (resource_context.vidc_platform_data->cp_enabled)
+ return 1;
+ else
+ 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 cc414e2..4b77576 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
@@ -30,6 +30,7 @@
u32 res_trk_get_mem_type(void);
u32 res_trk_get_disable_fullhd(void);
u32 res_trk_get_enable_ion(void);
+u32 res_trk_is_cp_enabled(void);
struct ion_client *res_trk_get_ion_client(void);
void res_trk_set_mem_type(enum ddl_mem_area mem_type);
int res_trk_check_for_sec_session(void);
diff --git a/drivers/video/msm/vidc/common/init/vidc_init.c b/drivers/video/msm/vidc/common/init/vidc_init.c
index 55bbe00b..e641d62 100644
--- a/drivers/video/msm/vidc/common/init/vidc_init.c
+++ b/drivers/video/msm/vidc/common/init/vidc_init.c
@@ -345,28 +345,32 @@
{
u32 status = true;
- mutex_lock(&vidc_device_p->lock);
- if (!vidc_device_p->get_firmware) {
- status = res_trk_download_firmware();
- if (!status)
- goto error;
- vidc_device_p->get_firmware = 1;
- }
- vidc_device_p->firmware_refcount++;
+ if (!res_trk_check_for_sec_session()) {
+ mutex_lock(&vidc_device_p->lock);
+ if (!vidc_device_p->get_firmware) {
+ status = res_trk_download_firmware();
+ if (!status)
+ goto error;
+ vidc_device_p->get_firmware = 1;
+ }
+ vidc_device_p->firmware_refcount++;
error:
- mutex_unlock(&vidc_device_p->lock);
+ mutex_unlock(&vidc_device_p->lock);
+ }
return status;
}
EXPORT_SYMBOL(vidc_load_firmware);
void vidc_release_firmware(void)
{
- mutex_lock(&vidc_device_p->lock);
- if (vidc_device_p->firmware_refcount > 0)
- vidc_device_p->firmware_refcount--;
- else
- vidc_device_p->firmware_refcount = 0;
- mutex_unlock(&vidc_device_p->lock);
+ if (!res_trk_check_for_sec_session()) {
+ mutex_lock(&vidc_device_p->lock);
+ if (vidc_device_p->firmware_refcount > 0)
+ vidc_device_p->firmware_refcount--;
+ else
+ vidc_device_p->firmware_refcount = 0;
+ mutex_unlock(&vidc_device_p->lock);
+ }
}
EXPORT_SYMBOL(vidc_release_firmware);