msm: vidc: Misc bug fixes
- Fix issues with encoder OUTPUT port settings.
- Fix issues with Buffer counts.
- Fix typo in VPP cycle parsing.
CRs-Fixed: 2022735
Change-Id: Iaf302eb70f78ceaaeeb915cf3c29c6d32d368567
Signed-off-by: Praneeth Paladugu <ppaladug@codeaurora.org>
diff --git a/drivers/media/platform/msm/vidc/msm_vdec.c b/drivers/media/platform/msm/vidc/msm_vdec.c
index 7c99e90..b211175 100644
--- a/drivers/media/platform/msm/vidc/msm_vdec.c
+++ b/drivers/media/platform/msm/vidc/msm_vdec.c
@@ -522,7 +522,7 @@
inst->prop.width[CAPTURE_PORT] == f->fmt.pix_mp.width &&
inst->prop.height[CAPTURE_PORT] ==
f->fmt.pix_mp.height) {
- dprintk(VIDC_DBG, "Thank you : Nothing changed\n");
+ dprintk(VIDC_DBG, "No change in CAPTURE port params\n");
return 0;
}
memcpy(&inst->fmts[fmt->type], fmt,
@@ -590,7 +590,7 @@
inst->prop.width[OUTPUT_PORT] == f->fmt.pix_mp.width &&
inst->prop.height[OUTPUT_PORT] ==
f->fmt.pix_mp.height) {
- dprintk(VIDC_DBG, "Thank you : Nothing changed\n");
+ dprintk(VIDC_DBG, "No change in OUTPUT port params\n");
return 0;
}
inst->prop.width[OUTPUT_PORT] = f->fmt.pix_mp.width;
diff --git a/drivers/media/platform/msm/vidc/msm_venc.c b/drivers/media/platform/msm/vidc/msm_venc.c
index 12f4c54..7bfd255 100644
--- a/drivers/media/platform/msm/vidc/msm_venc.c
+++ b/drivers/media/platform/msm/vidc/msm_venc.c
@@ -2229,6 +2229,7 @@
struct hfi_device *hdev;
int extra_idx = 0, i = 0;
struct hal_buffer_requirements *buff_req_buffer;
+ struct hal_frame_size frame_sz;
if (!inst || !f) {
dprintk(VIDC_ERR,
@@ -2267,6 +2268,19 @@
inst->prop.width[CAPTURE_PORT] = f->fmt.pix_mp.width;
inst->prop.height[CAPTURE_PORT] = f->fmt.pix_mp.height;
+ frame_sz.buffer_type = HAL_BUFFER_OUTPUT;
+ frame_sz.width = inst->prop.width[CAPTURE_PORT];
+ frame_sz.height = inst->prop.height[CAPTURE_PORT];
+ dprintk(VIDC_DBG, "CAPTURE port width = %d, height = %d\n",
+ frame_sz.width, frame_sz.height);
+ rc = call_hfi_op(hdev, session_set_property, (void *)
+ inst->session, HAL_PARAM_FRAME_SIZE, &frame_sz);
+ if (rc) {
+ dprintk(VIDC_ERR,
+ "Failed to set framesize for CAPTURE port\n");
+ goto exit;
+ }
+
rc = msm_comm_try_get_bufreqs(inst);
if (rc) {
dprintk(VIDC_ERR,
@@ -2315,7 +2329,7 @@
frame_sz.buffer_type = HAL_BUFFER_INPUT;
frame_sz.width = inst->prop.width[OUTPUT_PORT];
frame_sz.height = inst->prop.height[OUTPUT_PORT];
- dprintk(VIDC_DBG, "width = %d, height = %d\n",
+ dprintk(VIDC_DBG, "OUTPUT port width = %d, height = %d\n",
frame_sz.width, frame_sz.height);
rc = call_hfi_op(hdev, session_set_property, (void *)
inst->session, HAL_PARAM_FRAME_SIZE, &frame_sz);
diff --git a/drivers/media/platform/msm/vidc/msm_vidc.c b/drivers/media/platform/msm/vidc/msm_vidc.c
index cce1a8e..d3af24e 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc.c
@@ -26,6 +26,9 @@
#define MAX_EVENTS 30
+static int try_get_ctrl(struct msm_vidc_inst *inst,
+ struct v4l2_ctrl *ctrl);
+
static int get_poll_flags(void *instance)
{
struct msm_vidc_inst *inst = instance;
@@ -254,11 +257,20 @@
int msm_vidc_g_ctrl(void *instance, struct v4l2_control *control)
{
struct msm_vidc_inst *inst = instance;
+ struct v4l2_ctrl *ctrl = NULL;
+ int rc = 0;
if (!inst || !control)
return -EINVAL;
- return msm_comm_g_ctrl(instance, control);
+ ctrl = v4l2_ctrl_find(&inst->ctrl_handler, control->id);
+ if (ctrl) {
+ rc = try_get_ctrl(inst, ctrl);
+ if (!rc)
+ control->value = ctrl->val;
+ }
+
+ return rc;
}
EXPORT_SYMBOL(msm_vidc_g_ctrl);
@@ -1222,21 +1234,22 @@
HAL_BUFFER_INPUT);
return -EINVAL;
}
- if (*num_buffers < bufreq->buffer_count_actual) {
+ if (*num_buffers < bufreq->buffer_count_min_host) {
dprintk(VIDC_ERR,
"Invalid parameters : Req = %d Act = %d\n",
- *num_buffers, bufreq->buffer_count_actual);
+ *num_buffers, bufreq->buffer_count_min_host);
return -EINVAL;
}
*num_planes = inst->bufq[OUTPUT_PORT].num_planes;
if (*num_buffers < MIN_NUM_OUTPUT_BUFFERS ||
*num_buffers > MAX_NUM_OUTPUT_BUFFERS)
- *num_buffers = MIN_NUM_OUTPUT_BUFFERS;
+ bufreq->buffer_count_actual = *num_buffers =
+ MIN_NUM_OUTPUT_BUFFERS;
for (i = 0; i < *num_planes; i++)
sizes[i] = inst->bufq[OUTPUT_PORT].plane_sizes[i];
bufreq->buffer_count_actual = *num_buffers;
- rc = set_buffer_count(inst, bufreq->buffer_count_min_host,
+ rc = set_buffer_count(inst, bufreq->buffer_count_actual,
*num_buffers, HAL_BUFFER_INPUT);
}
@@ -1251,22 +1264,27 @@
buffer_type);
return -EINVAL;
}
- if (*num_buffers < bufreq->buffer_count_actual) {
- dprintk(VIDC_ERR,
- "Invalid parameters : Req = %d Act = %d\n",
- *num_buffers, bufreq->buffer_count_actual);
- return -EINVAL;
+ if (inst->session_type != MSM_VIDC_DECODER &&
+ inst->state > MSM_VIDC_LOAD_RESOURCES_DONE) {
+ if (*num_buffers < bufreq->buffer_count_min_host) {
+ dprintk(VIDC_ERR,
+ "Invalid parameters : Req = %d Act = %d\n",
+ *num_buffers,
+ bufreq->buffer_count_min_host);
+ return -EINVAL;
+ }
}
*num_planes = inst->bufq[CAPTURE_PORT].num_planes;
if (*num_buffers < MIN_NUM_CAPTURE_BUFFERS ||
*num_buffers > MAX_NUM_CAPTURE_BUFFERS)
- *num_buffers = MIN_NUM_CAPTURE_BUFFERS;
+ bufreq->buffer_count_actual = *num_buffers =
+ MIN_NUM_CAPTURE_BUFFERS;
for (i = 0; i < *num_planes; i++)
sizes[i] = inst->bufq[CAPTURE_PORT].plane_sizes[i];
bufreq->buffer_count_actual = *num_buffers;
- rc = set_buffer_count(inst, bufreq->buffer_count_min_host,
+ rc = set_buffer_count(inst, bufreq->buffer_count_actual,
*num_buffers, buffer_type);
}
break;
@@ -1290,24 +1308,40 @@
{
int rc = 0, i = 0;
+ /* For decoder No need to sanity till LOAD_RESOURCES */
+ if (inst->session_type == MSM_VIDC_DECODER &&
+ inst->state < MSM_VIDC_LOAD_RESOURCES_DONE) {
+ dprintk(VIDC_DBG,
+ "No need to verify buffer counts : %pK\n", inst);
+ return 0;
+ }
+
for (i = 0; i < HAL_BUFFER_MAX; i++) {
struct hal_buffer_requirements *req = &inst->buff_req.buffer[i];
- dprintk(VIDC_DBG, "Verifying Buffer : %d\n", req->buffer_type);
- if (!req ||
- req->buffer_count_actual < req->buffer_count_min_host ||
- req->buffer_count_min_host < req->buffer_count_min) {
- dprintk(VIDC_ERR, "Invalid data : Counts mismatch\n");
- dprintk(VIDC_ERR,
- "Min Count = %d ", req->buffer_count_min);
- dprintk(VIDC_ERR,
- "Min Host Count = %d ",
- req->buffer_count_min_host);
- dprintk(VIDC_ERR,
- "Min Actual Count = %d\n",
- req->buffer_count_actual);
- rc = -EINVAL;
- break;
+ if (req && (msm_comm_get_hal_output_buffer(inst) ==
+ req->buffer_type)) {
+ dprintk(VIDC_DBG, "Verifying Buffer : %d\n",
+ req->buffer_type);
+ if (req->buffer_count_actual <
+ req->buffer_count_min_host ||
+ req->buffer_count_min_host <
+ req->buffer_count_min) {
+
+ dprintk(VIDC_ERR,
+ "Invalid data : Counts mismatch\n");
+ dprintk(VIDC_ERR,
+ "Min Count = %d ",
+ req->buffer_count_min);
+ dprintk(VIDC_ERR,
+ "Min Host Count = %d ",
+ req->buffer_count_min_host);
+ dprintk(VIDC_ERR,
+ "Min Actual Count = %d\n",
+ req->buffer_count_actual);
+ rc = -EINVAL;
+ break;
+ }
}
}
return rc;
@@ -1729,7 +1763,7 @@
}
-static int msm_vdec_get_count(struct msm_vidc_inst *inst,
+static int msm_vidc_get_count(struct msm_vidc_inst *inst,
struct v4l2_ctrl *ctrl)
{
int rc = 0;
@@ -1750,15 +1784,19 @@
}
if (ctrl->val > bufreq->buffer_count_min_host) {
dprintk(VIDC_DBG,
- "Interesting : Usually shouldn't happen\n");
+ "Buffer count Host changed from %d to %d\n",
+ bufreq->buffer_count_min_host,
+ ctrl->val);
bufreq->buffer_count_min_host = ctrl->val;
+ } else {
+ ctrl->val = bufreq->buffer_count_min_host;
}
- rc = set_actual_buffer_count(inst, ctrl->val,
+ rc = set_actual_buffer_count(inst,
+ bufreq->buffer_count_min_host,
HAL_BUFFER_INPUT);
return rc;
} else if (ctrl->id == V4L2_CID_MIN_BUFFERS_FOR_CAPTURE) {
- int count = 0;
buffer_type = msm_comm_get_hal_output_buffer(inst);
bufreq = get_buff_req_buffer(inst,
@@ -1775,7 +1813,7 @@
else
return 0;
}
- count = bufreq->buffer_count_min_host;
+
if (inst->in_reconfig) {
rc = msm_comm_try_get_bufreqs(inst);
@@ -1787,21 +1825,28 @@
buffer_type);
return 0;
}
- newreq->buffer_count_min_host = count =
- newreq->buffer_count_min +
- msm_dcvs_get_extra_buff_count(inst);
+ ctrl->val = newreq->buffer_count_min;
}
- if (!inst->in_reconfig &&
+ if (inst->session_type == MSM_VIDC_DECODER &&
+ !inst->in_reconfig &&
inst->state < MSM_VIDC_LOAD_RESOURCES_DONE) {
- dprintk(VIDC_DBG, "Clients will correct this\n");
- rc = set_actual_buffer_count(inst, ctrl->val,
- buffer_type);
+ dprintk(VIDC_DBG,
+ "Clients updates Buffer count from %d to %d\n",
+ bufreq->buffer_count_min_host, ctrl->val);
bufreq->buffer_count_min_host = ctrl->val;
- return 0;
}
- bufreq->buffer_count_min_host = ctrl->val = count;
- rc = set_actual_buffer_count(inst, ctrl->val,
- buffer_type);
+ if (ctrl->val > bufreq->buffer_count_min_host) {
+ dprintk(VIDC_DBG,
+ "Buffer count Host changed from %d to %d\n",
+ bufreq->buffer_count_min_host,
+ ctrl->val);
+ bufreq->buffer_count_min_host = ctrl->val;
+ } else {
+ ctrl->val = bufreq->buffer_count_min_host;
+ }
+ rc = set_actual_buffer_count(inst,
+ bufreq->buffer_count_min_host,
+ HAL_BUFFER_OUTPUT);
return rc;
}
@@ -1817,7 +1862,6 @@
* lower level code that attempts to do g_ctrl() will end up deadlocking
* us.
*/
- v4l2_ctrl_unlock(ctrl);
switch (ctrl->id) {
@@ -1838,7 +1882,7 @@
case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE:
case V4L2_CID_MIN_BUFFERS_FOR_OUTPUT:
- rc = msm_vdec_get_count(inst, ctrl);
+ rc = msm_vidc_get_count(inst, ctrl);
break;
default:
/*
@@ -1846,8 +1890,7 @@
* modify ctrl->value
*/
break;
- }
- v4l2_ctrl_lock(ctrl);
+}
return rc;
}
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_clocks.c b/drivers/media/platform/msm/vidc/msm_vidc_clocks.c
index 70427d3..1c78a45 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_clocks.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc_clocks.c
@@ -422,19 +422,29 @@
int msm_dcvs_try_enable(struct msm_vidc_inst *inst)
{
+ bool force_disable = false;
+
if (!inst) {
dprintk(VIDC_ERR, "%s: Invalid args: %p\n", __func__, inst);
return -EINVAL;
}
- if (inst->flags & VIDC_THUMBNAIL) {
+
+ force_disable = inst->session_type == MSM_VIDC_ENCODER ?
+ !msm_vidc_enc_dcvs_mode :
+ !msm_vidc_dec_dcvs_mode;
+
+ if (force_disable || inst->flags & VIDC_THUMBNAIL) {
dprintk(VIDC_PROF, "Thumbnail sessions don't need DCVS : %pK\n",
inst);
+ inst->dcvs.extra_capture_buffer_count = 0;
+ inst->dcvs.extra_output_buffer_count = 0;
return false;
}
inst->dcvs_mode = true;
// TODO : Update with proper number based on on-target tuning.
- inst->dcvs.extra_buffer_count = DCVS_DEC_EXTRA_OUTPUT_BUFFERS;
+ inst->dcvs.extra_capture_buffer_count = DCVS_DEC_EXTRA_OUTPUT_BUFFERS;
+ inst->dcvs.extra_output_buffer_count = DCVS_DEC_EXTRA_OUTPUT_BUFFERS;
return true;
}
@@ -566,14 +576,17 @@
msm_dcvs_print_dcvs_stats(dcvs);
}
-int msm_dcvs_get_extra_buff_count(struct msm_vidc_inst *inst)
+int msm_vidc_get_extra_buff_count(struct msm_vidc_inst *inst,
+ enum hal_buffer buffer_type)
{
if (!inst) {
dprintk(VIDC_ERR, "%s Invalid args\n", __func__);
return 0;
}
- return inst->dcvs.extra_buffer_count;
+ return buffer_type == HAL_BUFFER_INPUT ?
+ inst->dcvs.extra_output_buffer_count :
+ inst->dcvs.extra_capture_buffer_count;
}
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_clocks.h b/drivers/media/platform/msm/vidc/msm_vidc_clocks.h
index 0229ccbb..79fd8f6 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_clocks.h
+++ b/drivers/media/platform/msm/vidc/msm_vidc_clocks.h
@@ -32,7 +32,8 @@
#define DCVS_BUFFER_SAFEGUARD (DCVS_DEC_EXTRA_OUTPUT_BUFFERS - 1)
void msm_dcvs_init(struct msm_vidc_inst *inst);
-int msm_dcvs_get_extra_buff_count(struct msm_vidc_inst *inst);
+int msm_vidc_get_extra_buff_count(struct msm_vidc_inst *inst,
+ enum hal_buffer buffer_type);
int msm_dcvs_try_enable(struct msm_vidc_inst *inst);
int msm_comm_scale_clocks_and_bus(struct msm_vidc_inst *inst);
int msm_comm_init_clocks_and_bus_data(struct msm_vidc_inst *inst);
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_common.c b/drivers/media/platform/msm/vidc/msm_vidc_common.c
index 274eed7..f002e76 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_common.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc_common.c
@@ -3992,32 +3992,89 @@
return rc;
}
+static int msm_vidc_update_host_buff_counts(struct msm_vidc_inst *inst)
+{
+ int extra_buffers, buffer_type;
+ struct hal_buffer_requirements *bufreq;
+
+ bufreq = get_buff_req_buffer(inst,
+ HAL_BUFFER_INPUT);
+ if (!bufreq) {
+ dprintk(VIDC_ERR,
+ "Failed : No buffer requirements : %x\n",
+ HAL_BUFFER_INPUT);
+ return -EINVAL;
+ }
+ extra_buffers = msm_vidc_get_extra_buff_count(inst, HAL_BUFFER_INPUT);
+
+ bufreq->buffer_count_min_host = bufreq->buffer_count_min +
+ extra_buffers;
+
+ buffer_type = msm_comm_get_hal_output_buffer(inst);
+ bufreq = get_buff_req_buffer(inst,
+ buffer_type);
+ if (!bufreq) {
+ dprintk(VIDC_ERR,
+ "Failed : No buffer requirements : %x\n",
+ buffer_type);
+ return -EINVAL;
+ }
+
+ extra_buffers = msm_vidc_get_extra_buff_count(inst, buffer_type);
+
+ bufreq->buffer_count_min_host = bufreq->buffer_count_min +
+ extra_buffers;
+
+ return 0;
+}
+
int msm_comm_try_get_bufreqs(struct msm_vidc_inst *inst)
{
int rc = 0, i = 0;
union hal_get_property hprop;
+ memset(&hprop, 0x0, sizeof(hprop));
+
rc = msm_comm_try_get_prop(inst, HAL_PARAM_GET_BUFFER_REQUIREMENTS,
- &hprop);
+ &hprop);
if (rc) {
dprintk(VIDC_ERR, "Failed getting buffer requirements: %d", rc);
return rc;
}
- dprintk(VIDC_DBG, "Buffer requirements:\n");
- dprintk(VIDC_DBG, "%15s %8s %8s\n", "buffer type", "count", "size");
+ dprintk(VIDC_DBG, "Buffer requirements from HW:\n");
+ dprintk(VIDC_DBG, "%15s %8s %8s %8s %8s\n",
+ "buffer type", "count", "mincount_host", "mincount_fw", "size");
for (i = 0; i < HAL_BUFFER_MAX; i++) {
struct hal_buffer_requirements req = hprop.buf_req.buffer[i];
inst->buff_req.buffer[i] = req;
- dprintk(VIDC_DBG, "%15s %8d %8d\n",
+ if (req.buffer_type != HAL_BUFFER_NONE) {
+ dprintk(VIDC_DBG, "%15s %8d %8d %8d %8d\n",
get_buffer_name(req.buffer_type),
- req.buffer_count_actual, req.buffer_size);
+ req.buffer_count_actual,
+ req.buffer_count_min_host,
+ req.buffer_count_min, req.buffer_size);
+ }
}
- dprintk(VIDC_PROF, "Input buffers: %d, Output buffers: %d\n",
- inst->buff_req.buffer[0].buffer_count_actual,
- inst->buff_req.buffer[1].buffer_count_actual);
+ rc = msm_vidc_update_host_buff_counts(inst);
+
+ dprintk(VIDC_DBG, "Buffer requirements host adjusted:\n");
+ dprintk(VIDC_DBG, "%15s %8s %8s %8s %8s\n",
+ "buffer type", "count", "mincount_host", "mincount_fw", "size");
+ for (i = 0; i < HAL_BUFFER_MAX; i++) {
+ struct hal_buffer_requirements req = hprop.buf_req.buffer[i];
+
+ inst->buff_req.buffer[i] = req;
+ if (req.buffer_type != HAL_BUFFER_NONE) {
+ dprintk(VIDC_DBG, "%15s %8d %8d %8d %8d\n",
+ get_buffer_name(req.buffer_type),
+ req.buffer_count_actual,
+ req.buffer_count_min_host,
+ req.buffer_count_min, req.buffer_size);
+ }
+ }
return rc;
}
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_internal.h b/drivers/media/platform/msm/vidc/msm_vidc_internal.h
index 8562e8f..4b91193 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_internal.h
+++ b/drivers/media/platform/msm/vidc/msm_vidc_internal.h
@@ -212,7 +212,8 @@
int load_high;
int min_threshold;
int max_threshold;
- unsigned int extra_buffer_count;
+ unsigned int extra_capture_buffer_count;
+ unsigned int extra_output_buffer_count;
enum hal_buffer buffer_type;
};
diff --git a/drivers/media/platform/msm/vidc/msm_vidc_res_parse.c b/drivers/media/platform/msm/vidc/msm_vidc_res_parse.c
index 8b9018c..763c41d 100644
--- a/drivers/media/platform/msm/vidc/msm_vidc_res_parse.c
+++ b/drivers/media/platform/msm/vidc/msm_vidc_res_parse.c
@@ -499,7 +499,7 @@
"qcom,vpp-cycles-per-mb", NULL)) {
rc = of_property_read_u32(child_node,
"qcom,vpp-cycles-per-mb",
- &entry->vsp_cycles);
+ &entry->vpp_cycles);
if (rc) {
dprintk(VIDC_ERR,
"qcom,vpp-cycles-per-mb not found\n");