Jelajahi Sumber

Merge "video: driver: print error message from FW"

qctecmdr 4 tahun lalu
induk
melakukan
ad18bb5c23

+ 0 - 4
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));

+ 5 - 0
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)

+ 46 - 0
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;

+ 24 - 0
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;
 }