162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Contains the virtual decoder logic. The functions here control the 462306a36Sopenharmony_ci * tracing/TPG on a per-frame basis 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include "visl.h" 862306a36Sopenharmony_ci#include "visl-debugfs.h" 962306a36Sopenharmony_ci#include "visl-dec.h" 1062306a36Sopenharmony_ci#include "visl-trace-fwht.h" 1162306a36Sopenharmony_ci#include "visl-trace-mpeg2.h" 1262306a36Sopenharmony_ci#include "visl-trace-vp8.h" 1362306a36Sopenharmony_ci#include "visl-trace-vp9.h" 1462306a36Sopenharmony_ci#include "visl-trace-h264.h" 1562306a36Sopenharmony_ci#include "visl-trace-hevc.h" 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#include <linux/delay.h> 1862306a36Sopenharmony_ci#include <linux/workqueue.h> 1962306a36Sopenharmony_ci#include <media/v4l2-mem2mem.h> 2062306a36Sopenharmony_ci#include <media/tpg/v4l2-tpg.h> 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_cistatic void *plane_vaddr(struct tpg_data *tpg, struct vb2_buffer *buf, 2362306a36Sopenharmony_ci u32 p, u32 bpl[TPG_MAX_PLANES], u32 h) 2462306a36Sopenharmony_ci{ 2562306a36Sopenharmony_ci u32 i; 2662306a36Sopenharmony_ci void *vbuf; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci if (p == 0 || tpg_g_buffers(tpg) > 1) 2962306a36Sopenharmony_ci return vb2_plane_vaddr(buf, p); 3062306a36Sopenharmony_ci vbuf = vb2_plane_vaddr(buf, 0); 3162306a36Sopenharmony_ci for (i = 0; i < p; i++) 3262306a36Sopenharmony_ci vbuf += bpl[i] * h / tpg->vdownsampling[i]; 3362306a36Sopenharmony_ci return vbuf; 3462306a36Sopenharmony_ci} 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cistatic void visl_get_ref_frames(struct visl_ctx *ctx, u8 *buf, 3762306a36Sopenharmony_ci __kernel_size_t buflen, struct visl_run *run) 3862306a36Sopenharmony_ci{ 3962306a36Sopenharmony_ci struct vb2_queue *cap_q = &ctx->fh.m2m_ctx->cap_q_ctx.q; 4062306a36Sopenharmony_ci char header[] = "Reference frames:\n"; 4162306a36Sopenharmony_ci u32 i; 4262306a36Sopenharmony_ci u32 len; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci len = scnprintf(buf, buflen, header); 4562306a36Sopenharmony_ci buf += len; 4662306a36Sopenharmony_ci buflen -= len; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci switch (ctx->current_codec) { 4962306a36Sopenharmony_ci case VISL_CODEC_NONE: 5062306a36Sopenharmony_ci break; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci case VISL_CODEC_FWHT: { 5362306a36Sopenharmony_ci struct vb2_buffer *vb2_buf; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci vb2_buf = vb2_find_buffer(cap_q, run->fwht.params->backward_ref_ts); 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci scnprintf(buf, buflen, "backwards_ref_ts: %lld, vb2_idx: %d", 5862306a36Sopenharmony_ci run->fwht.params->backward_ref_ts, 5962306a36Sopenharmony_ci vb2_buf ? vb2_buf->index : -1); 6062306a36Sopenharmony_ci break; 6162306a36Sopenharmony_ci } 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci case VISL_CODEC_MPEG2: { 6462306a36Sopenharmony_ci struct vb2_buffer *b_ref; 6562306a36Sopenharmony_ci struct vb2_buffer *f_ref; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci b_ref = vb2_find_buffer(cap_q, run->mpeg2.pic->backward_ref_ts); 6862306a36Sopenharmony_ci f_ref = vb2_find_buffer(cap_q, run->mpeg2.pic->forward_ref_ts); 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci scnprintf(buf, buflen, 7162306a36Sopenharmony_ci "backward_ref_ts: %llu, vb2_idx: %d\n" 7262306a36Sopenharmony_ci "forward_ref_ts: %llu, vb2_idx: %d\n", 7362306a36Sopenharmony_ci run->mpeg2.pic->backward_ref_ts, 7462306a36Sopenharmony_ci b_ref ? b_ref->index : -1, 7562306a36Sopenharmony_ci run->mpeg2.pic->forward_ref_ts, 7662306a36Sopenharmony_ci f_ref ? f_ref->index : -1); 7762306a36Sopenharmony_ci break; 7862306a36Sopenharmony_ci } 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci case VISL_CODEC_VP8: { 8162306a36Sopenharmony_ci struct vb2_buffer *last; 8262306a36Sopenharmony_ci struct vb2_buffer *golden; 8362306a36Sopenharmony_ci struct vb2_buffer *alt; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci last = vb2_find_buffer(cap_q, run->vp8.frame->last_frame_ts); 8662306a36Sopenharmony_ci golden = vb2_find_buffer(cap_q, run->vp8.frame->golden_frame_ts); 8762306a36Sopenharmony_ci alt = vb2_find_buffer(cap_q, run->vp8.frame->alt_frame_ts); 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci scnprintf(buf, buflen, 9062306a36Sopenharmony_ci "last_ref_ts: %llu, vb2_idx: %d\n" 9162306a36Sopenharmony_ci "golden_ref_ts: %llu, vb2_idx: %d\n" 9262306a36Sopenharmony_ci "alt_ref_ts: %llu, vb2_idx: %d\n", 9362306a36Sopenharmony_ci run->vp8.frame->last_frame_ts, 9462306a36Sopenharmony_ci last ? last->index : -1, 9562306a36Sopenharmony_ci run->vp8.frame->golden_frame_ts, 9662306a36Sopenharmony_ci golden ? golden->index : -1, 9762306a36Sopenharmony_ci run->vp8.frame->alt_frame_ts, 9862306a36Sopenharmony_ci alt ? alt->index : -1); 9962306a36Sopenharmony_ci break; 10062306a36Sopenharmony_ci } 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci case VISL_CODEC_VP9: { 10362306a36Sopenharmony_ci struct vb2_buffer *last; 10462306a36Sopenharmony_ci struct vb2_buffer *golden; 10562306a36Sopenharmony_ci struct vb2_buffer *alt; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci last = vb2_find_buffer(cap_q, run->vp9.frame->last_frame_ts); 10862306a36Sopenharmony_ci golden = vb2_find_buffer(cap_q, run->vp9.frame->golden_frame_ts); 10962306a36Sopenharmony_ci alt = vb2_find_buffer(cap_q, run->vp9.frame->alt_frame_ts); 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci scnprintf(buf, buflen, 11262306a36Sopenharmony_ci "last_ref_ts: %llu, vb2_idx: %d\n" 11362306a36Sopenharmony_ci "golden_ref_ts: %llu, vb2_idx: %d\n" 11462306a36Sopenharmony_ci "alt_ref_ts: %llu, vb2_idx: %d\n", 11562306a36Sopenharmony_ci run->vp9.frame->last_frame_ts, 11662306a36Sopenharmony_ci last ? last->index : -1, 11762306a36Sopenharmony_ci run->vp9.frame->golden_frame_ts, 11862306a36Sopenharmony_ci golden ? golden->index : -1, 11962306a36Sopenharmony_ci run->vp9.frame->alt_frame_ts, 12062306a36Sopenharmony_ci alt ? alt->index : -1); 12162306a36Sopenharmony_ci break; 12262306a36Sopenharmony_ci } 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci case VISL_CODEC_H264: { 12562306a36Sopenharmony_ci char entry[] = "dpb[%d]:%u, vb2_index: %d\n"; 12662306a36Sopenharmony_ci struct vb2_buffer *vb2_buf; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(run->h264.dpram->dpb); i++) { 12962306a36Sopenharmony_ci vb2_buf = vb2_find_buffer(cap_q, run->h264.dpram->dpb[i].reference_ts); 13062306a36Sopenharmony_ci len = scnprintf(buf, buflen, entry, i, 13162306a36Sopenharmony_ci run->h264.dpram->dpb[i].reference_ts, 13262306a36Sopenharmony_ci vb2_buf ? vb2_buf->index : -1); 13362306a36Sopenharmony_ci buf += len; 13462306a36Sopenharmony_ci buflen -= len; 13562306a36Sopenharmony_ci } 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci break; 13862306a36Sopenharmony_ci } 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci case VISL_CODEC_HEVC: { 14162306a36Sopenharmony_ci char entry[] = "dpb[%d]:%u, vb2_index: %d\n"; 14262306a36Sopenharmony_ci struct vb2_buffer *vb2_buf; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(run->hevc.dpram->dpb); i++) { 14562306a36Sopenharmony_ci vb2_buf = vb2_find_buffer(cap_q, run->hevc.dpram->dpb[i].timestamp); 14662306a36Sopenharmony_ci len = scnprintf(buf, buflen, entry, i, 14762306a36Sopenharmony_ci run->hevc.dpram->dpb[i].timestamp, 14862306a36Sopenharmony_ci vb2_buf ? vb2_buf->index : -1); 14962306a36Sopenharmony_ci buf += len; 15062306a36Sopenharmony_ci buflen -= len; 15162306a36Sopenharmony_ci } 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_ci break; 15462306a36Sopenharmony_ci } 15562306a36Sopenharmony_ci } 15662306a36Sopenharmony_ci} 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_cistatic char *visl_get_vb2_state(enum vb2_buffer_state state) 15962306a36Sopenharmony_ci{ 16062306a36Sopenharmony_ci switch (state) { 16162306a36Sopenharmony_ci case VB2_BUF_STATE_DEQUEUED: 16262306a36Sopenharmony_ci return "Dequeued"; 16362306a36Sopenharmony_ci case VB2_BUF_STATE_IN_REQUEST: 16462306a36Sopenharmony_ci return "In request"; 16562306a36Sopenharmony_ci case VB2_BUF_STATE_PREPARING: 16662306a36Sopenharmony_ci return "Preparing"; 16762306a36Sopenharmony_ci case VB2_BUF_STATE_QUEUED: 16862306a36Sopenharmony_ci return "Queued"; 16962306a36Sopenharmony_ci case VB2_BUF_STATE_ACTIVE: 17062306a36Sopenharmony_ci return "Active"; 17162306a36Sopenharmony_ci case VB2_BUF_STATE_DONE: 17262306a36Sopenharmony_ci return "Done"; 17362306a36Sopenharmony_ci case VB2_BUF_STATE_ERROR: 17462306a36Sopenharmony_ci return "Error"; 17562306a36Sopenharmony_ci default: 17662306a36Sopenharmony_ci return ""; 17762306a36Sopenharmony_ci } 17862306a36Sopenharmony_ci} 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_cistatic int visl_fill_bytesused(struct vb2_v4l2_buffer *v4l2_vb2_buf, char *buf, size_t bufsz) 18162306a36Sopenharmony_ci{ 18262306a36Sopenharmony_ci int len = 0; 18362306a36Sopenharmony_ci u32 i; 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci for (i = 0; i < v4l2_vb2_buf->vb2_buf.num_planes; i++) 18662306a36Sopenharmony_ci len += scnprintf(buf, bufsz, 18762306a36Sopenharmony_ci "bytesused[%u]: %u length[%u]: %u data_offset[%u]: %u", 18862306a36Sopenharmony_ci i, v4l2_vb2_buf->planes[i].bytesused, 18962306a36Sopenharmony_ci i, v4l2_vb2_buf->planes[i].length, 19062306a36Sopenharmony_ci i, v4l2_vb2_buf->planes[i].data_offset); 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci return len; 19362306a36Sopenharmony_ci} 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_cistatic void visl_tpg_fill_sequence(struct visl_ctx *ctx, 19662306a36Sopenharmony_ci struct visl_run *run, char buf[], size_t bufsz) 19762306a36Sopenharmony_ci{ 19862306a36Sopenharmony_ci u32 stream_ms; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci stream_ms = jiffies_to_msecs(get_jiffies_64() - ctx->capture_streamon_jiffies); 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci scnprintf(buf, bufsz, 20362306a36Sopenharmony_ci "stream time: %02d:%02d:%02d:%03d sequence:%u timestamp:%lld field:%s", 20462306a36Sopenharmony_ci (stream_ms / (60 * 60 * 1000)) % 24, 20562306a36Sopenharmony_ci (stream_ms / (60 * 1000)) % 60, 20662306a36Sopenharmony_ci (stream_ms / 1000) % 60, 20762306a36Sopenharmony_ci stream_ms % 1000, 20862306a36Sopenharmony_ci run->dst->sequence, 20962306a36Sopenharmony_ci run->dst->vb2_buf.timestamp, 21062306a36Sopenharmony_ci (run->dst->field == V4L2_FIELD_ALTERNATE) ? 21162306a36Sopenharmony_ci (run->dst->field == V4L2_FIELD_TOP ? 21262306a36Sopenharmony_ci " top" : " bottom") : "none"); 21362306a36Sopenharmony_ci} 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_cistatic void visl_tpg_fill(struct visl_ctx *ctx, struct visl_run *run) 21662306a36Sopenharmony_ci{ 21762306a36Sopenharmony_ci u8 *basep[TPG_MAX_PLANES][2]; 21862306a36Sopenharmony_ci char *buf = ctx->tpg_str_buf; 21962306a36Sopenharmony_ci char *tmp = buf; 22062306a36Sopenharmony_ci char *line_str; 22162306a36Sopenharmony_ci u32 line = 1; 22262306a36Sopenharmony_ci const u32 line_height = 16; 22362306a36Sopenharmony_ci u32 len; 22462306a36Sopenharmony_ci struct vb2_queue *out_q = &ctx->fh.m2m_ctx->out_q_ctx.q; 22562306a36Sopenharmony_ci struct vb2_queue *cap_q = &ctx->fh.m2m_ctx->cap_q_ctx.q; 22662306a36Sopenharmony_ci struct v4l2_pix_format_mplane *coded_fmt = &ctx->coded_fmt.fmt.pix_mp; 22762306a36Sopenharmony_ci struct v4l2_pix_format_mplane *decoded_fmt = &ctx->decoded_fmt.fmt.pix_mp; 22862306a36Sopenharmony_ci u32 p; 22962306a36Sopenharmony_ci u32 i; 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci for (p = 0; p < tpg_g_planes(&ctx->tpg); p++) { 23262306a36Sopenharmony_ci void *vbuf = plane_vaddr(&ctx->tpg, 23362306a36Sopenharmony_ci &run->dst->vb2_buf, p, 23462306a36Sopenharmony_ci ctx->tpg.bytesperline, 23562306a36Sopenharmony_ci ctx->tpg.buf_height); 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci tpg_calc_text_basep(&ctx->tpg, basep, p, vbuf); 23862306a36Sopenharmony_ci tpg_fill_plane_buffer(&ctx->tpg, 0, p, vbuf); 23962306a36Sopenharmony_ci } 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci visl_tpg_fill_sequence(ctx, run, buf, TPG_STR_BUF_SZ); 24262306a36Sopenharmony_ci tpg_gen_text(&ctx->tpg, basep, line++ * line_height, 16, buf); 24362306a36Sopenharmony_ci frame_dprintk(ctx->dev, run->dst->sequence, "%s\n", buf); 24462306a36Sopenharmony_ci frame_dprintk(ctx->dev, run->dst->sequence, ""); 24562306a36Sopenharmony_ci line++; 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci visl_get_ref_frames(ctx, buf, TPG_STR_BUF_SZ, run); 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_ci while ((line_str = strsep(&tmp, "\n")) && strlen(line_str)) { 25062306a36Sopenharmony_ci tpg_gen_text(&ctx->tpg, basep, line++ * line_height, 16, line_str); 25162306a36Sopenharmony_ci frame_dprintk(ctx->dev, run->dst->sequence, "%s\n", line_str); 25262306a36Sopenharmony_ci } 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci frame_dprintk(ctx->dev, run->dst->sequence, ""); 25562306a36Sopenharmony_ci line++; 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci scnprintf(buf, 25862306a36Sopenharmony_ci TPG_STR_BUF_SZ, 25962306a36Sopenharmony_ci "OUTPUT pixelformat: %c%c%c%c, resolution: %dx%d, num_planes: %d", 26062306a36Sopenharmony_ci coded_fmt->pixelformat, 26162306a36Sopenharmony_ci (coded_fmt->pixelformat >> 8) & 0xff, 26262306a36Sopenharmony_ci (coded_fmt->pixelformat >> 16) & 0xff, 26362306a36Sopenharmony_ci (coded_fmt->pixelformat >> 24) & 0xff, 26462306a36Sopenharmony_ci coded_fmt->width, 26562306a36Sopenharmony_ci coded_fmt->height, 26662306a36Sopenharmony_ci coded_fmt->num_planes); 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci tpg_gen_text(&ctx->tpg, basep, line++ * line_height, 16, buf); 26962306a36Sopenharmony_ci frame_dprintk(ctx->dev, run->dst->sequence, "%s\n", buf); 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci for (i = 0; i < coded_fmt->num_planes; i++) { 27262306a36Sopenharmony_ci scnprintf(buf, 27362306a36Sopenharmony_ci TPG_STR_BUF_SZ, 27462306a36Sopenharmony_ci "plane[%d]: bytesperline: %d, sizeimage: %d", 27562306a36Sopenharmony_ci i, 27662306a36Sopenharmony_ci coded_fmt->plane_fmt[i].bytesperline, 27762306a36Sopenharmony_ci coded_fmt->plane_fmt[i].sizeimage); 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci tpg_gen_text(&ctx->tpg, basep, line++ * line_height, 16, buf); 28062306a36Sopenharmony_ci frame_dprintk(ctx->dev, run->dst->sequence, "%s\n", buf); 28162306a36Sopenharmony_ci } 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci line++; 28462306a36Sopenharmony_ci frame_dprintk(ctx->dev, run->dst->sequence, ""); 28562306a36Sopenharmony_ci scnprintf(buf, TPG_STR_BUF_SZ, "Output queue status:"); 28662306a36Sopenharmony_ci tpg_gen_text(&ctx->tpg, basep, line++ * line_height, 16, buf); 28762306a36Sopenharmony_ci frame_dprintk(ctx->dev, run->dst->sequence, "%s\n", buf); 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci len = 0; 29062306a36Sopenharmony_ci for (i = 0; i < out_q->num_buffers; i++) { 29162306a36Sopenharmony_ci char entry[] = "index: %u, state: %s, request_fd: %d, "; 29262306a36Sopenharmony_ci u32 old_len = len; 29362306a36Sopenharmony_ci char *q_status = visl_get_vb2_state(out_q->bufs[i]->state); 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci len += scnprintf(&buf[len], TPG_STR_BUF_SZ - len, 29662306a36Sopenharmony_ci entry, i, q_status, 29762306a36Sopenharmony_ci to_vb2_v4l2_buffer(out_q->bufs[i])->request_fd); 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci len += visl_fill_bytesused(to_vb2_v4l2_buffer(out_q->bufs[i]), 30062306a36Sopenharmony_ci &buf[len], 30162306a36Sopenharmony_ci TPG_STR_BUF_SZ - len); 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci tpg_gen_text(&ctx->tpg, basep, line++ * line_height, 16, &buf[old_len]); 30462306a36Sopenharmony_ci frame_dprintk(ctx->dev, run->dst->sequence, "%s", &buf[old_len]); 30562306a36Sopenharmony_ci } 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci line++; 30862306a36Sopenharmony_ci frame_dprintk(ctx->dev, run->dst->sequence, ""); 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci scnprintf(buf, 31162306a36Sopenharmony_ci TPG_STR_BUF_SZ, 31262306a36Sopenharmony_ci "CAPTURE pixelformat: %c%c%c%c, resolution: %dx%d, num_planes: %d", 31362306a36Sopenharmony_ci decoded_fmt->pixelformat, 31462306a36Sopenharmony_ci (decoded_fmt->pixelformat >> 8) & 0xff, 31562306a36Sopenharmony_ci (decoded_fmt->pixelformat >> 16) & 0xff, 31662306a36Sopenharmony_ci (decoded_fmt->pixelformat >> 24) & 0xff, 31762306a36Sopenharmony_ci decoded_fmt->width, 31862306a36Sopenharmony_ci decoded_fmt->height, 31962306a36Sopenharmony_ci decoded_fmt->num_planes); 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci tpg_gen_text(&ctx->tpg, basep, line++ * line_height, 16, buf); 32262306a36Sopenharmony_ci frame_dprintk(ctx->dev, run->dst->sequence, "%s\n", buf); 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ci for (i = 0; i < decoded_fmt->num_planes; i++) { 32562306a36Sopenharmony_ci scnprintf(buf, 32662306a36Sopenharmony_ci TPG_STR_BUF_SZ, 32762306a36Sopenharmony_ci "plane[%d]: bytesperline: %d, sizeimage: %d", 32862306a36Sopenharmony_ci i, 32962306a36Sopenharmony_ci decoded_fmt->plane_fmt[i].bytesperline, 33062306a36Sopenharmony_ci decoded_fmt->plane_fmt[i].sizeimage); 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci tpg_gen_text(&ctx->tpg, basep, line++ * line_height, 16, buf); 33362306a36Sopenharmony_ci frame_dprintk(ctx->dev, run->dst->sequence, "%s\n", buf); 33462306a36Sopenharmony_ci } 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ci line++; 33762306a36Sopenharmony_ci frame_dprintk(ctx->dev, run->dst->sequence, ""); 33862306a36Sopenharmony_ci scnprintf(buf, TPG_STR_BUF_SZ, "Capture queue status:"); 33962306a36Sopenharmony_ci tpg_gen_text(&ctx->tpg, basep, line++ * line_height, 16, buf); 34062306a36Sopenharmony_ci frame_dprintk(ctx->dev, run->dst->sequence, "%s\n", buf); 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci len = 0; 34362306a36Sopenharmony_ci for (i = 0; i < cap_q->num_buffers; i++) { 34462306a36Sopenharmony_ci u32 old_len = len; 34562306a36Sopenharmony_ci char *q_status = visl_get_vb2_state(cap_q->bufs[i]->state); 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci len += scnprintf(&buf[len], TPG_STR_BUF_SZ - len, 34862306a36Sopenharmony_ci "index: %u, status: %s, timestamp: %llu, is_held: %d", 34962306a36Sopenharmony_ci cap_q->bufs[i]->index, q_status, 35062306a36Sopenharmony_ci cap_q->bufs[i]->timestamp, 35162306a36Sopenharmony_ci to_vb2_v4l2_buffer(cap_q->bufs[i])->is_held); 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_ci tpg_gen_text(&ctx->tpg, basep, line++ * line_height, 16, &buf[old_len]); 35462306a36Sopenharmony_ci frame_dprintk(ctx->dev, run->dst->sequence, "%s", &buf[old_len]); 35562306a36Sopenharmony_ci } 35662306a36Sopenharmony_ci} 35762306a36Sopenharmony_ci 35862306a36Sopenharmony_cistatic void visl_trace_ctrls(struct visl_ctx *ctx, struct visl_run *run) 35962306a36Sopenharmony_ci{ 36062306a36Sopenharmony_ci int i; 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ci switch (ctx->current_codec) { 36362306a36Sopenharmony_ci default: 36462306a36Sopenharmony_ci case VISL_CODEC_NONE: 36562306a36Sopenharmony_ci break; 36662306a36Sopenharmony_ci case VISL_CODEC_FWHT: 36762306a36Sopenharmony_ci trace_v4l2_ctrl_fwht_params(run->fwht.params); 36862306a36Sopenharmony_ci break; 36962306a36Sopenharmony_ci case VISL_CODEC_MPEG2: 37062306a36Sopenharmony_ci trace_v4l2_ctrl_mpeg2_sequence(run->mpeg2.seq); 37162306a36Sopenharmony_ci trace_v4l2_ctrl_mpeg2_picture(run->mpeg2.pic); 37262306a36Sopenharmony_ci trace_v4l2_ctrl_mpeg2_quantisation(run->mpeg2.quant); 37362306a36Sopenharmony_ci break; 37462306a36Sopenharmony_ci case VISL_CODEC_VP8: 37562306a36Sopenharmony_ci trace_v4l2_ctrl_vp8_frame(run->vp8.frame); 37662306a36Sopenharmony_ci trace_v4l2_ctrl_vp8_entropy(run->vp8.frame); 37762306a36Sopenharmony_ci break; 37862306a36Sopenharmony_ci case VISL_CODEC_VP9: 37962306a36Sopenharmony_ci trace_v4l2_ctrl_vp9_frame(run->vp9.frame); 38062306a36Sopenharmony_ci trace_v4l2_ctrl_vp9_compressed_hdr(run->vp9.probs); 38162306a36Sopenharmony_ci trace_v4l2_ctrl_vp9_compressed_coeff(run->vp9.probs); 38262306a36Sopenharmony_ci trace_v4l2_vp9_mv_probs(&run->vp9.probs->mv); 38362306a36Sopenharmony_ci break; 38462306a36Sopenharmony_ci case VISL_CODEC_H264: 38562306a36Sopenharmony_ci trace_v4l2_ctrl_h264_sps(run->h264.sps); 38662306a36Sopenharmony_ci trace_v4l2_ctrl_h264_pps(run->h264.pps); 38762306a36Sopenharmony_ci trace_v4l2_ctrl_h264_scaling_matrix(run->h264.sm); 38862306a36Sopenharmony_ci trace_v4l2_ctrl_h264_slice_params(run->h264.spram); 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(run->h264.spram->ref_pic_list0); i++) 39162306a36Sopenharmony_ci trace_v4l2_h264_ref_pic_list0(&run->h264.spram->ref_pic_list0[i], i); 39262306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(run->h264.spram->ref_pic_list0); i++) 39362306a36Sopenharmony_ci trace_v4l2_h264_ref_pic_list1(&run->h264.spram->ref_pic_list1[i], i); 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_ci trace_v4l2_ctrl_h264_decode_params(run->h264.dpram); 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(run->h264.dpram->dpb); i++) 39862306a36Sopenharmony_ci trace_v4l2_h264_dpb_entry(&run->h264.dpram->dpb[i], i); 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ci trace_v4l2_ctrl_h264_pred_weights(run->h264.pwht); 40162306a36Sopenharmony_ci break; 40262306a36Sopenharmony_ci case VISL_CODEC_HEVC: 40362306a36Sopenharmony_ci trace_v4l2_ctrl_hevc_sps(run->hevc.sps); 40462306a36Sopenharmony_ci trace_v4l2_ctrl_hevc_pps(run->hevc.pps); 40562306a36Sopenharmony_ci trace_v4l2_ctrl_hevc_slice_params(run->hevc.spram); 40662306a36Sopenharmony_ci trace_v4l2_ctrl_hevc_scaling_matrix(run->hevc.sm); 40762306a36Sopenharmony_ci trace_v4l2_ctrl_hevc_decode_params(run->hevc.dpram); 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(run->hevc.dpram->dpb); i++) 41062306a36Sopenharmony_ci trace_v4l2_hevc_dpb_entry(&run->hevc.dpram->dpb[i]); 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_ci trace_v4l2_hevc_pred_weight_table(&run->hevc.spram->pred_weight_table); 41362306a36Sopenharmony_ci break; 41462306a36Sopenharmony_ci } 41562306a36Sopenharmony_ci} 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_civoid visl_device_run(void *priv) 41862306a36Sopenharmony_ci{ 41962306a36Sopenharmony_ci struct visl_ctx *ctx = priv; 42062306a36Sopenharmony_ci struct visl_run run = {}; 42162306a36Sopenharmony_ci struct media_request *src_req; 42262306a36Sopenharmony_ci 42362306a36Sopenharmony_ci run.src = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx); 42462306a36Sopenharmony_ci run.dst = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_ci /* Apply request(s) controls if needed. */ 42762306a36Sopenharmony_ci src_req = run.src->vb2_buf.req_obj.req; 42862306a36Sopenharmony_ci 42962306a36Sopenharmony_ci if (src_req) 43062306a36Sopenharmony_ci v4l2_ctrl_request_setup(src_req, &ctx->hdl); 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_ci v4l2_m2m_buf_copy_metadata(run.src, run.dst, true); 43362306a36Sopenharmony_ci run.dst->sequence = ctx->q_data[V4L2_M2M_DST].sequence++; 43462306a36Sopenharmony_ci run.src->sequence = ctx->q_data[V4L2_M2M_SRC].sequence++; 43562306a36Sopenharmony_ci run.dst->field = ctx->decoded_fmt.fmt.pix.field; 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_ci switch (ctx->current_codec) { 43862306a36Sopenharmony_ci default: 43962306a36Sopenharmony_ci case VISL_CODEC_NONE: 44062306a36Sopenharmony_ci break; 44162306a36Sopenharmony_ci case VISL_CODEC_FWHT: 44262306a36Sopenharmony_ci run.fwht.params = visl_find_control_data(ctx, V4L2_CID_STATELESS_FWHT_PARAMS); 44362306a36Sopenharmony_ci break; 44462306a36Sopenharmony_ci case VISL_CODEC_MPEG2: 44562306a36Sopenharmony_ci run.mpeg2.seq = visl_find_control_data(ctx, V4L2_CID_STATELESS_MPEG2_SEQUENCE); 44662306a36Sopenharmony_ci run.mpeg2.pic = visl_find_control_data(ctx, V4L2_CID_STATELESS_MPEG2_PICTURE); 44762306a36Sopenharmony_ci run.mpeg2.quant = visl_find_control_data(ctx, 44862306a36Sopenharmony_ci V4L2_CID_STATELESS_MPEG2_QUANTISATION); 44962306a36Sopenharmony_ci break; 45062306a36Sopenharmony_ci case VISL_CODEC_VP8: 45162306a36Sopenharmony_ci run.vp8.frame = visl_find_control_data(ctx, V4L2_CID_STATELESS_VP8_FRAME); 45262306a36Sopenharmony_ci break; 45362306a36Sopenharmony_ci case VISL_CODEC_VP9: 45462306a36Sopenharmony_ci run.vp9.frame = visl_find_control_data(ctx, V4L2_CID_STATELESS_VP9_FRAME); 45562306a36Sopenharmony_ci run.vp9.probs = visl_find_control_data(ctx, V4L2_CID_STATELESS_VP9_COMPRESSED_HDR); 45662306a36Sopenharmony_ci break; 45762306a36Sopenharmony_ci case VISL_CODEC_H264: 45862306a36Sopenharmony_ci run.h264.sps = visl_find_control_data(ctx, V4L2_CID_STATELESS_H264_SPS); 45962306a36Sopenharmony_ci run.h264.pps = visl_find_control_data(ctx, V4L2_CID_STATELESS_H264_PPS); 46062306a36Sopenharmony_ci run.h264.sm = visl_find_control_data(ctx, V4L2_CID_STATELESS_H264_SCALING_MATRIX); 46162306a36Sopenharmony_ci run.h264.spram = visl_find_control_data(ctx, V4L2_CID_STATELESS_H264_SLICE_PARAMS); 46262306a36Sopenharmony_ci run.h264.dpram = visl_find_control_data(ctx, V4L2_CID_STATELESS_H264_DECODE_PARAMS); 46362306a36Sopenharmony_ci run.h264.pwht = visl_find_control_data(ctx, V4L2_CID_STATELESS_H264_PRED_WEIGHTS); 46462306a36Sopenharmony_ci break; 46562306a36Sopenharmony_ci case VISL_CODEC_HEVC: 46662306a36Sopenharmony_ci run.hevc.sps = visl_find_control_data(ctx, V4L2_CID_STATELESS_HEVC_SPS); 46762306a36Sopenharmony_ci run.hevc.pps = visl_find_control_data(ctx, V4L2_CID_STATELESS_HEVC_PPS); 46862306a36Sopenharmony_ci run.hevc.spram = visl_find_control_data(ctx, V4L2_CID_STATELESS_HEVC_SLICE_PARAMS); 46962306a36Sopenharmony_ci run.hevc.sm = visl_find_control_data(ctx, V4L2_CID_STATELESS_HEVC_SCALING_MATRIX); 47062306a36Sopenharmony_ci run.hevc.dpram = visl_find_control_data(ctx, V4L2_CID_STATELESS_HEVC_DECODE_PARAMS); 47162306a36Sopenharmony_ci break; 47262306a36Sopenharmony_ci } 47362306a36Sopenharmony_ci 47462306a36Sopenharmony_ci frame_dprintk(ctx->dev, run.dst->sequence, 47562306a36Sopenharmony_ci "Got OUTPUT buffer sequence %d, timestamp %llu\n", 47662306a36Sopenharmony_ci run.src->sequence, run.src->vb2_buf.timestamp); 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ci frame_dprintk(ctx->dev, run.dst->sequence, 47962306a36Sopenharmony_ci "Got CAPTURE buffer sequence %d, timestamp %llu\n", 48062306a36Sopenharmony_ci run.dst->sequence, run.dst->vb2_buf.timestamp); 48162306a36Sopenharmony_ci 48262306a36Sopenharmony_ci visl_tpg_fill(ctx, &run); 48362306a36Sopenharmony_ci visl_trace_ctrls(ctx, &run); 48462306a36Sopenharmony_ci 48562306a36Sopenharmony_ci if (bitstream_trace_frame_start > -1 && 48662306a36Sopenharmony_ci run.dst->sequence >= bitstream_trace_frame_start && 48762306a36Sopenharmony_ci run.dst->sequence < bitstream_trace_frame_start + bitstream_trace_nframes) 48862306a36Sopenharmony_ci visl_trace_bitstream(ctx, &run); 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_ci /* Complete request(s) controls if needed. */ 49162306a36Sopenharmony_ci if (src_req) 49262306a36Sopenharmony_ci v4l2_ctrl_request_complete(src_req, &ctx->hdl); 49362306a36Sopenharmony_ci 49462306a36Sopenharmony_ci if (visl_transtime_ms) 49562306a36Sopenharmony_ci usleep_range(visl_transtime_ms * 1000, 2 * visl_transtime_ms * 1000); 49662306a36Sopenharmony_ci 49762306a36Sopenharmony_ci v4l2_m2m_buf_done_and_job_finish(ctx->dev->m2m_dev, 49862306a36Sopenharmony_ci ctx->fh.m2m_ctx, VB2_BUF_STATE_DONE); 49962306a36Sopenharmony_ci} 500