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