Re: [PATCH v2 2/3] venus: Make debug infrastructure more flexible

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, 2020-05-21 at 16:28 +0300, Stanimir Varbanov wrote:
> Here we introduce few debug macros with levels (low, medium and
> high) and debug macro for firmware. Enabling the particular level
> will be done by dynamic debug.

I'd rather make the logging level facility generic in
dynamic debug than prefix all formats with what could
be non-specific content.

>From a long time ago:

https://groups.google.com/forum/#!msg/linux.kernel/VlWbno-ZAFw/k_fFadhNHXcJ

> For example to enable debug messages with low level:
> echo 'format "VENUSL" +p' > debugfs/dynamic_debug/control
> 
> If you want to enable all levels:
> echo 'format "VENUS" +p' > debugfs/dynamic_debug/control
> 
> All the features which dynamic debugging provide are preserved.
> 
> And finaly all dev_dbg are translated to VDBGX with appropriate
> debug levels.
> 
> Signed-off-by: Stanimir Varbanov <stanimir.varbanov@xxxxxxxxxx>
> ---
>  drivers/media/platform/qcom/venus/core.h      |  5 ++
>  drivers/media/platform/qcom/venus/helpers.c   |  2 +-
>  drivers/media/platform/qcom/venus/hfi_msgs.c  | 30 ++++-----
>  drivers/media/platform/qcom/venus/hfi_venus.c | 20 ++++--
>  .../media/platform/qcom/venus/pm_helpers.c    |  3 +-
>  drivers/media/platform/qcom/venus/vdec.c      | 63 +++++++++++++++++--
>  drivers/media/platform/qcom/venus/venc.c      |  4 ++
>  7 files changed, 96 insertions(+), 31 deletions(-)
> 
> diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h
> index b48782f9aa95..82438f19afba 100644
> --- a/drivers/media/platform/qcom/venus/core.h
> +++ b/drivers/media/platform/qcom/venus/core.h
> @@ -15,6 +15,11 @@
>  #include "dbgfs.h"
>  #include "hfi.h"
>  
> +#define VDBGL(fmt, args...)	pr_debug("VENUSL: " fmt, ##args)
> +#define VDBGM(fmt, args...)	pr_debug("VENUSM: " fmt, ##args)
> +#define VDBGH(fmt, args...)	pr_debug("VENUSH: " fmt, ##args)
> +#define VDBGFW(fmt, args...)	pr_debug("VENUSFW: " fmt, ##args)
> +
>  #define VIDC_CLKS_NUM_MAX		4
>  #define VIDC_VCODEC_CLKS_NUM_MAX	2
>  #define VIDC_PMDOMAINS_NUM_MAX		3
> diff --git a/drivers/media/platform/qcom/venus/helpers.c b/drivers/media/platform/qcom/venus/helpers.c
> index 0143af7822b2..115a9a2af1d6 100644
> --- a/drivers/media/platform/qcom/venus/helpers.c
> +++ b/drivers/media/platform/qcom/venus/helpers.c
> @@ -396,7 +396,7 @@ put_ts_metadata(struct venus_inst *inst, struct vb2_v4l2_buffer *vbuf)
>  	}
>  
>  	if (slot == -1) {
> -		dev_dbg(inst->core->dev, "%s: no free slot\n", __func__);
> +		VDBGH("no free slot for timestamp\n");
>  		return;
>  	}
>  
> diff --git a/drivers/media/platform/qcom/venus/hfi_msgs.c b/drivers/media/platform/qcom/venus/hfi_msgs.c
> index 279a9d6fe737..36986d402c96 100644
> --- a/drivers/media/platform/qcom/venus/hfi_msgs.c
> +++ b/drivers/media/platform/qcom/venus/hfi_msgs.c
> @@ -138,10 +138,9 @@ static void event_sys_error(struct venus_core *core, u32 event,
>  			    struct hfi_msg_event_notify_pkt *pkt)
>  {
>  	if (pkt)
> -		dev_dbg(core->dev,
> -			"sys error (session id:%x, data1:%x, data2:%x)\n",
> -			pkt->shdr.session_id, pkt->event_data1,
> -			pkt->event_data2);
> +		VDBGH("sys error (session id: %x, data1: %x, data2: %x)\n",
> +		      pkt->shdr.session_id, pkt->event_data1,
> +		      pkt->event_data2);
>  
>  	core->core_ops->event_notify(core, event);
>  }
> @@ -152,8 +151,8 @@ event_session_error(struct venus_core *core, struct venus_inst *inst,
>  {
>  	struct device *dev = core->dev;
>  
> -	dev_dbg(dev, "session error: event id:%x, session id:%x\n",
> -		pkt->event_data1, pkt->shdr.session_id);
> +	VDBGH("session error: event id: %x, session id: %x\n",
> +	      pkt->event_data1, pkt->shdr.session_id);
>  
>  	if (!inst)
>  		return;
> @@ -236,8 +235,7 @@ static void hfi_sys_init_done(struct venus_core *core, struct venus_inst *inst,
>  }
>  
>  static void
> -sys_get_prop_image_version(struct device *dev,
> -			   struct hfi_msg_sys_property_info_pkt *pkt)
> +sys_get_prop_image_version(struct hfi_msg_sys_property_info_pkt *pkt)
>  {
>  	int req_bytes;
>  
> @@ -247,26 +245,25 @@ sys_get_prop_image_version(struct device *dev,
>  		/* bad packet */
>  		return;
>  
> -	dev_dbg(dev, "F/W version: %s\n", (u8 *)&pkt->data[1]);
> +	VDBGL("F/W version: %s\n", (u8 *)&pkt->data[1]);
>  }
>  
>  static void hfi_sys_property_info(struct venus_core *core,
>  				  struct venus_inst *inst, void *packet)
>  {
>  	struct hfi_msg_sys_property_info_pkt *pkt = packet;
> -	struct device *dev = core->dev;
>  
>  	if (!pkt->num_properties) {
> -		dev_dbg(dev, "%s: no properties\n", __func__);
> +		VDBGM("no properties\n");
>  		return;
>  	}
>  
>  	switch (pkt->data[0]) {
>  	case HFI_PROPERTY_SYS_IMAGE_VERSION:
> -		sys_get_prop_image_version(dev, pkt);
> +		sys_get_prop_image_version(pkt);
>  		break;
>  	default:
> -		dev_dbg(dev, "%s: unknown property data\n", __func__);
> +		VDBGM("unknown property data\n");
>  		break;
>  	}
>  }
> @@ -297,7 +294,7 @@ static void hfi_sys_ping_done(struct venus_core *core, struct venus_inst *inst,
>  static void hfi_sys_idle_done(struct venus_core *core, struct venus_inst *inst,
>  			      void *packet)
>  {
> -	dev_dbg(core->dev, "sys idle\n");
> +	VDBGL("sys idle\n");
>  }
>  
>  static void hfi_sys_pc_prepare_done(struct venus_core *core,
> @@ -305,7 +302,7 @@ static void hfi_sys_pc_prepare_done(struct venus_core *core,
>  {
>  	struct hfi_msg_sys_pc_prep_done_pkt *pkt = packet;
>  
> -	dev_dbg(core->dev, "pc prepare done (error %x)\n", pkt->error_type);
> +	VDBGL("pc prepare done (error %x)\n", pkt->error_type);
>  }
>  
>  static unsigned int
> @@ -387,8 +384,7 @@ static void hfi_session_prop_info(struct venus_core *core,
>  	case HFI_PROPERTY_CONFIG_VDEC_ENTROPY:
>  		break;
>  	default:
> -		dev_dbg(dev, "%s: unknown property id:%x\n", __func__,
> -			pkt->data[0]);
> +		VDBGH("unknown property id: %x\n", pkt->data[0]);
>  		return;
>  	}
>  
> diff --git a/drivers/media/platform/qcom/venus/hfi_venus.c b/drivers/media/platform/qcom/venus/hfi_venus.c
> index 3a04b08ab85a..9aef62f9b59a 100644
> --- a/drivers/media/platform/qcom/venus/hfi_venus.c
> +++ b/drivers/media/platform/qcom/venus/hfi_venus.c
> @@ -467,7 +467,6 @@ static int venus_boot_core(struct venus_hfi_device *hdev)
>  
>  static u32 venus_hwversion(struct venus_hfi_device *hdev)
>  {
> -	struct device *dev = hdev->core->dev;
>  	u32 ver = venus_readl(hdev, WRAPPER_HW_VERSION);
>  	u32 major, minor, step;
>  
> @@ -477,7 +476,7 @@ static u32 venus_hwversion(struct venus_hfi_device *hdev)
>  	minor = minor >> WRAPPER_HW_VERSION_MINOR_VERSION_SHIFT;
>  	step = ver & WRAPPER_HW_VERSION_STEP_VERSION_MASK;
>  
> -	dev_dbg(dev, "venus hw version %x.%x.%x\n", major, minor, step);
> +	VDBGL("venus hw version %x.%x.%x\n", major, minor, step);
>  
>  	return major;
>  }
> @@ -897,7 +896,6 @@ static int venus_session_cmd(struct venus_inst *inst, u32 pkt_type)
>  
>  static void venus_flush_debug_queue(struct venus_hfi_device *hdev)
>  {
> -	struct device *dev = hdev->core->dev;
>  	void *packet = hdev->dbg_buf;
>  
>  	while (!venus_iface_dbgq_read(hdev, packet)) {
> @@ -906,7 +904,7 @@ static void venus_flush_debug_queue(struct venus_hfi_device *hdev)
>  		if (pkt->hdr.pkt_type != HFI_MSG_SYS_COV) {
>  			struct hfi_msg_sys_debug_pkt *pkt = packet;
>  
> -			dev_dbg(dev, "%s", pkt->msg_data);
> +			VDBGFW("%s", pkt->msg_data);
>  		}
>  	}
>  }
> @@ -1230,6 +1228,11 @@ static int venus_session_etb(struct venus_inst *inst,
>  		ret = -EINVAL;
>  	}
>  
> +	VDBGM("etb: %s: itag: %u, flen: %u, addr: %x\n",
> +	      session_type == VIDC_SESSION_TYPE_DEC ? "dec" : "enc",
> +	      in_frame->clnt_data, in_frame->filled_len,
> +	      in_frame->device_addr);
> +
>  	return ret;
>  }
>  
> @@ -1244,7 +1247,14 @@ static int venus_session_ftb(struct venus_inst *inst,
>  	if (ret)
>  		return ret;
>  
> -	return venus_iface_cmdq_write(hdev, &pkt);
> +	ret = venus_iface_cmdq_write(hdev, &pkt);
> +
> +	VDBGM("ftb: %s: otag: %u, flen: %u, addr: %x\n",
> +	      inst->session_type == VIDC_SESSION_TYPE_DEC ? "dec" : "enc",
> +	      out_frame->clnt_data, out_frame->filled_len,
> +	      out_frame->device_addr);
> +
> +	return ret;
>  }
>  
>  static int venus_session_set_buffers(struct venus_inst *inst,
> diff --git a/drivers/media/platform/qcom/venus/pm_helpers.c b/drivers/media/platform/qcom/venus/pm_helpers.c
> index abf93158857b..ec7394615ef8 100644
> --- a/drivers/media/platform/qcom/venus/pm_helpers.c
> +++ b/drivers/media/platform/qcom/venus/pm_helpers.c
> @@ -212,8 +212,7 @@ static int load_scale_bw(struct venus_core *core)
>  	}
>  	mutex_unlock(&core->lock);
>  
> -	dev_dbg(core->dev, "total: avg_bw: %u, peak_bw: %u\n",
> -		total_avg, total_peak);
> +	VDBGL("total: avg_bw: %u, peak_bw: %u\n", total_avg, total_peak);
>  
>  	return icc_set_bw(core->video_path, total_avg, total_peak);
>  }
> diff --git a/drivers/media/platform/qcom/venus/vdec.c b/drivers/media/platform/qcom/venus/vdec.c
> index 7c4c483d5438..7959e452fbf3 100644
> --- a/drivers/media/platform/qcom/venus/vdec.c
> +++ b/drivers/media/platform/qcom/venus/vdec.c
> @@ -225,7 +225,7 @@ static int vdec_check_src_change(struct venus_inst *inst)
>  
>  	if (!(inst->codec_state == VENUS_DEC_STATE_CAPTURE_SETUP) ||
>  	    !inst->reconfig)
> -		dev_dbg(inst->core->dev, "%s: wrong state\n", __func__);
> +		VDBGM("wrong codec state %u\n", inst->codec_state);
>  
>  done:
>  	return 0;
> @@ -790,6 +790,10 @@ static int vdec_queue_setup(struct vb2_queue *q,
>  	unsigned int in_num, out_num;
>  	int ret = 0;
>  
> +	VDBGM("vb2: queue_setup: %s: begin (codec_state: %u)\n",
> +	      V4L2_TYPE_IS_OUTPUT(q->type) ? "out" : "cap",
> +	      inst->codec_state);
> +
>  	if (*num_planes) {
>  		unsigned int output_buf_size = venus_helper_get_opb_size(inst);
>  
> @@ -859,6 +863,10 @@ static int vdec_queue_setup(struct vb2_queue *q,
>  		break;
>  	}
>  
> +	VDBGM("vb2: queue_setup: %s: end (codec_state: %u, ret: %d)\n",
> +	      V4L2_TYPE_IS_OUTPUT(q->type) ? "out" : "cap",
> +	      inst->codec_state, ret);
> +
>  	return ret;
>  
>  put_power:
> @@ -897,6 +905,8 @@ static int vdec_start_capture(struct venus_inst *inst)
>  {
>  	int ret;
>  
> +	VDBGM("on: cap: begin (codec_state: %u)\n", inst->codec_state);
> +
>  	if (!inst->streamon_out)
>  		return 0;
>  
> @@ -955,11 +965,16 @@ static int vdec_start_capture(struct venus_inst *inst)
>  	inst->sequence_cap = 0;
>  	inst->reconfig = false;
>  
> +	VDBGM("on: cap: end (codec_state: %u)\n", inst->codec_state);
> +
>  	return 0;
>  
>  free_dpb_bufs:
>  	venus_helper_free_dpb_bufs(inst);
>  err:
> +	VDBGM("on: cap: end (codec_state: %u, ret: %d)\n",
> +	      inst->codec_state, ret);
> +
>  	return ret;
>  }
>  
> @@ -967,6 +982,8 @@ static int vdec_start_output(struct venus_inst *inst)
>  {
>  	int ret;
>  
> +	VDBGM("on: out: begin (codec_state: %u)\n", inst->codec_state);
> +
>  	if (inst->codec_state == VENUS_DEC_STATE_SEEK) {
>  		ret = venus_helper_process_initial_out_bufs(inst);
>  		inst->codec_state = VENUS_DEC_STATE_DECODING;
> @@ -1015,6 +1032,10 @@ static int vdec_start_output(struct venus_inst *inst)
>  
>  done:
>  	inst->streamon_out = 1;
> +
> +	VDBGM("on: out: end (codec_state: %u, ret: %d)\n",
> +	      inst->codec_state, ret);
> +
>  	return ret;
>  }
>  
> @@ -1069,6 +1090,8 @@ static int vdec_stop_capture(struct venus_inst *inst)
>  {
>  	int ret = 0;
>  
> +	VDBGM("off: cap: begin (codec_state: %u)\n", inst->codec_state);
> +
>  	switch (inst->codec_state) {
>  	case VENUS_DEC_STATE_DECODING:
>  		ret = hfi_session_flush(inst, HFI_FLUSH_ALL, true);
> @@ -1090,6 +1113,9 @@ static int vdec_stop_capture(struct venus_inst *inst)
>  
>  	INIT_LIST_HEAD(&inst->registeredbufs);
>  
> +	VDBGM("off: cap: end (codec_state: %u, ret: %d)\n",
> +	      inst->codec_state, ret);
> +
>  	return ret;
>  }
>  
> @@ -1097,6 +1123,8 @@ static int vdec_stop_output(struct venus_inst *inst)
>  {
>  	int ret = 0;
>  
> +	VDBGM("off: out: begin (codec_state: %u)\n", inst->codec_state);
> +
>  	switch (inst->codec_state) {
>  	case VENUS_DEC_STATE_DECODING:
>  	case VENUS_DEC_STATE_DRAIN:
> @@ -1112,6 +1140,9 @@ static int vdec_stop_output(struct venus_inst *inst)
>  		break;
>  	}
>  
> +	VDBGM("off: out: end (codec_state: %u, ret %d)\n",
> +	      inst->codec_state, ret);
> +
>  	return ret;
>  }
>  
> @@ -1146,6 +1177,8 @@ static void vdec_session_release(struct venus_inst *inst)
>  	struct venus_core *core = inst->core;
>  	int ret, abort = 0;
>  
> +	VDBGM("rel: begin (codec_state: %u)\n", inst->codec_state);
> +
>  	vdec_pm_get(inst);
>  
>  	mutex_lock(&inst->lock);
> @@ -1175,15 +1208,23 @@ static void vdec_session_release(struct venus_inst *inst)
>  
>  	venus_pm_release_core(inst);
>  	vdec_pm_put(inst, false);
> +
> +	VDBGM("rel: end (codec_state: %u)\n", inst->codec_state);
>  }
>  
>  static int vdec_buf_init(struct vb2_buffer *vb)
>  {
>  	struct venus_inst *inst = vb2_get_drv_priv(vb->vb2_queue);
> +	int ret;
>  
>  	inst->buf_count++;
>  
> -	return venus_helper_vb2_buf_init(vb);
> +	ret = venus_helper_vb2_buf_init(vb);
> +
> +	VDBGM("vb2: buf_init: %s: done (codec_state: %u)\n",
> +	      V4L2_TYPE_IS_OUTPUT(vb->type) ? "out" : "cap", inst->codec_state);
> +
> +	return ret;
>  }
>  
>  static void vdec_buf_cleanup(struct vb2_buffer *vb)
> @@ -1193,6 +1234,9 @@ static void vdec_buf_cleanup(struct vb2_buffer *vb)
>  	inst->buf_count--;
>  	if (!inst->buf_count)
>  		vdec_session_release(inst);
> +
> +	VDBGM("vb2: buf_cleanup: %s: done (codec_state: %u)\n",
> +	      V4L2_TYPE_IS_OUTPUT(vb->type) ? "out" : "cap", inst->codec_state);
>  }
>  
>  static void vdec_vb2_buf_queue(struct vb2_buffer *vb)
> @@ -1281,6 +1325,10 @@ static void vdec_buf_done(struct venus_inst *inst, unsigned int buf_type,
>  	}
>  
>  	v4l2_m2m_buf_done(vbuf, state);
> +
> +	VDBGH("done: %s, idx: %02u, flen: %08u, flags: hfi: %08x, v4l2: %08x\n",
> +	      V4L2_TYPE_IS_OUTPUT(type) ? "out" : "cap",
> +	      vbuf->vb2_buf.index, bytesused, hfi_flags, vbuf->flags);
>  }
>  
>  static void vdec_event_change(struct venus_inst *inst,
> @@ -1289,7 +1337,6 @@ static void vdec_event_change(struct venus_inst *inst,
>  	static const struct v4l2_event ev = {
>  		.type = V4L2_EVENT_SOURCE_CHANGE,
>  		.u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION };
> -	struct device *dev = inst->core->dev_dec;
>  	struct v4l2_format format = {};
>  
>  	mutex_lock(&inst->lock);
> @@ -1310,8 +1357,12 @@ static void vdec_event_change(struct venus_inst *inst,
>  	if (inst->bit_depth != ev_data->bit_depth)
>  		inst->bit_depth = ev_data->bit_depth;
>  
> -	dev_dbg(dev, "event %s sufficient resources (%ux%u)\n",
> -		sufficient ? "" : "not", ev_data->width, ev_data->height);
> +	VDBGH("event: %s sufficient resources (%ux%u)\n",
> +	      sufficient ? "" : "not", ev_data->width, ev_data->height);
> +
> +	if (ev_data->buf_count)
> +		VDBGH("event: buf_count: %u, old: %u\n",
> +		      ev_data->buf_count, inst->num_output_bufs);
>  
>  	if (sufficient) {
>  		hfi_session_continue(inst);
> @@ -1344,7 +1395,7 @@ static void vdec_event_change(struct venus_inst *inst,
>  
>  		ret = hfi_session_flush(inst, HFI_FLUSH_OUTPUT, false);
>  		if (ret)
> -			dev_dbg(dev, "flush output error %d\n", ret);
> +			VDBGH("flush output error (%d)\n", ret);
>  	}
>  
>  	inst->reconfig = true;
> diff --git a/drivers/media/platform/qcom/venus/venc.c b/drivers/media/platform/qcom/venus/venc.c
> index feed648550d1..c591d00ee0a7 100644
> --- a/drivers/media/platform/qcom/venus/venc.c
> +++ b/drivers/media/platform/qcom/venus/venc.c
> @@ -1074,6 +1074,10 @@ static void venc_buf_done(struct venus_inst *inst, unsigned int buf_type,
>  	}
>  
>  	v4l2_m2m_buf_done(vbuf, VB2_BUF_STATE_DONE);
> +
> +	VDBGH("done: %s, idx: %02u, flen: %08u, flags: hfi: %08x, v4l2: %08x\n",
> +	      V4L2_TYPE_IS_OUTPUT(type) ? "out" : "cap",
> +	      vbuf->vb2_buf.index, bytesused, hfi_flags, vbuf->flags);
>  }
>  
>  static void venc_event_notify(struct venus_inst *inst, u32 event,




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux