Browse Source

video: driver: add release done flag support

update hfi command header file to include
release done flag and related hfi buffer flag
changes. add functionality to release and
unmap buffer if this flag is sent by fw.

Change-Id: I03fdd7776fcd6ac5e8a147c7dff2dfb6a15250e9
Signed-off-by: Darshana Patil <[email protected]>
Darshana Patil 4 years ago
parent
commit
03bda80d9e

+ 9 - 8
driver/vidc/inc/hfi_command.h

@@ -103,17 +103,18 @@ enum hfi_buffer_type {
 };
 
 enum hfi_buffer_host_flags {
-	HFI_BUF_HOST_FLAG_NONE         = 0x00000000,
-	HFI_BUF_HOST_FLAG_RELEASE      = 0x00000001,
-	HFI_BUF_HOST_FLAG_READONLY     = 0x00000002,
-	HFI_BUF_HOST_FLAG_CODEC_CONFIG = 0x00000004,
+	HFI_BUF_HOST_FLAG_NONE               = 0x00000000,
+	HFI_BUF_HOST_FLAG_RELEASE            = 0x00000001,
+	HFI_BUF_HOST_FLAG_READONLY           = 0x00000010,
+	HFI_BUF_HOST_FLAG_CODEC_CONFIG       = 0x00000100,
 };
 
 enum hfi_buffer_firmware_flags {
-	HFI_BUF_FW_FLAG_NONE         = 0x00000000,
-	HFI_BUF_FW_FLAG_LAST         = 0x00000001,
-	HFI_BUF_FW_FLAG_READONLY     = 0x00000002,
-	HFI_BUF_FW_FLAG_CODEC_CONFIG = 0x00000004,
+	HFI_BUF_FW_FLAG_NONE            = 0x00000000,
+	HFI_BUF_FW_FLAG_RELEASE_DONE    = 0x00000001,
+	HFI_BUF_FW_FLAG_READONLY        = 0x00000010,
+	HFI_BUF_FW_FLAG_CODEC_CONFIG    = 0x00000100,
+	HFI_BUF_FW_FLAG_LAST            = 0x10000000,
 };
 
 enum hfi_metapayload_header_flags {

+ 3 - 1
driver/vidc/inc/hfi_packet.h

@@ -16,8 +16,10 @@ u32 get_hfi_port(struct msm_vidc_inst *inst,
 	enum msm_vidc_port_type port);
 u32 get_hfi_port_from_buffer_type(struct msm_vidc_inst *inst,
 	enum msm_vidc_buffer_type buffer_type);
-u32 get_hfi_buffer_type(enum msm_vidc_domain_type domain,
+u32 hfi_buf_type_from_driver(enum msm_vidc_domain_type domain,
 	enum msm_vidc_buffer_type buffer_type);
+u32 hfi_buf_type_to_driver(enum msm_vidc_domain_type domain,
+	enum hfi_buffer_type buffer_type, enum hfi_packet_port_type port_type);
 u32 get_hfi_codec(struct msm_vidc_inst *inst);
 u32 get_hfi_colorformat(struct msm_vidc_inst *inst,
 	enum msm_vidc_colorformat_type colorformat);

+ 48 - 2
driver/vidc/src/hfi_packet.c

@@ -113,7 +113,7 @@ u32 get_hfi_port_from_buffer_type(struct msm_vidc_inst *inst,
 	return hfi_port;
 }
 
-u32 get_hfi_buffer_type(enum msm_vidc_domain_type domain,
+u32 hfi_buf_type_from_driver(enum msm_vidc_domain_type domain,
 	enum msm_vidc_buffer_type buffer_type)
 {
 	switch (buffer_type) {
@@ -151,6 +151,52 @@ u32 get_hfi_buffer_type(enum msm_vidc_domain_type domain,
 	}
 }
 
+u32 hfi_buf_type_to_driver(enum msm_vidc_domain_type domain,
+	enum hfi_buffer_type buffer_type, enum hfi_packet_port_type port_type)
+{
+	switch (buffer_type) {
+	case HFI_BUFFER_BITSTREAM:
+		if (domain == MSM_VIDC_DECODER)
+			return MSM_VIDC_BUF_INPUT;
+		else
+			return MSM_VIDC_BUF_OUTPUT;
+	case HFI_BUFFER_RAW:
+		if (domain == MSM_VIDC_DECODER)
+			return MSM_VIDC_BUF_OUTPUT;
+		else
+			return MSM_VIDC_BUF_INPUT;
+	case HFI_BUFFER_METADATA:
+		if (domain == MSM_VIDC_DECODER)
+			if (port_type == HFI_PORT_BITSTREAM)
+				return MSM_VIDC_BUF_INPUT_META;
+			else
+				return MSM_VIDC_BUF_OUTPUT_META;
+		else
+			if (port_type == HFI_PORT_BITSTREAM)
+				return MSM_VIDC_BUF_OUTPUT_META;
+			else
+				return MSM_VIDC_BUF_INPUT_META;
+	case HFI_BUFFER_BIN:
+		return MSM_VIDC_BUF_BIN;
+	case HFI_BUFFER_ARP:
+		return MSM_VIDC_BUF_ARP;
+	case HFI_BUFFER_COMV:
+		return MSM_VIDC_BUF_COMV;
+	case HFI_BUFFER_NON_COMV:
+		return MSM_VIDC_BUF_NON_COMV;
+	case HFI_BUFFER_LINE:
+		return MSM_VIDC_BUF_LINE;
+	case HFI_BUFFER_DPB:
+		return MSM_VIDC_BUF_DPB;
+	case HFI_BUFFER_PERSIST:
+		return MSM_VIDC_BUF_PERSIST;
+	default:
+		d_vpr_e("invalid buffer type %d\n",
+			buffer_type);
+		return 0;
+	}
+}
+
 u32 get_hfi_codec(struct msm_vidc_inst *inst)
 {
 	switch (inst->codec) {
@@ -244,7 +290,7 @@ int get_hfi_buffer(struct msm_vidc_inst *inst,
 	}
 
 	memset(buf, 0, sizeof(struct hfi_buffer));
-	buf->type = get_hfi_buffer_type(inst->domain, buffer->type);
+	buf->type = hfi_buf_type_from_driver(inst->domain, buffer->type);
 	buf->index = buffer->index;
 	buf->base_address = buffer->device_addr;
 	buf->addr_offset = 0;

+ 38 - 0
driver/vidc/src/venus_hfi_response.c

@@ -745,6 +745,7 @@ static int handle_dequeue_buffers(struct msm_vidc_inst* inst)
 	return rc;
 }
 
+/* todo: remove below funcs once fw supports rel done flag for internl buf*/
 static int handle_dpb_buffer(struct msm_vidc_inst *inst,
 	struct hfi_buffer *buffer)
 {
@@ -948,6 +949,41 @@ static int handle_arp_buffer(struct msm_vidc_inst *inst,
 	return rc;
 }
 
+static int handle_release_buffer(struct msm_vidc_inst *inst,
+	struct hfi_buffer *buffer, enum hfi_packet_port_type port_type)
+{
+	int rc = 0;
+	struct msm_vidc_buffers *buffers;
+	struct msm_vidc_buffer *buf;
+	bool found;
+
+	buffers = msm_vidc_get_buffers(inst, hfi_buf_type_to_driver(inst->domain,
+		buffer->type, port_type), __func__);
+	if (!buffers)
+		return -EINVAL;
+
+	found = false;
+	list_for_each_entry(buf, &buffers->list, list) {
+		if (buf->device_addr == buffer->base_address) {
+			found = true;
+			break;
+		}
+	}
+	if (!found) {
+		i_vpr_e(inst, "%s: invalid idx %d daddr %#x\n",
+			__func__, buffer->index, buffer->base_address);
+		return -EINVAL;
+	}
+	if (is_internal_buffer(buf->type))
+		rc = msm_vidc_destroy_internal_buffer(inst, buf);
+	else
+		rc = msm_vidc_put_driver_buf(inst, buf);
+	if (rc)
+		return rc;
+
+	return rc;
+}
+
 static int handle_session_buffer(struct msm_vidc_inst *inst,
 	struct hfi_packet *pkt)
 {
@@ -1006,6 +1042,8 @@ static int handle_session_buffer(struct msm_vidc_inst *inst,
 		msm_vidc_change_inst_state(inst, MSM_VIDC_ERROR, __func__);
 		return 0;
 	}
+	if (buffer->flags & HFI_BUF_FW_FLAG_RELEASE_DONE)
+		return handle_release_buffer(inst, buffer, pkt->port);
 
 	if (is_encode_session(inst)) {
 		if (pkt->port == HFI_PORT_RAW) {