mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-04 20:19:47 +08:00 
			
		
		
		
	[media] coda: Add tracing support
This patch adds tracepoints to the coda driver that can be used together
with the v4l2:v4l2_qbuf and v4l2:v4l2_dqbuf tracepoints to to follow video
frames through the mem2mem device.
For encoding with the BIT processor:
    coda:coda_enc_pic_run
    coda:coda_enc_pic_done
For decoding with the BIT processor:
    coda:coda_bit_queue
    coda:coda_dec_pic_run
    coda:coda_dec_pic_done
    coda:coda_dec_rot_done
Additionally, two low level tracepoints register whenever the BIT processor
is started and returns:
    coda:coda_bit_run
    coda:coda_bit_done
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: Kamil Debski <k.debski@samsung.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
			
			
This commit is contained in:
		
							parent
							
								
									8191919bff
								
							
						
					
					
						commit
						9a1a8f9953
					
				| @ -1,3 +1,5 @@ | ||||
| ccflags-y += -I$(src) | ||||
| 
 | ||||
| coda-objs := coda-common.o coda-bit.o coda-h264.o coda-jpeg.o | ||||
| 
 | ||||
| obj-$(CONFIG_VIDEO_CODA) += coda.o | ||||
|  | ||||
| @ -30,6 +30,8 @@ | ||||
| #include <media/videobuf2-vmalloc.h> | ||||
| 
 | ||||
| #include "coda.h" | ||||
| #define CREATE_TRACE_POINTS | ||||
| #include "trace.h" | ||||
| 
 | ||||
| #define CODA_PARA_BUF_SIZE	(10 * 1024) | ||||
| #define CODA7_PS_BUF_SIZE	0x28000 | ||||
| @ -88,15 +90,21 @@ static void coda_command_async(struct coda_ctx *ctx, int cmd) | ||||
| 	coda_write(dev, ctx->params.codec_mode, CODA_REG_BIT_RUN_COD_STD); | ||||
| 	coda_write(dev, ctx->params.codec_mode_aux, CODA7_REG_BIT_RUN_AUX_STD); | ||||
| 
 | ||||
| 	trace_coda_bit_run(ctx, cmd); | ||||
| 
 | ||||
| 	coda_write(dev, cmd, CODA_REG_BIT_RUN_COMMAND); | ||||
| } | ||||
| 
 | ||||
| static int coda_command_sync(struct coda_ctx *ctx, int cmd) | ||||
| { | ||||
| 	struct coda_dev *dev = ctx->dev; | ||||
| 	int ret; | ||||
| 
 | ||||
| 	coda_command_async(ctx, cmd); | ||||
| 	return coda_wait_timeout(dev); | ||||
| 	ret = coda_wait_timeout(dev); | ||||
| 	trace_coda_bit_done(ctx); | ||||
| 
 | ||||
| 	return ret; | ||||
| } | ||||
| 
 | ||||
| int coda_hw_reset(struct coda_ctx *ctx) | ||||
| @ -265,6 +273,8 @@ void coda_fill_bitstream(struct coda_ctx *ctx, bool streaming) | ||||
| 					    ctx->bitstream_fifo.kfifo.mask; | ||||
| 				list_add_tail(&meta->list, | ||||
| 					      &ctx->buffer_meta_list); | ||||
| 
 | ||||
| 				trace_coda_bit_queue(ctx, src_buf, meta); | ||||
| 			} | ||||
| 
 | ||||
| 			v4l2_m2m_buf_done(src_buf, VB2_BUF_STATE_DONE); | ||||
| @ -1240,6 +1250,8 @@ static int coda_prepare_encode(struct coda_ctx *ctx) | ||||
| 		coda_write(dev, ctx->iram_info.axi_sram_use, | ||||
| 				CODA7_REG_BIT_AXI_SRAM_USE); | ||||
| 
 | ||||
| 	trace_coda_enc_pic_run(ctx, src_buf); | ||||
| 
 | ||||
| 	coda_command_async(ctx, CODA_COMMAND_PIC_RUN); | ||||
| 
 | ||||
| 	return 0; | ||||
| @ -1254,6 +1266,8 @@ static void coda_finish_encode(struct coda_ctx *ctx) | ||||
| 	src_buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx); | ||||
| 	dst_buf = v4l2_m2m_next_dst_buf(ctx->fh.m2m_ctx); | ||||
| 
 | ||||
| 	trace_coda_enc_pic_done(ctx, dst_buf); | ||||
| 
 | ||||
| 	/* Get results from the coda */ | ||||
| 	start_ptr = coda_read(dev, CODA_CMD_ENC_PIC_BB_START); | ||||
| 	wr_ptr = coda_read(dev, CODA_REG_BIT_WR_PTR(ctx->reg_idx)); | ||||
| @ -1743,6 +1757,8 @@ static int coda_prepare_decode(struct coda_ctx *ctx) | ||||
| 	/* Clear decode success flag */ | ||||
| 	coda_write(dev, 0, CODA_RET_DEC_PIC_SUCCESS); | ||||
| 
 | ||||
| 	trace_coda_dec_pic_run(ctx, meta); | ||||
| 
 | ||||
| 	coda_command_async(ctx, CODA_COMMAND_PIC_RUN); | ||||
| 
 | ||||
| 	return 0; | ||||
| @ -1903,6 +1919,8 @@ static void coda_finish_decode(struct coda_ctx *ctx) | ||||
| 		} | ||||
| 		mutex_unlock(&ctx->bitstream_mutex); | ||||
| 
 | ||||
| 		trace_coda_dec_pic_done(ctx, &ctx->frame_metas[decoded_idx]); | ||||
| 
 | ||||
| 		val = coda_read(dev, CODA_RET_DEC_PIC_TYPE) & 0x7; | ||||
| 		if (val == 0) | ||||
| 			ctx->frame_types[decoded_idx] = V4L2_BUF_FLAG_KEYFRAME; | ||||
| @ -1942,6 +1960,8 @@ static void coda_finish_decode(struct coda_ctx *ctx) | ||||
| 		dst_buf->v4l2_buf.timecode = meta->timecode; | ||||
| 		dst_buf->v4l2_buf.timestamp = meta->timestamp; | ||||
| 
 | ||||
| 		trace_coda_dec_rot_done(ctx, meta, dst_buf); | ||||
| 
 | ||||
| 		switch (q_data_dst->fourcc) { | ||||
| 		case V4L2_PIX_FMT_YUV420: | ||||
| 		case V4L2_PIX_FMT_YVU420: | ||||
| @ -2000,6 +2020,8 @@ irqreturn_t coda_irq_handler(int irq, void *data) | ||||
| 		return IRQ_HANDLED; | ||||
| 	} | ||||
| 
 | ||||
| 	trace_coda_bit_done(ctx); | ||||
| 
 | ||||
| 	if (ctx->aborting) { | ||||
| 		v4l2_dbg(1, coda_debug, &ctx->dev->v4l2_dev, | ||||
| 			 "task has been aborted\n"); | ||||
|  | ||||
| @ -13,6 +13,7 @@ | ||||
| #include <linux/swab.h> | ||||
| 
 | ||||
| #include "coda.h" | ||||
| #include "trace.h" | ||||
| 
 | ||||
| #define SOI_MARKER	0xffd8 | ||||
| #define EOI_MARKER	0xffd9 | ||||
|  | ||||
| @ -12,6 +12,9 @@ | ||||
|  * (at your option) any later version. | ||||
|  */ | ||||
| 
 | ||||
| #ifndef __CODA_H__ | ||||
| #define __CODA_H__ | ||||
| 
 | ||||
| #include <linux/debugfs.h> | ||||
| #include <linux/irqreturn.h> | ||||
| #include <linux/mutex.h> | ||||
| @ -294,3 +297,5 @@ extern const struct coda_context_ops coda_bit_encode_ops; | ||||
| extern const struct coda_context_ops coda_bit_decode_ops; | ||||
| 
 | ||||
| irqreturn_t coda_irq_handler(int irq, void *data); | ||||
| 
 | ||||
| #endif /* __CODA_H__ */ | ||||
|  | ||||
							
								
								
									
										203
									
								
								drivers/media/platform/coda/trace.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										203
									
								
								drivers/media/platform/coda/trace.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,203 @@ | ||||
| #undef TRACE_SYSTEM | ||||
| #define TRACE_SYSTEM coda | ||||
| 
 | ||||
| #if !defined(__CODA_TRACE_H__) || defined(TRACE_HEADER_MULTI_READ) | ||||
| #define __CODA_TRACE_H__ | ||||
| 
 | ||||
| #include <linux/tracepoint.h> | ||||
| #include <media/videobuf2-core.h> | ||||
| 
 | ||||
| #include "coda.h" | ||||
| 
 | ||||
| #define TRACE_SYSTEM_STRING __stringify(TRACE_SYSTEM) | ||||
| 
 | ||||
| TRACE_EVENT(coda_bit_run, | ||||
| 	TP_PROTO(struct coda_ctx *ctx, int cmd), | ||||
| 
 | ||||
| 	TP_ARGS(ctx, cmd), | ||||
| 
 | ||||
| 	TP_STRUCT__entry( | ||||
| 		__field(int, minor) | ||||
| 		__field(int, ctx) | ||||
| 		__field(int, cmd) | ||||
| 	), | ||||
| 
 | ||||
| 	TP_fast_assign( | ||||
| 		__entry->minor = ctx->fh.vdev->minor; | ||||
| 		__entry->ctx = ctx->idx; | ||||
| 		__entry->cmd = cmd; | ||||
| 	), | ||||
| 
 | ||||
| 	TP_printk("minor = %d, ctx = %d, cmd = %d", | ||||
| 		  __entry->minor, __entry->ctx, __entry->cmd) | ||||
| ); | ||||
| 
 | ||||
| TRACE_EVENT(coda_bit_done, | ||||
| 	TP_PROTO(struct coda_ctx *ctx), | ||||
| 
 | ||||
| 	TP_ARGS(ctx), | ||||
| 
 | ||||
| 	TP_STRUCT__entry( | ||||
| 		__field(int, minor) | ||||
| 		__field(int, ctx) | ||||
| 	), | ||||
| 
 | ||||
| 	TP_fast_assign( | ||||
| 		__entry->minor = ctx->fh.vdev->minor; | ||||
| 		__entry->ctx = ctx->idx; | ||||
| 	), | ||||
| 
 | ||||
| 	TP_printk("minor = %d, ctx = %d", __entry->minor, __entry->ctx) | ||||
| ); | ||||
| 
 | ||||
| TRACE_EVENT(coda_enc_pic_run, | ||||
| 	TP_PROTO(struct coda_ctx *ctx, struct vb2_buffer *buf), | ||||
| 
 | ||||
| 	TP_ARGS(ctx, buf), | ||||
| 
 | ||||
| 	TP_STRUCT__entry( | ||||
| 		__field(int, minor) | ||||
| 		__field(int, index) | ||||
| 		__field(int, ctx) | ||||
| 	), | ||||
| 
 | ||||
| 	TP_fast_assign( | ||||
| 		__entry->minor = ctx->fh.vdev->minor; | ||||
| 		__entry->index = buf->v4l2_buf.index; | ||||
| 		__entry->ctx = ctx->idx; | ||||
| 	), | ||||
| 
 | ||||
| 	TP_printk("minor = %d, index = %d, ctx = %d", | ||||
| 		  __entry->minor, __entry->index, __entry->ctx) | ||||
| ); | ||||
| 
 | ||||
| TRACE_EVENT(coda_enc_pic_done, | ||||
| 	TP_PROTO(struct coda_ctx *ctx, struct vb2_buffer *buf), | ||||
| 
 | ||||
| 	TP_ARGS(ctx, buf), | ||||
| 
 | ||||
| 	TP_STRUCT__entry( | ||||
| 		__field(int, minor) | ||||
| 		__field(int, index) | ||||
| 		__field(int, ctx) | ||||
| 	), | ||||
| 
 | ||||
| 	TP_fast_assign( | ||||
| 		__entry->minor = ctx->fh.vdev->minor; | ||||
| 		__entry->index = buf->v4l2_buf.index; | ||||
| 		__entry->ctx = ctx->idx; | ||||
| 	), | ||||
| 
 | ||||
| 	TP_printk("minor = %d, index = %d, ctx = %d", | ||||
| 		  __entry->minor, __entry->index, __entry->ctx) | ||||
| ); | ||||
| 
 | ||||
| TRACE_EVENT(coda_bit_queue, | ||||
| 	TP_PROTO(struct coda_ctx *ctx, struct vb2_buffer *buf, | ||||
| 		 struct coda_buffer_meta *meta), | ||||
| 
 | ||||
| 	TP_ARGS(ctx, buf, meta), | ||||
| 
 | ||||
| 	TP_STRUCT__entry( | ||||
| 		__field(int, minor) | ||||
| 		__field(int, index) | ||||
| 		__field(int, start) | ||||
| 		__field(int, end) | ||||
| 		__field(int, ctx) | ||||
| 	), | ||||
| 
 | ||||
| 	TP_fast_assign( | ||||
| 		__entry->minor = ctx->fh.vdev->minor; | ||||
| 		__entry->index = buf->v4l2_buf.index; | ||||
| 		__entry->start = meta->start; | ||||
| 		__entry->end = meta->end; | ||||
| 		__entry->ctx = ctx->idx; | ||||
| 	), | ||||
| 
 | ||||
| 	TP_printk("minor = %d, index = %d, start = 0x%x, end = 0x%x, ctx = %d", | ||||
| 		  __entry->minor, __entry->index, __entry->start, __entry->end, | ||||
| 		  __entry->ctx) | ||||
| ); | ||||
| 
 | ||||
| TRACE_EVENT(coda_dec_pic_run, | ||||
| 	TP_PROTO(struct coda_ctx *ctx, struct coda_buffer_meta *meta), | ||||
| 
 | ||||
| 	TP_ARGS(ctx, meta), | ||||
| 
 | ||||
| 	TP_STRUCT__entry( | ||||
| 		__field(int, minor) | ||||
| 		__field(int, start) | ||||
| 		__field(int, end) | ||||
| 		__field(int, ctx) | ||||
| 	), | ||||
| 
 | ||||
| 	TP_fast_assign( | ||||
| 		__entry->minor = ctx->fh.vdev->minor; | ||||
| 		__entry->start = meta ? meta->start : 0; | ||||
| 		__entry->end = meta ? meta->end : 0; | ||||
| 		__entry->ctx = ctx->idx; | ||||
| 	), | ||||
| 
 | ||||
| 	TP_printk("minor = %d, start = 0x%x, end = 0x%x, ctx = %d", | ||||
| 		  __entry->minor, __entry->start, __entry->end, __entry->ctx) | ||||
| ); | ||||
| 
 | ||||
| TRACE_EVENT(coda_dec_pic_done, | ||||
| 	TP_PROTO(struct coda_ctx *ctx, struct coda_buffer_meta *meta), | ||||
| 
 | ||||
| 	TP_ARGS(ctx, meta), | ||||
| 
 | ||||
| 	TP_STRUCT__entry( | ||||
| 		__field(int, minor) | ||||
| 		__field(int, start) | ||||
| 		__field(int, end) | ||||
| 		__field(int, ctx) | ||||
| 	), | ||||
| 
 | ||||
| 	TP_fast_assign( | ||||
| 		__entry->minor = ctx->fh.vdev->minor; | ||||
| 		__entry->start = meta->start; | ||||
| 		__entry->end = meta->end; | ||||
| 		__entry->ctx = ctx->idx; | ||||
| 	), | ||||
| 
 | ||||
| 	TP_printk("minor = %d, start = 0x%x, end = 0x%x, ctx = %d", | ||||
| 		  __entry->minor, __entry->start, __entry->end, __entry->ctx) | ||||
| ); | ||||
| 
 | ||||
| TRACE_EVENT(coda_dec_rot_done, | ||||
| 	TP_PROTO(struct coda_ctx *ctx, struct coda_buffer_meta *meta, | ||||
| 		 struct vb2_buffer *buf), | ||||
| 
 | ||||
| 	TP_ARGS(ctx, meta, buf), | ||||
| 
 | ||||
| 	TP_STRUCT__entry( | ||||
| 		__field(int, minor) | ||||
| 		__field(int, start) | ||||
| 		__field(int, end) | ||||
| 		__field(int, index) | ||||
| 		__field(int, ctx) | ||||
| 	), | ||||
| 
 | ||||
| 	TP_fast_assign( | ||||
| 		__entry->minor = ctx->fh.vdev->minor; | ||||
| 		__entry->start = meta->start; | ||||
| 		__entry->end = meta->end; | ||||
| 		__entry->index = buf->v4l2_buf.index; | ||||
| 		__entry->ctx = ctx->idx; | ||||
| 	), | ||||
| 
 | ||||
| 	TP_printk("minor = %d, start = 0x%x, end = 0x%x, index = %d, ctx = %d", | ||||
| 		  __entry->minor, __entry->start, __entry->end, __entry->index, | ||||
| 		  __entry->ctx) | ||||
| ); | ||||
| 
 | ||||
| #endif /* __CODA_TRACE_H__ */ | ||||
| 
 | ||||
| #undef TRACE_INCLUDE_PATH | ||||
| #define TRACE_INCLUDE_PATH . | ||||
| #undef TRACE_INCLUDE_FILE | ||||
| #define TRACE_INCLUDE_FILE trace | ||||
| 
 | ||||
| /* This part must be outside protection */ | ||||
| #include <trace/define_trace.h> | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Philipp Zabel
						Philipp Zabel