media: mediatek: vcodec: replace pr_* with dev_* for v4l2 debug message
Adding different macro mtk_v4l2_vdec_dbg and mtk_v4l2_venc_dbg for encoder and decoder. Then calling the common macro mtk_v4l2_debug to print debug message. Replace pr_err with dev_err for 'mtk_v4l2_err' debug message. Replace pr_debug with dev_dbg for 'mtk_v4l2_debug' debug message. Signed-off-by: Yunfei Dong <yunfei.dong@mediatek.com> Reviewed-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
This commit is contained in:
parent
0db2fc4eec
commit
41f03c673c
|
@ -82,7 +82,7 @@ static int vidioc_decoder_cmd(struct file *file, void *priv,
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
mtk_v4l2_debug(1, "decoder cmd=%u", cmd->cmd);
|
mtk_v4l2_vdec_dbg(1, ctx, "decoder cmd=%u", cmd->cmd);
|
||||||
dst_vq = v4l2_m2m_get_vq(ctx->m2m_ctx,
|
dst_vq = v4l2_m2m_get_vq(ctx->m2m_ctx,
|
||||||
V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
|
V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
|
||||||
switch (cmd->cmd) {
|
switch (cmd->cmd) {
|
||||||
|
@ -90,11 +90,11 @@ static int vidioc_decoder_cmd(struct file *file, void *priv,
|
||||||
src_vq = v4l2_m2m_get_vq(ctx->m2m_ctx,
|
src_vq = v4l2_m2m_get_vq(ctx->m2m_ctx,
|
||||||
V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
|
V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
|
||||||
if (!vb2_is_streaming(src_vq)) {
|
if (!vb2_is_streaming(src_vq)) {
|
||||||
mtk_v4l2_debug(1, "Output stream is off. No need to flush.");
|
mtk_v4l2_vdec_dbg(1, ctx, "Output stream is off. No need to flush.");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (!vb2_is_streaming(dst_vq)) {
|
if (!vb2_is_streaming(dst_vq)) {
|
||||||
mtk_v4l2_debug(1, "Capture stream is off. No need to flush.");
|
mtk_v4l2_vdec_dbg(1, ctx, "Capture stream is off. No need to flush.");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
v4l2_m2m_buf_queue(ctx->m2m_ctx, &ctx->empty_flush_buf.vb);
|
v4l2_m2m_buf_queue(ctx->m2m_ctx, &ctx->empty_flush_buf.vb);
|
||||||
|
@ -172,8 +172,7 @@ static int vidioc_vdec_qbuf(struct file *file, void *priv,
|
||||||
struct mtk_vcodec_ctx *ctx = fh_to_ctx(priv);
|
struct mtk_vcodec_ctx *ctx = fh_to_ctx(priv);
|
||||||
|
|
||||||
if (ctx->state == MTK_STATE_ABORT) {
|
if (ctx->state == MTK_STATE_ABORT) {
|
||||||
mtk_v4l2_err("[%d] Call on QBUF after unrecoverable error",
|
mtk_v4l2_vdec_err(ctx, "[%d] Call on QBUF after unrecoverable error", ctx->id);
|
||||||
ctx->id);
|
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,8 +185,7 @@ static int vidioc_vdec_dqbuf(struct file *file, void *priv,
|
||||||
struct mtk_vcodec_ctx *ctx = fh_to_ctx(priv);
|
struct mtk_vcodec_ctx *ctx = fh_to_ctx(priv);
|
||||||
|
|
||||||
if (ctx->state == MTK_STATE_ABORT) {
|
if (ctx->state == MTK_STATE_ABORT) {
|
||||||
mtk_v4l2_err("[%d] Call on DQBUF after unrecoverable error",
|
mtk_v4l2_vdec_err(ctx, "[%d] Call on DQBUF after unrecoverable error", ctx->id);
|
||||||
ctx->id);
|
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -288,11 +286,10 @@ static int vidioc_try_fmt(struct mtk_vcodec_ctx *ctx, struct v4l2_format *f,
|
||||||
(pix_fmt_mp->height + 64) <= frmsize->max_height)
|
(pix_fmt_mp->height + 64) <= frmsize->max_height)
|
||||||
pix_fmt_mp->height += 64;
|
pix_fmt_mp->height += 64;
|
||||||
|
|
||||||
mtk_v4l2_debug(0,
|
mtk_v4l2_vdec_dbg(0, ctx,
|
||||||
"before resize width=%d, height=%d, after resize width=%d, height=%d, sizeimage=%d",
|
"before resize wxh=%dx%d, after resize wxh=%dx%d, sizeimage=%d",
|
||||||
tmp_w, tmp_h, pix_fmt_mp->width,
|
tmp_w, tmp_h, pix_fmt_mp->width, pix_fmt_mp->height,
|
||||||
pix_fmt_mp->height,
|
pix_fmt_mp->width * pix_fmt_mp->height);
|
||||||
pix_fmt_mp->width * pix_fmt_mp->height);
|
|
||||||
|
|
||||||
pix_fmt_mp->num_planes = fmt->num_planes;
|
pix_fmt_mp->num_planes = fmt->num_planes;
|
||||||
pix_fmt_mp->plane_fmt[0].sizeimage =
|
pix_fmt_mp->plane_fmt[0].sizeimage =
|
||||||
|
@ -344,7 +341,7 @@ static int vidioc_try_fmt_vid_out_mplane(struct file *file, void *priv,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pix_fmt_mp->plane_fmt[0].sizeimage == 0) {
|
if (pix_fmt_mp->plane_fmt[0].sizeimage == 0) {
|
||||||
mtk_v4l2_err("sizeimage of output format must be given");
|
mtk_v4l2_vdec_err(ctx, "sizeimage of output format must be given");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -432,7 +429,7 @@ static int vidioc_vdec_s_fmt(struct file *file, void *priv,
|
||||||
const struct mtk_video_fmt *fmt;
|
const struct mtk_video_fmt *fmt;
|
||||||
const struct mtk_vcodec_dec_pdata *dec_pdata = ctx->dev->vdec_pdata;
|
const struct mtk_vcodec_dec_pdata *dec_pdata = ctx->dev->vdec_pdata;
|
||||||
|
|
||||||
mtk_v4l2_debug(3, "[%d]", ctx->id);
|
mtk_v4l2_vdec_dbg(3, ctx, "[%d]", ctx->id);
|
||||||
|
|
||||||
q_data = mtk_vdec_get_q_data(ctx, f->type);
|
q_data = mtk_vdec_get_q_data(ctx, f->type);
|
||||||
if (!q_data)
|
if (!q_data)
|
||||||
|
@ -446,7 +443,7 @@ static int vidioc_vdec_s_fmt(struct file *file, void *priv,
|
||||||
if (!dec_pdata->uses_stateless_api &&
|
if (!dec_pdata->uses_stateless_api &&
|
||||||
f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE &&
|
f->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE &&
|
||||||
vb2_is_busy(&ctx->m2m_ctx->out_q_ctx.q)) {
|
vb2_is_busy(&ctx->m2m_ctx->out_q_ctx.q)) {
|
||||||
mtk_v4l2_err("out_q_ctx buffers already requested");
|
mtk_v4l2_vdec_err(ctx, "out_q_ctx buffers already requested");
|
||||||
ret = -EBUSY;
|
ret = -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -456,7 +453,7 @@ static int vidioc_vdec_s_fmt(struct file *file, void *priv,
|
||||||
*/
|
*/
|
||||||
if ((f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) &&
|
if ((f->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) &&
|
||||||
vb2_is_busy(&ctx->m2m_ctx->cap_q_ctx.q)) {
|
vb2_is_busy(&ctx->m2m_ctx->cap_q_ctx.q)) {
|
||||||
mtk_v4l2_err("cap_q_ctx buffers already requested");
|
mtk_v4l2_vdec_err(ctx, "cap_q_ctx buffers already requested");
|
||||||
ret = -EBUSY;
|
ret = -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -491,8 +488,8 @@ static int vidioc_vdec_s_fmt(struct file *file, void *priv,
|
||||||
if (ctx->state == MTK_STATE_FREE) {
|
if (ctx->state == MTK_STATE_FREE) {
|
||||||
ret = vdec_if_init(ctx, q_data->fmt->fourcc);
|
ret = vdec_if_init(ctx, q_data->fmt->fourcc);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mtk_v4l2_err("[%d]: vdec_if_init() fail ret=%d",
|
mtk_v4l2_vdec_err(ctx, "[%d]: vdec_if_init() fail ret=%d",
|
||||||
ctx->id, ret);
|
ctx->id, ret);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
ctx->state = MTK_STATE_INIT;
|
ctx->state = MTK_STATE_INIT;
|
||||||
|
@ -515,8 +512,8 @@ static int vidioc_vdec_s_fmt(struct file *file, void *priv,
|
||||||
*/
|
*/
|
||||||
ret = vdec_if_get_param(ctx, GET_PARAM_PIC_INFO, &ctx->picinfo);
|
ret = vdec_if_get_param(ctx, GET_PARAM_PIC_INFO, &ctx->picinfo);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mtk_v4l2_err("[%d]Error!! Get GET_PARAM_PICTURE_INFO Fail",
|
mtk_v4l2_vdec_err(ctx, "[%d]Error!! Get GET_PARAM_PICTURE_INFO Fail",
|
||||||
ctx->id);
|
ctx->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->last_decoded_picinfo = ctx->picinfo;
|
ctx->last_decoded_picinfo = ctx->picinfo;
|
||||||
|
@ -540,11 +537,13 @@ static int vidioc_vdec_s_fmt(struct file *file, void *priv,
|
||||||
|
|
||||||
ctx->q_data[MTK_Q_DATA_DST].coded_width = ctx->picinfo.buf_w;
|
ctx->q_data[MTK_Q_DATA_DST].coded_width = ctx->picinfo.buf_w;
|
||||||
ctx->q_data[MTK_Q_DATA_DST].coded_height = ctx->picinfo.buf_h;
|
ctx->q_data[MTK_Q_DATA_DST].coded_height = ctx->picinfo.buf_h;
|
||||||
mtk_v4l2_debug(2, "[%d] vdec_if_init() num_plane = %d wxh=%dx%d pic wxh=%dx%d sz[0]=0x%x sz[1]=0x%x",
|
mtk_v4l2_vdec_dbg(2, ctx,
|
||||||
ctx->id, pix_mp->num_planes, ctx->picinfo.buf_w, ctx->picinfo.buf_h,
|
"[%d] init() plane:%d wxh=%dx%d pic wxh=%dx%d sz=0x%x_0x%x",
|
||||||
ctx->picinfo.pic_w, ctx->picinfo.pic_h,
|
ctx->id, pix_mp->num_planes,
|
||||||
ctx->q_data[MTK_Q_DATA_DST].sizeimage[0],
|
ctx->picinfo.buf_w, ctx->picinfo.buf_h,
|
||||||
ctx->q_data[MTK_Q_DATA_DST].sizeimage[1]);
|
ctx->picinfo.pic_w, ctx->picinfo.pic_h,
|
||||||
|
ctx->q_data[MTK_Q_DATA_DST].sizeimage[0],
|
||||||
|
ctx->q_data[MTK_Q_DATA_DST].sizeimage[1]);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -570,14 +569,11 @@ static int vidioc_enum_framesizes(struct file *file, void *priv,
|
||||||
fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE;
|
fsize->type = V4L2_FRMSIZE_TYPE_STEPWISE;
|
||||||
fsize->stepwise = dec_pdata->vdec_formats[i].frmsize;
|
fsize->stepwise = dec_pdata->vdec_formats[i].frmsize;
|
||||||
|
|
||||||
mtk_v4l2_debug(1, "%x, %d %d %d %d %d %d",
|
mtk_v4l2_vdec_dbg(1, ctx, "%x, %d %d %d %d %d %d",
|
||||||
ctx->dev->dec_capability,
|
ctx->dev->dec_capability, fsize->stepwise.min_width,
|
||||||
fsize->stepwise.min_width,
|
fsize->stepwise.max_width, fsize->stepwise.step_width,
|
||||||
fsize->stepwise.max_width,
|
fsize->stepwise.min_height, fsize->stepwise.max_height,
|
||||||
fsize->stepwise.step_width,
|
fsize->stepwise.step_height);
|
||||||
fsize->stepwise.min_height,
|
|
||||||
fsize->stepwise.max_height,
|
|
||||||
fsize->stepwise.step_height);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -641,7 +637,7 @@ static int vidioc_vdec_g_fmt(struct file *file, void *priv,
|
||||||
|
|
||||||
vq = v4l2_m2m_get_vq(ctx->m2m_ctx, f->type);
|
vq = v4l2_m2m_get_vq(ctx->m2m_ctx, f->type);
|
||||||
if (!vq) {
|
if (!vq) {
|
||||||
mtk_v4l2_err("no vb2 queue for type=%d", f->type);
|
mtk_v4l2_vdec_err(ctx, "no vb2 queue for type=%d", f->type);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -712,8 +708,8 @@ static int vidioc_vdec_g_fmt(struct file *file, void *priv,
|
||||||
pix_mp->plane_fmt[1].bytesperline = q_data->bytesperline[1];
|
pix_mp->plane_fmt[1].bytesperline = q_data->bytesperline[1];
|
||||||
pix_mp->plane_fmt[1].sizeimage = q_data->sizeimage[1];
|
pix_mp->plane_fmt[1].sizeimage = q_data->sizeimage[1];
|
||||||
|
|
||||||
mtk_v4l2_debug(1, "[%d] type=%d state=%d Format information could not be read, not ready yet!",
|
mtk_v4l2_vdec_dbg(1, ctx, "[%d] type=%d state=%d Format information not ready!",
|
||||||
ctx->id, f->type, ctx->state);
|
ctx->id, f->type, ctx->state);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -730,7 +726,7 @@ int vb2ops_vdec_queue_setup(struct vb2_queue *vq, unsigned int *nbuffers,
|
||||||
q_data = mtk_vdec_get_q_data(ctx, vq->type);
|
q_data = mtk_vdec_get_q_data(ctx, vq->type);
|
||||||
|
|
||||||
if (q_data == NULL) {
|
if (q_data == NULL) {
|
||||||
mtk_v4l2_err("vq->type=%d err\n", vq->type);
|
mtk_v4l2_vdec_err(ctx, "vq->type=%d err\n", vq->type);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -756,10 +752,9 @@ int vb2ops_vdec_queue_setup(struct vb2_queue *vq, unsigned int *nbuffers,
|
||||||
sizes[i] = q_data->sizeimage[i];
|
sizes[i] = q_data->sizeimage[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
mtk_v4l2_debug(1,
|
mtk_v4l2_vdec_dbg(1, ctx,
|
||||||
"[%d]\t type = %d, get %d plane(s), %d buffer(s) of size 0x%x 0x%x ",
|
"[%d]\t type = %d, get %d plane(s), %d buffer(s) of size 0x%x 0x%x ",
|
||||||
ctx->id, vq->type, *nplanes, *nbuffers,
|
ctx->id, vq->type, *nplanes, *nbuffers, sizes[0], sizes[1]);
|
||||||
sizes[0], sizes[1]);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -770,16 +765,15 @@ int vb2ops_vdec_buf_prepare(struct vb2_buffer *vb)
|
||||||
struct mtk_q_data *q_data;
|
struct mtk_q_data *q_data;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
mtk_v4l2_debug(3, "[%d] (%d) id=%d",
|
mtk_v4l2_vdec_dbg(3, ctx, "[%d] (%d) id=%d",
|
||||||
ctx->id, vb->vb2_queue->type, vb->index);
|
ctx->id, vb->vb2_queue->type, vb->index);
|
||||||
|
|
||||||
q_data = mtk_vdec_get_q_data(ctx, vb->vb2_queue->type);
|
q_data = mtk_vdec_get_q_data(ctx, vb->vb2_queue->type);
|
||||||
|
|
||||||
for (i = 0; i < q_data->fmt->num_planes; i++) {
|
for (i = 0; i < q_data->fmt->num_planes; i++) {
|
||||||
if (vb2_plane_size(vb, i) < q_data->sizeimage[i]) {
|
if (vb2_plane_size(vb, i) < q_data->sizeimage[i]) {
|
||||||
mtk_v4l2_err("data will not fit into plane %d (%lu < %d)",
|
mtk_v4l2_vdec_err(ctx, "data will not fit into plane %d (%lu < %d)",
|
||||||
i, vb2_plane_size(vb, i),
|
i, vb2_plane_size(vb, i), q_data->sizeimage[i]);
|
||||||
q_data->sizeimage[i]);
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
if (!V4L2_TYPE_IS_OUTPUT(vb->type))
|
if (!V4L2_TYPE_IS_OUTPUT(vb->type))
|
||||||
|
@ -807,7 +801,7 @@ void vb2ops_vdec_buf_finish(struct vb2_buffer *vb)
|
||||||
mutex_unlock(&ctx->lock);
|
mutex_unlock(&ctx->lock);
|
||||||
|
|
||||||
if (buf_error) {
|
if (buf_error) {
|
||||||
mtk_v4l2_err("Unrecoverable error on buffer.");
|
mtk_v4l2_vdec_err(ctx, "Unrecoverable error on buffer.");
|
||||||
ctx->state = MTK_STATE_ABORT;
|
ctx->state = MTK_STATE_ABORT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -843,8 +837,8 @@ void vb2ops_vdec_stop_streaming(struct vb2_queue *q)
|
||||||
struct mtk_vcodec_ctx *ctx = vb2_get_drv_priv(q);
|
struct mtk_vcodec_ctx *ctx = vb2_get_drv_priv(q);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
mtk_v4l2_debug(3, "[%d] (%d) state=(%x) ctx->decoded_frame_cnt=%d",
|
mtk_v4l2_vdec_dbg(3, ctx, "[%d] (%d) state=(%x) ctx->decoded_frame_cnt=%d",
|
||||||
ctx->id, q->type, ctx->state, ctx->decoded_frame_cnt);
|
ctx->id, q->type, ctx->state, ctx->decoded_frame_cnt);
|
||||||
|
|
||||||
if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
|
if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
|
||||||
while ((src_buf = v4l2_m2m_src_buf_remove(ctx->m2m_ctx))) {
|
while ((src_buf = v4l2_m2m_src_buf_remove(ctx->m2m_ctx))) {
|
||||||
|
@ -870,17 +864,17 @@ void vb2ops_vdec_stop_streaming(struct vb2_queue *q)
|
||||||
*/
|
*/
|
||||||
ctx->picinfo = ctx->last_decoded_picinfo;
|
ctx->picinfo = ctx->last_decoded_picinfo;
|
||||||
|
|
||||||
mtk_v4l2_debug(2,
|
mtk_v4l2_vdec_dbg(2, ctx,
|
||||||
"[%d]-> new(%d,%d), old(%d,%d), real(%d,%d)",
|
"[%d]-> new(%d,%d), old(%d,%d), real(%d,%d)",
|
||||||
ctx->id, ctx->last_decoded_picinfo.pic_w,
|
ctx->id, ctx->last_decoded_picinfo.pic_w,
|
||||||
ctx->last_decoded_picinfo.pic_h,
|
ctx->last_decoded_picinfo.pic_h,
|
||||||
ctx->picinfo.pic_w, ctx->picinfo.pic_h,
|
ctx->picinfo.pic_w, ctx->picinfo.pic_h,
|
||||||
ctx->last_decoded_picinfo.buf_w,
|
ctx->last_decoded_picinfo.buf_w,
|
||||||
ctx->last_decoded_picinfo.buf_h);
|
ctx->last_decoded_picinfo.buf_h);
|
||||||
|
|
||||||
ret = ctx->dev->vdec_pdata->flush_decoder(ctx);
|
ret = ctx->dev->vdec_pdata->flush_decoder(ctx);
|
||||||
if (ret)
|
if (ret)
|
||||||
mtk_v4l2_err("DecodeFinal failed, ret=%d", ret);
|
mtk_v4l2_vdec_err(ctx, "DecodeFinal failed, ret=%d", ret);
|
||||||
}
|
}
|
||||||
ctx->state = MTK_STATE_FLUSH;
|
ctx->state = MTK_STATE_FLUSH;
|
||||||
|
|
||||||
|
@ -905,7 +899,7 @@ static int m2mops_vdec_job_ready(void *m2m_priv)
|
||||||
{
|
{
|
||||||
struct mtk_vcodec_ctx *ctx = m2m_priv;
|
struct mtk_vcodec_ctx *ctx = m2m_priv;
|
||||||
|
|
||||||
mtk_v4l2_debug(3, "[%d]", ctx->id);
|
mtk_v4l2_vdec_dbg(3, ctx, "[%d]", ctx->id);
|
||||||
|
|
||||||
if (ctx->state == MTK_STATE_ABORT)
|
if (ctx->state == MTK_STATE_ABORT)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -973,7 +967,7 @@ int mtk_vcodec_dec_queue_init(void *priv, struct vb2_queue *src_vq,
|
||||||
struct mtk_vcodec_ctx *ctx = priv;
|
struct mtk_vcodec_ctx *ctx = priv;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
mtk_v4l2_debug(3, "[%d]", ctx->id);
|
mtk_v4l2_vdec_dbg(3, ctx, "[%d]", ctx->id);
|
||||||
|
|
||||||
src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
|
src_vq->type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
|
||||||
src_vq->io_modes = VB2_DMABUF | VB2_MMAP;
|
src_vq->io_modes = VB2_DMABUF | VB2_MMAP;
|
||||||
|
@ -988,7 +982,7 @@ int mtk_vcodec_dec_queue_init(void *priv, struct vb2_queue *src_vq,
|
||||||
|
|
||||||
ret = vb2_queue_init(src_vq);
|
ret = vb2_queue_init(src_vq);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mtk_v4l2_err("Failed to initialize videobuf2 queue(output)");
|
mtk_v4l2_vdec_err(ctx, "Failed to initialize videobuf2 queue(output)");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
|
dst_vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
|
||||||
|
@ -1004,7 +998,7 @@ int mtk_vcodec_dec_queue_init(void *priv, struct vb2_queue *src_vq,
|
||||||
|
|
||||||
ret = vb2_queue_init(dst_vq);
|
ret = vb2_queue_init(dst_vq);
|
||||||
if (ret)
|
if (ret)
|
||||||
mtk_v4l2_err("Failed to initialize videobuf2 queue(capture)");
|
mtk_v4l2_vdec_err(ctx, "Failed to initialize videobuf2 queue(capture)");
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,7 +29,7 @@
|
||||||
#include "mtk_vcodec_util.h"
|
#include "mtk_vcodec_util.h"
|
||||||
#include "mtk_vcodec_fw.h"
|
#include "mtk_vcodec_fw.h"
|
||||||
|
|
||||||
static int mtk_vcodec_get_hw_count(struct mtk_vcodec_dev *dev)
|
static int mtk_vcodec_get_hw_count(struct mtk_vcodec_ctx *ctx, struct mtk_vcodec_dev *dev)
|
||||||
{
|
{
|
||||||
switch (dev->vdec_pdata->hw_arch) {
|
switch (dev->vdec_pdata->hw_arch) {
|
||||||
case MTK_VDEC_PURE_SINGLE_CORE:
|
case MTK_VDEC_PURE_SINGLE_CORE:
|
||||||
|
@ -37,7 +37,7 @@ static int mtk_vcodec_get_hw_count(struct mtk_vcodec_dev *dev)
|
||||||
case MTK_VDEC_LAT_SINGLE_CORE:
|
case MTK_VDEC_LAT_SINGLE_CORE:
|
||||||
return MTK_VDEC_ONE_LAT_ONE_CORE;
|
return MTK_VDEC_ONE_LAT_ONE_CORE;
|
||||||
default:
|
default:
|
||||||
mtk_v4l2_err("hw arch %d not supported", dev->vdec_pdata->hw_arch);
|
mtk_v4l2_vdec_err(ctx, "hw arch %d not supported", dev->vdec_pdata->hw_arch);
|
||||||
return MTK_VDEC_NO_HW;
|
return MTK_VDEC_NO_HW;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,7 +65,7 @@ static irqreturn_t mtk_vcodec_dec_irq_handler(int irq, void *priv)
|
||||||
ctx = mtk_vcodec_get_curr_ctx(dev, MTK_VDEC_CORE);
|
ctx = mtk_vcodec_get_curr_ctx(dev, MTK_VDEC_CORE);
|
||||||
|
|
||||||
if (!mtk_vcodec_is_hw_active(dev)) {
|
if (!mtk_vcodec_is_hw_active(dev)) {
|
||||||
mtk_v4l2_err("DEC ISR, VDEC active is not 0x0");
|
mtk_v4l2_vdec_err(ctx, "DEC ISR, VDEC active is not 0x0");
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,9 +83,7 @@ static irqreturn_t mtk_vcodec_dec_irq_handler(int irq, void *priv)
|
||||||
|
|
||||||
wake_up_ctx(ctx, MTK_INST_IRQ_RECEIVED, 0);
|
wake_up_ctx(ctx, MTK_INST_IRQ_RECEIVED, 0);
|
||||||
|
|
||||||
mtk_v4l2_debug(3,
|
mtk_v4l2_vdec_dbg(3, ctx, "wake up ctx %d, dec_done_status=%x", ctx->id, dec_done_status);
|
||||||
"mtk_vcodec_dec_irq_handler :wake up ctx %d, dec_done_status=%x",
|
|
||||||
ctx->id, dec_done_status);
|
|
||||||
|
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
@ -140,7 +138,7 @@ static int mtk_vcodec_get_reg_bases(struct mtk_vcodec_dev *dev)
|
||||||
if (IS_ERR(dev->reg_base[i]))
|
if (IS_ERR(dev->reg_base[i]))
|
||||||
return PTR_ERR(dev->reg_base[i]);
|
return PTR_ERR(dev->reg_base[i]);
|
||||||
|
|
||||||
mtk_v4l2_debug(2, "reg[%d] base=%p", i, dev->reg_base[i]);
|
dev_dbg(&pdev->dev, "reg[%d] base=%p", i, dev->reg_base[i]);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (i = 0; i < reg_num; i++) {
|
for (i = 0; i < reg_num; i++) {
|
||||||
|
@ -148,7 +146,7 @@ static int mtk_vcodec_get_reg_bases(struct mtk_vcodec_dev *dev)
|
||||||
if (IS_ERR(dev->reg_base[i+1]))
|
if (IS_ERR(dev->reg_base[i+1]))
|
||||||
return PTR_ERR(dev->reg_base[i+1]);
|
return PTR_ERR(dev->reg_base[i+1]);
|
||||||
|
|
||||||
mtk_v4l2_debug(2, "reg[%d] base=%p", i+1, dev->reg_base[i+1]);
|
dev_dbg(&pdev->dev, "reg[%d] base=%p", i + 1, dev->reg_base[i + 1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
dev->vdecsys_regmap = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
|
dev->vdecsys_regmap = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
|
||||||
|
@ -216,7 +214,7 @@ static int fops_vcodec_open(struct file *file)
|
||||||
INIT_LIST_HEAD(&ctx->list);
|
INIT_LIST_HEAD(&ctx->list);
|
||||||
ctx->dev = dev;
|
ctx->dev = dev;
|
||||||
if (ctx->dev->vdec_pdata->is_subdev_supported) {
|
if (ctx->dev->vdec_pdata->is_subdev_supported) {
|
||||||
hw_count = mtk_vcodec_get_hw_count(dev);
|
hw_count = mtk_vcodec_get_hw_count(ctx, dev);
|
||||||
if (!hw_count || !dev->subdev_prob_done) {
|
if (!hw_count || !dev->subdev_prob_done) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto err_ctrls_setup;
|
goto err_ctrls_setup;
|
||||||
|
@ -236,15 +234,14 @@ static int fops_vcodec_open(struct file *file)
|
||||||
ctx->type = MTK_INST_DECODER;
|
ctx->type = MTK_INST_DECODER;
|
||||||
ret = dev->vdec_pdata->ctrls_setup(ctx);
|
ret = dev->vdec_pdata->ctrls_setup(ctx);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mtk_v4l2_err("Failed to setup mt vcodec controls");
|
mtk_v4l2_vdec_err(ctx, "Failed to setup mt vcodec controls");
|
||||||
goto err_ctrls_setup;
|
goto err_ctrls_setup;
|
||||||
}
|
}
|
||||||
ctx->m2m_ctx = v4l2_m2m_ctx_init(dev->m2m_dev_dec, ctx,
|
ctx->m2m_ctx = v4l2_m2m_ctx_init(dev->m2m_dev_dec, ctx,
|
||||||
&mtk_vcodec_dec_queue_init);
|
&mtk_vcodec_dec_queue_init);
|
||||||
if (IS_ERR((__force void *)ctx->m2m_ctx)) {
|
if (IS_ERR((__force void *)ctx->m2m_ctx)) {
|
||||||
ret = PTR_ERR((__force void *)ctx->m2m_ctx);
|
ret = PTR_ERR((__force void *)ctx->m2m_ctx);
|
||||||
mtk_v4l2_err("Failed to v4l2_m2m_ctx_init() (%d)",
|
mtk_v4l2_vdec_err(ctx, "Failed to v4l2_m2m_ctx_init() (%d)", ret);
|
||||||
ret);
|
|
||||||
goto err_m2m_ctx_init;
|
goto err_m2m_ctx_init;
|
||||||
}
|
}
|
||||||
src_vq = v4l2_m2m_get_vq(ctx->m2m_ctx,
|
src_vq = v4l2_m2m_get_vq(ctx->m2m_ctx,
|
||||||
|
@ -262,14 +259,14 @@ static int fops_vcodec_open(struct file *file)
|
||||||
* Return 0 if downloading firmware successfully,
|
* Return 0 if downloading firmware successfully,
|
||||||
* otherwise it is failed
|
* otherwise it is failed
|
||||||
*/
|
*/
|
||||||
mtk_v4l2_err("failed to load firmware!");
|
mtk_v4l2_vdec_err(ctx, "failed to load firmware!");
|
||||||
goto err_load_fw;
|
goto err_load_fw;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev->dec_capability =
|
dev->dec_capability =
|
||||||
mtk_vcodec_fw_get_vdec_capa(dev->fw_handler);
|
mtk_vcodec_fw_get_vdec_capa(dev->fw_handler);
|
||||||
|
|
||||||
mtk_v4l2_debug(0, "decoder capability %x", dev->dec_capability);
|
mtk_v4l2_vdec_dbg(0, ctx, "decoder capability %x", dev->dec_capability);
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->dev->vdec_pdata->init_vdec_params(ctx);
|
ctx->dev->vdec_pdata->init_vdec_params(ctx);
|
||||||
|
@ -278,8 +275,7 @@ static int fops_vcodec_open(struct file *file)
|
||||||
mtk_vcodec_dbgfs_create(ctx);
|
mtk_vcodec_dbgfs_create(ctx);
|
||||||
|
|
||||||
mutex_unlock(&dev->dev_mutex);
|
mutex_unlock(&dev->dev_mutex);
|
||||||
mtk_v4l2_debug(0, "%s decoder [%d]", dev_name(&dev->plat_dev->dev),
|
mtk_v4l2_vdec_dbg(0, ctx, "%s decoder [%d]", dev_name(&dev->plat_dev->dev), ctx->id);
|
||||||
ctx->id);
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
/* Deinit when failure occurred */
|
/* Deinit when failure occurred */
|
||||||
|
@ -301,7 +297,7 @@ static int fops_vcodec_release(struct file *file)
|
||||||
struct mtk_vcodec_dev *dev = video_drvdata(file);
|
struct mtk_vcodec_dev *dev = video_drvdata(file);
|
||||||
struct mtk_vcodec_ctx *ctx = fh_to_ctx(file->private_data);
|
struct mtk_vcodec_ctx *ctx = fh_to_ctx(file->private_data);
|
||||||
|
|
||||||
mtk_v4l2_debug(0, "[%d] decoder", ctx->id);
|
mtk_v4l2_vdec_dbg(0, ctx, "[%d] decoder", ctx->id);
|
||||||
mutex_lock(&dev->dev_mutex);
|
mutex_lock(&dev->dev_mutex);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -356,7 +352,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
|
||||||
&rproc_phandle)) {
|
&rproc_phandle)) {
|
||||||
fw_type = SCP;
|
fw_type = SCP;
|
||||||
} else {
|
} else {
|
||||||
mtk_v4l2_err("Could not get vdec IPI device");
|
dev_dbg(&pdev->dev, "Could not get vdec IPI device");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
dma_set_max_seg_size(&pdev->dev, UINT_MAX);
|
dma_set_max_seg_size(&pdev->dev, UINT_MAX);
|
||||||
|
@ -376,7 +372,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
|
||||||
alloc_ordered_workqueue("core-decoder",
|
alloc_ordered_workqueue("core-decoder",
|
||||||
WQ_MEM_RECLAIM | WQ_FREEZABLE);
|
WQ_MEM_RECLAIM | WQ_FREEZABLE);
|
||||||
if (!dev->core_workqueue) {
|
if (!dev->core_workqueue) {
|
||||||
mtk_v4l2_err("Failed to create core workqueue");
|
dev_dbg(&pdev->dev, "Failed to create core workqueue");
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto err_res;
|
goto err_res;
|
||||||
}
|
}
|
||||||
|
@ -392,13 +388,13 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
|
ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mtk_v4l2_err("v4l2_device_register err=%d", ret);
|
dev_err(&pdev->dev, "v4l2_device_register err=%d", ret);
|
||||||
goto err_core_workq;
|
goto err_core_workq;
|
||||||
}
|
}
|
||||||
|
|
||||||
vfd_dec = video_device_alloc();
|
vfd_dec = video_device_alloc();
|
||||||
if (!vfd_dec) {
|
if (!vfd_dec) {
|
||||||
mtk_v4l2_err("Failed to allocate video device");
|
dev_err(&pdev->dev, "Failed to allocate video device");
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto err_dec_alloc;
|
goto err_dec_alloc;
|
||||||
}
|
}
|
||||||
|
@ -419,7 +415,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
dev->m2m_dev_dec = v4l2_m2m_init(&mtk_vdec_m2m_ops);
|
dev->m2m_dev_dec = v4l2_m2m_init(&mtk_vdec_m2m_ops);
|
||||||
if (IS_ERR((__force void *)dev->m2m_dev_dec)) {
|
if (IS_ERR((__force void *)dev->m2m_dev_dec)) {
|
||||||
mtk_v4l2_err("Failed to init mem2mem dec device");
|
dev_err(&pdev->dev, "Failed to init mem2mem dec device");
|
||||||
ret = PTR_ERR((__force void *)dev->m2m_dev_dec);
|
ret = PTR_ERR((__force void *)dev->m2m_dev_dec);
|
||||||
goto err_dec_alloc;
|
goto err_dec_alloc;
|
||||||
}
|
}
|
||||||
|
@ -428,7 +424,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
|
||||||
alloc_ordered_workqueue(MTK_VCODEC_DEC_NAME,
|
alloc_ordered_workqueue(MTK_VCODEC_DEC_NAME,
|
||||||
WQ_MEM_RECLAIM | WQ_FREEZABLE);
|
WQ_MEM_RECLAIM | WQ_FREEZABLE);
|
||||||
if (!dev->decode_workqueue) {
|
if (!dev->decode_workqueue) {
|
||||||
mtk_v4l2_err("Failed to create decode workqueue");
|
dev_err(&pdev->dev, "Failed to create decode workqueue");
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto err_event_workq;
|
goto err_event_workq;
|
||||||
}
|
}
|
||||||
|
@ -437,7 +433,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
|
||||||
ret = of_platform_populate(pdev->dev.of_node, NULL, NULL,
|
ret = of_platform_populate(pdev->dev.of_node, NULL, NULL,
|
||||||
&pdev->dev);
|
&pdev->dev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mtk_v4l2_err("Main device of_platform_populate failed.");
|
dev_err(&pdev->dev, "Main device of_platform_populate failed.");
|
||||||
goto err_reg_cont;
|
goto err_reg_cont;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -450,7 +446,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
ret = video_register_device(vfd_dec, VFL_TYPE_VIDEO, -1);
|
ret = video_register_device(vfd_dec, VFL_TYPE_VIDEO, -1);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mtk_v4l2_err("Failed to register video device");
|
dev_err(&pdev->dev, "Failed to register video device");
|
||||||
goto err_reg_cont;
|
goto err_reg_cont;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -469,21 +465,21 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
|
||||||
ret = v4l2_m2m_register_media_controller(dev->m2m_dev_dec, dev->vfd_dec,
|
ret = v4l2_m2m_register_media_controller(dev->m2m_dev_dec, dev->vfd_dec,
|
||||||
MEDIA_ENT_F_PROC_VIDEO_DECODER);
|
MEDIA_ENT_F_PROC_VIDEO_DECODER);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mtk_v4l2_err("Failed to register media controller");
|
dev_err(&pdev->dev, "Failed to register media controller");
|
||||||
goto err_dec_mem_init;
|
goto err_dec_mem_init;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = media_device_register(&dev->mdev_dec);
|
ret = media_device_register(&dev->mdev_dec);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mtk_v4l2_err("Failed to register media device");
|
dev_err(&pdev->dev, "Failed to register media device");
|
||||||
goto err_media_reg;
|
goto err_media_reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
mtk_v4l2_debug(0, "media registered as /dev/media%d", vfd_dec->minor);
|
dev_dbg(&pdev->dev, "media registered as /dev/media%d", vfd_dec->minor);
|
||||||
}
|
}
|
||||||
|
|
||||||
mtk_vcodec_dbgfs_init(dev, false);
|
mtk_vcodec_dbgfs_init(dev, false);
|
||||||
mtk_v4l2_debug(0, "decoder registered as /dev/video%d", vfd_dec->minor);
|
dev_dbg(&pdev->dev, "decoder registered as /dev/video%d", vfd_dec->minor);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -77,8 +77,7 @@ static irqreturn_t mtk_vdec_hw_irq_handler(int irq, void *priv)
|
||||||
/* check if HW active or not */
|
/* check if HW active or not */
|
||||||
cg_status = readl(dev->reg_base[VDEC_HW_SYS] + VDEC_HW_ACTIVE_ADDR);
|
cg_status = readl(dev->reg_base[VDEC_HW_SYS] + VDEC_HW_ACTIVE_ADDR);
|
||||||
if (cg_status & VDEC_HW_ACTIVE_MASK) {
|
if (cg_status & VDEC_HW_ACTIVE_MASK) {
|
||||||
mtk_v4l2_err("vdec active is not 0x0 (0x%08x)",
|
mtk_v4l2_vdec_err(ctx, "vdec active is not 0x0 (0x%08x)", cg_status);
|
||||||
cg_status);
|
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,8 +92,8 @@ static irqreturn_t mtk_vdec_hw_irq_handler(int irq, void *priv)
|
||||||
|
|
||||||
wake_up_ctx(ctx, MTK_INST_IRQ_RECEIVED, dev->hw_idx);
|
wake_up_ctx(ctx, MTK_INST_IRQ_RECEIVED, dev->hw_idx);
|
||||||
|
|
||||||
mtk_v4l2_debug(3, "wake up ctx %d, dec_done_status=%x",
|
mtk_v4l2_vdec_dbg(3, ctx, "wake up ctx %d, dec_done_status=%x",
|
||||||
ctx->id, dec_done_status);
|
ctx->id, dec_done_status);
|
||||||
|
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ int mtk_vcodec_init_dec_clk(struct platform_device *pdev, struct mtk_vcodec_pm *
|
||||||
if (!dec_clk->clk_info)
|
if (!dec_clk->clk_info)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
} else {
|
} else {
|
||||||
mtk_v4l2_err("Failed to get vdec clock count");
|
dev_err(&pdev->dev, "Failed to get vdec clock count");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,14 +40,13 @@ int mtk_vcodec_init_dec_clk(struct platform_device *pdev, struct mtk_vcodec_pm *
|
||||||
ret = of_property_read_string_index(pdev->dev.of_node,
|
ret = of_property_read_string_index(pdev->dev.of_node,
|
||||||
"clock-names", i, &clk_info->clk_name);
|
"clock-names", i, &clk_info->clk_name);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mtk_v4l2_err("Failed to get clock name id = %d", i);
|
dev_err(&pdev->dev, "Failed to get clock name id = %d", i);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
clk_info->vcodec_clk = devm_clk_get(&pdev->dev,
|
clk_info->vcodec_clk = devm_clk_get(&pdev->dev,
|
||||||
clk_info->clk_name);
|
clk_info->clk_name);
|
||||||
if (IS_ERR(clk_info->vcodec_clk)) {
|
if (IS_ERR(clk_info->vcodec_clk)) {
|
||||||
mtk_v4l2_err("devm_clk_get (%d)%s fail", i,
|
dev_err(&pdev->dev, "devm_clk_get (%d)%s fail", i, clk_info->clk_name);
|
||||||
clk_info->clk_name);
|
|
||||||
return PTR_ERR(clk_info->vcodec_clk);
|
return PTR_ERR(clk_info->vcodec_clk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -62,7 +61,7 @@ static int mtk_vcodec_dec_pw_on(struct mtk_vcodec_pm *pm)
|
||||||
|
|
||||||
ret = pm_runtime_resume_and_get(pm->dev);
|
ret = pm_runtime_resume_and_get(pm->dev);
|
||||||
if (ret)
|
if (ret)
|
||||||
mtk_v4l2_err("pm_runtime_resume_and_get fail %d", ret);
|
dev_err(pm->dev, "pm_runtime_resume_and_get fail %d", ret);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -73,7 +72,7 @@ static void mtk_vcodec_dec_pw_off(struct mtk_vcodec_pm *pm)
|
||||||
|
|
||||||
ret = pm_runtime_put(pm->dev);
|
ret = pm_runtime_put(pm->dev);
|
||||||
if (ret && ret != -EAGAIN)
|
if (ret && ret != -EAGAIN)
|
||||||
mtk_v4l2_err("pm_runtime_put fail %d", ret);
|
dev_err(pm->dev, "pm_runtime_put fail %d", ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mtk_vcodec_dec_clock_on(struct mtk_vcodec_pm *pm)
|
static void mtk_vcodec_dec_clock_on(struct mtk_vcodec_pm *pm)
|
||||||
|
@ -85,7 +84,7 @@ static void mtk_vcodec_dec_clock_on(struct mtk_vcodec_pm *pm)
|
||||||
for (i = 0; i < dec_clk->clk_num; i++) {
|
for (i = 0; i < dec_clk->clk_num; i++) {
|
||||||
ret = clk_prepare_enable(dec_clk->clk_info[i].vcodec_clk);
|
ret = clk_prepare_enable(dec_clk->clk_info[i].vcodec_clk);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mtk_v4l2_err("clk_prepare_enable %d %s fail %d", i,
|
dev_err(pm->dev, "clk_prepare_enable %d %s fail %d", i,
|
||||||
dec_clk->clk_info[i].clk_name, ret);
|
dec_clk->clk_info[i].clk_name, ret);
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
@ -119,7 +118,7 @@ static void mtk_vcodec_dec_enable_irq(struct mtk_vcodec_dev *vdec_dev, int hw_id
|
||||||
if (subdev_dev)
|
if (subdev_dev)
|
||||||
enable_irq(subdev_dev->dec_irq);
|
enable_irq(subdev_dev->dec_irq);
|
||||||
else
|
else
|
||||||
mtk_v4l2_err("Failed to get hw dev\n");
|
dev_err(&vdec_dev->plat_dev->dev, "Failed to get hw dev\n");
|
||||||
} else {
|
} else {
|
||||||
enable_irq(vdec_dev->dec_irq);
|
enable_irq(vdec_dev->dec_irq);
|
||||||
}
|
}
|
||||||
|
@ -137,7 +136,7 @@ static void mtk_vcodec_dec_disable_irq(struct mtk_vcodec_dev *vdec_dev, int hw_i
|
||||||
if (subdev_dev)
|
if (subdev_dev)
|
||||||
disable_irq(subdev_dev->dec_irq);
|
disable_irq(subdev_dev->dec_irq);
|
||||||
else
|
else
|
||||||
mtk_v4l2_err("Failed to get hw dev\n");
|
dev_err(&vdec_dev->plat_dev->dev, "Failed to get hw dev\n");
|
||||||
} else {
|
} else {
|
||||||
disable_irq(vdec_dev->dec_irq);
|
disable_irq(vdec_dev->dec_irq);
|
||||||
}
|
}
|
||||||
|
@ -184,7 +183,7 @@ static struct mtk_vcodec_pm *mtk_vcodec_dec_get_pm(struct mtk_vcodec_dev *vdec_d
|
||||||
if (subdev_dev)
|
if (subdev_dev)
|
||||||
return &subdev_dev->pm;
|
return &subdev_dev->pm;
|
||||||
|
|
||||||
mtk_v4l2_err("Failed to get hw dev\n");
|
dev_err(&vdec_dev->plat_dev->dev, "Failed to get hw dev\n");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,15 +61,16 @@ static struct vb2_buffer *get_display_buffer(struct mtk_vcodec_ctx *ctx)
|
||||||
struct mtk_video_dec_buf *dstbuf;
|
struct mtk_video_dec_buf *dstbuf;
|
||||||
struct vb2_v4l2_buffer *vb;
|
struct vb2_v4l2_buffer *vb;
|
||||||
|
|
||||||
mtk_v4l2_debug(3, "[%d]", ctx->id);
|
mtk_v4l2_vdec_dbg(3, ctx, "[%d]", ctx->id);
|
||||||
if (vdec_if_get_param(ctx, GET_PARAM_DISP_FRAME_BUFFER,
|
if (vdec_if_get_param(ctx, GET_PARAM_DISP_FRAME_BUFFER,
|
||||||
&disp_frame_buffer)) {
|
&disp_frame_buffer)) {
|
||||||
mtk_v4l2_err("[%d]Cannot get param : GET_PARAM_DISP_FRAME_BUFFER", ctx->id);
|
mtk_v4l2_vdec_err(ctx, "[%d]Cannot get param : GET_PARAM_DISP_FRAME_BUFFER",
|
||||||
|
ctx->id);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!disp_frame_buffer) {
|
if (!disp_frame_buffer) {
|
||||||
mtk_v4l2_debug(3, "No display frame buffer");
|
mtk_v4l2_vdec_dbg(3, ctx, "No display frame buffer");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,9 +79,9 @@ static struct vb2_buffer *get_display_buffer(struct mtk_vcodec_ctx *ctx)
|
||||||
vb = &dstbuf->m2m_buf.vb;
|
vb = &dstbuf->m2m_buf.vb;
|
||||||
mutex_lock(&ctx->lock);
|
mutex_lock(&ctx->lock);
|
||||||
if (dstbuf->used) {
|
if (dstbuf->used) {
|
||||||
mtk_v4l2_debug(2, "[%d]status=%x queue id=%d to done_list %d",
|
mtk_v4l2_vdec_dbg(2, ctx, "[%d]status=%x queue id=%d to done_list %d",
|
||||||
ctx->id, disp_frame_buffer->status,
|
ctx->id, disp_frame_buffer->status,
|
||||||
vb->vb2_buf.index, dstbuf->queued_in_vb2);
|
vb->vb2_buf.index, dstbuf->queued_in_vb2);
|
||||||
|
|
||||||
v4l2_m2m_buf_done(vb, VB2_BUF_STATE_DONE);
|
v4l2_m2m_buf_done(vb, VB2_BUF_STATE_DONE);
|
||||||
ctx->decoded_frame_cnt++;
|
ctx->decoded_frame_cnt++;
|
||||||
|
@ -105,16 +106,16 @@ static struct vb2_buffer *get_free_buffer(struct mtk_vcodec_ctx *ctx)
|
||||||
|
|
||||||
if (vdec_if_get_param(ctx, GET_PARAM_FREE_FRAME_BUFFER,
|
if (vdec_if_get_param(ctx, GET_PARAM_FREE_FRAME_BUFFER,
|
||||||
&free_frame_buffer)) {
|
&free_frame_buffer)) {
|
||||||
mtk_v4l2_err("[%d] Error!! Cannot get param", ctx->id);
|
mtk_v4l2_vdec_err(ctx, "[%d] Error!! Cannot get param", ctx->id);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (!free_frame_buffer) {
|
if (!free_frame_buffer) {
|
||||||
mtk_v4l2_debug(3, " No free frame buffer");
|
mtk_v4l2_vdec_dbg(3, ctx, " No free frame buffer");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
mtk_v4l2_debug(3, "[%d] tmp_frame_addr = 0x%p", ctx->id,
|
mtk_v4l2_vdec_dbg(3, ctx, "[%d] tmp_frame_addr = 0x%p", ctx->id,
|
||||||
free_frame_buffer);
|
free_frame_buffer);
|
||||||
|
|
||||||
dstbuf = container_of(free_frame_buffer, struct mtk_video_dec_buf,
|
dstbuf = container_of(free_frame_buffer, struct mtk_video_dec_buf,
|
||||||
frame_buffer);
|
frame_buffer);
|
||||||
|
@ -131,9 +132,9 @@ static struct vb2_buffer *get_free_buffer(struct mtk_vcodec_ctx *ctx)
|
||||||
* This reduce overheads that dq/q unused capture
|
* This reduce overheads that dq/q unused capture
|
||||||
* buffer. In this case, queued_in_vb2 = true.
|
* buffer. In this case, queued_in_vb2 = true.
|
||||||
*/
|
*/
|
||||||
mtk_v4l2_debug(2, "[%d]status=%x queue id=%d to rdy_queue %d",
|
mtk_v4l2_vdec_dbg(2, ctx, "[%d]status=%x queue id=%d to rdy_queue %d",
|
||||||
ctx->id, free_frame_buffer->status,
|
ctx->id, free_frame_buffer->status,
|
||||||
vb->vb2_buf.index, dstbuf->queued_in_vb2);
|
vb->vb2_buf.index, dstbuf->queued_in_vb2);
|
||||||
v4l2_m2m_buf_queue(ctx->m2m_ctx, vb);
|
v4l2_m2m_buf_queue(ctx->m2m_ctx, vb);
|
||||||
} else if (!dstbuf->queued_in_vb2 && dstbuf->queued_in_v4l2) {
|
} else if (!dstbuf->queued_in_vb2 && dstbuf->queued_in_v4l2) {
|
||||||
/*
|
/*
|
||||||
|
@ -146,10 +147,10 @@ static struct vb2_buffer *get_free_buffer(struct mtk_vcodec_ctx *ctx)
|
||||||
* means this buffer is not from previous decode
|
* means this buffer is not from previous decode
|
||||||
* output.
|
* output.
|
||||||
*/
|
*/
|
||||||
mtk_v4l2_debug(2,
|
mtk_v4l2_vdec_dbg(2, ctx,
|
||||||
"[%d]status=%x queue id=%d to rdy_queue",
|
"[%d]status=%x queue id=%d to rdy_queue",
|
||||||
ctx->id, free_frame_buffer->status,
|
ctx->id, free_frame_buffer->status,
|
||||||
vb->vb2_buf.index);
|
vb->vb2_buf.index);
|
||||||
v4l2_m2m_buf_queue(ctx->m2m_ctx, vb);
|
v4l2_m2m_buf_queue(ctx->m2m_ctx, vb);
|
||||||
dstbuf->queued_in_vb2 = true;
|
dstbuf->queued_in_vb2 = true;
|
||||||
} else {
|
} else {
|
||||||
|
@ -161,10 +162,10 @@ static struct vb2_buffer *get_free_buffer(struct mtk_vcodec_ctx *ctx)
|
||||||
* When this buffer q from user space, it could
|
* When this buffer q from user space, it could
|
||||||
* directly q to vb2 buffer
|
* directly q to vb2 buffer
|
||||||
*/
|
*/
|
||||||
mtk_v4l2_debug(3, "[%d]status=%x err queue id=%d %d %d",
|
mtk_v4l2_vdec_dbg(3, ctx, "[%d]status=%x err queue id=%d %d %d",
|
||||||
ctx->id, free_frame_buffer->status,
|
ctx->id, free_frame_buffer->status,
|
||||||
vb->vb2_buf.index, dstbuf->queued_in_vb2,
|
vb->vb2_buf.index, dstbuf->queued_in_vb2,
|
||||||
dstbuf->queued_in_v4l2);
|
dstbuf->queued_in_v4l2);
|
||||||
}
|
}
|
||||||
dstbuf->used = false;
|
dstbuf->used = false;
|
||||||
}
|
}
|
||||||
|
@ -191,7 +192,7 @@ static void mtk_vdec_queue_res_chg_event(struct mtk_vcodec_ctx *ctx)
|
||||||
.u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION,
|
.u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION,
|
||||||
};
|
};
|
||||||
|
|
||||||
mtk_v4l2_debug(1, "[%d]", ctx->id);
|
mtk_v4l2_vdec_dbg(1, ctx, "[%d]", ctx->id);
|
||||||
v4l2_event_queue_fh(&ctx->fh, &ev_src_ch);
|
v4l2_event_queue_fh(&ctx->fh, &ev_src_ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,7 +203,7 @@ static int mtk_vdec_flush_decoder(struct mtk_vcodec_ctx *ctx)
|
||||||
|
|
||||||
ret = vdec_if_decode(ctx, NULL, NULL, &res_chg);
|
ret = vdec_if_decode(ctx, NULL, NULL, &res_chg);
|
||||||
if (ret)
|
if (ret)
|
||||||
mtk_v4l2_err("DecodeFinal failed, ret=%d", ret);
|
mtk_v4l2_vdec_err(ctx, "DecodeFinal failed, ret=%d", ret);
|
||||||
|
|
||||||
clean_display_buffer(ctx);
|
clean_display_buffer(ctx);
|
||||||
clean_free_buffer(ctx);
|
clean_free_buffer(ctx);
|
||||||
|
@ -221,14 +222,14 @@ static void mtk_vdec_update_fmt(struct mtk_vcodec_ctx *ctx,
|
||||||
for (k = 0; k < num_supported_formats; k++) {
|
for (k = 0; k < num_supported_formats; k++) {
|
||||||
fmt = &mtk_video_formats[k];
|
fmt = &mtk_video_formats[k];
|
||||||
if (fmt->fourcc == pixelformat) {
|
if (fmt->fourcc == pixelformat) {
|
||||||
mtk_v4l2_debug(1, "Update cap fourcc(%d -> %d)",
|
mtk_v4l2_vdec_dbg(1, ctx, "Update cap fourcc(%d -> %d)",
|
||||||
dst_q_data->fmt->fourcc, pixelformat);
|
dst_q_data->fmt->fourcc, pixelformat);
|
||||||
dst_q_data->fmt = fmt;
|
dst_q_data->fmt = fmt;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mtk_v4l2_err("Cannot get fourcc(%d), using init value", pixelformat);
|
mtk_v4l2_vdec_err(ctx, "Cannot get fourcc(%d), using init value", pixelformat);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mtk_vdec_pic_info_update(struct mtk_vcodec_ctx *ctx)
|
static int mtk_vdec_pic_info_update(struct mtk_vcodec_ctx *ctx)
|
||||||
|
@ -238,7 +239,8 @@ static int mtk_vdec_pic_info_update(struct mtk_vcodec_ctx *ctx)
|
||||||
|
|
||||||
if (vdec_if_get_param(ctx, GET_PARAM_PIC_INFO,
|
if (vdec_if_get_param(ctx, GET_PARAM_PIC_INFO,
|
||||||
&ctx->last_decoded_picinfo)) {
|
&ctx->last_decoded_picinfo)) {
|
||||||
mtk_v4l2_err("[%d]Error!! Cannot get param : GET_PARAM_PICTURE_INFO ERR", ctx->id);
|
mtk_v4l2_vdec_err(ctx, "[%d]Error!! Cannot get param : GET_PARAM_PICTURE_INFO ERR",
|
||||||
|
ctx->id);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -246,7 +248,7 @@ static int mtk_vdec_pic_info_update(struct mtk_vcodec_ctx *ctx)
|
||||||
ctx->last_decoded_picinfo.pic_h == 0 ||
|
ctx->last_decoded_picinfo.pic_h == 0 ||
|
||||||
ctx->last_decoded_picinfo.buf_w == 0 ||
|
ctx->last_decoded_picinfo.buf_w == 0 ||
|
||||||
ctx->last_decoded_picinfo.buf_h == 0) {
|
ctx->last_decoded_picinfo.buf_h == 0) {
|
||||||
mtk_v4l2_err("Cannot get correct pic info");
|
mtk_v4l2_vdec_err(ctx, "Cannot get correct pic info");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -258,15 +260,15 @@ static int mtk_vdec_pic_info_update(struct mtk_vcodec_ctx *ctx)
|
||||||
ctx->last_decoded_picinfo.pic_h == ctx->picinfo.pic_h)
|
ctx->last_decoded_picinfo.pic_h == ctx->picinfo.pic_h)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
mtk_v4l2_debug(1, "[%d]-> new(%d,%d), old(%d,%d), real(%d,%d)", ctx->id,
|
mtk_v4l2_vdec_dbg(1, ctx, "[%d]-> new(%d,%d), old(%d,%d), real(%d,%d)", ctx->id,
|
||||||
ctx->last_decoded_picinfo.pic_w,
|
ctx->last_decoded_picinfo.pic_w,
|
||||||
ctx->last_decoded_picinfo.pic_h, ctx->picinfo.pic_w,
|
ctx->last_decoded_picinfo.pic_h, ctx->picinfo.pic_w,
|
||||||
ctx->picinfo.pic_h, ctx->last_decoded_picinfo.buf_w,
|
ctx->picinfo.pic_h, ctx->last_decoded_picinfo.buf_w,
|
||||||
ctx->last_decoded_picinfo.buf_h);
|
ctx->last_decoded_picinfo.buf_h);
|
||||||
|
|
||||||
ret = vdec_if_get_param(ctx, GET_PARAM_DPB_SIZE, &dpbsize);
|
ret = vdec_if_get_param(ctx, GET_PARAM_DPB_SIZE, &dpbsize);
|
||||||
if (dpbsize == 0)
|
if (dpbsize == 0)
|
||||||
mtk_v4l2_err("Incorrect dpb size, ret=%d", ret);
|
mtk_v4l2_vdec_err(ctx, "Incorrect dpb size, ret=%d", ret);
|
||||||
|
|
||||||
ctx->dpb_size = dpbsize;
|
ctx->dpb_size = dpbsize;
|
||||||
|
|
||||||
|
@ -288,14 +290,14 @@ static void mtk_vdec_worker(struct work_struct *work)
|
||||||
src_buf = v4l2_m2m_next_src_buf(ctx->m2m_ctx);
|
src_buf = v4l2_m2m_next_src_buf(ctx->m2m_ctx);
|
||||||
if (!src_buf) {
|
if (!src_buf) {
|
||||||
v4l2_m2m_job_finish(dev->m2m_dev_dec, ctx->m2m_ctx);
|
v4l2_m2m_job_finish(dev->m2m_dev_dec, ctx->m2m_ctx);
|
||||||
mtk_v4l2_debug(1, "[%d] src_buf empty!!", ctx->id);
|
mtk_v4l2_vdec_dbg(1, ctx, "[%d] src_buf empty!!", ctx->id);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
dst_buf = v4l2_m2m_next_dst_buf(ctx->m2m_ctx);
|
dst_buf = v4l2_m2m_next_dst_buf(ctx->m2m_ctx);
|
||||||
if (!dst_buf) {
|
if (!dst_buf) {
|
||||||
v4l2_m2m_job_finish(dev->m2m_dev_dec, ctx->m2m_ctx);
|
v4l2_m2m_job_finish(dev->m2m_dev_dec, ctx->m2m_ctx);
|
||||||
mtk_v4l2_debug(1, "[%d] dst_buf empty!!", ctx->id);
|
mtk_v4l2_vdec_dbg(1, ctx, "[%d] dst_buf empty!!", ctx->id);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -313,15 +315,15 @@ static void mtk_vdec_worker(struct work_struct *work)
|
||||||
vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 1);
|
vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 1);
|
||||||
pfb->base_c.size = ctx->picinfo.fb_sz[1];
|
pfb->base_c.size = ctx->picinfo.fb_sz[1];
|
||||||
pfb->status = 0;
|
pfb->status = 0;
|
||||||
mtk_v4l2_debug(3, "===>[%d] vdec_if_decode() ===>", ctx->id);
|
mtk_v4l2_vdec_dbg(3, ctx, "===>[%d] vdec_if_decode() ===>", ctx->id);
|
||||||
|
|
||||||
mtk_v4l2_debug(3,
|
mtk_v4l2_vdec_dbg(3, ctx,
|
||||||
"id=%d Framebuf pfb=%p VA=%p Y_DMA=%pad C_DMA=%pad Size=%zx",
|
"id=%d Framebuf pfb=%p VA=%p Y_DMA=%pad C_DMA=%pad Size=%zx",
|
||||||
dst_buf->vb2_buf.index, pfb, pfb->base_y.va,
|
dst_buf->vb2_buf.index, pfb, pfb->base_y.va,
|
||||||
&pfb->base_y.dma_addr, &pfb->base_c.dma_addr, pfb->base_y.size);
|
&pfb->base_y.dma_addr, &pfb->base_c.dma_addr, pfb->base_y.size);
|
||||||
|
|
||||||
if (src_buf == &ctx->empty_flush_buf.vb) {
|
if (src_buf == &ctx->empty_flush_buf.vb) {
|
||||||
mtk_v4l2_debug(1, "Got empty flush input buffer.");
|
mtk_v4l2_vdec_dbg(1, ctx, "Got empty flush input buffer.");
|
||||||
src_buf = v4l2_m2m_src_buf_remove(ctx->m2m_ctx);
|
src_buf = v4l2_m2m_src_buf_remove(ctx->m2m_ctx);
|
||||||
|
|
||||||
/* update dst buf status */
|
/* update dst buf status */
|
||||||
|
@ -350,12 +352,12 @@ static void mtk_vdec_worker(struct work_struct *work)
|
||||||
buf.size = (size_t)src_buf->vb2_buf.planes[0].bytesused;
|
buf.size = (size_t)src_buf->vb2_buf.planes[0].bytesused;
|
||||||
if (!buf.va) {
|
if (!buf.va) {
|
||||||
v4l2_m2m_job_finish(dev->m2m_dev_dec, ctx->m2m_ctx);
|
v4l2_m2m_job_finish(dev->m2m_dev_dec, ctx->m2m_ctx);
|
||||||
mtk_v4l2_err("[%d] id=%d src_addr is NULL!!", ctx->id,
|
mtk_v4l2_vdec_err(ctx, "[%d] id=%d src_addr is NULL!!", ctx->id,
|
||||||
src_buf->vb2_buf.index);
|
src_buf->vb2_buf.index);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mtk_v4l2_debug(3, "[%d] Bitstream VA=%p DMA=%pad Size=%zx vb=%p",
|
mtk_v4l2_vdec_dbg(3, ctx, "[%d] Bitstream VA=%p DMA=%pad Size=%zx vb=%p",
|
||||||
ctx->id, buf.va, &buf.dma_addr, buf.size, src_buf);
|
ctx->id, buf.va, &buf.dma_addr, buf.size, src_buf);
|
||||||
dst_buf->vb2_buf.timestamp = src_buf->vb2_buf.timestamp;
|
dst_buf->vb2_buf.timestamp = src_buf->vb2_buf.timestamp;
|
||||||
dst_buf->timecode = src_buf->timecode;
|
dst_buf->timecode = src_buf->timecode;
|
||||||
mutex_lock(&ctx->lock);
|
mutex_lock(&ctx->lock);
|
||||||
|
@ -366,9 +368,10 @@ static void mtk_vdec_worker(struct work_struct *work)
|
||||||
ret = vdec_if_decode(ctx, &buf, pfb, &res_chg);
|
ret = vdec_if_decode(ctx, &buf, pfb, &res_chg);
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mtk_v4l2_err(" <===[%d], src_buf[%d] sz=0x%zx pts=%llu dst_buf[%d] vdec_if_decode() ret=%d res_chg=%d===>",
|
mtk_v4l2_vdec_err(ctx,
|
||||||
ctx->id, src_buf->vb2_buf.index, buf.size,
|
"[%d] decode src[%d] sz=0x%zx pts=%llu dst[%d] ret=%d res_chg=%d",
|
||||||
src_buf->vb2_buf.timestamp, dst_buf->vb2_buf.index, ret, res_chg);
|
ctx->id, src_buf->vb2_buf.index, buf.size,
|
||||||
|
src_buf->vb2_buf.timestamp, dst_buf->vb2_buf.index, ret, res_chg);
|
||||||
src_buf = v4l2_m2m_src_buf_remove(ctx->m2m_ctx);
|
src_buf = v4l2_m2m_src_buf_remove(ctx->m2m_ctx);
|
||||||
if (ret == -EIO) {
|
if (ret == -EIO) {
|
||||||
mutex_lock(&ctx->lock);
|
mutex_lock(&ctx->lock);
|
||||||
|
@ -421,8 +424,8 @@ static void vb2ops_vdec_stateful_buf_queue(struct vb2_buffer *vb)
|
||||||
struct vb2_v4l2_buffer *vb2_v4l2;
|
struct vb2_v4l2_buffer *vb2_v4l2;
|
||||||
struct mtk_q_data *dst_q_data;
|
struct mtk_q_data *dst_q_data;
|
||||||
|
|
||||||
mtk_v4l2_debug(3, "[%d] (%d) id=%d, vb=%p", ctx->id,
|
mtk_v4l2_vdec_dbg(3, ctx, "[%d] (%d) id=%d, vb=%p", ctx->id,
|
||||||
vb->vb2_queue->type, vb->index, vb);
|
vb->vb2_queue->type, vb->index, vb);
|
||||||
/*
|
/*
|
||||||
* check if this buffer is ready to be used after decode
|
* check if this buffer is ready to be used after decode
|
||||||
*/
|
*/
|
||||||
|
@ -448,20 +451,19 @@ static void vb2ops_vdec_stateful_buf_queue(struct vb2_buffer *vb)
|
||||||
v4l2_m2m_buf_queue(ctx->m2m_ctx, to_vb2_v4l2_buffer(vb));
|
v4l2_m2m_buf_queue(ctx->m2m_ctx, to_vb2_v4l2_buffer(vb));
|
||||||
|
|
||||||
if (ctx->state != MTK_STATE_INIT) {
|
if (ctx->state != MTK_STATE_INIT) {
|
||||||
mtk_v4l2_debug(3, "[%d] already init driver %d", ctx->id,
|
mtk_v4l2_vdec_dbg(3, ctx, "[%d] already init driver %d", ctx->id, ctx->state);
|
||||||
ctx->state);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
src_buf = v4l2_m2m_next_src_buf(ctx->m2m_ctx);
|
src_buf = v4l2_m2m_next_src_buf(ctx->m2m_ctx);
|
||||||
if (!src_buf) {
|
if (!src_buf) {
|
||||||
mtk_v4l2_err("No src buffer");
|
mtk_v4l2_vdec_err(ctx, "No src buffer");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (src_buf == &ctx->empty_flush_buf.vb) {
|
if (src_buf == &ctx->empty_flush_buf.vb) {
|
||||||
/* This shouldn't happen. Just in case. */
|
/* This shouldn't happen. Just in case. */
|
||||||
mtk_v4l2_err("Invalid flush buffer.");
|
mtk_v4l2_vdec_err(ctx, "Invalid flush buffer.");
|
||||||
v4l2_m2m_src_buf_remove(ctx->m2m_ctx);
|
v4l2_m2m_src_buf_remove(ctx->m2m_ctx);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -469,9 +471,8 @@ static void vb2ops_vdec_stateful_buf_queue(struct vb2_buffer *vb)
|
||||||
src_mem.va = vb2_plane_vaddr(&src_buf->vb2_buf, 0);
|
src_mem.va = vb2_plane_vaddr(&src_buf->vb2_buf, 0);
|
||||||
src_mem.dma_addr = vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0);
|
src_mem.dma_addr = vb2_dma_contig_plane_dma_addr(&src_buf->vb2_buf, 0);
|
||||||
src_mem.size = (size_t)src_buf->vb2_buf.planes[0].bytesused;
|
src_mem.size = (size_t)src_buf->vb2_buf.planes[0].bytesused;
|
||||||
mtk_v4l2_debug(2, "[%d] buf id=%d va=%p dma=%pad size=%zx", ctx->id,
|
mtk_v4l2_vdec_dbg(2, ctx, "[%d] buf id=%d va=%p dma=%pad size=%zx", ctx->id,
|
||||||
src_buf->vb2_buf.index, src_mem.va, &src_mem.dma_addr,
|
src_buf->vb2_buf.index, src_mem.va, &src_mem.dma_addr, src_mem.size);
|
||||||
src_mem.size);
|
|
||||||
|
|
||||||
ret = vdec_if_decode(ctx, &src_mem, NULL, &res_chg);
|
ret = vdec_if_decode(ctx, &src_mem, NULL, &res_chg);
|
||||||
if (ret || !res_chg) {
|
if (ret || !res_chg) {
|
||||||
|
@ -484,20 +485,22 @@ static void vb2ops_vdec_stateful_buf_queue(struct vb2_buffer *vb)
|
||||||
|
|
||||||
src_buf = v4l2_m2m_src_buf_remove(ctx->m2m_ctx);
|
src_buf = v4l2_m2m_src_buf_remove(ctx->m2m_ctx);
|
||||||
if (ret == -EIO) {
|
if (ret == -EIO) {
|
||||||
mtk_v4l2_err("[%d] Unrecoverable error in vdec_if_decode.", ctx->id);
|
mtk_v4l2_vdec_err(ctx, "[%d] Unrecoverable error in vdec_if_decode.",
|
||||||
|
ctx->id);
|
||||||
ctx->state = MTK_STATE_ABORT;
|
ctx->state = MTK_STATE_ABORT;
|
||||||
v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
|
v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
|
||||||
} else {
|
} else {
|
||||||
v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE);
|
v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE);
|
||||||
}
|
}
|
||||||
mtk_v4l2_debug(ret ? 0 : 1,
|
mtk_v4l2_vdec_dbg(ret ? 0 : 1, ctx,
|
||||||
"[%d] vdec_if_decode() src_buf=%d, size=%zu, fail=%d, res_chg=%d",
|
"[%d] decode() src_buf=%d, size=%zu, fail=%d, res_chg=%d",
|
||||||
ctx->id, src_buf->vb2_buf.index, src_mem.size, ret, res_chg);
|
ctx->id, src_buf->vb2_buf.index, src_mem.size, ret, res_chg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vdec_if_get_param(ctx, GET_PARAM_PIC_INFO, &ctx->picinfo)) {
|
if (vdec_if_get_param(ctx, GET_PARAM_PIC_INFO, &ctx->picinfo)) {
|
||||||
mtk_v4l2_err("[%d]Error!! Cannot get param : GET_PARAM_PICTURE_INFO ERR", ctx->id);
|
mtk_v4l2_vdec_err(ctx, "[%d]Error!! Cannot get param : GET_PARAM_PICTURE_INFO ERR",
|
||||||
|
ctx->id);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -508,17 +511,17 @@ static void vb2ops_vdec_stateful_buf_queue(struct vb2_buffer *vb)
|
||||||
dst_q_data->bytesperline[i] = ctx->picinfo.buf_w;
|
dst_q_data->bytesperline[i] = ctx->picinfo.buf_w;
|
||||||
}
|
}
|
||||||
|
|
||||||
mtk_v4l2_debug(2, "[%d] vdec_if_init() OK wxh=%dx%d pic wxh=%dx%d sz[0]=0x%x sz[1]=0x%x",
|
mtk_v4l2_vdec_dbg(2, ctx, "[%d] init OK wxh=%dx%d pic wxh=%dx%d sz[0]=0x%x sz[1]=0x%x",
|
||||||
ctx->id, ctx->picinfo.buf_w, ctx->picinfo.buf_h, ctx->picinfo.pic_w,
|
ctx->id, ctx->picinfo.buf_w, ctx->picinfo.buf_h, ctx->picinfo.pic_w,
|
||||||
ctx->picinfo.pic_h, dst_q_data->sizeimage[0], dst_q_data->sizeimage[1]);
|
ctx->picinfo.pic_h, dst_q_data->sizeimage[0], dst_q_data->sizeimage[1]);
|
||||||
|
|
||||||
ret = vdec_if_get_param(ctx, GET_PARAM_DPB_SIZE, &dpbsize);
|
ret = vdec_if_get_param(ctx, GET_PARAM_DPB_SIZE, &dpbsize);
|
||||||
if (dpbsize == 0)
|
if (dpbsize == 0)
|
||||||
mtk_v4l2_err("[%d] GET_PARAM_DPB_SIZE fail=%d", ctx->id, ret);
|
mtk_v4l2_vdec_err(ctx, "[%d] GET_PARAM_DPB_SIZE fail=%d", ctx->id, ret);
|
||||||
|
|
||||||
ctx->dpb_size = dpbsize;
|
ctx->dpb_size = dpbsize;
|
||||||
ctx->state = MTK_STATE_HEADER;
|
ctx->state = MTK_STATE_HEADER;
|
||||||
mtk_v4l2_debug(1, "[%d] dpbsize=%d", ctx->id, ctx->dpb_size);
|
mtk_v4l2_vdec_dbg(1, ctx, "[%d] dpbsize=%d", ctx->id, ctx->dpb_size);
|
||||||
|
|
||||||
mtk_vdec_queue_res_chg_event(ctx);
|
mtk_vdec_queue_res_chg_event(ctx);
|
||||||
}
|
}
|
||||||
|
@ -533,7 +536,7 @@ static int mtk_vdec_g_v_ctrl(struct v4l2_ctrl *ctrl)
|
||||||
if (ctx->state >= MTK_STATE_HEADER) {
|
if (ctx->state >= MTK_STATE_HEADER) {
|
||||||
ctrl->val = ctx->dpb_size;
|
ctrl->val = ctx->dpb_size;
|
||||||
} else {
|
} else {
|
||||||
mtk_v4l2_debug(0, "Seqinfo not ready");
|
mtk_v4l2_vdec_dbg(0, ctx, "Seqinfo not ready");
|
||||||
ctrl->val = 0;
|
ctrl->val = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -570,7 +573,7 @@ static int mtk_vcodec_dec_ctrls_setup(struct mtk_vcodec_ctx *ctx)
|
||||||
V4L2_MPEG_VIDEO_H264_PROFILE_MAIN);
|
V4L2_MPEG_VIDEO_H264_PROFILE_MAIN);
|
||||||
|
|
||||||
if (ctx->ctrl_hdl.error) {
|
if (ctx->ctrl_hdl.error) {
|
||||||
mtk_v4l2_err("Adding control failed %d", ctx->ctrl_hdl.error);
|
mtk_v4l2_vdec_err(ctx, "Adding control failed %d", ctx->ctrl_hdl.error);
|
||||||
return ctx->ctrl_hdl.error;
|
return ctx->ctrl_hdl.error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -232,10 +232,10 @@ static void mtk_vdec_stateless_cap_to_disp(struct mtk_vcodec_ctx *ctx, int error
|
||||||
vb2_dst = v4l2_m2m_dst_buf_remove(ctx->m2m_ctx);
|
vb2_dst = v4l2_m2m_dst_buf_remove(ctx->m2m_ctx);
|
||||||
if (vb2_dst) {
|
if (vb2_dst) {
|
||||||
v4l2_m2m_buf_done(vb2_dst, state);
|
v4l2_m2m_buf_done(vb2_dst, state);
|
||||||
mtk_v4l2_debug(2, "free frame buffer id:%d to done list",
|
mtk_v4l2_vdec_dbg(2, ctx, "free frame buffer id:%d to done list",
|
||||||
vb2_dst->vb2_buf.index);
|
vb2_dst->vb2_buf.index);
|
||||||
} else {
|
} else {
|
||||||
mtk_v4l2_err("dst buffer is NULL");
|
mtk_v4l2_vdec_err(ctx, "dst buffer is NULL");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (src_buf_req)
|
if (src_buf_req)
|
||||||
|
@ -251,7 +251,7 @@ static struct vdec_fb *vdec_get_cap_buffer(struct mtk_vcodec_ctx *ctx)
|
||||||
|
|
||||||
vb2_v4l2 = v4l2_m2m_next_dst_buf(ctx->m2m_ctx);
|
vb2_v4l2 = v4l2_m2m_next_dst_buf(ctx->m2m_ctx);
|
||||||
if (!vb2_v4l2) {
|
if (!vb2_v4l2) {
|
||||||
mtk_v4l2_debug(1, "[%d] dst_buf empty!!", ctx->id);
|
mtk_v4l2_vdec_dbg(1, ctx, "[%d] dst_buf empty!!", ctx->id);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,9 +269,10 @@ static struct vdec_fb *vdec_get_cap_buffer(struct mtk_vcodec_ctx *ctx)
|
||||||
vb2_dma_contig_plane_dma_addr(dst_buf, 1);
|
vb2_dma_contig_plane_dma_addr(dst_buf, 1);
|
||||||
pfb->base_c.size = ctx->q_data[MTK_Q_DATA_DST].sizeimage[1];
|
pfb->base_c.size = ctx->q_data[MTK_Q_DATA_DST].sizeimage[1];
|
||||||
}
|
}
|
||||||
mtk_v4l2_debug(1, "id=%d Framebuf pfb=%p VA=%p Y_DMA=%pad C_DMA=%pad Size=%zx frame_count = %d",
|
mtk_v4l2_vdec_dbg(1, ctx,
|
||||||
dst_buf->index, pfb, pfb->base_y.va, &pfb->base_y.dma_addr,
|
"id=%d Framebuf pfb=%p VA=%p Y/C_DMA=%pad_%pad Sz=%zx frame_count = %d",
|
||||||
&pfb->base_c.dma_addr, pfb->base_y.size, ctx->decoded_frame_cnt);
|
dst_buf->index, pfb, pfb->base_y.va, &pfb->base_y.dma_addr,
|
||||||
|
&pfb->base_c.dma_addr, pfb->base_y.size, ctx->decoded_frame_cnt);
|
||||||
|
|
||||||
return pfb;
|
return pfb;
|
||||||
}
|
}
|
||||||
|
@ -300,7 +301,7 @@ static void mtk_vdec_worker(struct work_struct *work)
|
||||||
vb2_v4l2_src = v4l2_m2m_next_src_buf(ctx->m2m_ctx);
|
vb2_v4l2_src = v4l2_m2m_next_src_buf(ctx->m2m_ctx);
|
||||||
if (!vb2_v4l2_src) {
|
if (!vb2_v4l2_src) {
|
||||||
v4l2_m2m_job_finish(dev->m2m_dev_dec, ctx->m2m_ctx);
|
v4l2_m2m_job_finish(dev->m2m_dev_dec, ctx->m2m_ctx);
|
||||||
mtk_v4l2_debug(1, "[%d] no available source buffer", ctx->id);
|
mtk_v4l2_vdec_dbg(1, ctx, "[%d] no available source buffer", ctx->id);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -309,33 +310,34 @@ static void mtk_vdec_worker(struct work_struct *work)
|
||||||
m2m_buf.vb);
|
m2m_buf.vb);
|
||||||
bs_src = &dec_buf_src->bs_buffer;
|
bs_src = &dec_buf_src->bs_buffer;
|
||||||
|
|
||||||
mtk_v4l2_debug(3, "[%d] (%d) id=%d, vb=%p", ctx->id,
|
mtk_v4l2_vdec_dbg(3, ctx, "[%d] (%d) id=%d, vb=%p", ctx->id,
|
||||||
vb2_src->vb2_queue->type, vb2_src->index, vb2_src);
|
vb2_src->vb2_queue->type, vb2_src->index, vb2_src);
|
||||||
|
|
||||||
bs_src->va = vb2_plane_vaddr(vb2_src, 0);
|
bs_src->va = vb2_plane_vaddr(vb2_src, 0);
|
||||||
bs_src->dma_addr = vb2_dma_contig_plane_dma_addr(vb2_src, 0);
|
bs_src->dma_addr = vb2_dma_contig_plane_dma_addr(vb2_src, 0);
|
||||||
bs_src->size = (size_t)vb2_src->planes[0].bytesused;
|
bs_src->size = (size_t)vb2_src->planes[0].bytesused;
|
||||||
if (!bs_src->va) {
|
if (!bs_src->va) {
|
||||||
v4l2_m2m_job_finish(dev->m2m_dev_dec, ctx->m2m_ctx);
|
v4l2_m2m_job_finish(dev->m2m_dev_dec, ctx->m2m_ctx);
|
||||||
mtk_v4l2_err("[%d] id=%d source buffer is NULL", ctx->id,
|
mtk_v4l2_vdec_err(ctx, "[%d] id=%d source buffer is NULL", ctx->id,
|
||||||
vb2_src->index);
|
vb2_src->index);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mtk_v4l2_debug(3, "[%d] Bitstream VA=%p DMA=%pad Size=%zx vb=%p",
|
mtk_v4l2_vdec_dbg(3, ctx, "[%d] Bitstream VA=%p DMA=%pad Size=%zx vb=%p",
|
||||||
ctx->id, bs_src->va, &bs_src->dma_addr, bs_src->size, vb2_src);
|
ctx->id, bs_src->va, &bs_src->dma_addr, bs_src->size, vb2_src);
|
||||||
/* Apply request controls. */
|
/* Apply request controls. */
|
||||||
src_buf_req = vb2_src->req_obj.req;
|
src_buf_req = vb2_src->req_obj.req;
|
||||||
if (src_buf_req)
|
if (src_buf_req)
|
||||||
v4l2_ctrl_request_setup(src_buf_req, &ctx->ctrl_hdl);
|
v4l2_ctrl_request_setup(src_buf_req, &ctx->ctrl_hdl);
|
||||||
else
|
else
|
||||||
mtk_v4l2_err("vb2 buffer media request is NULL");
|
mtk_v4l2_vdec_err(ctx, "vb2 buffer media request is NULL");
|
||||||
|
|
||||||
ret = vdec_if_decode(ctx, bs_src, NULL, &res_chg);
|
ret = vdec_if_decode(ctx, bs_src, NULL, &res_chg);
|
||||||
if (ret && ret != -EAGAIN) {
|
if (ret && ret != -EAGAIN) {
|
||||||
mtk_v4l2_err(" <===[%d], src_buf[%d] sz=0x%zx pts=%llu vdec_if_decode() ret=%d res_chg=%d===>",
|
mtk_v4l2_vdec_err(ctx,
|
||||||
ctx->id, vb2_src->index, bs_src->size,
|
"[%d] decode src_buf[%d] sz=0x%zx pts=%llu ret=%d res_chg=%d",
|
||||||
vb2_src->timestamp, ret, res_chg);
|
ctx->id, vb2_src->index, bs_src->size,
|
||||||
|
vb2_src->timestamp, ret, res_chg);
|
||||||
if (ret == -EIO) {
|
if (ret == -EIO) {
|
||||||
mutex_lock(&ctx->lock);
|
mutex_lock(&ctx->lock);
|
||||||
dec_buf_src->error = true;
|
dec_buf_src->error = true;
|
||||||
|
@ -363,7 +365,8 @@ static void vb2ops_vdec_stateless_buf_queue(struct vb2_buffer *vb)
|
||||||
struct mtk_vcodec_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
|
struct mtk_vcodec_ctx *ctx = vb2_get_drv_priv(vb->vb2_queue);
|
||||||
struct vb2_v4l2_buffer *vb2_v4l2 = to_vb2_v4l2_buffer(vb);
|
struct vb2_v4l2_buffer *vb2_v4l2 = to_vb2_v4l2_buffer(vb);
|
||||||
|
|
||||||
mtk_v4l2_debug(3, "[%d] (%d) id=%d, vb=%p", ctx->id, vb->vb2_queue->type, vb->index, vb);
|
mtk_v4l2_vdec_dbg(3, ctx, "[%d] (%d) id=%d, vb=%p", ctx->id, vb->vb2_queue->type,
|
||||||
|
vb->index, vb);
|
||||||
|
|
||||||
mutex_lock(&ctx->lock);
|
mutex_lock(&ctx->lock);
|
||||||
v4l2_m2m_buf_queue(ctx->m2m_ctx, vb2_v4l2);
|
v4l2_m2m_buf_queue(ctx->m2m_ctx, vb2_v4l2);
|
||||||
|
@ -374,9 +377,9 @@ static void vb2ops_vdec_stateless_buf_queue(struct vb2_buffer *vb)
|
||||||
/* If an OUTPUT buffer, we may need to update the state */
|
/* If an OUTPUT buffer, we may need to update the state */
|
||||||
if (ctx->state == MTK_STATE_INIT) {
|
if (ctx->state == MTK_STATE_INIT) {
|
||||||
ctx->state = MTK_STATE_HEADER;
|
ctx->state = MTK_STATE_HEADER;
|
||||||
mtk_v4l2_debug(1, "Init driver from init to header.");
|
mtk_v4l2_vdec_dbg(1, ctx, "Init driver from init to header.");
|
||||||
} else {
|
} else {
|
||||||
mtk_v4l2_debug(3, "[%d] already init driver %d", ctx->id, ctx->state);
|
mtk_v4l2_vdec_dbg(3, ctx, "[%d] already init driver %d", ctx->id, ctx->state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -393,7 +396,7 @@ static int mtk_vcodec_dec_ctrls_setup(struct mtk_vcodec_ctx *ctx)
|
||||||
|
|
||||||
v4l2_ctrl_handler_init(&ctx->ctrl_hdl, NUM_CTRLS);
|
v4l2_ctrl_handler_init(&ctx->ctrl_hdl, NUM_CTRLS);
|
||||||
if (ctx->ctrl_hdl.error) {
|
if (ctx->ctrl_hdl.error) {
|
||||||
mtk_v4l2_err("v4l2_ctrl_handler_init failed\n");
|
mtk_v4l2_vdec_err(ctx, "v4l2_ctrl_handler_init failed\n");
|
||||||
return ctx->ctrl_hdl.error;
|
return ctx->ctrl_hdl.error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -402,7 +405,8 @@ static int mtk_vcodec_dec_ctrls_setup(struct mtk_vcodec_ctx *ctx)
|
||||||
|
|
||||||
v4l2_ctrl_new_custom(&ctx->ctrl_hdl, &cfg, NULL);
|
v4l2_ctrl_new_custom(&ctx->ctrl_hdl, &cfg, NULL);
|
||||||
if (ctx->ctrl_hdl.error) {
|
if (ctx->ctrl_hdl.error) {
|
||||||
mtk_v4l2_err("Adding control %d failed %d", i, ctx->ctrl_hdl.error);
|
mtk_v4l2_vdec_err(ctx, "Adding control %d failed %d", i,
|
||||||
|
ctx->ctrl_hdl.error);
|
||||||
return ctx->ctrl_hdl.error;
|
return ctx->ctrl_hdl.error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -421,11 +425,11 @@ static int fops_media_request_validate(struct media_request *mreq)
|
||||||
/* We expect exactly one buffer with the request */
|
/* We expect exactly one buffer with the request */
|
||||||
break;
|
break;
|
||||||
case 0:
|
case 0:
|
||||||
mtk_v4l2_debug(1, "No buffer provided with the request");
|
pr_debug(MTK_DBG_VCODEC_STR "No buffer provided with the request.");
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
default:
|
default:
|
||||||
mtk_v4l2_debug(1, "Too many buffers (%d) provided with the request",
|
pr_debug(MTK_DBG_VCODEC_STR "Too many buffers (%d) provided with the request.",
|
||||||
buffer_cnt);
|
buffer_cnt);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -470,13 +474,13 @@ static void mtk_vcodec_add_formats(unsigned int fourcc,
|
||||||
mtk_video_formats[count_formats].num_planes = 2;
|
mtk_video_formats[count_formats].num_planes = 2;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
mtk_v4l2_err("Can not add unsupported format type");
|
mtk_v4l2_vdec_err(ctx, "Can not add unsupported format type");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
num_formats++;
|
num_formats++;
|
||||||
mtk_v4l2_debug(3, "num_formats: %d dec_capability: 0x%x",
|
mtk_v4l2_vdec_dbg(3, ctx, "num_formats: %d dec_capability: 0x%x",
|
||||||
count_formats, ctx->dev->dec_capability);
|
count_formats, ctx->dev->dec_capability);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mtk_vcodec_get_supported_formats(struct mtk_vcodec_ctx *ctx)
|
static void mtk_vcodec_get_supported_formats(struct mtk_vcodec_ctx *ctx)
|
||||||
|
|
|
@ -51,63 +51,53 @@ static int vidioc_venc_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||||
|
|
||||||
switch (ctrl->id) {
|
switch (ctrl->id) {
|
||||||
case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
|
case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
|
||||||
mtk_v4l2_debug(2, "V4L2_CID_MPEG_VIDEO_BITRATE_MODE val= %d",
|
mtk_v4l2_venc_dbg(2, ctx, "V4L2_CID_MPEG_VIDEO_BITRATE_MODE val= %d", ctrl->val);
|
||||||
ctrl->val);
|
|
||||||
if (ctrl->val != V4L2_MPEG_VIDEO_BITRATE_MODE_CBR) {
|
if (ctrl->val != V4L2_MPEG_VIDEO_BITRATE_MODE_CBR) {
|
||||||
mtk_v4l2_err("Unsupported bitrate mode =%d", ctrl->val);
|
mtk_v4l2_venc_err(ctx, "Unsupported bitrate mode =%d", ctrl->val);
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case V4L2_CID_MPEG_VIDEO_BITRATE:
|
case V4L2_CID_MPEG_VIDEO_BITRATE:
|
||||||
mtk_v4l2_debug(2, "V4L2_CID_MPEG_VIDEO_BITRATE val = %d",
|
mtk_v4l2_venc_dbg(2, ctx, "V4L2_CID_MPEG_VIDEO_BITRATE val = %d", ctrl->val);
|
||||||
ctrl->val);
|
|
||||||
p->bitrate = ctrl->val;
|
p->bitrate = ctrl->val;
|
||||||
ctx->param_change |= MTK_ENCODE_PARAM_BITRATE;
|
ctx->param_change |= MTK_ENCODE_PARAM_BITRATE;
|
||||||
break;
|
break;
|
||||||
case V4L2_CID_MPEG_VIDEO_B_FRAMES:
|
case V4L2_CID_MPEG_VIDEO_B_FRAMES:
|
||||||
mtk_v4l2_debug(2, "V4L2_CID_MPEG_VIDEO_B_FRAMES val = %d",
|
mtk_v4l2_venc_dbg(2, ctx, "V4L2_CID_MPEG_VIDEO_B_FRAMES val = %d", ctrl->val);
|
||||||
ctrl->val);
|
|
||||||
p->num_b_frame = ctrl->val;
|
p->num_b_frame = ctrl->val;
|
||||||
break;
|
break;
|
||||||
case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:
|
case V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE:
|
||||||
mtk_v4l2_debug(2, "V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE val = %d",
|
mtk_v4l2_venc_dbg(2, ctx, "V4L2_CID_MPEG_VIDEO_FRAME_RC_ENABLE val = %d",
|
||||||
ctrl->val);
|
ctrl->val);
|
||||||
p->rc_frame = ctrl->val;
|
p->rc_frame = ctrl->val;
|
||||||
break;
|
break;
|
||||||
case V4L2_CID_MPEG_VIDEO_H264_MAX_QP:
|
case V4L2_CID_MPEG_VIDEO_H264_MAX_QP:
|
||||||
mtk_v4l2_debug(2, "V4L2_CID_MPEG_VIDEO_H264_MAX_QP val = %d",
|
mtk_v4l2_venc_dbg(2, ctx, "V4L2_CID_MPEG_VIDEO_H264_MAX_QP val = %d", ctrl->val);
|
||||||
ctrl->val);
|
|
||||||
p->h264_max_qp = ctrl->val;
|
p->h264_max_qp = ctrl->val;
|
||||||
break;
|
break;
|
||||||
case V4L2_CID_MPEG_VIDEO_HEADER_MODE:
|
case V4L2_CID_MPEG_VIDEO_HEADER_MODE:
|
||||||
mtk_v4l2_debug(2, "V4L2_CID_MPEG_VIDEO_HEADER_MODE val = %d",
|
mtk_v4l2_venc_dbg(2, ctx, "V4L2_CID_MPEG_VIDEO_HEADER_MODE val = %d", ctrl->val);
|
||||||
ctrl->val);
|
|
||||||
p->seq_hdr_mode = ctrl->val;
|
p->seq_hdr_mode = ctrl->val;
|
||||||
break;
|
break;
|
||||||
case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE:
|
case V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE:
|
||||||
mtk_v4l2_debug(2, "V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE val = %d",
|
mtk_v4l2_venc_dbg(2, ctx, "V4L2_CID_MPEG_VIDEO_MB_RC_ENABLE val = %d", ctrl->val);
|
||||||
ctrl->val);
|
|
||||||
p->rc_mb = ctrl->val;
|
p->rc_mb = ctrl->val;
|
||||||
break;
|
break;
|
||||||
case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
|
case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
|
||||||
mtk_v4l2_debug(2, "V4L2_CID_MPEG_VIDEO_H264_PROFILE val = %d",
|
mtk_v4l2_venc_dbg(2, ctx, "V4L2_CID_MPEG_VIDEO_H264_PROFILE val = %d", ctrl->val);
|
||||||
ctrl->val);
|
|
||||||
p->h264_profile = ctrl->val;
|
p->h264_profile = ctrl->val;
|
||||||
break;
|
break;
|
||||||
case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
|
case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
|
||||||
mtk_v4l2_debug(2, "V4L2_CID_MPEG_VIDEO_H264_LEVEL val = %d",
|
mtk_v4l2_venc_dbg(2, ctx, "V4L2_CID_MPEG_VIDEO_H264_LEVEL val = %d", ctrl->val);
|
||||||
ctrl->val);
|
|
||||||
p->h264_level = ctrl->val;
|
p->h264_level = ctrl->val;
|
||||||
break;
|
break;
|
||||||
case V4L2_CID_MPEG_VIDEO_H264_I_PERIOD:
|
case V4L2_CID_MPEG_VIDEO_H264_I_PERIOD:
|
||||||
mtk_v4l2_debug(2, "V4L2_CID_MPEG_VIDEO_H264_I_PERIOD val = %d",
|
mtk_v4l2_venc_dbg(2, ctx, "V4L2_CID_MPEG_VIDEO_H264_I_PERIOD val = %d", ctrl->val);
|
||||||
ctrl->val);
|
|
||||||
p->intra_period = ctrl->val;
|
p->intra_period = ctrl->val;
|
||||||
ctx->param_change |= MTK_ENCODE_PARAM_INTRA_PERIOD;
|
ctx->param_change |= MTK_ENCODE_PARAM_INTRA_PERIOD;
|
||||||
break;
|
break;
|
||||||
case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
|
case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
|
||||||
mtk_v4l2_debug(2, "V4L2_CID_MPEG_VIDEO_GOP_SIZE val = %d",
|
mtk_v4l2_venc_dbg(2, ctx, "V4L2_CID_MPEG_VIDEO_GOP_SIZE val = %d", ctrl->val);
|
||||||
ctrl->val);
|
|
||||||
p->gop_size = ctrl->val;
|
p->gop_size = ctrl->val;
|
||||||
ctx->param_change |= MTK_ENCODE_PARAM_GOP_SIZE;
|
ctx->param_change |= MTK_ENCODE_PARAM_GOP_SIZE;
|
||||||
break;
|
break;
|
||||||
|
@ -116,10 +106,10 @@ static int vidioc_venc_s_ctrl(struct v4l2_ctrl *ctrl)
|
||||||
* FIXME - what vp8 profiles are actually supported?
|
* FIXME - what vp8 profiles are actually supported?
|
||||||
* The ctrl is added (with only profile 0 supported) for now.
|
* The ctrl is added (with only profile 0 supported) for now.
|
||||||
*/
|
*/
|
||||||
mtk_v4l2_debug(2, "V4L2_CID_MPEG_VIDEO_VP8_PROFILE val = %d", ctrl->val);
|
mtk_v4l2_venc_dbg(2, ctx, "V4L2_CID_MPEG_VIDEO_VP8_PROFILE val = %d", ctrl->val);
|
||||||
break;
|
break;
|
||||||
case V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME:
|
case V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME:
|
||||||
mtk_v4l2_debug(2, "V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME");
|
mtk_v4l2_venc_dbg(2, ctx, "V4L2_CID_MPEG_VIDEO_FORCE_KEY_FRAME");
|
||||||
p->force_intra = 1;
|
p->force_intra = 1;
|
||||||
ctx->param_change |= MTK_ENCODE_PARAM_FORCE_INTRA;
|
ctx->param_change |= MTK_ENCODE_PARAM_FORCE_INTRA;
|
||||||
break;
|
break;
|
||||||
|
@ -341,11 +331,12 @@ static int vidioc_try_fmt_out(struct mtk_vcodec_ctx *ctx, struct v4l2_format *f,
|
||||||
if (pix_fmt_mp->height < tmp_h && (pix_fmt_mp->height + 32) <= max_height)
|
if (pix_fmt_mp->height < tmp_h && (pix_fmt_mp->height + 32) <= max_height)
|
||||||
pix_fmt_mp->height += 32;
|
pix_fmt_mp->height += 32;
|
||||||
|
|
||||||
mtk_v4l2_debug(0, "before resize w=%d, h=%d, after resize w=%d, h=%d, sizeimage=%d %d",
|
mtk_v4l2_venc_dbg(0, ctx,
|
||||||
tmp_w, tmp_h, pix_fmt_mp->width,
|
"before resize wxh=%dx%d, after resize wxh=%dx%d, sizeimage=%d %d",
|
||||||
pix_fmt_mp->height,
|
tmp_w, tmp_h, pix_fmt_mp->width,
|
||||||
pix_fmt_mp->plane_fmt[0].sizeimage,
|
pix_fmt_mp->height,
|
||||||
pix_fmt_mp->plane_fmt[1].sizeimage);
|
pix_fmt_mp->plane_fmt[0].sizeimage,
|
||||||
|
pix_fmt_mp->plane_fmt[1].sizeimage);
|
||||||
|
|
||||||
pix_fmt_mp->num_planes = fmt->num_planes;
|
pix_fmt_mp->num_planes = fmt->num_planes;
|
||||||
pix_fmt_mp->plane_fmt[0].sizeimage =
|
pix_fmt_mp->plane_fmt[0].sizeimage =
|
||||||
|
@ -396,7 +387,7 @@ static void mtk_venc_set_param(struct mtk_vcodec_ctx *ctx,
|
||||||
param->input_yuv_fmt = VENC_YUV_FORMAT_NV21;
|
param->input_yuv_fmt = VENC_YUV_FORMAT_NV21;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
mtk_v4l2_err("Unsupported fourcc =%d", q_data_src->fmt->fourcc);
|
mtk_v4l2_venc_err(ctx, "Unsupported fourcc =%d", q_data_src->fmt->fourcc);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
param->h264_profile = enc_params->h264_profile;
|
param->h264_profile = enc_params->h264_profile;
|
||||||
|
@ -414,13 +405,13 @@ static void mtk_venc_set_param(struct mtk_vcodec_ctx *ctx,
|
||||||
param->gop_size = enc_params->gop_size;
|
param->gop_size = enc_params->gop_size;
|
||||||
param->bitrate = enc_params->bitrate;
|
param->bitrate = enc_params->bitrate;
|
||||||
|
|
||||||
mtk_v4l2_debug(0,
|
mtk_v4l2_venc_dbg(0, ctx,
|
||||||
"fmt 0x%x, P/L %d/%d, w/h %d/%d, buf %d/%d, fps/bps %d/%d, gop %d, i_period %d",
|
"fmt 0x%x, P/L %d/%d w/h %d/%d buf %d/%d fps/bps %d/%d gop %d i_per %d",
|
||||||
param->input_yuv_fmt, param->h264_profile,
|
param->input_yuv_fmt, param->h264_profile,
|
||||||
param->h264_level, param->width, param->height,
|
param->h264_level, param->width, param->height,
|
||||||
param->buf_width, param->buf_height,
|
param->buf_width, param->buf_height,
|
||||||
param->frm_rate, param->bitrate,
|
param->frm_rate, param->bitrate,
|
||||||
param->gop_size, param->intra_period);
|
param->gop_size, param->intra_period);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vidioc_venc_s_fmt_cap(struct file *file, void *priv,
|
static int vidioc_venc_s_fmt_cap(struct file *file, void *priv,
|
||||||
|
@ -435,12 +426,12 @@ static int vidioc_venc_s_fmt_cap(struct file *file, void *priv,
|
||||||
|
|
||||||
vq = v4l2_m2m_get_vq(ctx->m2m_ctx, f->type);
|
vq = v4l2_m2m_get_vq(ctx->m2m_ctx, f->type);
|
||||||
if (!vq) {
|
if (!vq) {
|
||||||
mtk_v4l2_err("fail to get vq");
|
mtk_v4l2_venc_err(ctx, "fail to get vq");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vb2_is_busy(vq)) {
|
if (vb2_is_busy(vq)) {
|
||||||
mtk_v4l2_err("queue busy");
|
mtk_v4l2_venc_err(ctx, "queue busy");
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -468,8 +459,8 @@ static int vidioc_venc_s_fmt_cap(struct file *file, void *priv,
|
||||||
if (ctx->state == MTK_STATE_FREE) {
|
if (ctx->state == MTK_STATE_FREE) {
|
||||||
ret = venc_if_init(ctx, q_data->fmt->fourcc);
|
ret = venc_if_init(ctx, q_data->fmt->fourcc);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mtk_v4l2_err("venc_if_init failed=%d, codec type=%x",
|
mtk_v4l2_venc_err(ctx, "venc_if_init failed=%d, codec type=%x",
|
||||||
ret, q_data->fmt->fourcc);
|
ret, q_data->fmt->fourcc);
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
ctx->state = MTK_STATE_INIT;
|
ctx->state = MTK_STATE_INIT;
|
||||||
|
@ -490,12 +481,12 @@ static int vidioc_venc_s_fmt_out(struct file *file, void *priv,
|
||||||
|
|
||||||
vq = v4l2_m2m_get_vq(ctx->m2m_ctx, f->type);
|
vq = v4l2_m2m_get_vq(ctx->m2m_ctx, f->type);
|
||||||
if (!vq) {
|
if (!vq) {
|
||||||
mtk_v4l2_err("fail to get vq");
|
mtk_v4l2_venc_err(ctx, "fail to get vq");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (vb2_is_busy(vq)) {
|
if (vb2_is_busy(vq)) {
|
||||||
mtk_v4l2_err("queue busy");
|
mtk_v4l2_venc_err(ctx, "queue busy");
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -670,8 +661,8 @@ static int vidioc_venc_qbuf(struct file *file, void *priv,
|
||||||
struct mtk_vcodec_ctx *ctx = fh_to_ctx(priv);
|
struct mtk_vcodec_ctx *ctx = fh_to_ctx(priv);
|
||||||
|
|
||||||
if (ctx->state == MTK_STATE_ABORT) {
|
if (ctx->state == MTK_STATE_ABORT) {
|
||||||
mtk_v4l2_err("[%d] Call on QBUF after unrecoverable error",
|
mtk_v4l2_venc_err(ctx, "[%d] Call on QBUF after unrecoverable error",
|
||||||
ctx->id);
|
ctx->id);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -685,8 +676,8 @@ static int vidioc_venc_dqbuf(struct file *file, void *priv,
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (ctx->state == MTK_STATE_ABORT) {
|
if (ctx->state == MTK_STATE_ABORT) {
|
||||||
mtk_v4l2_err("[%d] Call on QBUF after unrecoverable error",
|
mtk_v4l2_venc_err(ctx, "[%d] Call on QBUF after unrecoverable error",
|
||||||
ctx->id);
|
ctx->id);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -724,8 +715,8 @@ static int vidioc_encoder_cmd(struct file *file, void *priv,
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (ctx->state == MTK_STATE_ABORT) {
|
if (ctx->state == MTK_STATE_ABORT) {
|
||||||
mtk_v4l2_err("[%d] Call to CMD after unrecoverable error",
|
mtk_v4l2_venc_err(ctx, "[%d] Call to CMD after unrecoverable error",
|
||||||
ctx->id);
|
ctx->id);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -737,7 +728,7 @@ static int vidioc_encoder_cmd(struct file *file, void *priv,
|
||||||
if (ctx->is_flushing)
|
if (ctx->is_flushing)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
||||||
mtk_v4l2_debug(1, "encoder cmd=%u", cmd->cmd);
|
mtk_v4l2_venc_dbg(1, ctx, "encoder cmd=%u", cmd->cmd);
|
||||||
|
|
||||||
dst_vq = v4l2_m2m_get_vq(ctx->m2m_ctx,
|
dst_vq = v4l2_m2m_get_vq(ctx->m2m_ctx,
|
||||||
V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
|
V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
|
||||||
|
@ -746,11 +737,11 @@ static int vidioc_encoder_cmd(struct file *file, void *priv,
|
||||||
src_vq = v4l2_m2m_get_vq(ctx->m2m_ctx,
|
src_vq = v4l2_m2m_get_vq(ctx->m2m_ctx,
|
||||||
V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
|
V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE);
|
||||||
if (!vb2_is_streaming(src_vq)) {
|
if (!vb2_is_streaming(src_vq)) {
|
||||||
mtk_v4l2_debug(1, "Output stream is off. No need to flush.");
|
mtk_v4l2_venc_dbg(1, ctx, "Output stream is off. No need to flush.");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (!vb2_is_streaming(dst_vq)) {
|
if (!vb2_is_streaming(dst_vq)) {
|
||||||
mtk_v4l2_debug(1, "Capture stream is off. No need to flush.");
|
mtk_v4l2_venc_dbg(1, ctx, "Capture stream is off. No need to flush.");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
ctx->is_flushing = true;
|
ctx->is_flushing = true;
|
||||||
|
@ -841,9 +832,8 @@ static int vb2ops_venc_buf_prepare(struct vb2_buffer *vb)
|
||||||
|
|
||||||
for (i = 0; i < q_data->fmt->num_planes; i++) {
|
for (i = 0; i < q_data->fmt->num_planes; i++) {
|
||||||
if (vb2_plane_size(vb, i) < q_data->sizeimage[i]) {
|
if (vb2_plane_size(vb, i) < q_data->sizeimage[i]) {
|
||||||
mtk_v4l2_err("data will not fit into plane %d (%lu < %d)",
|
mtk_v4l2_venc_err(ctx, "data will not fit into plane %d (%lu < %d)",
|
||||||
i, vb2_plane_size(vb, i),
|
i, vb2_plane_size(vb, i), q_data->sizeimage[i]);
|
||||||
q_data->sizeimage[i]);
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -863,10 +853,8 @@ static void vb2ops_venc_buf_queue(struct vb2_buffer *vb)
|
||||||
|
|
||||||
if ((vb->vb2_queue->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) &&
|
if ((vb->vb2_queue->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) &&
|
||||||
(ctx->param_change != MTK_ENCODE_PARAM_NONE)) {
|
(ctx->param_change != MTK_ENCODE_PARAM_NONE)) {
|
||||||
mtk_v4l2_debug(1, "[%d] Before id=%d encode parameter change %x",
|
mtk_v4l2_venc_dbg(1, ctx, "[%d] Before id=%d encode parameter change %x",
|
||||||
ctx->id,
|
ctx->id, vb2_v4l2->vb2_buf.index, ctx->param_change);
|
||||||
vb2_v4l2->vb2_buf.index,
|
|
||||||
ctx->param_change);
|
|
||||||
mtk_buf->param_change = ctx->param_change;
|
mtk_buf->param_change = ctx->param_change;
|
||||||
mtk_buf->enc_params = ctx->enc_params;
|
mtk_buf->enc_params = ctx->enc_params;
|
||||||
ctx->param_change = MTK_ENCODE_PARAM_NONE;
|
ctx->param_change = MTK_ENCODE_PARAM_NONE;
|
||||||
|
@ -901,14 +889,14 @@ static int vb2ops_venc_start_streaming(struct vb2_queue *q, unsigned int count)
|
||||||
|
|
||||||
ret = pm_runtime_resume_and_get(&ctx->dev->plat_dev->dev);
|
ret = pm_runtime_resume_and_get(&ctx->dev->plat_dev->dev);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
mtk_v4l2_err("pm_runtime_resume_and_get fail %d", ret);
|
mtk_v4l2_venc_err(ctx, "pm_runtime_resume_and_get fail %d", ret);
|
||||||
goto err_start_stream;
|
goto err_start_stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
mtk_venc_set_param(ctx, ¶m);
|
mtk_venc_set_param(ctx, ¶m);
|
||||||
ret = venc_if_set_param(ctx, VENC_SET_PARAM_ENC, ¶m);
|
ret = venc_if_set_param(ctx, VENC_SET_PARAM_ENC, ¶m);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mtk_v4l2_err("venc_if_set_param failed=%d", ret);
|
mtk_v4l2_venc_err(ctx, "venc_if_set_param failed=%d", ret);
|
||||||
ctx->state = MTK_STATE_ABORT;
|
ctx->state = MTK_STATE_ABORT;
|
||||||
goto err_set_param;
|
goto err_set_param;
|
||||||
}
|
}
|
||||||
|
@ -921,7 +909,7 @@ static int vb2ops_venc_start_streaming(struct vb2_queue *q, unsigned int count)
|
||||||
VENC_SET_PARAM_PREPEND_HEADER,
|
VENC_SET_PARAM_PREPEND_HEADER,
|
||||||
NULL);
|
NULL);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mtk_v4l2_err("venc_if_set_param failed=%d", ret);
|
mtk_v4l2_venc_err(ctx, "venc_if_set_param failed=%d", ret);
|
||||||
ctx->state = MTK_STATE_ABORT;
|
ctx->state = MTK_STATE_ABORT;
|
||||||
goto err_set_param;
|
goto err_set_param;
|
||||||
}
|
}
|
||||||
|
@ -933,7 +921,7 @@ static int vb2ops_venc_start_streaming(struct vb2_queue *q, unsigned int count)
|
||||||
err_set_param:
|
err_set_param:
|
||||||
pm_ret = pm_runtime_put(&ctx->dev->plat_dev->dev);
|
pm_ret = pm_runtime_put(&ctx->dev->plat_dev->dev);
|
||||||
if (pm_ret < 0)
|
if (pm_ret < 0)
|
||||||
mtk_v4l2_err("pm_runtime_put fail %d", pm_ret);
|
mtk_v4l2_venc_err(ctx, "pm_runtime_put fail %d", pm_ret);
|
||||||
|
|
||||||
err_start_stream:
|
err_start_stream:
|
||||||
for (i = 0; i < q->num_buffers; ++i) {
|
for (i = 0; i < q->num_buffers; ++i) {
|
||||||
|
@ -944,9 +932,8 @@ err_start_stream:
|
||||||
* can be marked as done.
|
* can be marked as done.
|
||||||
*/
|
*/
|
||||||
if (buf && buf->state == VB2_BUF_STATE_ACTIVE) {
|
if (buf && buf->state == VB2_BUF_STATE_ACTIVE) {
|
||||||
mtk_v4l2_debug(0, "[%d] id=%d, type=%d, %d -> VB2_BUF_STATE_QUEUED",
|
mtk_v4l2_venc_dbg(0, ctx, "[%d] id=%d, type=%d, %d->VB2_BUF_STATE_QUEUED",
|
||||||
ctx->id, i, q->type,
|
ctx->id, i, q->type, (int)buf->state);
|
||||||
(int)buf->state);
|
|
||||||
v4l2_m2m_buf_done(to_vb2_v4l2_buffer(buf),
|
v4l2_m2m_buf_done(to_vb2_v4l2_buffer(buf),
|
||||||
VB2_BUF_STATE_QUEUED);
|
VB2_BUF_STATE_QUEUED);
|
||||||
}
|
}
|
||||||
|
@ -961,7 +948,7 @@ static void vb2ops_venc_stop_streaming(struct vb2_queue *q)
|
||||||
struct vb2_v4l2_buffer *src_buf, *dst_buf;
|
struct vb2_v4l2_buffer *src_buf, *dst_buf;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
mtk_v4l2_debug(2, "[%d]-> type=%d", ctx->id, q->type);
|
mtk_v4l2_venc_dbg(2, ctx, "[%d]-> type=%d", ctx->id, q->type);
|
||||||
|
|
||||||
if (q->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
|
if (q->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
|
||||||
while ((dst_buf = v4l2_m2m_dst_buf_remove(ctx->m2m_ctx))) {
|
while ((dst_buf = v4l2_m2m_dst_buf_remove(ctx->m2m_ctx))) {
|
||||||
|
@ -972,7 +959,7 @@ static void vb2ops_venc_stop_streaming(struct vb2_queue *q)
|
||||||
if (ctx->is_flushing) {
|
if (ctx->is_flushing) {
|
||||||
struct v4l2_m2m_buffer *b, *n;
|
struct v4l2_m2m_buffer *b, *n;
|
||||||
|
|
||||||
mtk_v4l2_debug(1, "STREAMOFF called while flushing");
|
mtk_v4l2_venc_dbg(1, ctx, "STREAMOFF called while flushing");
|
||||||
/*
|
/*
|
||||||
* STREAMOFF could be called before the flush buffer is
|
* STREAMOFF could be called before the flush buffer is
|
||||||
* dequeued. Check whether empty flush buf is still in
|
* dequeued. Check whether empty flush buf is still in
|
||||||
|
@ -1006,21 +993,21 @@ static void vb2ops_venc_stop_streaming(struct vb2_queue *q)
|
||||||
vb2_is_streaming(&ctx->m2m_ctx->out_q_ctx.q)) ||
|
vb2_is_streaming(&ctx->m2m_ctx->out_q_ctx.q)) ||
|
||||||
(q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE &&
|
(q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE &&
|
||||||
vb2_is_streaming(&ctx->m2m_ctx->cap_q_ctx.q))) {
|
vb2_is_streaming(&ctx->m2m_ctx->cap_q_ctx.q))) {
|
||||||
mtk_v4l2_debug(1, "[%d]-> q type %d out=%d cap=%d",
|
mtk_v4l2_venc_dbg(1, ctx, "[%d]-> q type %d out=%d cap=%d",
|
||||||
ctx->id, q->type,
|
ctx->id, q->type,
|
||||||
vb2_is_streaming(&ctx->m2m_ctx->out_q_ctx.q),
|
vb2_is_streaming(&ctx->m2m_ctx->out_q_ctx.q),
|
||||||
vb2_is_streaming(&ctx->m2m_ctx->cap_q_ctx.q));
|
vb2_is_streaming(&ctx->m2m_ctx->cap_q_ctx.q));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Release the encoder if both streams are stopped. */
|
/* Release the encoder if both streams are stopped. */
|
||||||
ret = venc_if_deinit(ctx);
|
ret = venc_if_deinit(ctx);
|
||||||
if (ret)
|
if (ret)
|
||||||
mtk_v4l2_err("venc_if_deinit failed=%d", ret);
|
mtk_v4l2_venc_err(ctx, "venc_if_deinit failed=%d", ret);
|
||||||
|
|
||||||
ret = pm_runtime_put(&ctx->dev->plat_dev->dev);
|
ret = pm_runtime_put(&ctx->dev->plat_dev->dev);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
mtk_v4l2_err("pm_runtime_put fail %d", ret);
|
mtk_v4l2_venc_err(ctx, "pm_runtime_put fail %d", ret);
|
||||||
|
|
||||||
ctx->state = MTK_STATE_FREE;
|
ctx->state = MTK_STATE_FREE;
|
||||||
}
|
}
|
||||||
|
@ -1054,7 +1041,7 @@ static int mtk_venc_encode_header(void *priv)
|
||||||
|
|
||||||
dst_buf = v4l2_m2m_dst_buf_remove(ctx->m2m_ctx);
|
dst_buf = v4l2_m2m_dst_buf_remove(ctx->m2m_ctx);
|
||||||
if (!dst_buf) {
|
if (!dst_buf) {
|
||||||
mtk_v4l2_debug(1, "No dst buffer");
|
mtk_v4l2_venc_dbg(1, ctx, "No dst buffer");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1062,12 +1049,10 @@ static int mtk_venc_encode_header(void *priv)
|
||||||
bs_buf.dma_addr = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0);
|
bs_buf.dma_addr = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0);
|
||||||
bs_buf.size = (size_t)dst_buf->vb2_buf.planes[0].length;
|
bs_buf.size = (size_t)dst_buf->vb2_buf.planes[0].length;
|
||||||
|
|
||||||
mtk_v4l2_debug(1,
|
mtk_v4l2_venc_dbg(1, ctx,
|
||||||
"[%d] buf id=%d va=0x%p dma_addr=0x%llx size=%zu",
|
"[%d] buf id=%d va=0x%p dma_addr=0x%llx size=%zu",
|
||||||
ctx->id,
|
ctx->id, dst_buf->vb2_buf.index, bs_buf.va,
|
||||||
dst_buf->vb2_buf.index, bs_buf.va,
|
(u64)bs_buf.dma_addr, bs_buf.size);
|
||||||
(u64)bs_buf.dma_addr,
|
|
||||||
bs_buf.size);
|
|
||||||
|
|
||||||
ret = venc_if_encode(ctx,
|
ret = venc_if_encode(ctx,
|
||||||
VENC_START_OPT_ENCODE_SEQUENCE_HEADER,
|
VENC_START_OPT_ENCODE_SEQUENCE_HEADER,
|
||||||
|
@ -1077,7 +1062,7 @@ static int mtk_venc_encode_header(void *priv)
|
||||||
vb2_set_plane_payload(&dst_buf->vb2_buf, 0, 0);
|
vb2_set_plane_payload(&dst_buf->vb2_buf, 0, 0);
|
||||||
ctx->state = MTK_STATE_ABORT;
|
ctx->state = MTK_STATE_ABORT;
|
||||||
v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_ERROR);
|
v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_ERROR);
|
||||||
mtk_v4l2_err("venc_if_encode failed=%d", ret);
|
mtk_v4l2_venc_err(ctx, "venc_if_encode failed=%d", ret);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
src_buf = v4l2_m2m_next_src_buf(ctx->m2m_ctx);
|
src_buf = v4l2_m2m_next_src_buf(ctx->m2m_ctx);
|
||||||
|
@ -1085,7 +1070,7 @@ static int mtk_venc_encode_header(void *priv)
|
||||||
dst_buf->vb2_buf.timestamp = src_buf->vb2_buf.timestamp;
|
dst_buf->vb2_buf.timestamp = src_buf->vb2_buf.timestamp;
|
||||||
dst_buf->timecode = src_buf->timecode;
|
dst_buf->timecode = src_buf->timecode;
|
||||||
} else {
|
} else {
|
||||||
mtk_v4l2_err("No timestamp for the header buffer.");
|
mtk_v4l2_venc_err(ctx, "No timestamp for the header buffer.");
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->state = MTK_STATE_HEADER;
|
ctx->state = MTK_STATE_HEADER;
|
||||||
|
@ -1114,10 +1099,8 @@ static int mtk_venc_param_change(struct mtk_vcodec_ctx *ctx)
|
||||||
|
|
||||||
if (mtk_buf->param_change & MTK_ENCODE_PARAM_BITRATE) {
|
if (mtk_buf->param_change & MTK_ENCODE_PARAM_BITRATE) {
|
||||||
enc_prm.bitrate = mtk_buf->enc_params.bitrate;
|
enc_prm.bitrate = mtk_buf->enc_params.bitrate;
|
||||||
mtk_v4l2_debug(1, "[%d] id=%d, change param br=%d",
|
mtk_v4l2_venc_dbg(1, ctx, "[%d] id=%d, change param br=%d",
|
||||||
ctx->id,
|
ctx->id, vb2_v4l2->vb2_buf.index, enc_prm.bitrate);
|
||||||
vb2_v4l2->vb2_buf.index,
|
|
||||||
enc_prm.bitrate);
|
|
||||||
ret |= venc_if_set_param(ctx,
|
ret |= venc_if_set_param(ctx,
|
||||||
VENC_SET_PARAM_ADJUST_BITRATE,
|
VENC_SET_PARAM_ADJUST_BITRATE,
|
||||||
&enc_prm);
|
&enc_prm);
|
||||||
|
@ -1125,27 +1108,23 @@ static int mtk_venc_param_change(struct mtk_vcodec_ctx *ctx)
|
||||||
if (!ret && mtk_buf->param_change & MTK_ENCODE_PARAM_FRAMERATE) {
|
if (!ret && mtk_buf->param_change & MTK_ENCODE_PARAM_FRAMERATE) {
|
||||||
enc_prm.frm_rate = mtk_buf->enc_params.framerate_num /
|
enc_prm.frm_rate = mtk_buf->enc_params.framerate_num /
|
||||||
mtk_buf->enc_params.framerate_denom;
|
mtk_buf->enc_params.framerate_denom;
|
||||||
mtk_v4l2_debug(1, "[%d] id=%d, change param fr=%d",
|
mtk_v4l2_venc_dbg(1, ctx, "[%d] id=%d, change param fr=%d",
|
||||||
ctx->id,
|
ctx->id, vb2_v4l2->vb2_buf.index, enc_prm.frm_rate);
|
||||||
vb2_v4l2->vb2_buf.index,
|
|
||||||
enc_prm.frm_rate);
|
|
||||||
ret |= venc_if_set_param(ctx,
|
ret |= venc_if_set_param(ctx,
|
||||||
VENC_SET_PARAM_ADJUST_FRAMERATE,
|
VENC_SET_PARAM_ADJUST_FRAMERATE,
|
||||||
&enc_prm);
|
&enc_prm);
|
||||||
}
|
}
|
||||||
if (!ret && mtk_buf->param_change & MTK_ENCODE_PARAM_GOP_SIZE) {
|
if (!ret && mtk_buf->param_change & MTK_ENCODE_PARAM_GOP_SIZE) {
|
||||||
enc_prm.gop_size = mtk_buf->enc_params.gop_size;
|
enc_prm.gop_size = mtk_buf->enc_params.gop_size;
|
||||||
mtk_v4l2_debug(1, "change param intra period=%d",
|
mtk_v4l2_venc_dbg(1, ctx, "change param intra period=%d", enc_prm.gop_size);
|
||||||
enc_prm.gop_size);
|
|
||||||
ret |= venc_if_set_param(ctx,
|
ret |= venc_if_set_param(ctx,
|
||||||
VENC_SET_PARAM_GOP_SIZE,
|
VENC_SET_PARAM_GOP_SIZE,
|
||||||
&enc_prm);
|
&enc_prm);
|
||||||
}
|
}
|
||||||
if (!ret && mtk_buf->param_change & MTK_ENCODE_PARAM_FORCE_INTRA) {
|
if (!ret && mtk_buf->param_change & MTK_ENCODE_PARAM_FORCE_INTRA) {
|
||||||
mtk_v4l2_debug(1, "[%d] id=%d, change param force I=%d",
|
mtk_v4l2_venc_dbg(1, ctx, "[%d] id=%d, change param force I=%d",
|
||||||
ctx->id,
|
ctx->id, vb2_v4l2->vb2_buf.index,
|
||||||
vb2_v4l2->vb2_buf.index,
|
mtk_buf->enc_params.force_intra);
|
||||||
mtk_buf->enc_params.force_intra);
|
|
||||||
if (mtk_buf->enc_params.force_intra)
|
if (mtk_buf->enc_params.force_intra)
|
||||||
ret |= venc_if_set_param(ctx,
|
ret |= venc_if_set_param(ctx,
|
||||||
VENC_SET_PARAM_FORCE_INTRA,
|
VENC_SET_PARAM_FORCE_INTRA,
|
||||||
|
@ -1156,8 +1135,8 @@ static int mtk_venc_param_change(struct mtk_vcodec_ctx *ctx)
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
ctx->state = MTK_STATE_ABORT;
|
ctx->state = MTK_STATE_ABORT;
|
||||||
mtk_v4l2_err("venc_if_set_param %d failed=%d",
|
mtk_v4l2_venc_err(ctx, "venc_if_set_param %d failed=%d",
|
||||||
mtk_buf->param_change, ret);
|
mtk_buf->param_change, ret);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1218,14 +1197,11 @@ static void mtk_venc_worker(struct work_struct *work)
|
||||||
bs_buf.dma_addr = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0);
|
bs_buf.dma_addr = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0);
|
||||||
bs_buf.size = (size_t)dst_buf->vb2_buf.planes[0].length;
|
bs_buf.size = (size_t)dst_buf->vb2_buf.planes[0].length;
|
||||||
|
|
||||||
mtk_v4l2_debug(2,
|
mtk_v4l2_venc_dbg(2, ctx,
|
||||||
"Framebuf PA=%llx Size=0x%zx;PA=0x%llx Size=0x%zx;PA=0x%llx Size=%zu",
|
"Framebuf PA=%llx Size=0x%zx;PA=0x%llx Size=0x%zx;PA=0x%llx Size=%zu",
|
||||||
(u64)frm_buf.fb_addr[0].dma_addr,
|
(u64)frm_buf.fb_addr[0].dma_addr, frm_buf.fb_addr[0].size,
|
||||||
frm_buf.fb_addr[0].size,
|
(u64)frm_buf.fb_addr[1].dma_addr, frm_buf.fb_addr[1].size,
|
||||||
(u64)frm_buf.fb_addr[1].dma_addr,
|
(u64)frm_buf.fb_addr[2].dma_addr, frm_buf.fb_addr[2].size);
|
||||||
frm_buf.fb_addr[1].size,
|
|
||||||
(u64)frm_buf.fb_addr[2].dma_addr,
|
|
||||||
frm_buf.fb_addr[2].size);
|
|
||||||
|
|
||||||
ret = venc_if_encode(ctx, VENC_START_OPT_ENCODE_FRAME,
|
ret = venc_if_encode(ctx, VENC_START_OPT_ENCODE_FRAME,
|
||||||
&frm_buf, &bs_buf, &enc_result);
|
&frm_buf, &bs_buf, &enc_result);
|
||||||
|
@ -1240,20 +1216,19 @@ static void mtk_venc_worker(struct work_struct *work)
|
||||||
v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
|
v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_ERROR);
|
||||||
vb2_set_plane_payload(&dst_buf->vb2_buf, 0, 0);
|
vb2_set_plane_payload(&dst_buf->vb2_buf, 0, 0);
|
||||||
v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_ERROR);
|
v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_ERROR);
|
||||||
mtk_v4l2_err("venc_if_encode failed=%d", ret);
|
mtk_v4l2_venc_err(ctx, "venc_if_encode failed=%d", ret);
|
||||||
} else {
|
} else {
|
||||||
v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE);
|
v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE);
|
||||||
vb2_set_plane_payload(&dst_buf->vb2_buf, 0, enc_result.bs_size);
|
vb2_set_plane_payload(&dst_buf->vb2_buf, 0, enc_result.bs_size);
|
||||||
v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_DONE);
|
v4l2_m2m_buf_done(dst_buf, VB2_BUF_STATE_DONE);
|
||||||
mtk_v4l2_debug(2, "venc_if_encode bs size=%d",
|
mtk_v4l2_venc_dbg(2, ctx, "venc_if_encode bs size=%d",
|
||||||
enc_result.bs_size);
|
enc_result.bs_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
v4l2_m2m_job_finish(ctx->dev->m2m_dev_enc, ctx->m2m_ctx);
|
v4l2_m2m_job_finish(ctx->dev->m2m_dev_enc, ctx->m2m_ctx);
|
||||||
|
|
||||||
mtk_v4l2_debug(1, "<=== src_buf[%d] dst_buf[%d] venc_if_encode ret=%d Size=%u===>",
|
mtk_v4l2_venc_dbg(1, ctx, "<=== src_buf[%d] dst_buf[%d] venc_if_encode ret=%d Size=%u===>",
|
||||||
src_buf->vb2_buf.index, dst_buf->vb2_buf.index, ret,
|
src_buf->vb2_buf.index, dst_buf->vb2_buf.index, ret, enc_result.bs_size);
|
||||||
enc_result.bs_size);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void m2mops_venc_device_run(void *priv)
|
static void m2mops_venc_device_run(void *priv)
|
||||||
|
@ -1277,8 +1252,7 @@ static int m2mops_venc_job_ready(void *m2m_priv)
|
||||||
struct mtk_vcodec_ctx *ctx = m2m_priv;
|
struct mtk_vcodec_ctx *ctx = m2m_priv;
|
||||||
|
|
||||||
if (ctx->state == MTK_STATE_ABORT || ctx->state == MTK_STATE_FREE) {
|
if (ctx->state == MTK_STATE_ABORT || ctx->state == MTK_STATE_FREE) {
|
||||||
mtk_v4l2_debug(3, "[%d]Not ready: state=0x%x.",
|
mtk_v4l2_venc_dbg(3, ctx, "[%d]Not ready: state=0x%x.", ctx->id, ctx->state);
|
||||||
ctx->id, ctx->state);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1413,8 +1387,7 @@ int mtk_vcodec_enc_ctrls_setup(struct mtk_vcodec_ctx *ctx)
|
||||||
|
|
||||||
|
|
||||||
if (handler->error) {
|
if (handler->error) {
|
||||||
mtk_v4l2_err("Init control handler fail %d",
|
mtk_v4l2_venc_err(ctx, "Init control handler fail %d", handler->error);
|
||||||
handler->error);
|
|
||||||
return handler->error;
|
return handler->error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1482,7 +1455,7 @@ void mtk_vcodec_enc_release(struct mtk_vcodec_ctx *ctx)
|
||||||
int ret = venc_if_deinit(ctx);
|
int ret = venc_if_deinit(ctx);
|
||||||
|
|
||||||
if (ret)
|
if (ret)
|
||||||
mtk_v4l2_err("venc_if_deinit failed=%d", ret);
|
mtk_v4l2_venc_err(ctx, "venc_if_deinit failed=%d", ret);
|
||||||
|
|
||||||
ctx->state = MTK_STATE_FREE;
|
ctx->state = MTK_STATE_FREE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -97,12 +97,11 @@ static irqreturn_t mtk_vcodec_enc_irq_handler(int irq, void *priv)
|
||||||
|
|
||||||
core_id = dev->venc_pdata->core_id;
|
core_id = dev->venc_pdata->core_id;
|
||||||
if (core_id < 0 || core_id >= NUM_MAX_VCODEC_REG_BASE) {
|
if (core_id < 0 || core_id >= NUM_MAX_VCODEC_REG_BASE) {
|
||||||
mtk_v4l2_err("Invalid core id: %d, ctx id: %d",
|
mtk_v4l2_venc_err(ctx, "Invalid core id: %d, ctx id: %d", core_id, ctx->id);
|
||||||
core_id, ctx->id);
|
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
mtk_v4l2_debug(1, "id: %d, core id: %d", ctx->id, core_id);
|
mtk_v4l2_venc_dbg(1, ctx, "id: %d, core id: %d", ctx->id, core_id);
|
||||||
|
|
||||||
addr = dev->reg_base[core_id] + MTK_VENC_IRQ_ACK_OFFSET;
|
addr = dev->reg_base[core_id] + MTK_VENC_IRQ_ACK_OFFSET;
|
||||||
|
|
||||||
|
@ -143,16 +142,14 @@ static int fops_vcodec_open(struct file *file)
|
||||||
ctx->type = MTK_INST_ENCODER;
|
ctx->type = MTK_INST_ENCODER;
|
||||||
ret = mtk_vcodec_enc_ctrls_setup(ctx);
|
ret = mtk_vcodec_enc_ctrls_setup(ctx);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mtk_v4l2_err("Failed to setup controls() (%d)",
|
mtk_v4l2_venc_err(ctx, "Failed to setup controls() (%d)", ret);
|
||||||
ret);
|
|
||||||
goto err_ctrls_setup;
|
goto err_ctrls_setup;
|
||||||
}
|
}
|
||||||
ctx->m2m_ctx = v4l2_m2m_ctx_init(dev->m2m_dev_enc, ctx,
|
ctx->m2m_ctx = v4l2_m2m_ctx_init(dev->m2m_dev_enc, ctx,
|
||||||
&mtk_vcodec_enc_queue_init);
|
&mtk_vcodec_enc_queue_init);
|
||||||
if (IS_ERR((__force void *)ctx->m2m_ctx)) {
|
if (IS_ERR((__force void *)ctx->m2m_ctx)) {
|
||||||
ret = PTR_ERR((__force void *)ctx->m2m_ctx);
|
ret = PTR_ERR((__force void *)ctx->m2m_ctx);
|
||||||
mtk_v4l2_err("Failed to v4l2_m2m_ctx_init() (%d)",
|
mtk_v4l2_venc_err(ctx, "Failed to v4l2_m2m_ctx_init() (%d)", ret);
|
||||||
ret);
|
|
||||||
goto err_m2m_ctx_init;
|
goto err_m2m_ctx_init;
|
||||||
}
|
}
|
||||||
src_vq = v4l2_m2m_get_vq(ctx->m2m_ctx,
|
src_vq = v4l2_m2m_get_vq(ctx->m2m_ctx,
|
||||||
|
@ -171,23 +168,23 @@ static int fops_vcodec_open(struct file *file)
|
||||||
* Return 0 if downloading firmware successfully,
|
* Return 0 if downloading firmware successfully,
|
||||||
* otherwise it is failed
|
* otherwise it is failed
|
||||||
*/
|
*/
|
||||||
mtk_v4l2_err("vpu_load_firmware failed!");
|
mtk_v4l2_venc_err(ctx, "vpu_load_firmware failed!");
|
||||||
goto err_load_fw;
|
goto err_load_fw;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev->enc_capability =
|
dev->enc_capability =
|
||||||
mtk_vcodec_fw_get_venc_capa(dev->fw_handler);
|
mtk_vcodec_fw_get_venc_capa(dev->fw_handler);
|
||||||
mtk_v4l2_debug(0, "encoder capability %x", dev->enc_capability);
|
mtk_v4l2_venc_dbg(0, ctx, "encoder capability %x", dev->enc_capability);
|
||||||
}
|
}
|
||||||
|
|
||||||
mtk_v4l2_debug(2, "Create instance [%d]@%p m2m_ctx=%p ",
|
mtk_v4l2_venc_dbg(2, ctx, "Create instance [%d]@%p m2m_ctx=%p ",
|
||||||
ctx->id, ctx, ctx->m2m_ctx);
|
ctx->id, ctx, ctx->m2m_ctx);
|
||||||
|
|
||||||
list_add(&ctx->list, &dev->ctx_list);
|
list_add(&ctx->list, &dev->ctx_list);
|
||||||
|
|
||||||
mutex_unlock(&dev->dev_mutex);
|
mutex_unlock(&dev->dev_mutex);
|
||||||
mtk_v4l2_debug(0, "%s encoder [%d]", dev_name(&dev->plat_dev->dev),
|
mtk_v4l2_venc_dbg(0, ctx, "%s encoder [%d]", dev_name(&dev->plat_dev->dev),
|
||||||
ctx->id);
|
ctx->id);
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
/* Deinit when failure occurred */
|
/* Deinit when failure occurred */
|
||||||
|
@ -209,7 +206,7 @@ static int fops_vcodec_release(struct file *file)
|
||||||
struct mtk_vcodec_dev *dev = video_drvdata(file);
|
struct mtk_vcodec_dev *dev = video_drvdata(file);
|
||||||
struct mtk_vcodec_ctx *ctx = fh_to_ctx(file->private_data);
|
struct mtk_vcodec_ctx *ctx = fh_to_ctx(file->private_data);
|
||||||
|
|
||||||
mtk_v4l2_debug(1, "[%d] encoder", ctx->id);
|
mtk_v4l2_venc_dbg(1, ctx, "[%d] encoder", ctx->id);
|
||||||
mutex_lock(&dev->dev_mutex);
|
mutex_lock(&dev->dev_mutex);
|
||||||
|
|
||||||
v4l2_m2m_ctx_release(ctx->m2m_ctx);
|
v4l2_m2m_ctx_release(ctx->m2m_ctx);
|
||||||
|
@ -255,7 +252,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
|
||||||
&rproc_phandle)) {
|
&rproc_phandle)) {
|
||||||
fw_type = SCP;
|
fw_type = SCP;
|
||||||
} else {
|
} else {
|
||||||
mtk_v4l2_err("Could not get venc IPI device");
|
dev_err(&pdev->dev, "[MTK VCODEC] Could not get venc IPI device");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
dma_set_max_seg_size(&pdev->dev, UINT_MAX);
|
dma_set_max_seg_size(&pdev->dev, UINT_MAX);
|
||||||
|
@ -267,7 +264,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
|
||||||
dev->venc_pdata = of_device_get_match_data(&pdev->dev);
|
dev->venc_pdata = of_device_get_match_data(&pdev->dev);
|
||||||
ret = mtk_vcodec_init_enc_clk(dev);
|
ret = mtk_vcodec_init_enc_clk(dev);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(&pdev->dev, "Failed to get mtk vcodec clock source!");
|
dev_err(&pdev->dev, "[MTK VCODEC] Failed to get mtk vcodec clock source!");
|
||||||
goto err_enc_pm;
|
goto err_enc_pm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -292,7 +289,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
|
||||||
0, pdev->name, dev);
|
0, pdev->name, dev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_err(&pdev->dev,
|
dev_err(&pdev->dev,
|
||||||
"Failed to install dev->enc_irq %d (%d) core_id (%d)",
|
"[MTK VCODEC] Failed to install dev->enc_irq %d (%d) core_id (%d)",
|
||||||
dev->enc_irq, ret, dev->venc_pdata->core_id);
|
dev->enc_irq, ret, dev->venc_pdata->core_id);
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto err_res;
|
goto err_res;
|
||||||
|
@ -307,14 +304,14 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
|
ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mtk_v4l2_err("v4l2_device_register err=%d", ret);
|
dev_err(&pdev->dev, "[MTK VCODEC] v4l2_device_register err=%d", ret);
|
||||||
goto err_res;
|
goto err_res;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* allocate video device for encoder and register it */
|
/* allocate video device for encoder and register it */
|
||||||
vfd_enc = video_device_alloc();
|
vfd_enc = video_device_alloc();
|
||||||
if (!vfd_enc) {
|
if (!vfd_enc) {
|
||||||
mtk_v4l2_err("Failed to allocate video device");
|
dev_err(&pdev->dev, "[MTK VCODEC] Failed to allocate video device");
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto err_enc_alloc;
|
goto err_enc_alloc;
|
||||||
}
|
}
|
||||||
|
@ -335,7 +332,7 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
dev->m2m_dev_enc = v4l2_m2m_init(&mtk_venc_m2m_ops);
|
dev->m2m_dev_enc = v4l2_m2m_init(&mtk_venc_m2m_ops);
|
||||||
if (IS_ERR((__force void *)dev->m2m_dev_enc)) {
|
if (IS_ERR((__force void *)dev->m2m_dev_enc)) {
|
||||||
mtk_v4l2_err("Failed to init mem2mem enc device");
|
dev_err(&pdev->dev, "[MTK VCODEC] Failed to init mem2mem enc device");
|
||||||
ret = PTR_ERR((__force void *)dev->m2m_dev_enc);
|
ret = PTR_ERR((__force void *)dev->m2m_dev_enc);
|
||||||
goto err_enc_mem_init;
|
goto err_enc_mem_init;
|
||||||
}
|
}
|
||||||
|
@ -345,20 +342,20 @@ static int mtk_vcodec_probe(struct platform_device *pdev)
|
||||||
WQ_MEM_RECLAIM |
|
WQ_MEM_RECLAIM |
|
||||||
WQ_FREEZABLE);
|
WQ_FREEZABLE);
|
||||||
if (!dev->encode_workqueue) {
|
if (!dev->encode_workqueue) {
|
||||||
mtk_v4l2_err("Failed to create encode workqueue");
|
dev_err(&pdev->dev, "[MTK VCODEC] Failed to create encode workqueue");
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto err_event_workq;
|
goto err_event_workq;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = video_register_device(vfd_enc, VFL_TYPE_VIDEO, -1);
|
ret = video_register_device(vfd_enc, VFL_TYPE_VIDEO, -1);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mtk_v4l2_err("Failed to register video device");
|
dev_err(&pdev->dev, "[MTK VCODEC] Failed to register video device");
|
||||||
goto err_enc_reg;
|
goto err_enc_reg;
|
||||||
}
|
}
|
||||||
|
|
||||||
mtk_vcodec_dbgfs_init(dev, true);
|
mtk_vcodec_dbgfs_init(dev, true);
|
||||||
mtk_v4l2_debug(0, "encoder %d registered as /dev/video%d",
|
dev_dbg(&pdev->dev, "[MTK VCODEC] encoder %d registered as /dev/video%d",
|
||||||
dev->venc_pdata->core_id, vfd_enc->num);
|
dev->venc_pdata->core_id, vfd_enc->num);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ int mtk_vcodec_init_enc_clk(struct mtk_vcodec_dev *mtkdev)
|
||||||
if (!enc_clk->clk_info)
|
if (!enc_clk->clk_info)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
} else {
|
} else {
|
||||||
mtk_v4l2_err("Failed to get venc clock count");
|
dev_err(pm->dev, "[MTK VCODEC] Failed to get venc clock count");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,13 +43,13 @@ int mtk_vcodec_init_enc_clk(struct mtk_vcodec_dev *mtkdev)
|
||||||
ret = of_property_read_string_index(pdev->dev.of_node,
|
ret = of_property_read_string_index(pdev->dev.of_node,
|
||||||
"clock-names", i, &clk_info->clk_name);
|
"clock-names", i, &clk_info->clk_name);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mtk_v4l2_err("venc failed to get clk name %d", i);
|
dev_err(pm->dev, "[MTK VCODEC] venc failed to get clk name %d", i);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
clk_info->vcodec_clk = devm_clk_get(&pdev->dev,
|
clk_info->vcodec_clk = devm_clk_get(&pdev->dev,
|
||||||
clk_info->clk_name);
|
clk_info->clk_name);
|
||||||
if (IS_ERR(clk_info->vcodec_clk)) {
|
if (IS_ERR(clk_info->vcodec_clk)) {
|
||||||
mtk_v4l2_err("venc devm_clk_get (%d)%s fail", i,
|
dev_err(pm->dev, "[MTK VCODEC] venc devm_clk_get (%d)%s fail", i,
|
||||||
clk_info->clk_name);
|
clk_info->clk_name);
|
||||||
return PTR_ERR(clk_info->vcodec_clk);
|
return PTR_ERR(clk_info->vcodec_clk);
|
||||||
}
|
}
|
||||||
|
@ -66,7 +66,7 @@ void mtk_vcodec_enc_clock_on(struct mtk_vcodec_pm *pm)
|
||||||
for (i = 0; i < enc_clk->clk_num; i++) {
|
for (i = 0; i < enc_clk->clk_num; i++) {
|
||||||
ret = clk_prepare_enable(enc_clk->clk_info[i].vcodec_clk);
|
ret = clk_prepare_enable(enc_clk->clk_info[i].vcodec_clk);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
mtk_v4l2_err("venc clk_prepare_enable %d %s fail %d", i,
|
dev_err(pm->dev, "[MTK VCODEC] venc clk_prepare_enable %d %s fail %d", i,
|
||||||
enc_clk->clk_info[i].clk_name, ret);
|
enc_clk->clk_info[i].clk_name, ret);
|
||||||
goto clkerr;
|
goto clkerr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ struct mtk_vcodec_fw *mtk_vcodec_fw_select(void *priv, enum mtk_vcodec_fw_type t
|
||||||
case SCP:
|
case SCP:
|
||||||
return mtk_vcodec_fw_scp_init(priv, fw_use);
|
return mtk_vcodec_fw_scp_init(priv, fw_use);
|
||||||
default:
|
default:
|
||||||
mtk_v4l2_err("invalid vcodec fw type");
|
pr_err(MTK_DBG_VCODEC_STR "Invalid vcodec fw type");
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,7 +63,7 @@ struct mtk_vcodec_fw *mtk_vcodec_fw_scp_init(void *priv, enum mtk_vcodec_fw_use
|
||||||
plat_dev = dev->plat_dev;
|
plat_dev = dev->plat_dev;
|
||||||
scp = scp_get(plat_dev);
|
scp = scp_get(plat_dev);
|
||||||
if (!scp) {
|
if (!scp) {
|
||||||
mtk_v4l2_err("could not get vdec scp handle");
|
dev_err(&dev->plat_dev->dev, "could not get vdec scp handle");
|
||||||
return ERR_PTR(-EPROBE_DEFER);
|
return ERR_PTR(-EPROBE_DEFER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -56,13 +56,12 @@ static void mtk_vcodec_vpu_reset_handler(void *priv)
|
||||||
struct mtk_vcodec_dev *dev = priv;
|
struct mtk_vcodec_dev *dev = priv;
|
||||||
struct mtk_vcodec_ctx *ctx;
|
struct mtk_vcodec_ctx *ctx;
|
||||||
|
|
||||||
mtk_v4l2_err("Watchdog timeout!!");
|
dev_err(&dev->plat_dev->dev, "Watchdog timeout!!");
|
||||||
|
|
||||||
mutex_lock(&dev->dev_mutex);
|
mutex_lock(&dev->dev_mutex);
|
||||||
list_for_each_entry(ctx, &dev->ctx_list, list) {
|
list_for_each_entry(ctx, &dev->ctx_list, list) {
|
||||||
ctx->state = MTK_STATE_ABORT;
|
ctx->state = MTK_STATE_ABORT;
|
||||||
mtk_v4l2_debug(0, "[%d] Change to state MTK_STATE_ABORT",
|
mtk_v4l2_vdec_dbg(0, ctx, "[%d] Change to state MTK_STATE_ABORT", ctx->id);
|
||||||
ctx->id);
|
|
||||||
}
|
}
|
||||||
mutex_unlock(&dev->dev_mutex);
|
mutex_unlock(&dev->dev_mutex);
|
||||||
}
|
}
|
||||||
|
@ -98,7 +97,7 @@ struct mtk_vcodec_fw *mtk_vcodec_fw_vpu_init(void *priv, enum mtk_vcodec_fw_use
|
||||||
plat_dev = dev->plat_dev;
|
plat_dev = dev->plat_dev;
|
||||||
fw_pdev = vpu_get_plat_device(plat_dev);
|
fw_pdev = vpu_get_plat_device(plat_dev);
|
||||||
if (!fw_pdev) {
|
if (!fw_pdev) {
|
||||||
mtk_v4l2_err("firmware device is not ready");
|
dev_err(&dev->plat_dev->dev, "firmware device is not ready");
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,14 +33,14 @@ int mtk_vcodec_wait_for_done_ctx(void *priv, int command, unsigned int timeout_m
|
||||||
|
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
status = -1; /* timeout */
|
status = -1; /* timeout */
|
||||||
mtk_v4l2_err("[%d] cmd=%d, type=%d, dec timeout=%ums (%d %d)",
|
dev_err(&ctx->dev->plat_dev->dev, "[%d] cmd=%d, type=%d, dec timeout=%ums (%d %d)",
|
||||||
ctx_id, command, ctx_type, timeout_ms,
|
ctx_id, command, ctx_type, timeout_ms,
|
||||||
ctx_int_cond[hw_id], ctx_int_type[hw_id]);
|
ctx_int_cond[hw_id], ctx_int_type[hw_id]);
|
||||||
} else if (-ERESTARTSYS == ret) {
|
} else if (-ERESTARTSYS == ret) {
|
||||||
status = -1;
|
status = -1;
|
||||||
mtk_v4l2_err("[%d] cmd=%d, type=%d, dec inter fail (%d %d)",
|
dev_err(&ctx->dev->plat_dev->dev, "[%d] cmd=%d, type=%d, dec inter fail (%d %d)",
|
||||||
ctx_id, command, ctx_type,
|
ctx_id, command, ctx_type,
|
||||||
ctx_int_cond[hw_id], ctx_int_type[hw_id]);
|
ctx_int_cond[hw_id], ctx_int_type[hw_id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx_int_cond[hw_id] = 0;
|
ctx_int_cond[hw_id] = 0;
|
||||||
|
|
|
@ -24,7 +24,7 @@ EXPORT_SYMBOL(mtk_v4l2_dbg_level);
|
||||||
void __iomem *mtk_vcodec_get_reg_addr(void __iomem **reg_base, unsigned int reg_idx)
|
void __iomem *mtk_vcodec_get_reg_addr(void __iomem **reg_base, unsigned int reg_idx)
|
||||||
{
|
{
|
||||||
if (reg_idx >= NUM_MAX_VCODEC_REG_BASE) {
|
if (reg_idx >= NUM_MAX_VCODEC_REG_BASE) {
|
||||||
mtk_v4l2_err("Invalid arguments, reg_idx=%d", reg_idx);
|
pr_err(MTK_DBG_V4L2_STR "Invalid arguments, reg_idx=%d", reg_idx);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
return reg_base[reg_idx];
|
return reg_base[reg_idx];
|
||||||
|
@ -53,15 +53,14 @@ int mtk_vcodec_mem_alloc(void *priv, struct mtk_vcodec_mem *mem)
|
||||||
|
|
||||||
mem->va = dma_alloc_coherent(dev, size, &mem->dma_addr, GFP_KERNEL);
|
mem->va = dma_alloc_coherent(dev, size, &mem->dma_addr, GFP_KERNEL);
|
||||||
if (!mem->va) {
|
if (!mem->va) {
|
||||||
mtk_v4l2_err("%s dma_alloc size=%ld failed!", dev_name(dev),
|
mtk_v4l2_vdec_err(ctx, "%s dma_alloc size=%ld failed!", dev_name(dev), size);
|
||||||
size);
|
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
mtk_v4l2_debug(3, "[%d] - va = %p", ctx->id, mem->va);
|
mtk_v4l2_vdec_dbg(3, ctx, "[%d] - va = %p", ctx->id, mem->va);
|
||||||
mtk_v4l2_debug(3, "[%d] - dma = 0x%lx", ctx->id,
|
mtk_v4l2_vdec_dbg(3, ctx, "[%d] - dma = 0x%lx", ctx->id,
|
||||||
(unsigned long)mem->dma_addr);
|
(unsigned long)mem->dma_addr);
|
||||||
mtk_v4l2_debug(3, "[%d] size = 0x%lx", ctx->id, size);
|
mtk_v4l2_vdec_dbg(3, ctx, "[%d] size = 0x%lx", ctx->id, size);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -74,15 +73,14 @@ void mtk_vcodec_mem_free(void *priv, struct mtk_vcodec_mem *mem)
|
||||||
struct device *dev = &ctx->dev->plat_dev->dev;
|
struct device *dev = &ctx->dev->plat_dev->dev;
|
||||||
|
|
||||||
if (!mem->va) {
|
if (!mem->va) {
|
||||||
mtk_v4l2_err("%s dma_free size=%ld failed!", dev_name(dev),
|
mtk_v4l2_vdec_err(ctx, "%s dma_free size=%ld failed!", dev_name(dev), size);
|
||||||
size);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mtk_v4l2_debug(3, "[%d] - va = %p", ctx->id, mem->va);
|
mtk_v4l2_vdec_dbg(3, ctx, "[%d] - va = %p", ctx->id, mem->va);
|
||||||
mtk_v4l2_debug(3, "[%d] - dma = 0x%lx", ctx->id,
|
mtk_v4l2_vdec_dbg(3, ctx, "[%d] - dma = 0x%lx", ctx->id,
|
||||||
(unsigned long)mem->dma_addr);
|
(unsigned long)mem->dma_addr);
|
||||||
mtk_v4l2_debug(3, "[%d] size = 0x%lx", ctx->id, size);
|
mtk_v4l2_vdec_dbg(3, ctx, "[%d] size = 0x%lx", ctx->id, size);
|
||||||
|
|
||||||
dma_free_coherent(dev, size, mem->va, mem->dma_addr);
|
dma_free_coherent(dev, size, mem->va, mem->dma_addr);
|
||||||
mem->va = NULL;
|
mem->va = NULL;
|
||||||
|
@ -94,7 +92,7 @@ EXPORT_SYMBOL(mtk_vcodec_mem_free);
|
||||||
void *mtk_vcodec_get_hw_dev(struct mtk_vcodec_dev *dev, int hw_idx)
|
void *mtk_vcodec_get_hw_dev(struct mtk_vcodec_dev *dev, int hw_idx)
|
||||||
{
|
{
|
||||||
if (hw_idx >= MTK_VDEC_HW_MAX || hw_idx < 0 || !dev->subdev_dev[hw_idx]) {
|
if (hw_idx >= MTK_VDEC_HW_MAX || hw_idx < 0 || !dev->subdev_dev[hw_idx]) {
|
||||||
mtk_v4l2_err("hw idx is out of range:%d", hw_idx);
|
dev_err(&dev->plat_dev->dev, "hw idx is out of range:%d", hw_idx);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,7 +110,7 @@ void mtk_vcodec_set_curr_ctx(struct mtk_vcodec_dev *vdec_dev,
|
||||||
if (vdec_dev->vdec_pdata->is_subdev_supported) {
|
if (vdec_dev->vdec_pdata->is_subdev_supported) {
|
||||||
subdev_dev = mtk_vcodec_get_hw_dev(vdec_dev, hw_idx);
|
subdev_dev = mtk_vcodec_get_hw_dev(vdec_dev, hw_idx);
|
||||||
if (!subdev_dev) {
|
if (!subdev_dev) {
|
||||||
mtk_v4l2_err("Failed to get hw dev");
|
dev_err(&vdec_dev->plat_dev->dev, "Failed to get hw dev");
|
||||||
spin_unlock_irqrestore(&vdec_dev->irqlock, flags);
|
spin_unlock_irqrestore(&vdec_dev->irqlock, flags);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -135,7 +133,7 @@ struct mtk_vcodec_ctx *mtk_vcodec_get_curr_ctx(struct mtk_vcodec_dev *vdec_dev,
|
||||||
if (vdec_dev->vdec_pdata->is_subdev_supported) {
|
if (vdec_dev->vdec_pdata->is_subdev_supported) {
|
||||||
subdev_dev = mtk_vcodec_get_hw_dev(vdec_dev, hw_idx);
|
subdev_dev = mtk_vcodec_get_hw_dev(vdec_dev, hw_idx);
|
||||||
if (!subdev_dev) {
|
if (!subdev_dev) {
|
||||||
mtk_v4l2_err("Failed to get hw dev");
|
dev_err(&vdec_dev->plat_dev->dev, "Failed to get hw dev");
|
||||||
spin_unlock_irqrestore(&vdec_dev->irqlock, flags);
|
spin_unlock_irqrestore(&vdec_dev->irqlock, flags);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,9 @@
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/dma-direction.h>
|
#include <linux/dma-direction.h>
|
||||||
|
|
||||||
|
#define MTK_DBG_VCODEC_STR "[MTK_VCODEC]"
|
||||||
|
#define MTK_DBG_V4L2_STR "[MTK_V4L2]"
|
||||||
|
|
||||||
struct mtk_vcodec_mem {
|
struct mtk_vcodec_mem {
|
||||||
size_t size;
|
size_t size;
|
||||||
void *va;
|
void *va;
|
||||||
|
@ -28,8 +31,8 @@ struct mtk_vcodec_dev;
|
||||||
#undef pr_fmt
|
#undef pr_fmt
|
||||||
#define pr_fmt(fmt) "%s(),%d: " fmt, __func__, __LINE__
|
#define pr_fmt(fmt) "%s(),%d: " fmt, __func__, __LINE__
|
||||||
|
|
||||||
#define mtk_v4l2_err(fmt, args...) \
|
#define mtk_v4l2_err(plat_dev, fmt, args...) \
|
||||||
pr_err("[MTK_V4L2][ERROR] " fmt "\n", ##args)
|
dev_err(&(plat_dev)->dev, "[MTK_V4L2][ERROR] " fmt "\n", ##args)
|
||||||
|
|
||||||
#define mtk_vcodec_err(inst_id, plat_dev, fmt, args...) \
|
#define mtk_vcodec_err(inst_id, plat_dev, fmt, args...) \
|
||||||
dev_err(&(plat_dev)->dev, "[MTK_VCODEC][ERROR][%d]: " fmt "\n", inst_id, ##args)
|
dev_err(&(plat_dev)->dev, "[MTK_VCODEC][ERROR][%d]: " fmt "\n", inst_id, ##args)
|
||||||
|
@ -38,11 +41,11 @@ struct mtk_vcodec_dev;
|
||||||
extern int mtk_v4l2_dbg_level;
|
extern int mtk_v4l2_dbg_level;
|
||||||
extern int mtk_vcodec_dbg;
|
extern int mtk_vcodec_dbg;
|
||||||
|
|
||||||
#define mtk_v4l2_debug(level, fmt, args...) \
|
#define mtk_v4l2_debug(plat_dev, level, fmt, args...) \
|
||||||
do { \
|
do { \
|
||||||
if (mtk_v4l2_dbg_level >= (level)) \
|
if (mtk_v4l2_dbg_level >= (level)) \
|
||||||
pr_debug("[MTK_V4L2] %s, %d: " fmt "\n", \
|
dev_dbg(&(plat_dev)->dev, "[MTK_V4L2] %s, %d: " fmt "\n", \
|
||||||
__func__, __LINE__, ##args); \
|
__func__, __LINE__, ##args); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define mtk_vcodec_debug(inst_id, plat_dev, fmt, args...) \
|
#define mtk_vcodec_debug(inst_id, plat_dev, fmt, args...) \
|
||||||
|
@ -52,7 +55,8 @@ extern int mtk_vcodec_dbg;
|
||||||
inst_id, __func__, __LINE__, ##args); \
|
inst_id, __func__, __LINE__, ##args); \
|
||||||
} while (0)
|
} while (0)
|
||||||
#else
|
#else
|
||||||
#define mtk_v4l2_debug(level, fmt, args...) pr_debug(fmt, ##args)
|
#define mtk_v4l2_debug(plat_dev, level, fmt, args...) \
|
||||||
|
dev_dbg(&(plat_dev)->dev, "[MTK_V4L2]: " fmt "\n", ##args)
|
||||||
|
|
||||||
#define mtk_vcodec_debug(inst_id, plat_dev, fmt, args...) \
|
#define mtk_vcodec_debug(inst_id, plat_dev, fmt, args...) \
|
||||||
dev_dbg(&(plat_dev)->dev, "[MTK_VCODEC][%d]: " fmt "\n", inst_id, ##args)
|
dev_dbg(&(plat_dev)->dev, "[MTK_VCODEC][%d]: " fmt "\n", inst_id, ##args)
|
||||||
|
@ -70,6 +74,16 @@ extern int mtk_vcodec_dbg;
|
||||||
#define mtk_venc_debug(ctx, fmt, args...) \
|
#define mtk_venc_debug(ctx, fmt, args...) \
|
||||||
mtk_vcodec_debug((ctx)->id, (ctx)->dev->plat_dev, fmt, ##args)
|
mtk_vcodec_debug((ctx)->id, (ctx)->dev->plat_dev, fmt, ##args)
|
||||||
|
|
||||||
|
#define mtk_v4l2_vdec_err(ctx, fmt, args...) mtk_v4l2_err((ctx)->dev->plat_dev, fmt, ##args)
|
||||||
|
|
||||||
|
#define mtk_v4l2_vdec_dbg(level, ctx, fmt, args...) \
|
||||||
|
mtk_v4l2_debug((ctx)->dev->plat_dev, level, fmt, ##args)
|
||||||
|
|
||||||
|
#define mtk_v4l2_venc_err(ctx, fmt, args...) mtk_v4l2_err((ctx)->dev->plat_dev, fmt, ##args)
|
||||||
|
|
||||||
|
#define mtk_v4l2_venc_dbg(level, ctx, fmt, args...) \
|
||||||
|
mtk_v4l2_debug((ctx)->dev->plat_dev, level, fmt, ##args)
|
||||||
|
|
||||||
void __iomem *mtk_vcodec_get_reg_addr(void __iomem **reg_base, unsigned int reg_idx);
|
void __iomem *mtk_vcodec_get_reg_addr(void __iomem **reg_base, unsigned int reg_idx);
|
||||||
int mtk_vcodec_write_vdecsys(struct mtk_vcodec_ctx *ctx, unsigned int reg, unsigned int val);
|
int mtk_vcodec_write_vdecsys(struct mtk_vcodec_ctx *ctx, unsigned int reg, unsigned int val);
|
||||||
int mtk_vcodec_mem_alloc(void *priv, struct mtk_vcodec_mem *mem);
|
int mtk_vcodec_mem_alloc(void *priv, struct mtk_vcodec_mem *mem);
|
||||||
|
|
|
@ -861,8 +861,8 @@ static void vdec_av1_slice_decrease_ref_count(struct vdec_av1_slice_slot *slots,
|
||||||
frame_info[fb_idx].ref_count--;
|
frame_info[fb_idx].ref_count--;
|
||||||
if (frame_info[fb_idx].ref_count < 0) {
|
if (frame_info[fb_idx].ref_count < 0) {
|
||||||
frame_info[fb_idx].ref_count = 0;
|
frame_info[fb_idx].ref_count = 0;
|
||||||
mtk_v4l2_err("av1_error: %s() fb_idx %d decrease ref_count error\n",
|
pr_err(MTK_DBG_V4L2_STR "av1_error: %s() fb_idx %d decrease ref_count error\n",
|
||||||
__func__, fb_idx);
|
__func__, fb_idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
vdec_av1_slice_clear_fb(&frame_info[fb_idx]);
|
vdec_av1_slice_clear_fb(&frame_info[fb_idx]);
|
||||||
|
@ -910,7 +910,7 @@ static void vdec_av1_slice_setup_slot(struct vdec_av1_slice_instance *instance,
|
||||||
vsi->slot_id = vdec_av1_slice_get_new_slot(vsi);
|
vsi->slot_id = vdec_av1_slice_get_new_slot(vsi);
|
||||||
|
|
||||||
if (vsi->slot_id == AV1_INVALID_IDX) {
|
if (vsi->slot_id == AV1_INVALID_IDX) {
|
||||||
mtk_v4l2_err("warning:av1 get invalid index slot\n");
|
mtk_v4l2_vdec_err(instance->ctx, "warning:av1 get invalid index slot\n");
|
||||||
vsi->slot_id = 0;
|
vsi->slot_id = 0;
|
||||||
}
|
}
|
||||||
cur_frame_info = &vsi->slots.frame_info[vsi->slot_id];
|
cur_frame_info = &vsi->slots.frame_info[vsi->slot_id];
|
||||||
|
@ -1504,8 +1504,8 @@ static void vdec_av1_slice_setup_ref(struct vdec_av1_slice_pfc *pfc,
|
||||||
slot_id = frame->ref_frame_map[ref_idx];
|
slot_id = frame->ref_frame_map[ref_idx];
|
||||||
frame_info = &slots->frame_info[slot_id];
|
frame_info = &slots->frame_info[slot_id];
|
||||||
if (slot_id == AV1_INVALID_IDX) {
|
if (slot_id == AV1_INVALID_IDX) {
|
||||||
mtk_v4l2_err("cannot match reference[%d] 0x%llx\n", i,
|
pr_err(MTK_DBG_V4L2_STR "cannot match reference[%d] 0x%llx\n", i,
|
||||||
ctrl_fh->reference_frame_ts[ref_idx]);
|
ctrl_fh->reference_frame_ts[ref_idx]);
|
||||||
frame->order_hints[i] = 0;
|
frame->order_hints[i] = 0;
|
||||||
frame->ref_frame_valid[i] = 0;
|
frame->ref_frame_valid[i] = 0;
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -187,7 +187,7 @@ static int alloc_mv_buf(struct vdec_h264_slice_inst *inst,
|
||||||
struct mtk_vcodec_mem *mem = NULL;
|
struct mtk_vcodec_mem *mem = NULL;
|
||||||
unsigned int buf_sz = mtk_vdec_h264_get_mv_buf_size(pic->buf_w, pic->buf_h);
|
unsigned int buf_sz = mtk_vdec_h264_get_mv_buf_size(pic->buf_w, pic->buf_h);
|
||||||
|
|
||||||
mtk_v4l2_debug(3, "size = 0x%x", buf_sz);
|
mtk_v4l2_vdec_dbg(3, inst->ctx, "size = 0x%x", buf_sz);
|
||||||
for (i = 0; i < H264_MAX_MV_NUM; i++) {
|
for (i = 0; i < H264_MAX_MV_NUM; i++) {
|
||||||
mem = &inst->mv_buf[i];
|
mem = &inst->mv_buf[i];
|
||||||
if (mem->va)
|
if (mem->va)
|
||||||
|
@ -243,12 +243,12 @@ static void get_pic_info(struct vdec_h264_slice_inst *inst,
|
||||||
ctx->last_decoded_picinfo.buf_h != ctx->picinfo.buf_h)
|
ctx->last_decoded_picinfo.buf_h != ctx->picinfo.buf_h)
|
||||||
inst->vsi_ctx.dec.realloc_mv_buf = true;
|
inst->vsi_ctx.dec.realloc_mv_buf = true;
|
||||||
|
|
||||||
mtk_v4l2_debug(1, "ResChg: (%d %d) : old(%d, %d) -> new(%d, %d)",
|
mtk_v4l2_vdec_dbg(1, inst->ctx, "ResChg: (%d %d) : old(%d, %d) -> new(%d, %d)",
|
||||||
inst->vsi_ctx.dec.resolution_changed,
|
inst->vsi_ctx.dec.resolution_changed,
|
||||||
inst->vsi_ctx.dec.realloc_mv_buf,
|
inst->vsi_ctx.dec.realloc_mv_buf,
|
||||||
ctx->last_decoded_picinfo.pic_w,
|
ctx->last_decoded_picinfo.pic_w,
|
||||||
ctx->last_decoded_picinfo.pic_h,
|
ctx->last_decoded_picinfo.pic_h,
|
||||||
ctx->picinfo.pic_w, ctx->picinfo.pic_h);
|
ctx->picinfo.pic_w, ctx->picinfo.pic_h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -294,7 +294,7 @@ static void vdec_h264_slice_fill_decode_reflist(struct vdec_h264_slice_inst *ins
|
||||||
mtk_vdec_h264_fill_dpb_info(inst->ctx, &slice_param->decode_params,
|
mtk_vdec_h264_fill_dpb_info(inst->ctx, &slice_param->decode_params,
|
||||||
slice_param->h264_dpb_info);
|
slice_param->h264_dpb_info);
|
||||||
|
|
||||||
mtk_v4l2_debug(3, "cur poc = %d\n", dec_params->bottom_field_order_cnt);
|
mtk_v4l2_vdec_dbg(3, inst->ctx, "cur poc = %d\n", dec_params->bottom_field_order_cnt);
|
||||||
/* Build the reference lists */
|
/* Build the reference lists */
|
||||||
v4l2_h264_init_reflist_builder(&reflist_builder, dec_params, sps,
|
v4l2_h264_init_reflist_builder(&reflist_builder, dec_params, sps,
|
||||||
inst->dpb);
|
inst->dpb);
|
||||||
|
@ -314,7 +314,7 @@ static int vdec_h264_slice_alloc_mv_buf(struct vdec_h264_slice_inst *inst,
|
||||||
struct mtk_vcodec_mem *mem;
|
struct mtk_vcodec_mem *mem;
|
||||||
int i, err;
|
int i, err;
|
||||||
|
|
||||||
mtk_v4l2_debug(3, "size = 0x%x", buf_sz);
|
mtk_v4l2_vdec_dbg(3, inst->ctx, "size = 0x%x", buf_sz);
|
||||||
for (i = 0; i < H264_MAX_MV_NUM; i++) {
|
for (i = 0; i < H264_MAX_MV_NUM; i++) {
|
||||||
mem = &inst->mv_buf[i];
|
mem = &inst->mv_buf[i];
|
||||||
if (mem->va)
|
if (mem->va)
|
||||||
|
@ -372,12 +372,12 @@ static void vdec_h264_slice_get_pic_info(struct vdec_h264_slice_inst *inst)
|
||||||
ctx->last_decoded_picinfo.buf_h != ctx->picinfo.buf_h)
|
ctx->last_decoded_picinfo.buf_h != ctx->picinfo.buf_h)
|
||||||
inst->realloc_mv_buf = true;
|
inst->realloc_mv_buf = true;
|
||||||
|
|
||||||
mtk_v4l2_debug(1, "resChg: (%d %d) : old(%d, %d) -> new(%d, %d)",
|
mtk_v4l2_vdec_dbg(1, inst->ctx, "resChg: (%d %d) : old(%d, %d) -> new(%d, %d)",
|
||||||
inst->resolution_changed,
|
inst->resolution_changed,
|
||||||
inst->realloc_mv_buf,
|
inst->realloc_mv_buf,
|
||||||
ctx->last_decoded_picinfo.pic_w,
|
ctx->last_decoded_picinfo.pic_w,
|
||||||
ctx->last_decoded_picinfo.pic_h,
|
ctx->last_decoded_picinfo.pic_h,
|
||||||
ctx->picinfo.pic_w, ctx->picinfo.pic_h);
|
ctx->picinfo.pic_w, ctx->picinfo.pic_h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -649,7 +649,7 @@ static int vdec_hevc_slice_alloc_mv_buf(struct vdec_hevc_slice_inst *inst,
|
||||||
struct mtk_vcodec_mem *mem;
|
struct mtk_vcodec_mem *mem;
|
||||||
int i, err;
|
int i, err;
|
||||||
|
|
||||||
mtk_v4l2_debug(3, "allocate mv buffer size = 0x%x", buf_sz);
|
mtk_v4l2_vdec_dbg(3, inst->ctx, "allocate mv buffer size = 0x%x", buf_sz);
|
||||||
for (i = 0; i < HEVC_MAX_MV_NUM; i++) {
|
for (i = 0; i < HEVC_MAX_MV_NUM; i++) {
|
||||||
mem = &inst->mv_buf[i];
|
mem = &inst->mv_buf[i];
|
||||||
if (mem->va)
|
if (mem->va)
|
||||||
|
@ -707,12 +707,12 @@ static void vdec_hevc_slice_get_pic_info(struct vdec_hevc_slice_inst *inst)
|
||||||
ctx->last_decoded_picinfo.buf_h != ctx->picinfo.buf_h)
|
ctx->last_decoded_picinfo.buf_h != ctx->picinfo.buf_h)
|
||||||
inst->realloc_mv_buf = true;
|
inst->realloc_mv_buf = true;
|
||||||
|
|
||||||
mtk_v4l2_debug(1, "resChg: (%d %d) : old(%d, %d) -> new(%d, %d)",
|
mtk_v4l2_vdec_dbg(1, inst->ctx, "resChg: (%d %d) : old(%d, %d) -> new(%d, %d)",
|
||||||
inst->resolution_changed,
|
inst->resolution_changed,
|
||||||
inst->realloc_mv_buf,
|
inst->realloc_mv_buf,
|
||||||
ctx->last_decoded_picinfo.pic_w,
|
ctx->last_decoded_picinfo.pic_w,
|
||||||
ctx->last_decoded_picinfo.pic_h,
|
ctx->last_decoded_picinfo.pic_h,
|
||||||
ctx->picinfo.pic_w, ctx->picinfo.pic_h);
|
ctx->picinfo.pic_w, ctx->picinfo.pic_h);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -75,7 +75,7 @@ int vdec_if_decode(struct mtk_vcodec_ctx *ctx, struct mtk_vcodec_mem *bs,
|
||||||
|
|
||||||
if (bs) {
|
if (bs) {
|
||||||
if ((bs->dma_addr & 63) != 0) {
|
if ((bs->dma_addr & 63) != 0) {
|
||||||
mtk_v4l2_err("bs dma_addr should 64 byte align");
|
mtk_v4l2_vdec_err(ctx, "bs dma_addr should 64 byte align");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -83,7 +83,7 @@ int vdec_if_decode(struct mtk_vcodec_ctx *ctx, struct mtk_vcodec_mem *bs,
|
||||||
if (fb) {
|
if (fb) {
|
||||||
if (((fb->base_y.dma_addr & 511) != 0) ||
|
if (((fb->base_y.dma_addr & 511) != 0) ||
|
||||||
((fb->base_c.dma_addr & 511) != 0)) {
|
((fb->base_c.dma_addr & 511) != 0)) {
|
||||||
mtk_v4l2_err("frame buffer dma_addr should 512 byte align");
|
mtk_v4l2_vdec_err(ctx, "frame buffer dma_addr should 512 byte align");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,7 +77,7 @@ int vdec_msg_queue_qbuf(struct vdec_msg_queue_ctx *msg_ctx, struct vdec_lat_buf
|
||||||
|
|
||||||
head = vdec_get_buf_list(msg_ctx->hardware_index, buf);
|
head = vdec_get_buf_list(msg_ctx->hardware_index, buf);
|
||||||
if (!head) {
|
if (!head) {
|
||||||
mtk_v4l2_err("fail to qbuf: %d", msg_ctx->hardware_index);
|
mtk_v4l2_vdec_err(buf->ctx, "fail to qbuf: %d", msg_ctx->hardware_index);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,8 +95,8 @@ int vdec_msg_queue_qbuf(struct vdec_msg_queue_ctx *msg_ctx, struct vdec_lat_buf
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mtk_v4l2_debug(3, "enqueue buf type: %d addr: 0x%p num: %d",
|
mtk_v4l2_vdec_dbg(3, buf->ctx, "enqueue buf type: %d addr: 0x%p num: %d",
|
||||||
msg_ctx->hardware_index, buf, msg_ctx->ready_num);
|
msg_ctx->hardware_index, buf, msg_ctx->ready_num);
|
||||||
spin_unlock(&msg_ctx->ready_lock);
|
spin_unlock(&msg_ctx->ready_lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -123,8 +123,6 @@ struct vdec_lat_buf *vdec_msg_queue_dqbuf(struct vdec_msg_queue_ctx *msg_ctx)
|
||||||
|
|
||||||
spin_lock(&msg_ctx->ready_lock);
|
spin_lock(&msg_ctx->ready_lock);
|
||||||
if (list_empty(&msg_ctx->ready_queue)) {
|
if (list_empty(&msg_ctx->ready_queue)) {
|
||||||
mtk_v4l2_debug(3, "queue is NULL, type:%d num: %d",
|
|
||||||
msg_ctx->hardware_index, msg_ctx->ready_num);
|
|
||||||
spin_unlock(&msg_ctx->ready_lock);
|
spin_unlock(&msg_ctx->ready_lock);
|
||||||
|
|
||||||
if (msg_ctx->hardware_index == MTK_VDEC_CORE)
|
if (msg_ctx->hardware_index == MTK_VDEC_CORE)
|
||||||
|
@ -146,15 +144,15 @@ struct vdec_lat_buf *vdec_msg_queue_dqbuf(struct vdec_msg_queue_ctx *msg_ctx)
|
||||||
head = vdec_get_buf_list(msg_ctx->hardware_index, buf);
|
head = vdec_get_buf_list(msg_ctx->hardware_index, buf);
|
||||||
if (!head) {
|
if (!head) {
|
||||||
spin_unlock(&msg_ctx->ready_lock);
|
spin_unlock(&msg_ctx->ready_lock);
|
||||||
mtk_v4l2_err("fail to dqbuf: %d", msg_ctx->hardware_index);
|
mtk_v4l2_vdec_err(buf->ctx, "fail to dqbuf: %d", msg_ctx->hardware_index);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
list_del(head);
|
list_del(head);
|
||||||
vdec_msg_queue_dec(&buf->ctx->msg_queue, msg_ctx->hardware_index);
|
vdec_msg_queue_dec(&buf->ctx->msg_queue, msg_ctx->hardware_index);
|
||||||
|
|
||||||
msg_ctx->ready_num--;
|
msg_ctx->ready_num--;
|
||||||
mtk_v4l2_debug(3, "dqueue buf type:%d addr: 0x%p num: %d",
|
mtk_v4l2_vdec_dbg(3, buf->ctx, "dqueue buf type:%d addr: 0x%p num: %d",
|
||||||
msg_ctx->hardware_index, buf, msg_ctx->ready_num);
|
msg_ctx->hardware_index, buf, msg_ctx->ready_num);
|
||||||
spin_unlock(&msg_ctx->ready_lock);
|
spin_unlock(&msg_ctx->ready_lock);
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
|
@ -164,7 +162,7 @@ void vdec_msg_queue_update_ube_rptr(struct vdec_msg_queue *msg_queue, uint64_t u
|
||||||
{
|
{
|
||||||
spin_lock(&msg_queue->lat_ctx.ready_lock);
|
spin_lock(&msg_queue->lat_ctx.ready_lock);
|
||||||
msg_queue->wdma_rptr_addr = ube_rptr;
|
msg_queue->wdma_rptr_addr = ube_rptr;
|
||||||
mtk_v4l2_debug(3, "update ube rprt (0x%llx)", ube_rptr);
|
mtk_v4l2_vdec_dbg(3, msg_queue->ctx, "update ube rprt (0x%llx)", ube_rptr);
|
||||||
spin_unlock(&msg_queue->lat_ctx.ready_lock);
|
spin_unlock(&msg_queue->lat_ctx.ready_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,20 +170,19 @@ void vdec_msg_queue_update_ube_wptr(struct vdec_msg_queue *msg_queue, uint64_t u
|
||||||
{
|
{
|
||||||
spin_lock(&msg_queue->lat_ctx.ready_lock);
|
spin_lock(&msg_queue->lat_ctx.ready_lock);
|
||||||
msg_queue->wdma_wptr_addr = ube_wptr;
|
msg_queue->wdma_wptr_addr = ube_wptr;
|
||||||
mtk_v4l2_debug(3, "update ube wprt: (0x%llx 0x%llx) offset: 0x%llx",
|
mtk_v4l2_vdec_dbg(3, msg_queue->ctx, "update ube wprt: (0x%llx 0x%llx) offset: 0x%llx",
|
||||||
msg_queue->wdma_rptr_addr, msg_queue->wdma_wptr_addr,
|
msg_queue->wdma_rptr_addr, msg_queue->wdma_wptr_addr,
|
||||||
ube_wptr);
|
ube_wptr);
|
||||||
spin_unlock(&msg_queue->lat_ctx.ready_lock);
|
spin_unlock(&msg_queue->lat_ctx.ready_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool vdec_msg_queue_wait_lat_buf_full(struct vdec_msg_queue *msg_queue)
|
bool vdec_msg_queue_wait_lat_buf_full(struct vdec_msg_queue *msg_queue)
|
||||||
{
|
{
|
||||||
if (atomic_read(&msg_queue->lat_list_cnt) == NUM_BUFFER_COUNT) {
|
if (atomic_read(&msg_queue->lat_list_cnt) == NUM_BUFFER_COUNT) {
|
||||||
mtk_v4l2_debug(3, "wait buf full: list(%d %d) ready_num:%d status:%d",
|
mtk_v4l2_vdec_dbg(3, msg_queue->ctx, "wait buf full: (%d %d) ready:%d status:%d",
|
||||||
atomic_read(&msg_queue->lat_list_cnt),
|
atomic_read(&msg_queue->lat_list_cnt),
|
||||||
atomic_read(&msg_queue->core_list_cnt),
|
atomic_read(&msg_queue->core_list_cnt),
|
||||||
msg_queue->lat_ctx.ready_num,
|
msg_queue->lat_ctx.ready_num, msg_queue->status);
|
||||||
msg_queue->status);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,10 +190,10 @@ bool vdec_msg_queue_wait_lat_buf_full(struct vdec_msg_queue *msg_queue)
|
||||||
vdec_msg_queue_qbuf(&msg_queue->core_ctx, &msg_queue->empty_lat_buf);
|
vdec_msg_queue_qbuf(&msg_queue->core_ctx, &msg_queue->empty_lat_buf);
|
||||||
wait_event(msg_queue->core_dec_done, msg_queue->flush_done);
|
wait_event(msg_queue->core_dec_done, msg_queue->flush_done);
|
||||||
|
|
||||||
mtk_v4l2_debug(3, "flush done => ready_num:%d status:%d list(%d %d)",
|
mtk_v4l2_vdec_dbg(3, msg_queue->ctx, "flush done => ready_num:%d status:%d list(%d %d)",
|
||||||
msg_queue->lat_ctx.ready_num, msg_queue->status,
|
msg_queue->lat_ctx.ready_num, msg_queue->status,
|
||||||
atomic_read(&msg_queue->lat_list_cnt),
|
atomic_read(&msg_queue->lat_list_cnt),
|
||||||
atomic_read(&msg_queue->core_list_cnt));
|
atomic_read(&msg_queue->core_list_cnt));
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -307,7 +304,7 @@ int vdec_msg_queue_init(struct vdec_msg_queue *msg_queue,
|
||||||
ctx->picinfo.buf_h);
|
ctx->picinfo.buf_h);
|
||||||
err = mtk_vcodec_mem_alloc(ctx, &msg_queue->wdma_addr);
|
err = mtk_vcodec_mem_alloc(ctx, &msg_queue->wdma_addr);
|
||||||
if (err) {
|
if (err) {
|
||||||
mtk_v4l2_err("failed to allocate wdma_addr buf");
|
mtk_v4l2_vdec_err(ctx, "failed to allocate wdma_addr buf");
|
||||||
msg_queue->wdma_addr.size = 0;
|
msg_queue->wdma_addr.size = 0;
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
@ -318,20 +315,21 @@ int vdec_msg_queue_init(struct vdec_msg_queue *msg_queue,
|
||||||
msg_queue->empty_lat_buf.core_decode = NULL;
|
msg_queue->empty_lat_buf.core_decode = NULL;
|
||||||
msg_queue->empty_lat_buf.is_last_frame = true;
|
msg_queue->empty_lat_buf.is_last_frame = true;
|
||||||
|
|
||||||
|
msg_queue->ctx = ctx;
|
||||||
for (i = 0; i < NUM_BUFFER_COUNT; i++) {
|
for (i = 0; i < NUM_BUFFER_COUNT; i++) {
|
||||||
lat_buf = &msg_queue->lat_buf[i];
|
lat_buf = &msg_queue->lat_buf[i];
|
||||||
|
|
||||||
lat_buf->wdma_err_addr.size = VDEC_ERR_MAP_SZ_AVC;
|
lat_buf->wdma_err_addr.size = VDEC_ERR_MAP_SZ_AVC;
|
||||||
err = mtk_vcodec_mem_alloc(ctx, &lat_buf->wdma_err_addr);
|
err = mtk_vcodec_mem_alloc(ctx, &lat_buf->wdma_err_addr);
|
||||||
if (err) {
|
if (err) {
|
||||||
mtk_v4l2_err("failed to allocate wdma_err_addr buf[%d]", i);
|
mtk_v4l2_vdec_err(ctx, "failed to allocate wdma_err_addr buf[%d]", i);
|
||||||
goto mem_alloc_err;
|
goto mem_alloc_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
lat_buf->slice_bc_addr.size = VDEC_LAT_SLICE_HEADER_SZ;
|
lat_buf->slice_bc_addr.size = VDEC_LAT_SLICE_HEADER_SZ;
|
||||||
err = mtk_vcodec_mem_alloc(ctx, &lat_buf->slice_bc_addr);
|
err = mtk_vcodec_mem_alloc(ctx, &lat_buf->slice_bc_addr);
|
||||||
if (err) {
|
if (err) {
|
||||||
mtk_v4l2_err("failed to allocate wdma_addr buf[%d]", i);
|
mtk_v4l2_vdec_err(ctx, "failed to allocate wdma_addr buf[%d]", i);
|
||||||
goto mem_alloc_err;
|
goto mem_alloc_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -339,14 +337,14 @@ int vdec_msg_queue_init(struct vdec_msg_queue *msg_queue,
|
||||||
lat_buf->rd_mv_addr.size = VDEC_RD_MV_BUFFER_SZ;
|
lat_buf->rd_mv_addr.size = VDEC_RD_MV_BUFFER_SZ;
|
||||||
err = mtk_vcodec_mem_alloc(ctx, &lat_buf->rd_mv_addr);
|
err = mtk_vcodec_mem_alloc(ctx, &lat_buf->rd_mv_addr);
|
||||||
if (err) {
|
if (err) {
|
||||||
mtk_v4l2_err("failed to allocate rd_mv_addr buf[%d]", i);
|
mtk_v4l2_vdec_err(ctx, "failed to allocate rd_mv_addr buf[%d]", i);
|
||||||
goto mem_alloc_err;
|
goto mem_alloc_err;
|
||||||
}
|
}
|
||||||
|
|
||||||
lat_buf->tile_addr.size = VDEC_LAT_TILE_SZ;
|
lat_buf->tile_addr.size = VDEC_LAT_TILE_SZ;
|
||||||
err = mtk_vcodec_mem_alloc(ctx, &lat_buf->tile_addr);
|
err = mtk_vcodec_mem_alloc(ctx, &lat_buf->tile_addr);
|
||||||
if (err) {
|
if (err) {
|
||||||
mtk_v4l2_err("failed to allocate tile_addr buf[%d]", i);
|
mtk_v4l2_vdec_err(ctx, "failed to allocate tile_addr buf[%d]", i);
|
||||||
goto mem_alloc_err;
|
goto mem_alloc_err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -362,7 +360,7 @@ int vdec_msg_queue_init(struct vdec_msg_queue *msg_queue,
|
||||||
lat_buf->is_last_frame = false;
|
lat_buf->is_last_frame = false;
|
||||||
err = vdec_msg_queue_qbuf(&msg_queue->lat_ctx, lat_buf);
|
err = vdec_msg_queue_qbuf(&msg_queue->lat_ctx, lat_buf);
|
||||||
if (err) {
|
if (err) {
|
||||||
mtk_v4l2_err("failed to qbuf buf[%d]", i);
|
mtk_v4l2_vdec_err(ctx, "failed to qbuf buf[%d]", i);
|
||||||
goto mem_alloc_err;
|
goto mem_alloc_err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,6 +100,7 @@ struct vdec_lat_buf {
|
||||||
* @empty_lat_buf: the last lat buf used to flush decode
|
* @empty_lat_buf: the last lat buf used to flush decode
|
||||||
* @core_dec_done: core work queue decode done event
|
* @core_dec_done: core work queue decode done event
|
||||||
* @status: current context decode status for core hardware
|
* @status: current context decode status for core hardware
|
||||||
|
* @ctx: mtk vcodec context information
|
||||||
*/
|
*/
|
||||||
struct vdec_msg_queue {
|
struct vdec_msg_queue {
|
||||||
struct vdec_lat_buf lat_buf[NUM_BUFFER_COUNT];
|
struct vdec_lat_buf lat_buf[NUM_BUFFER_COUNT];
|
||||||
|
@ -118,6 +119,7 @@ struct vdec_msg_queue {
|
||||||
struct vdec_lat_buf empty_lat_buf;
|
struct vdec_lat_buf empty_lat_buf;
|
||||||
wait_queue_head_t core_dec_done;
|
wait_queue_head_t core_dec_done;
|
||||||
int status;
|
int status;
|
||||||
|
struct mtk_vcodec_ctx *ctx;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -91,7 +91,7 @@ static void vpu_dec_ipi_handler(void *data, unsigned int len, void *priv)
|
||||||
(unsigned long)msg->ap_inst_addr;
|
(unsigned long)msg->ap_inst_addr;
|
||||||
|
|
||||||
if (!vpu) {
|
if (!vpu) {
|
||||||
mtk_v4l2_err("ap_inst_addr is NULL, did the SCP hang or crash?");
|
mtk_v4l2_vdec_err(vpu->ctx, "ap_inst_addr is NULL, did the SCP hang or crash?");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue