msm: vidc: Add a check for separate metadata buffers
Added a check for separate metadata buffers based on
the board specific platform data.
Change-Id: I24d51329d93215da75d115ccfa8fc1f3fe260b7f
Signed-off-by: Deepak Verma <dverma@codeaurora.org>
Conflicts:
drivers/video/msm/vidc/1080p/resource_tracker/vcd_res_tracker.c
Signed-off-by: Deepak Verma <dverma@codeaurora.org>
diff --git a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl.c b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl.c
index 9bdcba6..26e8f36 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl.c
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl.c
@@ -198,7 +198,9 @@
ddl->client_state = DDL_CLIENT_OPEN;
ddl->codec_data.hdr.decoding = decoding;
ddl->decoding = decoding;
- ddl_set_default_meta_data_hdr(ddl);
+ if (!res_trk_check_for_sec_session() ||
+ res_trk_get_enable_sec_metadata())
+ ddl_set_default_meta_data_hdr(ddl);
ddl_set_initial_default_values(ddl);
*ddl_handle = (u32 *) ddl;
} else {
diff --git a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.c b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.c
index e17dd00..7449a4a 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.c
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.c
@@ -14,6 +14,7 @@
#include "vcd_ddl.h"
#include "vcd_ddl_shared_mem.h"
#include "vcd_ddl_metadata.h"
+#include "vcd_res_tracker_api.h"
static u32 *ddl_metadata_hdr_entry(struct ddl_client_context *ddl,
u32 meta_data)
@@ -188,6 +189,8 @@
u32 flag = decoder->meta_data_enable_flag;
u32 suffix = 0, size = 0;
if (!flag) {
+ output_buf_req->meta_buffer_size =
+ DDL_SECURE_METADATA_DEFAULT_SIZE;
decoder->suffix = 0;
return;
}
@@ -493,7 +496,7 @@
align_physical_addr, decoder->dp_buf.
dec_pic_buffers[loopc].vcd_frm.physical));
}
- } else {
+ } else if (res_trk_get_enable_sec_metadata()) {
*buffer++ = decoder->actual_output_buf_req.meta_buffer_size;
for (loopc = 0; loopc < dpb; ++loopc) {
*buffer++ = DDL_ADDR_OFFSET(ddl_context->dram_base_a,
diff --git a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.h b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.h
index e03a9b7..8cee92f 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.h
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -19,6 +19,7 @@
#define DDL_METADATA_EXTRAPAD_SIZE 256
#define DDL_METADATA_HDR_SIZE 20
#define DDL_METADATA_EXTRADATANONE_SIZE 24
+#define DDL_SECURE_METADATA_DEFAULT_SIZE 8192
#define DDL_METADATA_ALIGNSIZE(x) ((x) = (((x) + 0x7) & ~0x7))
#define DDL_METADATA_MANDATORY \
(VCD_METADATA_DATANONE | VCD_METADATA_QCOMFILLER)
diff --git a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_properties.c b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_properties.c
index 6fb8f6c..8756cd4 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_properties.c
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_properties.c
@@ -1311,6 +1311,13 @@
vcd_status = VCD_S_SUCCESS;
}
break;
+ case VCD_I_ENABLE_SEC_METADATA:
+ if (sizeof(u32) == property_hdr->sz) {
+ *(u32 *)property_value =
+ res_trk_get_enable_sec_metadata();
+ vcd_status = VCD_S_SUCCESS;
+ }
+ break;
case VCD_I_DISABLE_DMX:
if (sizeof(u32) == property_hdr->sz) {
*(u32 *)property_value = decoder->dmx_disable;
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 9dfb5d1..c7ba00c 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
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2013, Linux Foundation. All rights reserved.
+/* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -756,6 +756,9 @@
resource_context.vidc_platform_data->disable_dmx;
resource_context.disable_fullhd =
resource_context.vidc_platform_data->disable_fullhd;
+ resource_context.enable_sec_metadata =
+ resource_context.vidc_platform_data->
+ enable_sec_metadata;
#ifdef CONFIG_MSM_BUS_SCALING
resource_context.vidc_bus_client_pdata =
resource_context.vidc_platform_data->
@@ -914,6 +917,10 @@
{
return resource_context.disable_fullhd;
}
+u32 res_trk_get_enable_sec_metadata(void)
+{
+ return resource_context.enable_sec_metadata;
+}
int res_trk_enable_iommu_clocks(void)
{
diff --git a/drivers/video/msm/vidc/1080p/resource_tracker/vcd_res_tracker.h b/drivers/video/msm/vidc/1080p/resource_tracker/vcd_res_tracker.h
index a980230..2fa82ac 100644
--- a/drivers/video/msm/vidc/1080p/resource_tracker/vcd_res_tracker.h
+++ b/drivers/video/msm/vidc/1080p/resource_tracker/vcd_res_tracker.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -53,6 +53,7 @@
struct ion_client *res_ion_client;
u32 disable_dmx;
u32 disable_fullhd;
+ u32 enable_sec_metadata;
enum ddl_mem_area res_mem_type;
u32 mmu_clks_on;
u32 secure_session;
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 ee876f4..15ffa96 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
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2012, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2010-2013, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -34,6 +34,7 @@
u32 res_trk_get_enable_ion(void);
u32 res_trk_is_cp_enabled(void);
u32 res_trk_get_disable_fullhd(void);
+u32 res_trk_get_enable_sec_metadata(void);
struct ion_client *res_trk_get_ion_client(void);
u32 res_trk_get_disable_dmx(void);
u32 res_trk_get_min_dpb_count(void);
diff --git a/drivers/video/msm/vidc/common/dec/vdec.c b/drivers/video/msm/vidc/common/dec/vdec.c
index 3efc4d3..a978593 100644
--- a/drivers/video/msm/vidc/common/dec/vdec.c
+++ b/drivers/video/msm/vidc/common/dec/vdec.c
@@ -273,7 +273,8 @@
(vcd_frame_data->flags & VCD_FRAME_FLAG_EOS)) {
if (res_trk_check_for_sec_session() &&
- event == VCD_EVT_RESP_OUTPUT_DONE) {
+ res_trk_get_enable_sec_metadata() &&
+ event == VCD_EVT_RESP_OUTPUT_DONE) {
DBG("Buffer Index = %d", buffer_index);
if (buffer_index != -1) {
if (client_ctx->meta_addr_table[buffer_index].
@@ -735,6 +736,22 @@
return true;
}
+static u32 vid_dec_get_enable_secure_metadata(struct video_client_ctx
+ *client_ctx, u32 *enable_sec_metadata)
+{
+
+ struct vcd_property_hdr vcd_property_hdr;
+ if (!client_ctx || !enable_sec_metadata)
+ return false;
+ vcd_property_hdr.prop_id = VCD_I_ENABLE_SEC_METADATA;
+ vcd_property_hdr.sz = sizeof(u32);
+ if (vcd_get_property(client_ctx->vcd_handle, &vcd_property_hdr,
+ enable_sec_metadata))
+ return false;
+ else
+ return true;
+}
+
static u32 vid_dec_get_disable_dmx_support(struct video_client_ctx *client_ctx,
u32 *disable_dmx)
{
@@ -2242,6 +2259,23 @@
break;
}
+ case VDEC_IOCTL_GET_ENABLE_SEC_METADATA:
+ {
+ u32 enable_sec_metadata;
+ DBG("VDEC_IOCTL_GET_ENABLE_SEC_METADATA\n");
+ if (copy_from_user(&vdec_msg, arg, sizeof(vdec_msg)))
+ return -EFAULT;
+ result = vid_dec_get_enable_secure_metadata(client_ctx,
+ &enable_sec_metadata);
+ if (result) {
+ if (copy_to_user(vdec_msg.out, &enable_sec_metadata,
+ sizeof(u32)))
+ return -EFAULT;
+ } else
+ return -EIO;
+ break;
+ }
+
case VDEC_IOCTL_GET_DISABLE_DMX_SUPPORT:
{
u32 disable_dmx;
@@ -2334,7 +2368,11 @@
if (copy_from_user(&meta_buffers, vdec_msg.in,
sizeof(meta_buffers)))
return -EFAULT;
- result = vid_dec_set_meta_buffers(client_ctx, &meta_buffers);
+ if (res_trk_get_enable_sec_metadata())
+ result =
+ vid_dec_set_meta_buffers(client_ctx, &meta_buffers);
+ else
+ ERR("ERROR : Meta data is not enabled.\n");
if (!result)
return -EIO;
@@ -2343,7 +2381,10 @@
case VDEC_IOCTL_FREE_META_BUFFERS:
{
DBG("VDEC_IOCTL_FREE_META_BUFFERS\n");
- result = vid_dec_free_meta_buffers(client_ctx);
+ if (res_trk_get_enable_sec_metadata())
+ result = vid_dec_free_meta_buffers(client_ctx);
+ else
+ ERR("ERROR : Can't free. Meta data is not enabled.\n");
if (!result)
return -EIO;
break;
diff --git a/include/linux/msm_vidc_dec.h b/include/linux/msm_vidc_dec.h
index cc864f0..cd363c5 100644
--- a/include/linux/msm_vidc_dec.h
+++ b/include/linux/msm_vidc_dec.h
@@ -220,6 +220,9 @@
#define VDEC_IOCTL_FREE_META_BUFFERS \
_IO(VDEC_IOCTL_MAGIC, 40)
+#define VDEC_IOCTL_GET_ENABLE_SEC_METADATA \
+ _IOR(VDEC_IOCTL_MAGIC, 41, struct vdec_ioctl_msg)
+
enum vdec_picture {
PICTURE_TYPE_I,
PICTURE_TYPE_P,
diff --git a/include/media/msm/vcd_property.h b/include/media/msm/vcd_property.h
index 698dd3b..fe16ee0 100644
--- a/include/media/msm/vcd_property.h
+++ b/include/media/msm/vcd_property.h
@@ -59,6 +59,8 @@
#define VCD_I_ENABLE_VUI_TIMING_INFO (VCD_START_BASE + 0x2B)
#define VCD_I_SET_EXT_METABUFFER (VCD_START_BASE + 0x2C)
#define VCD_I_FREE_EXT_METABUFFER (VCD_START_BASE + 0x2D)
+#define VCD_I_ENABLE_SEC_METADATA (VCD_START_BASE + 0x2E)
+
#define VCD_START_REQ (VCD_START_BASE + 0x1000)
#define VCD_I_REQ_IFRAME (VCD_START_REQ + 0x1)