Merge "msm: vdec: Allocate max internal buffers"

This commit is contained in:
Linux Build Service Account 2017-07-20 02:56:46 -07:00 committed by Gerrit - the friendly Code Review server
commit 7aa065cbc4
4 changed files with 47 additions and 65 deletions

View file

@ -1571,9 +1571,10 @@ exit:
return rc; return rc;
} }
static inline int set_max_internal_buffers_size(struct msm_vidc_inst *inst) static int set_max_internal_buffers_size(struct msm_vidc_inst *inst)
{ {
int rc = 0; int rc = 0;
struct msm_vidc_list *buf_list = &inst->scratchbufs;
struct { struct {
enum hal_buffer type; enum hal_buffer type;
struct hal_buffer_requirements *req; struct hal_buffer_requirements *req;
@ -1581,13 +1582,17 @@ static inline int set_max_internal_buffers_size(struct msm_vidc_inst *inst)
} internal_buffers[] = { } internal_buffers[] = {
{ HAL_BUFFER_INTERNAL_SCRATCH, NULL, 0}, { HAL_BUFFER_INTERNAL_SCRATCH, NULL, 0},
{ HAL_BUFFER_INTERNAL_SCRATCH_1, NULL, 0}, { HAL_BUFFER_INTERNAL_SCRATCH_1, NULL, 0},
{ HAL_BUFFER_INTERNAL_SCRATCH_2, NULL, 0},
{ HAL_BUFFER_INTERNAL_PERSIST, NULL, 0},
{ HAL_BUFFER_INTERNAL_PERSIST_1, NULL, 0},
}; };
struct hal_frame_size frame_sz; struct hal_frame_size frame_sz;
int i; int i;
mutex_lock(&buf_list->lock);
if (!list_empty(&buf_list->list)) {
dprintk(VIDC_DBG, "Scratch list already has allocated buf\n");
mutex_unlock(&buf_list->lock);
return 0;
}
mutex_unlock(&buf_list->lock);
frame_sz.buffer_type = HAL_BUFFER_INPUT; frame_sz.buffer_type = HAL_BUFFER_INPUT;
frame_sz.width = inst->capability.width.max; frame_sz.width = inst->capability.width.max;
@ -1613,6 +1618,15 @@ static inline int set_max_internal_buffers_size(struct msm_vidc_inst *inst)
get_buff_req_buffer(inst, internal_buffers[i].type); get_buff_req_buffer(inst, internal_buffers[i].type);
internal_buffers[i].size = internal_buffers[i].req ? internal_buffers[i].size = internal_buffers[i].req ?
internal_buffers[i].req->buffer_size : 0; internal_buffers[i].req->buffer_size : 0;
rc = allocate_and_set_internal_bufs(inst,
internal_buffers[i].req,
&inst->scratchbufs, false);
if (rc)
goto alloc_fail;
dprintk(VIDC_DBG,
"Allocated scratch type : %d size to : %zd\n",
internal_buffers[i].type, internal_buffers[i].size);
} }
frame_sz.buffer_type = HAL_BUFFER_INPUT; frame_sz.buffer_type = HAL_BUFFER_INPUT;
@ -1625,25 +1639,18 @@ static inline int set_max_internal_buffers_size(struct msm_vidc_inst *inst)
dprintk(VIDC_ERR, dprintk(VIDC_ERR,
"%s Failed to get back old buf req, %d\n", "%s Failed to get back old buf req, %d\n",
__func__, rc); __func__, rc);
return rc; goto alloc_fail;
} }
dprintk(VIDC_DBG, dprintk(VIDC_DBG,
"Old buffer reqs, buffer type = %d width = %d, height = %d\n", "Old buffer reqs, buffer type = %d width = %d, height = %d\n",
frame_sz.buffer_type, frame_sz.width, frame_sz.buffer_type, frame_sz.width,
frame_sz.height); frame_sz.height);
for (i = 0; i < ARRAY_SIZE(internal_buffers); i++) {
if (internal_buffers[i].req) {
internal_buffers[i].req->buffer_size =
internal_buffers[i].size;
dprintk(VIDC_DBG,
"Changing buffer type : %d size to : %zd\n",
internal_buffers[i].type,
internal_buffers[i].size);
}
}
return 0; return 0;
alloc_fail:
msm_comm_release_scratch_buffers(inst, false);
return rc;
} }
static inline int start_streaming(struct msm_vidc_inst *inst) static inline int start_streaming(struct msm_vidc_inst *inst)
@ -1654,6 +1661,7 @@ static inline int start_streaming(struct msm_vidc_inst *inst)
struct hal_buffer_size_minimum b; struct hal_buffer_size_minimum b;
unsigned int buffer_size; unsigned int buffer_size;
struct msm_vidc_format *fmt = NULL; struct msm_vidc_format *fmt = NULL;
bool max_internal_buf = false;
fmt = &inst->fmts[CAPTURE_PORT]; fmt = &inst->fmts[CAPTURE_PORT];
buffer_size = fmt->get_frame_size(0, buffer_size = fmt->get_frame_size(0,
@ -1677,8 +1685,9 @@ static inline int start_streaming(struct msm_vidc_inst *inst)
dprintk(VIDC_ERR, "H/w scaling is not in valid range\n"); dprintk(VIDC_ERR, "H/w scaling is not in valid range\n");
return -EINVAL; return -EINVAL;
} }
if ((inst->flags & VIDC_SECURE) && !inst->in_reconfig && max_internal_buf = (inst->flags & VIDC_SECURE) && !slave_side_cp
!slave_side_cp) { && (inst->session_type == MSM_VIDC_DECODER);
if (max_internal_buf) {
rc = set_max_internal_buffers_size(inst); rc = set_max_internal_buffers_size(inst);
if (rc) { if (rc) {
dprintk(VIDC_ERR, dprintk(VIDC_ERR,
@ -1687,7 +1696,7 @@ static inline int start_streaming(struct msm_vidc_inst *inst)
goto fail_start; goto fail_start;
} }
} }
rc = msm_comm_set_scratch_buffers(inst); rc = msm_comm_set_scratch_buffers(inst, max_internal_buf);
if (rc) { if (rc) {
dprintk(VIDC_ERR, dprintk(VIDC_ERR,
"Failed to set scratch buffers: %d\n", rc); "Failed to set scratch buffers: %d\n", rc);

View file

@ -1868,7 +1868,7 @@ static inline int start_streaming(struct msm_vidc_inst *inst)
"Failed to get Buffer Requirements : %d\n", rc); "Failed to get Buffer Requirements : %d\n", rc);
goto fail_start; goto fail_start;
} }
rc = msm_comm_set_scratch_buffers(inst); rc = msm_comm_set_scratch_buffers(inst, false);
if (rc) { if (rc) {
dprintk(VIDC_ERR, "Failed to set scratch buffers: %d\n", rc); dprintk(VIDC_ERR, "Failed to set scratch buffers: %d\n", rc);
goto fail_start; goto fail_start;

View file

@ -3342,9 +3342,9 @@ static bool reuse_internal_buffers(struct msm_vidc_inst *inst,
return reused; return reused;
} }
static int allocate_and_set_internal_bufs(struct msm_vidc_inst *inst, int allocate_and_set_internal_bufs(struct msm_vidc_inst *inst,
struct hal_buffer_requirements *internal_bufreq, struct hal_buffer_requirements *internal_bufreq,
struct msm_vidc_list *buf_list) struct msm_vidc_list *buf_list, bool set_on_fw)
{ {
struct msm_smem *handle; struct msm_smem *handle;
struct internal_buf *binfo; struct internal_buf *binfo;
@ -3381,11 +3381,13 @@ static int allocate_and_set_internal_bufs(struct msm_vidc_inst *inst,
binfo->handle = handle; binfo->handle = handle;
binfo->buffer_type = internal_bufreq->buffer_type; binfo->buffer_type = internal_bufreq->buffer_type;
rc = set_internal_buf_on_fw(inst, internal_bufreq->buffer_type, if (set_on_fw) {
rc = set_internal_buf_on_fw(inst,
internal_bufreq->buffer_type,
handle, false); handle, false);
if (rc) if (rc)
goto fail_set_buffers; goto fail_set_buffers;
}
mutex_lock(&buf_list->lock); mutex_lock(&buf_list->lock);
list_add_tail(&binfo->list, &buf_list->list); list_add_tail(&binfo->list, &buf_list->list);
mutex_unlock(&buf_list->lock); mutex_unlock(&buf_list->lock);
@ -3426,7 +3428,7 @@ static int set_internal_buffers(struct msm_vidc_inst *inst,
return 0; return 0;
return allocate_and_set_internal_bufs(inst, internal_buf, return allocate_and_set_internal_bufs(inst, internal_buf,
buf_list); buf_list, true);
} }
int msm_comm_try_state(struct msm_vidc_inst *inst, int state) int msm_comm_try_state(struct msm_vidc_inst *inst, int state)
@ -3587,39 +3589,6 @@ int msm_vidc_comm_cmd(void *instance, union msm_v4l2_cmd *cmd)
"Failed to flush buffers: %d\n", rc); "Failed to flush buffers: %d\n", rc);
} }
break; break;
case V4L2_DEC_QCOM_CMD_RECONFIG_HINT:
{
u32 *ptr = NULL;
struct hal_buffer_requirements *output_buf;
rc = msm_comm_try_get_bufreqs(inst);
if (rc) {
dprintk(VIDC_ERR,
"Getting buffer requirements failed: %d\n",
rc);
break;
}
output_buf = get_buff_req_buffer(inst,
msm_comm_get_hal_output_buffer(inst));
if (output_buf) {
if (dec) {
ptr = (u32 *)dec->raw.data;
ptr[0] = output_buf->buffer_size;
ptr[1] = output_buf->buffer_count_actual;
dprintk(VIDC_DBG,
"Reconfig hint, size is %u, count is %u\n",
ptr[0], ptr[1]);
} else {
dprintk(VIDC_ERR, "Null decoder\n");
}
} else {
dprintk(VIDC_DBG,
"This output buffer not required, buffer_type: %x\n",
HAL_BUFFER_OUTPUT);
}
break;
}
default: default:
dprintk(VIDC_ERR, "Unknown Command %d\n", which_cmd); dprintk(VIDC_ERR, "Unknown Command %d\n", which_cmd);
rc = -ENOTSUPP; rc = -ENOTSUPP;
@ -4453,15 +4422,15 @@ error:
return rc; return rc;
} }
int msm_comm_set_scratch_buffers(struct msm_vidc_inst *inst) int msm_comm_set_scratch_buffers(struct msm_vidc_inst *inst,
{ bool max_int_buffer) {
int rc = 0; int rc = 0;
if (!inst || !inst->core || !inst->core->device) { if (!inst || !inst->core || !inst->core->device) {
dprintk(VIDC_ERR, "%s invalid parameters\n", __func__); dprintk(VIDC_ERR, "%s invalid parameters\n", __func__);
return -EINVAL; return -EINVAL;
} }
if (msm_comm_release_scratch_buffers(inst, true)) if (!max_int_buffer && msm_comm_release_scratch_buffers(inst, true))
dprintk(VIDC_WARN, "Failed to release scratch buffers\n"); dprintk(VIDC_WARN, "Failed to release scratch buffers\n");
rc = set_internal_buffers(inst, HAL_BUFFER_INTERNAL_SCRATCH, rc = set_internal_buffers(inst, HAL_BUFFER_INTERNAL_SCRATCH,

View file

@ -41,9 +41,13 @@ int msm_comm_try_set_prop(struct msm_vidc_inst *inst,
enum hal_property ptype, void *pdata); enum hal_property ptype, void *pdata);
int msm_comm_try_get_prop(struct msm_vidc_inst *inst, int msm_comm_try_get_prop(struct msm_vidc_inst *inst,
enum hal_property ptype, union hal_get_property *hprop); enum hal_property ptype, union hal_get_property *hprop);
int msm_comm_set_scratch_buffers(struct msm_vidc_inst *inst); int msm_comm_set_scratch_buffers(struct msm_vidc_inst *inst,
bool max_int_buffer);
int msm_comm_set_persist_buffers(struct msm_vidc_inst *inst); int msm_comm_set_persist_buffers(struct msm_vidc_inst *inst);
int msm_comm_set_output_buffers(struct msm_vidc_inst *inst); int msm_comm_set_output_buffers(struct msm_vidc_inst *inst);
int allocate_and_set_internal_bufs(struct msm_vidc_inst *inst,
struct hal_buffer_requirements *internal_bufreq,
struct msm_vidc_list *buf_list, bool set_on_fw);
int msm_comm_queue_output_buffers(struct msm_vidc_inst *inst); int msm_comm_queue_output_buffers(struct msm_vidc_inst *inst);
int msm_comm_qbuf(struct msm_vidc_inst *inst, struct vb2_buffer *vb); int msm_comm_qbuf(struct msm_vidc_inst *inst, struct vb2_buffer *vb);
void msm_comm_scale_clocks_and_bus(struct msm_vidc_inst *inst); void msm_comm_scale_clocks_and_bus(struct msm_vidc_inst *inst);