Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e40bf359 authored by Shivendra Kakrania's avatar Shivendra Kakrania
Browse files

msm: vidc: Adding video noc error logging for kona



Added support to dump video noc error registers. When video hardware
hangs it can be due to incorrect noc transactions, these register
dumps will help in analyzing if video hardware hang is due to any noc
error.

Change-Id: Ia816c6ae0ba94508c80c419fafd7ddf99204ef1a
Signed-off-by: default avatarShivendra Kakrania <shiven@codeaurora.org>
parent b7d83333
Loading
Loading
Loading
Loading
+51 −8
Original line number Diff line number Diff line
@@ -109,6 +109,8 @@ static int reset_ahb2axi_bridge(struct venus_hfi_device *device);
static int __set_ubwc_config(struct venus_hfi_device *device);
static void power_off_common(struct venus_hfi_device *device);
static void power_off_iris2(struct venus_hfi_device *device);
static void noc_error_info_common(struct venus_hfi_device *device);
static void noc_error_info_iris2(struct venus_hfi_device *device);

struct venus_hfi_vpu_ops vpu4_ops = {
	.interrupt_init = interrupt_init_vpu4,
@@ -116,6 +118,7 @@ struct venus_hfi_vpu_ops vpu4_ops = {
	.clock_config_on_enable = NULL,
	.reset_ahb2axi_bridge = NULL,
	.power_off = power_off_common,
	.noc_error_info = noc_error_info_common,
};

struct venus_hfi_vpu_ops iris1_ops = {
@@ -124,6 +127,7 @@ struct venus_hfi_vpu_ops iris1_ops = {
	.clock_config_on_enable = clock_config_on_enable_iris1,
	.reset_ahb2axi_bridge = reset_ahb2axi_bridge,
	.power_off = power_off_common,
	.noc_error_info = noc_error_info_common,
};

struct venus_hfi_vpu_ops iris2_ops = {
@@ -132,6 +136,7 @@ struct venus_hfi_vpu_ops iris2_ops = {
	.clock_config_on_enable = NULL,
	.reset_ahb2axi_bridge = reset_ahb2axi_bridge,
	.power_off = power_off_iris2,
	.noc_error_info = noc_error_info_iris2,
};

/**
@@ -5024,10 +5029,54 @@ static void __noc_error_info(struct venus_hfi_device *device, u32 core_num)
	dprintk(VIDC_ERR, "CORE%d_NOC_ERR_ERRLOG3_HIGH: %#x\n", core_num, val);
}

static void noc_error_info_common(struct venus_hfi_device *device)
{
	const u32 core0 = 0, core1 = 1;

	if (__read_register(device, VCODEC_CORE0_VIDEO_NOC_BASE_OFFS +
			VCODEC_COREX_VIDEO_NOC_ERR_ERRVLD_LOW_OFFS))
		__noc_error_info(device, core0);

	if (__read_register(device, VCODEC_CORE1_VIDEO_NOC_BASE_OFFS +
			VCODEC_COREX_VIDEO_NOC_ERR_ERRVLD_LOW_OFFS))
		__noc_error_info(device, core1);
}

static void noc_error_info_iris2(struct venus_hfi_device *device)
{
	u32 val = 0;

	val = __read_register(device, VCODEC_NOC_ERL_MAIN_SWID_LOW);
	dprintk(VIDC_ERR, "VCODEC_NOC_ERL_MAIN_SWID_LOW:     %#x\n", val);
	val = __read_register(device, VCODEC_NOC_ERL_MAIN_SWID_HIGH);
	dprintk(VIDC_ERR, "VCODEC_NOC_ERL_MAIN_SWID_HIGH:     %#x\n", val);
	val = __read_register(device, VCODEC_NOC_ERL_MAIN_MAINCTL_LOW);
	dprintk(VIDC_ERR, "VCODEC_NOC_ERL_MAIN_MAINCTL_LOW:     %#x\n", val);
	val = __read_register(device, VCODEC_NOC_ERL_MAIN_ERRVLD_LOW);
	dprintk(VIDC_ERR, "VCODEC_NOC_ERL_MAIN_ERRVLD_LOW:     %#x\n", val);
	val = __read_register(device, VCODEC_NOC_ERL_MAIN_ERRCLR_LOW);
	dprintk(VIDC_ERR, "VCODEC_NOC_ERL_MAIN_ERRCLR_LOW:     %#x\n", val);
	val = __read_register(device, VCODEC_NOC_ERL_MAIN_ERRLOG0_LOW);
	dprintk(VIDC_ERR, "VCODEC_NOC_ERL_MAIN_ERRLOG0_LOW:     %#x\n", val);
	val = __read_register(device, VCODEC_NOC_ERL_MAIN_ERRLOG0_HIGH);
	dprintk(VIDC_ERR, "VCODEC_NOC_ERL_MAIN_ERRLOG0_HIGH:     %#x\n", val);
	val = __read_register(device, VCODEC_NOC_ERL_MAIN_ERRLOG1_LOW);
	dprintk(VIDC_ERR, "VCODEC_NOC_ERL_MAIN_ERRLOG1_LOW:     %#x\n", val);
	val = __read_register(device, VCODEC_NOC_ERL_MAIN_ERRLOG1_HIGH);
	dprintk(VIDC_ERR, "VCODEC_NOC_ERL_MAIN_ERRLOG1_HIGH:     %#x\n", val);
	val = __read_register(device, VCODEC_NOC_ERL_MAIN_ERRLOG2_LOW);
	dprintk(VIDC_ERR, "VCODEC_NOC_ERL_MAIN_ERRLOG2_LOW:     %#x\n", val);
	val = __read_register(device, VCODEC_NOC_ERL_MAIN_ERRLOG2_HIGH);
	dprintk(VIDC_ERR, "VCODEC_NOC_ERL_MAIN_ERRLOG2_HIGH:     %#x\n", val);
	val = __read_register(device, VCODEC_NOC_ERL_MAIN_ERRLOG3_LOW);
	dprintk(VIDC_ERR, "VCODEC_NOC_ERL_MAIN_ERRLOG3_LOW:     %#x\n", val);
	val = __read_register(device, VCODEC_NOC_ERL_MAIN_ERRLOG3_HIGH);
	dprintk(VIDC_ERR, "VCODEC_NOC_ERL_MAIN_ERRLOG3_HIGH:     %#x\n", val);
}

static int venus_hfi_noc_error_info(void *dev)
{
	struct venus_hfi_device *device;
	const u32 core0 = 0, core1 = 1;

	if (!dev) {
		dprintk(VIDC_ERR, "%s: null device\n", __func__);
@@ -5038,13 +5087,7 @@ static int venus_hfi_noc_error_info(void *dev)
	mutex_lock(&device->lock);
	dprintk(VIDC_ERR, "%s: non error information\n", __func__);

	if (__read_register(device, VCODEC_CORE0_VIDEO_NOC_BASE_OFFS +
			VCODEC_COREX_VIDEO_NOC_ERR_ERRVLD_LOW_OFFS))
		__noc_error_info(device, core0);

	if (__read_register(device, VCODEC_CORE1_VIDEO_NOC_BASE_OFFS +
			VCODEC_COREX_VIDEO_NOC_ERR_ERRVLD_LOW_OFFS))
		__noc_error_info(device, core1);
	call_venus_op(device, noc_error_info, device);

	mutex_unlock(&device->lock);

+1 −0
Original line number Diff line number Diff line
@@ -238,6 +238,7 @@ struct venus_hfi_vpu_ops {
	void (*clock_config_on_enable)(struct venus_hfi_device *device);
	int (*reset_ahb2axi_bridge)(struct venus_hfi_device *device);
	void (*power_off)(struct venus_hfi_device *device);
	void (*noc_error_info)(struct venus_hfi_device *device);
};

struct venus_hfi_device {
+21 −2
Original line number Diff line number Diff line
@@ -175,7 +175,7 @@

/*
 * --------------------------------------------------------------------------
 * MODULE: vcodec noc error log registers
 * MODULE: vcodec noc error log registers (iris1)
 * --------------------------------------------------------------------------
 */
#define VCODEC_CORE0_VIDEO_NOC_BASE_OFFS		0x00004000
@@ -197,5 +197,24 @@
#define VIDC_AON_WRAPPER_MVP_NOC_LPI_CONTROL	(VIDC_AON_BASE_OFFS)
#define VIDC_AON_WRAPPER_MVP_NOC_LPI_STATUS	(VIDC_AON_BASE_OFFS + 0x4)


/*
 * --------------------------------------------------------------------------
 * MODULE: vcodec noc error log registers (iris2)
 * --------------------------------------------------------------------------
 */
#define VCODEC_NOC_VIDEO_A_NOC_BASE_OFFS		0x00010000
#define VCODEC_NOC_ERL_MAIN_SWID_LOW			0x00011200
#define VCODEC_NOC_ERL_MAIN_SWID_HIGH			0x00011204
#define VCODEC_NOC_ERL_MAIN_MAINCTL_LOW			0x00011208
#define VCODEC_NOC_ERL_MAIN_ERRVLD_LOW			0x00011210
#define VCODEC_NOC_ERL_MAIN_ERRCLR_LOW			0x00011218
#define VCODEC_NOC_ERL_MAIN_ERRLOG0_LOW			0x00011220
#define VCODEC_NOC_ERL_MAIN_ERRLOG0_HIGH		0x00011224
#define VCODEC_NOC_ERL_MAIN_ERRLOG1_LOW			0x00011228
#define VCODEC_NOC_ERL_MAIN_ERRLOG1_HIGH		0x0001122C
#define VCODEC_NOC_ERL_MAIN_ERRLOG2_LOW			0x00011230
#define VCODEC_NOC_ERL_MAIN_ERRLOG2_HIGH		0x00011234
#define VCODEC_NOC_ERL_MAIN_ERRLOG3_LOW			0x00011238
#define VCODEC_NOC_ERL_MAIN_ERRLOG3_HIGH		0x0001123C
#
#endif