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

Commit 7a3a08b2 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: cvp: buffer managerment optimization for Lahaina"

parents 209228f3 b55702b1
Loading
Loading
Loading
Loading
+4 −6
Original line number Diff line number Diff line
@@ -572,10 +572,9 @@ static int __init msm_cvp_init(void)
	}

	cvp_driver->msg_cache = KMEM_CACHE(cvp_session_msg, 0);
	cvp_driver->fence_data_cache = KMEM_CACHE(msm_cvp_fence_thread_data, 0);
	cvp_driver->frame_cache = KMEM_CACHE(msm_cvp_frame, 0);
	cvp_driver->frame_buf_cache = KMEM_CACHE(msm_cvp_frame_buf, 0);
	cvp_driver->internal_buf_cache = KMEM_CACHE(msm_cvp_internal_buffer, 0);
	cvp_driver->buf_cache = KMEM_CACHE(cvp_internal_buf, 0);
	cvp_driver->smem_cache = KMEM_CACHE(msm_cvp_smem, 0);

	rc = cvp_dsp_device_init();
	if (rc)
@@ -588,10 +587,9 @@ static void __exit msm_cvp_exit(void)
{
	cvp_dsp_device_exit();
	kmem_cache_destroy(cvp_driver->msg_cache);
	kmem_cache_destroy(cvp_driver->fence_data_cache);
	kmem_cache_destroy(cvp_driver->frame_cache);
	kmem_cache_destroy(cvp_driver->frame_buf_cache);
	kmem_cache_destroy(cvp_driver->internal_buf_cache);
	kmem_cache_destroy(cvp_driver->buf_cache);
	kmem_cache_destroy(cvp_driver->smem_cache);

	platform_driver_unregister(&msm_cvp_driver);
	debugfs_remove_recursive(cvp_driver->debugfs_root);
+12 −22
Original line number Diff line number Diff line
@@ -809,9 +809,7 @@ static int __smem_alloc(struct iris_hfi_device *dev, struct cvp_mem_addr *mem,
	}

	dprintk(CVP_INFO, "start to alloc size: %d, flags: %d\n", size, flags);
	rc = msm_cvp_smem_alloc(
		size, align, flags, 1, (void *)dev->res,
		MSM_CVP_UNKNOWN, alloc);
	rc = msm_cvp_smem_alloc(size, align, flags, 1, (void *)dev->res, alloc);
	if (rc) {
		dprintk(CVP_ERR, "Alloc failed\n");
		rc = -ENOMEM;
@@ -1512,7 +1510,7 @@ static int __interface_dsp_queues_init(struct iris_hfi_device *dev)
		dprintk(CVP_ERR, "%s: failed dma allocation\n", __func__);
		goto fail_dma_alloc;
	}
	cb = msm_cvp_smem_get_context_bank(MSM_CVP_UNKNOWN, 0, dev->res, 0);
	cb = msm_cvp_smem_get_context_bank(0, dev->res, 0);
	if (!cb) {
		dprintk(CVP_ERR,
			"%s: failed to get context bank\n", __func__);
@@ -1533,7 +1531,7 @@ static int __interface_dsp_queues_init(struct iris_hfi_device *dev)
	mem_data->device_addr = iova;
	mem_data->dma_handle = dma_handle;
	mem_data->size = q_size;
	mem_data->buffer_type = 0;
	mem_data->ion_flags = 0;
	mem_data->mapping_info.cb_info = cb;

	if (!is_iommu_present(dev->res))
@@ -1621,8 +1619,7 @@ static void __interface_queues_release(struct iris_hfi_device *device)
		}

		mem_map = (struct cvp_hfi_mem_map *)(qdss + 1);
		cb = msm_cvp_smem_get_context_bank(MSM_CVP_UNKNOWN,
			false, device->res, 0);
		cb = msm_cvp_smem_get_context_bank(false, device->res, 0);

		for (i = 0; cb && i < num_entries; i++) {
			iommu_unmap(cb->domain,
@@ -1846,8 +1843,7 @@ static int __interface_queues_init(struct iris_hfi_device *dev)
		qdss->mem_map_table_base_addr = mem_map_table_base_addr;

		mem_map = (struct cvp_hfi_mem_map *)(qdss + 1);
		cb = msm_cvp_smem_get_context_bank(MSM_CVP_UNKNOWN, false,
			dev->res, 0);
		cb = msm_cvp_smem_get_context_bank(false, dev->res, 0);
		if (!cb) {
			dprintk(CVP_ERR,
				"%s: failed to get context bank\n", __func__);
@@ -2344,15 +2340,14 @@ static int iris_hfi_session_abort(void *sess)
	return rc;
}

static int iris_hfi_session_set_buffers(void *sess,
				struct cvp_buffer_addr_info *buffer_info)
static int iris_hfi_session_set_buffers(void *sess, u32 iova, u32 size)
{
	struct cvp_hfi_cmd_session_set_buffers_packet pkt;
	int rc = 0;
	struct cvp_hal_session *session = sess;
	struct iris_hfi_device *device;

	if (!session || !session->device || !buffer_info) {
	if (!session || !session->device || !iova || !size) {
		dprintk(CVP_ERR, "Invalid Params\n");
		return -EINVAL;
	}
@@ -2366,13 +2361,12 @@ static int iris_hfi_session_set_buffers(void *sess,
	}

	rc = call_hfi_pkt_op(device, session_set_buffers,
			&pkt, session, buffer_info);
			&pkt, session, iova, size);
	if (rc) {
		dprintk(CVP_ERR, "set buffers: failed to create packet\n");
		goto err_create_pkt;
	}

	dprintk(CVP_DBG, "set buffers: %#x\n", buffer_info->buffer_type);
	if (__iface_cmdq_write(session->device, &pkt))
		rc = -ENOTEMPTY;

@@ -2381,15 +2375,14 @@ static int iris_hfi_session_set_buffers(void *sess,
	return rc;
}

static int iris_hfi_session_release_buffers(void *sess,
				struct cvp_buffer_addr_info *buffer_info)
static int iris_hfi_session_release_buffers(void *sess)
{
	struct cvp_session_release_buffers_packet pkt;
	int rc = 0;
	struct cvp_hal_session *session = sess;
	struct iris_hfi_device *device;

	if (!session || !session->device || !buffer_info) {
	if (!session || !session->device) {
		dprintk(CVP_ERR, "Invalid Params\n");
		return -EINVAL;
	}
@@ -2402,8 +2395,7 @@ static int iris_hfi_session_release_buffers(void *sess,
		goto err_create_pkt;
	}

	rc = call_hfi_pkt_op(device, session_release_buffers,
			&pkt, session, buffer_info);
	rc = call_hfi_pkt_op(device, session_release_buffers, &pkt, session);
	if (rc) {
		dprintk(CVP_ERR, "release buffers: failed to create packet\n");
		goto err_create_pkt;
@@ -2878,14 +2870,12 @@ static void **get_session_id(struct msm_cvp_cb_info *info)
	case HAL_SESSION_FD_CONFIG_CMD_DONE:
	case HAL_SESSION_MODEL_BUF_CMD_DONE:
	case HAL_SESSION_PROPERTY_INFO:
	case HAL_SESSION_EVENT_CHANGE:
		session_id = &info->response.cmd.session_id;
		break;
	case HAL_SESSION_ERROR:
		session_id = &info->response.data.session_id;
		break;
	case HAL_SESSION_EVENT_CHANGE:
		session_id = &info->response.event.session_id;
		break;
	case HAL_RESPONSE_UNUSED:
	default:
		session_id = NULL;
+4 −61
Original line number Diff line number Diff line
@@ -162,22 +162,6 @@ struct cvp_resource_hdr {
	void *resource_handle;
};

struct cvp_buffer_addr_info {
	enum hal_buffer buffer_type;
	u32 buffer_size;
	u32 num_buffers;
	u32 align_device_addr;
	u32 extradata_addr;
	u32 extradata_size;
	u32 response_required;
};

/* Needs to be exactly the same as hfi_buffer_info */
struct cvp_hal_buffer_info {
	u32 buffer_addr;
	u32 extra_data_addr;
};

struct cvp_hal_fw_info {
	char version[CVP_VERSION_LENGTH];
	phys_addr_t base_addr;
@@ -186,13 +170,6 @@ struct cvp_hal_fw_info {
	int irq;
};

enum hal_flush {
	HAL_FLUSH_INPUT,
	HAL_FLUSH_OUTPUT,
	HAL_FLUSH_ALL,
	HAL_UNUSED_FLUSH = 0x10000000,
};

enum hal_event_type {
	HAL_EVENT_SEQ_CHANGED_SUFFICIENT_RESOURCES,
	HAL_EVENT_SEQ_CHANGED_INSUFFICIENT_RESOURCES,
@@ -282,56 +259,24 @@ struct msm_cvp_cb_cmd_done {
	union {
		struct cvp_hfi_msg_session_hdr msg_hdr;
		struct cvp_resource_hdr resource_hdr;
		struct cvp_buffer_addr_info buffer_addr_info;
		struct cvp_hal_sys_init_done sys_init_done;
		struct cvp_hal_session_init_done session_init_done;
		struct cvp_hal_buffer_info buffer_info;
		enum hal_flush flush_type;
		u32 buffer_addr;
	} data;
};

struct cvp_hal_index_extradata_input_crop_payload {
	u32 size;
	u32 version;
	u32 port_index;
	u32 left;
	u32 top;
	u32 width;
	u32 height;
};

struct msm_cvp_cb_event {
	u32 device_id;
	void *session_id;
	enum cvp_status status;
	u32 height;
	u32 width;
	int bit_depth;
	u32 hal_event_type;
	u32 packet_buffer;
	u32 extra_data_buffer;
	u32 pic_struct;
	u32 colour_space;
	u32 profile;
	u32 level;
	u32 entropy_mode;
	u32 capture_buf_count;
	struct cvp_hal_index_extradata_input_crop_payload crop_data;
};

struct msm_cvp_cb_data_done {
	u32 device_id;
	void *session_id;
	enum cvp_status status;
	u32 size;
	u32 clnt_data;
	u32 client_data;
};

struct msm_cvp_cb_info {
	enum hal_command_response response_type;
	union {
		struct msm_cvp_cb_cmd_done cmd;
		struct msm_cvp_cb_event event;
		struct msm_cvp_cb_data_done data;
	} response;
};
@@ -393,10 +338,8 @@ struct cvp_hfi_device {
	int (*session_init)(void *device, void *session_id, void **new_session);
	int (*session_end)(void *session);
	int (*session_abort)(void *session);
	int (*session_set_buffers)(void *sess,
				struct cvp_buffer_addr_info *buffer_info);
	int (*session_release_buffers)(void *sess,
				struct cvp_buffer_addr_info *buffer_info);
	int (*session_set_buffers)(void *sess, u32 iova, u32 size);
	int (*session_release_buffers)(void *sess);
	int (*session_send)(void *sess,
		struct cvp_kmd_hfi_packet *in_pkt);
	int (*scale_clocks)(void *dev, u32 freq);
+1 −7
Original line number Diff line number Diff line
@@ -291,7 +291,7 @@ struct cvp_hfi_client {
} __packed;

struct cvp_hfi_buf_type {
	s32 fd;
	u32 iova;
	u32 size;
	u32 offset;
	u32 flags;
@@ -369,12 +369,6 @@ struct cvp_hfi_msg_session_op_cfg_packet {
	u32 op_conf_id;
} __packed;

struct cvp_hfi_msg_release_buffer_ref_event_packet {
	u32 packet_buffer;
	u32 extra_data_buffer;
	u32 output_tag;
};

struct cvp_hfi_msg_sys_init_done_packet {
	u32 size;
	u32 packet_type;
+8 −14
Original line number Diff line number Diff line
@@ -300,7 +300,8 @@ int cvp_create_pkt_cmd_sys_power_control(
int cvp_create_pkt_cmd_session_set_buffers(
		void *cmd,
		struct cvp_hal_session *session,
		struct cvp_buffer_addr_info *buffer_info)
		u32 iova,
		u32 size)
{
	int rc = 0;
	struct cvp_hfi_cmd_session_set_buffers_packet *pkt;
@@ -311,8 +312,8 @@ int cvp_create_pkt_cmd_session_set_buffers(
	pkt = (struct cvp_hfi_cmd_session_set_buffers_packet *)cmd;
	pkt->packet_type = HFI_CMD_SESSION_CVP_SET_BUFFERS;
	pkt->session_id = hash32_ptr(session);
	pkt->buf_type.fd = buffer_info->align_device_addr;
	pkt->buf_type.size = buffer_info->buffer_size;
	pkt->buf_type.iova = iova;
	pkt->buf_type.size = size;
	pkt->size = sizeof(struct cvp_hfi_cmd_session_set_buffers_packet);

	return rc;
@@ -320,8 +321,7 @@ int cvp_create_pkt_cmd_session_set_buffers(

int cvp_create_pkt_cmd_session_release_buffers(
		void *cmd,
		struct cvp_hal_session *session,
		struct cvp_buffer_addr_info *buffer_info)
		struct cvp_hal_session *session)
{
	struct cvp_session_release_buffers_packet *pkt;

@@ -331,16 +331,10 @@ int cvp_create_pkt_cmd_session_release_buffers(
	pkt = (struct cvp_session_release_buffers_packet *)cmd;
	pkt->packet_type = HFI_CMD_SESSION_CVP_RELEASE_BUFFERS;
	pkt->session_id = hash32_ptr(session);
	pkt->num_buffers = buffer_info->num_buffers;
	pkt->buffer_type = buffer_info->buffer_type;
	pkt->num_buffers = 1;
	pkt->buffer_type = 0;
	pkt->size = sizeof(struct cvp_session_release_buffers_packet) +
			((buffer_info->num_buffers - 1) * sizeof(u32));

	if (buffer_info->buffer_type == HAL_BUFFER_OUTPUT ||
		buffer_info->buffer_type == HAL_BUFFER_OUTPUT2) {
		dprintk(CVP_ERR, "%s: deprecated buffer_type\n", __func__);
		return -EINVAL;
	}
			((pkt->num_buffers - 1) * sizeof(u32));

	return 0;
}
Loading