vidc: Dec/Enc ION memory allocation according to new ION heap ID
Allocate ION memory from the newly defined ION heap IDs.
Change-Id: I599e13f3bd983a551fa62f00247228725fac8bcb
Signed-off-by: Deepak Kotur <dkotur@codeaurora.org>
diff --git a/arch/arm/mach-msm/devices-msm8x60.c b/arch/arm/mach-msm/devices-msm8x60.c
index 8f1709b..4023332 100644
--- a/arch/arm/mach-msm/devices-msm8x60.c
+++ b/arch/arm/mach-msm/devices-msm8x60.c
@@ -2151,7 +2151,7 @@
.vidc_bus_client_pdata = &vidc_bus_client_data,
#endif
#ifdef CONFIG_MSM_MULTIMEDIA_USE_ION
- .memtype = ION_HEAP_SMI_ID,
+ .memtype = ION_CP_MM_HEAP_ID,
.enable_ion = 1,
#else
.memtype = MEMTYPE_SMI_KERNEL,
diff --git a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl.c b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl.c
index f883fd7..1e02a2c 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl.c
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl.c
@@ -88,6 +88,7 @@
ddl_context->dram_base_a.align_virtual_addr;
}
if (!status) {
+ ddl_context->metadata_shared_input.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&ddl_context->metadata_shared_input,
DDL_METADATA_TOTAL_INPUTBUFSIZE,
DDL_LINEAR_BUFFER_ALIGN_BYTES);
@@ -163,14 +164,16 @@
DDL_MSG_ERROR("ddl_open:Client_trasac_failed");
return status;
}
+ ddl->shared_mem[0].mem_type = DDL_CMD_MEM;
ptr = ddl_pmem_alloc(&ddl->shared_mem[0],
- DDL_FW_AUX_HOST_CMD_SPACE_SIZE, sizeof(u32));
+ DDL_FW_AUX_HOST_CMD_SPACE_SIZE, 0);
if (!ptr)
status = VCD_ERR_ALLOC_FAIL;
if (!status && ddl_context->frame_channel_depth
== VCD_DUAL_FRAME_COMMAND_CHANNEL) {
+ ddl->shared_mem[1].mem_type = DDL_CMD_MEM;
ptr = ddl_pmem_alloc(&ddl->shared_mem[1],
- DDL_FW_AUX_HOST_CMD_SPACE_SIZE, sizeof(u32));
+ DDL_FW_AUX_HOST_CMD_SPACE_SIZE, 0);
if (!ptr) {
ddl_pmem_free(&ddl->shared_mem[0]);
status = VCD_ERR_ALLOC_FAIL;
@@ -278,7 +281,7 @@
#ifdef DDL_BUF_LOG
ddl_list_buffers(ddl);
#endif
-
+ encoder->seq_header.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&encoder->seq_header,
DDL_ENC_SEQHEADER_SIZE, DDL_LINEAR_BUFFER_ALIGN_BYTES);
if (!ptr) {
diff --git a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl.h b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl.h
index 051d32d..e613f29 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl.h
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl.h
@@ -84,6 +84,12 @@
#define DDL_MAX_NUM_IN_INPUTFRAME_POOL (DDL_MAX_NUM_OF_B_FRAME + 1)
+enum ddl_mem_area {
+ DDL_FW_MEM = 0x0,
+ DDL_MM_MEM = 0x1,
+ DDL_CMD_MEM = 0x2
+};
+
struct ddl_buf_addr{
u8 *virtual_base_addr;
u8 *physical_base_addr;
@@ -93,6 +99,7 @@
struct msm_mapped_buffer *mapped_buffer;
struct ion_handle *alloc_handle;
u32 buffer_size;
+ enum ddl_mem_area mem_type;
};
enum ddl_cmd_state{
DDL_CMD_INVALID = 0x0,
diff --git a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_core.h b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_core.h
index f8cbccd..e9c5193 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_core.h
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_core.h
@@ -60,7 +60,7 @@
#define DDL_ENC_MIN_DPB_BUFFERS 2
#define DDL_ENC_MAX_DPB_BUFFERS 4
-#define DDL_FW_AUX_HOST_CMD_SPACE_SIZE (DDL_KILO_BYTE(10))
+#define DDL_FW_AUX_HOST_CMD_SPACE_SIZE (DDL_KILO_BYTE(8))
#define DDL_FW_INST_GLOBAL_CONTEXT_SPACE_SIZE (DDL_KILO_BYTE(800))
#define DDL_FW_H264DEC_CONTEXT_SPACE_SIZE (DDL_KILO_BYTE(800))
#define DDL_FW_OTHER_CONTEXT_SPACE_SIZE (DDL_KILO_BYTE(10))
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 6078821..b3790a5 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_helper.c
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_helper.c
@@ -633,72 +633,84 @@
ddl_calc_dec_hw_buffers_size(ddl->codec_data.decoder.
codec.codec, width, height, dpb, &buf_size);
if (buf_size.sz_context > 0) {
+ dec_bufs->context.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&dec_bufs->context, buf_size.sz_context,
DDL_KILO_BYTE(2));
if (!ptr)
status = VCD_ERR_ALLOC_FAIL;
}
if (buf_size.sz_nb_ip > 0) {
+ dec_bufs->h264_nb_ip.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&dec_bufs->h264_nb_ip, buf_size.sz_nb_ip,
DDL_KILO_BYTE(2));
if (!ptr)
status = VCD_ERR_ALLOC_FAIL;
}
if (buf_size.sz_vert_nb_mv > 0) {
+ dec_bufs->h264_vert_nb_mv.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&dec_bufs->h264_vert_nb_mv,
buf_size.sz_vert_nb_mv, DDL_KILO_BYTE(2));
if (!ptr)
status = VCD_ERR_ALLOC_FAIL;
}
if (buf_size.sz_nb_dcac > 0) {
+ dec_bufs->nb_dcac.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&dec_bufs->nb_dcac, buf_size.sz_nb_dcac,
DDL_KILO_BYTE(2));
if (!ptr)
status = VCD_ERR_ALLOC_FAIL;
}
if (buf_size.sz_upnb_mv > 0) {
+ dec_bufs->upnb_mv.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&dec_bufs->upnb_mv, buf_size.sz_upnb_mv,
DDL_KILO_BYTE(2));
if (!ptr)
status = VCD_ERR_ALLOC_FAIL;
}
if (buf_size.sz_sub_anchor_mv > 0) {
+ dec_bufs->sub_anchor_mv.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&dec_bufs->sub_anchor_mv,
buf_size.sz_sub_anchor_mv, DDL_KILO_BYTE(2));
if (!ptr)
status = VCD_ERR_ALLOC_FAIL;
}
if (buf_size.sz_overlap_xform > 0) {
+ dec_bufs->overlay_xform.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&dec_bufs->overlay_xform,
buf_size.sz_overlap_xform, DDL_KILO_BYTE(2));
if (!ptr)
status = VCD_ERR_ALLOC_FAIL;
}
if (buf_size.sz_bit_plane3 > 0) {
+ dec_bufs->bit_plane3.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&dec_bufs->bit_plane3,
buf_size.sz_bit_plane3, DDL_KILO_BYTE(2));
if (!ptr)
status = VCD_ERR_ALLOC_FAIL;
}
if (buf_size.sz_bit_plane2 > 0) {
+ dec_bufs->bit_plane2.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&dec_bufs->bit_plane2,
buf_size.sz_bit_plane2, DDL_KILO_BYTE(2));
if (!ptr)
status = VCD_ERR_ALLOC_FAIL;
}
if (buf_size.sz_bit_plane1 > 0) {
+ dec_bufs->bit_plane1.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&dec_bufs->bit_plane1,
buf_size.sz_bit_plane1, DDL_KILO_BYTE(2));
if (!ptr)
status = VCD_ERR_ALLOC_FAIL;
}
if (buf_size.sz_stx_parser > 0) {
+ dec_bufs->stx_parser.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&dec_bufs->stx_parser,
buf_size.sz_stx_parser, DDL_KILO_BYTE(2));
if (!ptr)
status = VCD_ERR_ALLOC_FAIL;
}
if (buf_size.sz_desc > 0) {
+ dec_bufs->desc.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&dec_bufs->desc, buf_size.sz_desc,
DDL_KILO_BYTE(2));
if (!ptr)
@@ -830,48 +842,56 @@
enc_bufs->sz_dpb_y = buf_size.sz_dpb_y;
enc_bufs->sz_dpb_c = buf_size.sz_dpb_c;
if (buf_size.sz_mv > 0) {
+ enc_bufs->mv.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&enc_bufs->mv, buf_size.sz_mv,
DDL_KILO_BYTE(2));
if (!ptr)
status = VCD_ERR_ALLOC_FAIL;
}
if (buf_size.sz_col_zero > 0) {
+ enc_bufs->col_zero.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&enc_bufs->col_zero,
buf_size.sz_col_zero, DDL_KILO_BYTE(2));
if (!ptr)
status = VCD_ERR_ALLOC_FAIL;
}
if (buf_size.sz_md > 0) {
+ enc_bufs->md.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&enc_bufs->md, buf_size.sz_md,
DDL_KILO_BYTE(2));
if (!ptr)
status = VCD_ERR_ALLOC_FAIL;
}
if (buf_size.sz_pred > 0) {
+ enc_bufs->pred.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&enc_bufs->pred,
buf_size.sz_pred, DDL_KILO_BYTE(2));
if (!ptr)
status = VCD_ERR_ALLOC_FAIL;
}
if (buf_size.sz_nbor_info > 0) {
+ enc_bufs->nbor_info.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&enc_bufs->nbor_info,
buf_size.sz_nbor_info, DDL_KILO_BYTE(2));
if (!ptr)
status = VCD_ERR_ALLOC_FAIL;
}
if (buf_size.sz_acdc_coef > 0) {
+ enc_bufs->acdc_coef.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&enc_bufs->acdc_coef,
buf_size.sz_acdc_coef, DDL_KILO_BYTE(2));
if (!ptr)
status = VCD_ERR_ALLOC_FAIL;
}
if (buf_size.sz_mb_info > 0) {
+ enc_bufs->mb_info.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&enc_bufs->mb_info,
buf_size.sz_mb_info, DDL_KILO_BYTE(2));
if (!ptr)
status = VCD_ERR_ALLOC_FAIL;
}
if (buf_size.sz_context > 0) {
+ enc_bufs->context.mem_type = DDL_MM_MEM;
ptr = ddl_pmem_alloc(&enc_bufs->context,
buf_size.sz_context, DDL_KILO_BYTE(2));
if (!ptr)
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 43aba2e..f69a471 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_utils.c
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_utils.c
@@ -52,6 +52,7 @@
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)
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 79f56bd..3a86afc 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
@@ -224,8 +224,7 @@
static struct ion_client *res_trk_create_ion_client(void){
struct ion_client *video_client;
- video_client = msm_ion_client_create((1<<ION_HEAP_TYPE_CARVEOUT),
- "video_client");
+ video_client = msm_ion_client_create(-1, "video_client");
return video_client;
}
@@ -423,6 +422,10 @@
if (resource_context.vidc_platform_data) {
resource_context.memtype =
resource_context.vidc_platform_data->memtype;
+ resource_context.fw_mem_type =
+ resource_context.vidc_platform_data->memtype;
+ resource_context.cmd_mem_type =
+ resource_context.vidc_platform_data->memtype;
if (resource_context.vidc_platform_data->enable_ion) {
resource_context.res_ion_client =
res_trk_create_ion_client();
@@ -431,6 +434,10 @@
__func__);
return;
}
+ resource_context.fw_mem_type =
+ resource_context.vidc_platform_data->memtype;
+ resource_context.cmd_mem_type =
+ ION_CP_MFC_HEAP_ID;
}
resource_context.disable_dmx =
resource_context.vidc_platform_data->disable_dmx;
@@ -444,6 +451,7 @@
resource_context.disable_dmx = 0;
}
resource_context.core_type = VCD_CORE_1080P;
+ resource_context.firmware_addr.mem_type = DDL_FW_MEM;
if (!ddl_pmem_alloc(&resource_context.firmware_addr,
VIDC_FW_SIZE, DDL_KILO_BYTE(128))) {
pr_err("%s() Firmware buffer allocation failed",
@@ -469,8 +477,18 @@
return status;
}
-u32 res_trk_get_mem_type(void){
- return resource_context.memtype;
+u32 res_trk_get_mem_type(void)
+{
+ switch (resource_context.res_mem_type) {
+ case DDL_FW_MEM:
+ return resource_context.fw_mem_type;
+ case DDL_MM_MEM:
+ return resource_context.memtype;
+ case DDL_CMD_MEM:
+ return resource_context.cmd_mem_type;
+ default:
+ return 0;
+ }
}
u32 res_trk_get_enable_ion(void)
@@ -489,3 +507,9 @@
u32 res_trk_get_disable_dmx(void){
return resource_context.disable_dmx;
}
+
+void res_trk_set_mem_type(enum ddl_mem_area mem_type)
+{
+ resource_context.res_mem_type = mem_type;
+ return;
+}
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 a90ccec..7283991 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
@@ -40,6 +40,8 @@
struct regulator *footswitch;
struct msm_vidc_platform_data *vidc_platform_data;
int memtype;
+ int fw_mem_type;
+ int cmd_mem_type;
#ifdef CONFIG_MSM_BUS_SCALING
struct msm_bus_scale_pdata *vidc_bus_client_pdata;
uint32_t pcl;
@@ -48,6 +50,7 @@
struct ddl_buf_addr firmware_addr;
struct ion_client *res_ion_client;
u32 disable_dmx;
+ enum ddl_mem_area res_mem_type;
};
#if DEBUG
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 04f28c6..47fa363 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
@@ -33,4 +33,5 @@
u32 res_trk_get_enable_ion(void);
struct ion_client *res_trk_get_ion_client(void);
u32 res_trk_get_disable_dmx(void);
+void res_trk_set_mem_type(enum ddl_mem_area mem_type);
#endif
diff --git a/drivers/video/msm/vidc/720p/ddl/vcd_ddl.h b/drivers/video/msm/vidc/720p/ddl/vcd_ddl.h
index e5a5a84..e1407c8 100644
--- a/drivers/video/msm/vidc/720p/ddl/vcd_ddl.h
+++ b/drivers/video/msm/vidc/720p/ddl/vcd_ddl.h
@@ -67,6 +67,10 @@
#define DDL_DEC_REQ_OUTPUT_FLUSH 0x1
+enum ddl_mem_area {
+ DDL_MM_MEM = 0x0
+};
+
struct ddl_buf_addr {
u32 *physical_base_addr;
u32 *virtual_base_addr;
@@ -74,6 +78,7 @@
u32 *align_virtual_addr;
struct msm_mapped_buffer *mapped_buffer;
u32 buffer_size;
+ enum ddl_mem_area mem_type;
};
enum ddl_cmd_state {
@@ -282,4 +287,6 @@
void ddl_client_fatal_cb(struct ddl_context *ddl_context);
void ddl_hw_fatal_cb(struct ddl_context *ddl_context);
u32 ddl_hal_engine_reset(struct ddl_context *ddl_context);
+void ddl_pmem_alloc(struct ddl_buf_addr *addr, size_t sz, u32 alignment);
+void ddl_pmem_free(struct ddl_buf_addr *addr);
#endif
diff --git a/drivers/video/msm/vidc/720p/ddl/vcd_ddl_utils.h b/drivers/video/msm/vidc/720p/ddl/vcd_ddl_utils.h
index 4d39ef0..539f753 100644
--- a/drivers/video/msm/vidc/720p/ddl/vcd_ddl_utils.h
+++ b/drivers/video/msm/vidc/720p/ddl/vcd_ddl_utils.h
@@ -40,10 +40,6 @@
printk(KERN_DEBUG x); \
} while (0)
-void ddl_pmem_alloc(struct ddl_buf_addr *, u32, u32);
-
-void ddl_pmem_free(struct ddl_buf_addr *);
-
void ddl_set_core_start_time(const char *func_name, u32 index);
void ddl_calc_core_proc_time(const char *func_name, u32 index);
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 fe8e185..0172427 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
@@ -718,3 +718,8 @@
{
return NULL;
}
+
+void res_trk_set_mem_type(enum ddl_mem_area mem_type)
+{
+ return;
+}
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 7f9a2be..fbc91e2 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
@@ -14,6 +14,7 @@
#define _VIDEO_720P_RESOURCE_TRACKER_API_H_
#include "vcd_core.h"
+#include "vcd_ddl.h"
void res_trk_init(struct device *device, u32 irq);
u32 res_trk_power_up(void);
@@ -29,4 +30,5 @@
u32 res_trk_get_mem_type(void);
u32 res_trk_get_enable_ion(void);
struct ion_client *res_trk_get_ion_client(void);
+void res_trk_set_mem_type(enum ddl_mem_area mem_type);
#endif
diff --git a/drivers/video/msm/vidc/common/vcd/vcd_sub.c b/drivers/video/msm/vidc/common/vcd/vcd_sub.c
index 217030f..77affcd 100644
--- a/drivers/video/msm/vidc/common/vcd/vcd_sub.c
+++ b/drivers/video/msm/vidc/common/vcd/vcd_sub.c
@@ -57,6 +57,7 @@
pr_err("%s() map table is full", __func__);
goto bailout;
}
+ res_trk_set_mem_type(DDL_MM_MEM);
memtype = res_trk_get_mem_type();
if (!cctxt->vcd_enable_ion) {
map_buffer->phy_addr = (phys_addr_t)