From 24de4a8b91daf5f201604c11b48e09a089d21483 Mon Sep 17 00:00:00 2001 From: Darshana Patil Date: Tue, 26 Jan 2021 14:22:11 -0800 Subject: [PATCH] video: driver: print error message from FW print error message from FW during system error Change-Id: Id27469d786b647d2b61e8090fa1f4337b8bc79f6 Signed-off-by: Darshana Patil --- driver/variant/iris2/src/msm_vidc_iris2.c | 4 -- driver/vidc/inc/msm_vidc_internal.h | 5 +++ driver/vidc/src/venus_hfi.c | 46 +++++++++++++++++++++++ driver/vidc/src/venus_hfi_response.c | 24 ++++++++++++ 4 files changed, 75 insertions(+), 4 deletions(-) diff --git a/driver/variant/iris2/src/msm_vidc_iris2.c b/driver/variant/iris2/src/msm_vidc_iris2.c index 166e706735..e90094495f 100644 --- a/driver/variant/iris2/src/msm_vidc_iris2.c +++ b/driver/variant/iris2/src/msm_vidc_iris2.c @@ -184,10 +184,6 @@ static int __setup_ucregion_memory_map_iris2(struct msm_vidc_core *vidc_core) __write_register(core, QTBL_ADDR_IRIS2, (u32)core->iface_q_table.align_device_addr); __write_register(core, QTBL_INFO_IRIS2, 0x01); - /* TODO: darshana, remove below comment later with FW support*/ - /*if (core->sfr.align_device_addr) - __write_register(core, SFR_ADDR_IRIS2, - (u32)core->sfr.align_device_addr);*/ /* update queues vaddr for debug purpose */ __write_register(core, CPU_CS_VCICMDARG0_IRIS2, (u32)((u64)core->iface_q_table.align_virtual_addr)); diff --git a/driver/vidc/inc/msm_vidc_internal.h b/driver/vidc/inc/msm_vidc_internal.h index 2dff93f28a..59ddc61136 100644 --- a/driver/vidc/inc/msm_vidc_internal.h +++ b/driver/vidc/inc/msm_vidc_internal.h @@ -731,6 +731,11 @@ struct msm_vidc_ssr { enum msm_vidc_ssr_trigger_type ssr_type; }; +struct msm_vidc_sfr { + u32 bufSize; + u8 rg_data[1]; +}; + #define call_mem_op(c, op, ...) \ (((c) && (c)->mem_ops && (c)->mem_ops->op) ? \ ((c)->mem_ops->op(__VA_ARGS__)) : 0) diff --git a/driver/vidc/src/venus_hfi.c b/driver/vidc/src/venus_hfi.c index 453e590afb..17cf71b0f9 100644 --- a/driver/vidc/src/venus_hfi.c +++ b/driver/vidc/src/venus_hfi.c @@ -2578,6 +2578,48 @@ static int __sys_init(struct msm_vidc_core *core) return 0; } +static int __queue_sfr_buffer(struct msm_vidc_core *core) +{ + int rc = 0; + struct hfi_buffer buf; + + memset(&buf, 0, sizeof(struct hfi_buffer)); + buf.type = HFI_BUFFER_SFR; + buf.index = 0; + buf.base_address = core->sfr.align_device_addr; + buf.addr_offset = 0; + buf.buffer_size = core->sfr.mem_size; + buf.data_offset = 0; + buf.data_size = 0; + buf.timestamp = 0; + buf.flags = 0; + + rc = hfi_create_header(core->packet, core->packet_size, + 0, core->header_id++); + if (rc) + return rc; + + rc = hfi_create_packet(core->packet, + core->packet_size, + HFI_CMD_BUFFER, + HFI_BUF_HOST_FLAG_NONE, + HFI_PAYLOAD_STRUCTURE, + HFI_PORT_NONE, + core->packet_id++, + &buf, + sizeof(buf)); + if (rc) + return rc; + + rc = __iface_cmdq_write(core, core->packet); + if (rc) + return rc; + + d_vpr_h("SFR buffer packet queued\n"); + + return rc; +} + static int __sys_image_version(struct msm_vidc_core *core) { int rc = 0; @@ -2640,6 +2682,10 @@ int venus_hfi_core_init(struct msm_vidc_core *core) if (rc) goto error; + rc = __queue_sfr_buffer(core); + if (rc) + goto error; + rc = __sys_image_version(core); if (rc) goto error; diff --git a/driver/vidc/src/venus_hfi_response.c b/driver/vidc/src/venus_hfi_response.c index 5f052cab7f..bdb07f878a 100644 --- a/driver/vidc/src/venus_hfi_response.c +++ b/driver/vidc/src/venus_hfi_response.c @@ -28,6 +28,29 @@ void print_psc_properties(u32 tag, const char *str, struct msm_vidc_inst *inst, subsc_params.tier); } +static void print_sfr_message(struct msm_vidc_core *core) +{ + struct msm_vidc_sfr *vsfr = NULL; + u32 vsfr_size = 0; + void *p = NULL; + + vsfr = (struct msm_vidc_sfr *)core->sfr.align_virtual_addr; + if (vsfr) { + if (vsfr->bufSize != core->sfr.mem_size) { + d_vpr_e("Invalid SFR buf size %d actual %d\n", + vsfr->bufSize, core->sfr.mem_size); + return; + } + vsfr_size = vsfr->bufSize - sizeof(u32); + p = memchr(vsfr->rg_data, '\0', vsfr_size); + /* SFR isn't guaranteed to be NULL terminated */ + if (p == NULL) + vsfr->rg_data[vsfr_size - 1] = '\0'; + + d_vpr_e("SFR Message from FW: %s\n", vsfr->rg_data); + } +} + u32 vidc_port_from_hfi(struct msm_vidc_inst *inst, enum hfi_packet_port_type hfi_port) { @@ -239,6 +262,7 @@ static int handle_system_error(struct msm_vidc_core *core, struct hfi_packet *pkt) { d_vpr_e("%s: system error received\n", __func__); + print_sfr_message(core); msm_vidc_core_deinit(core, true); return 0; }