From e0b0015079ec3c2726a236136272e10b3f15c16d Mon Sep 17 00:00:00 2001 From: Ruofei Ma Date: Wed, 8 Jan 2020 18:09:15 -0800 Subject: [PATCH] msm: cvp: remove version and deprecated functions Firmware version check is not needed in Lahaina. Remove it and deprecated functions. Change-Id: I4d3f8eaad1b4d49f762f534b8a7f76ddc32fa230 Signed-off-by: Ruofei Ma --- drivers/media/platform/msm/cvp/cvp_hfi.c | 57 +-- .../media/platform/msm/cvp/cvp_hfi_helper.h | 71 +--- .../platform/msm/cvp/hfi_packetization.c | 67 +--- drivers/media/platform/msm/cvp/msm_cvp.c | 324 ++++-------------- .../media/platform/msm/cvp/msm_cvp_internal.h | 22 +- 5 files changed, 105 insertions(+), 436 deletions(-) diff --git a/drivers/media/platform/msm/cvp/cvp_hfi.c b/drivers/media/platform/msm/cvp/cvp_hfi.c index b63a1cd7c486..1d5295d53d50 100644 --- a/drivers/media/platform/msm/cvp/cvp_hfi.c +++ b/drivers/media/platform/msm/cvp/cvp_hfi.c @@ -360,69 +360,31 @@ int get_hfi_version(void) unsigned int get_msg_size(void) { - unsigned int ver; - - ver = get_hfi_version(); - ver = (ver & HFI_VERSION_MINOR_MASK) >> HFI_VERSION_MINOR_SHIFT; - - if (ver < 1) - return sizeof(struct cvp_hfi_msg_session_hdr_d); - return sizeof(struct cvp_hfi_msg_session_hdr); } unsigned int get_msg_session_id(void *msg) { - unsigned int ver; struct cvp_hfi_msg_session_hdr *hdr = (struct cvp_hfi_msg_session_hdr *)msg; - ver = get_hfi_version(); - ver = (ver & HFI_VERSION_MINOR_MASK) >> HFI_VERSION_MINOR_SHIFT; - - if (ver < 1) { - struct cvp_hfi_msg_session_hdr_d *old_hdr = - (struct cvp_hfi_msg_session_hdr_d *)msg; - return old_hdr->session_id; - } return hdr->session_id; } unsigned int get_msg_errorcode(void *msg) { - unsigned int ver; struct cvp_hfi_msg_session_hdr *hdr = (struct cvp_hfi_msg_session_hdr *)msg; - ver = get_hfi_version(); - ver = (ver & HFI_VERSION_MINOR_MASK) >> HFI_VERSION_MINOR_SHIFT; - - if (ver < 1) { - struct cvp_hfi_msg_session_hdr_d *old_hdr = - (struct cvp_hfi_msg_session_hdr_d *)msg; - return old_hdr->error_type; - } return hdr->error_type; } int get_msg_opconfigs(void *msg, unsigned int *session_id, unsigned int *error_type, unsigned int *config_id) { - unsigned int ver; struct cvp_hfi_msg_session_op_cfg_packet *cfg = (struct cvp_hfi_msg_session_op_cfg_packet *)msg; - ver = get_hfi_version(); - ver = (ver & HFI_VERSION_MINOR_MASK) >> HFI_VERSION_MINOR_SHIFT; - - if (ver < 1) { - struct cvp_hfi_msg_session_op_cfg_packet_d *old_cfg - = (struct cvp_hfi_msg_session_op_cfg_packet_d *)msg; - *session_id = old_cfg->session_id; - *error_type = old_cfg->error_type; - *config_id = old_cfg->op_conf_id; - return 0; - } *session_id = cfg->session_id; *error_type = cfg->error_type; *config_id = cfg->op_conf_id; @@ -3002,13 +2964,7 @@ static void **get_session_id(struct msm_cvp_cb_info *info) static void print_msg_hdr(void *hdr) { - unsigned int ver; - - ver = get_hfi_version(); - ver = (ver & HFI_VERSION_MINOR_MASK) >> HFI_VERSION_MINOR_SHIFT; - - if (ver >= 1) { - struct cvp_hfi_msg_session_hdr *new_hdr = + struct cvp_hfi_msg_session_hdr *new_hdr = (struct cvp_hfi_msg_session_hdr *)hdr; dprintk(CVP_DBG, "HFI MSG received: %x %x %x %x %x %x %x\n", new_hdr->size, new_hdr->packet_type, @@ -3017,17 +2973,6 @@ static void print_msg_hdr(void *hdr) new_hdr->client_data.data1, new_hdr->client_data.data2, new_hdr->error_type); - } else { - struct cvp_hfi_msg_session_hdr_d *old_hdr = - (struct cvp_hfi_msg_session_hdr_d *)hdr; - dprintk(CVP_DBG, "HFI MSG received: %x %x %x %x %x %x %x\n", - old_hdr->size, old_hdr->packet_type, - old_hdr->session_id, - old_hdr->client_data.transaction_id, - old_hdr->client_data.data1, - old_hdr->client_data.data2, - old_hdr->error_type); - } } static int __response_handler(struct iris_hfi_device *device) diff --git a/drivers/media/platform/msm/cvp/cvp_hfi_helper.h b/drivers/media/platform/msm/cvp/cvp_hfi_helper.h index e8978cd1bc2c..52d5bee69152 100644 --- a/drivers/media/platform/msm/cvp/cvp_hfi_helper.h +++ b/drivers/media/platform/msm/cvp/cvp_hfi_helper.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. */ #ifndef __H_CVP_HFI_HELPER_H__ @@ -285,28 +285,11 @@ struct cvp_hfi_client { u32 transaction_id; u32 data1; u32 data2; - union { - u64 kdata; - struct { - u32 kdata1; - u32 kdata2; - }; - }; + u64 kdata; u32 reserved1; u32 reserved2; } __packed; -struct cvp_hfi_client_d { - u32 transaction_id; - u32 data1; - u32 data2; -}; - -struct cvp_buf_desc { - u32 fd; - u32 size; -}; - struct cvp_hfi_buf_type { s32 fd; u32 size; @@ -324,15 +307,6 @@ struct cvp_hfi_cmd_session_set_buffers_packet { struct cvp_hfi_buf_type buf_type; } __packed; -struct cvp_hfi_cmd_session_set_buffers_packet_d { - u32 size; - u32 packet_type; - u32 session_id; - struct cvp_hfi_client_d client_data; - u32 buffer_addr; - u32 buffer_size; -}; - struct cvp_session_release_buffers_packet { u32 size; u32 packet_type; @@ -344,16 +318,6 @@ struct cvp_session_release_buffers_packet { u32 buffer_idx; } __packed; -struct cvp_session_release_buffers_packet_d { - u32 size; - u32 packet_type; - u32 session_id; - struct cvp_hfi_client_d client_data; - u32 buffer_type; - u32 num_buffers; - u32 buffer_idx; -}; - struct cvp_hfi_cmd_session_hdr { u32 size; u32 packet_type; @@ -371,14 +335,6 @@ struct cvp_hfi_msg_session_hdr { u32 stream_idx; } __packed; -struct cvp_hfi_msg_session_hdr_d { - u32 size; - u32 packet_type; - u32 session_id; - struct cvp_hfi_client_d client_data; - u32 error_type; -}; - struct cvp_hfi_buffer_mapping_type { u32 index; u32 device_addr; @@ -403,15 +359,6 @@ struct cvp_hfi_msg_event_notify_packet { u32 rg_ext_event_data[1]; }; -struct cvp_hfi_msg_session_op_cfg_packet_d { - u32 size; - u32 packet_type; - u32 session_id; - struct cvp_hfi_client_d client_data; - u32 op_conf_id; - u32 error_type; -}; - struct cvp_hfi_msg_session_op_cfg_packet { u32 size; u32 packet_type; @@ -500,4 +447,18 @@ struct cvp_hfi_cmd_sys_test_ssr_packet { u32 trigger_type; }; +struct cvp_buf_type { + s32 fd; + u32 size; + u32 offset; + u32 flags; + union { + struct dma_buf *dbuf; + struct { + u32 reserved1; + u32 reserved2; + }; + }; +}; + #endif diff --git a/drivers/media/platform/msm/cvp/hfi_packetization.c b/drivers/media/platform/msm/cvp/hfi_packetization.c index 597c7cfa74ce..3394115a519b 100644 --- a/drivers/media/platform/msm/cvp/hfi_packetization.c +++ b/drivers/media/platform/msm/cvp/hfi_packetization.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. */ #include "hfi_packetization.h" @@ -303,35 +303,17 @@ int cvp_create_pkt_cmd_session_set_buffers( struct cvp_buffer_addr_info *buffer_info) { int rc = 0; - unsigned int ver; - - ver = get_hfi_version(); - ver = (ver & HFI_VERSION_MINOR_MASK) >> HFI_VERSION_MINOR_SHIFT; + struct cvp_hfi_cmd_session_set_buffers_packet *pkt; if (!cmd || !session) return -EINVAL; - if (ver < 1) { - struct cvp_hfi_cmd_session_set_buffers_packet_d *pkt; - - pkt = (struct cvp_hfi_cmd_session_set_buffers_packet_d *)cmd; - pkt->packet_type = HFI_CMD_SESSION_CVP_SET_BUFFERS; - pkt->session_id = hash32_ptr(session); - pkt->buffer_addr = buffer_info->align_device_addr; - pkt->buffer_size = buffer_info->buffer_size; - pkt->size = - sizeof(struct cvp_hfi_cmd_session_set_buffers_packet_d); - } else { - struct cvp_hfi_cmd_session_set_buffers_packet *pkt; - - 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->size = - sizeof(struct cvp_hfi_cmd_session_set_buffers_packet); - } + 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->size = sizeof(struct cvp_hfi_cmd_session_set_buffers_packet); return rc; } @@ -341,37 +323,18 @@ int cvp_create_pkt_cmd_session_release_buffers( struct cvp_hal_session *session, struct cvp_buffer_addr_info *buffer_info) { - unsigned int ver; - - ver = get_hfi_version(); - ver = (ver & HFI_VERSION_MINOR_MASK) >> HFI_VERSION_MINOR_SHIFT; + struct cvp_session_release_buffers_packet *pkt; if (!cmd || !session) return -EINVAL; - if (ver < 1) { - struct cvp_session_release_buffers_packet_d *pkt; - - pkt = (struct cvp_session_release_buffers_packet_d *)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->size = - sizeof(struct cvp_session_release_buffers_packet_d) + + 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->size = sizeof(struct cvp_session_release_buffers_packet) + ((buffer_info->num_buffers - 1) * sizeof(u32)); - } else { - struct cvp_session_release_buffers_packet *pkt; - - 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->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) { diff --git a/drivers/media/platform/msm/cvp/msm_cvp.c b/drivers/media/platform/msm/cvp/msm_cvp.c index 3b9e084657cd..c9e638be2baf 100644 --- a/drivers/media/platform/msm/cvp/msm_cvp.c +++ b/drivers/media/platform/msm/cvp/msm_cvp.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. */ #include "msm_cvp.h" @@ -34,25 +34,6 @@ void print_internal_buffer(u32 tag, const char *str, } } -static enum hal_buffer get_hal_buftype(const char *str, unsigned int type) -{ - enum hal_buffer buftype = HAL_BUFFER_NONE; - - if (type == CVP_KMD_BUFTYPE_INPUT) - buftype = HAL_BUFFER_INPUT; - else if (type == CVP_KMD_BUFTYPE_OUTPUT) - buftype = HAL_BUFFER_OUTPUT; - else if (type == CVP_KMD_BUFTYPE_INTERNAL_1) - buftype = HAL_BUFFER_INTERNAL_SCRATCH_1; - else if (type == CVP_KMD_BUFTYPE_INTERNAL_2) - buftype = HAL_BUFFER_INTERNAL_SCRATCH_1; - else - dprintk(CVP_ERR, "%s: unknown buffer type %#x\n", - str, type); - - return buftype; -} - static int msm_cvp_get_session_info(struct msm_cvp_inst *inst, struct cvp_kmd_session_info *session) { @@ -77,42 +58,6 @@ static int msm_cvp_get_session_info(struct msm_cvp_inst *inst, return rc; } -static int msm_cvp_session_get_iova_addr_d( - struct msm_cvp_inst *inst, - struct msm_cvp_internal_buffer **cbuf_ptr, - unsigned int search_fd, unsigned int search_size, - unsigned int *iova, - unsigned int *iova_size) -{ - bool found = false; - struct msm_cvp_internal_buffer *cbuf; - - mutex_lock(&inst->cvpcpubufs.lock); - list_for_each_entry(cbuf, &inst->cvpcpubufs.list, list) { - if (cbuf->buf.fd == search_fd) { - found = true; - break; - } - } - mutex_unlock(&inst->cvpcpubufs.lock); - if (!found) - return -ENOENT; - - if (search_size != cbuf->buf.size) { - dprintk(CVP_ERR, - "%s: invalid size received fd = %d, size 0x%x 0x%x\n", - __func__, search_fd, search_size, cbuf->buf.size); - return -EINVAL; - } - *iova = cbuf->smem.device_addr; - *iova_size = cbuf->buf.size; - - if (cbuf_ptr) - *cbuf_ptr = cbuf; - - return 0; -} - static int msm_cvp_session_get_iova_addr( struct msm_cvp_inst *inst, struct cvp_buf_type *in_buf, @@ -188,7 +133,7 @@ static int msm_cvp_map_buf_dsp(struct msm_cvp_inst *inst, return -ENOMEM; memcpy(&cbuf->buf, buf, sizeof(struct cvp_kmd_buffer)); - cbuf->smem.buffer_type = get_hal_buftype(__func__, buf->type); + cbuf->smem.buffer_type = 0; cbuf->smem.fd = buf->fd; cbuf->smem.offset = buf->offset; cbuf->smem.size = buf->size; @@ -288,70 +233,6 @@ static int msm_cvp_unmap_buf_dsp(struct msm_cvp_inst *inst, return rc; } -static int msm_cvp_map_buf_cpu_d(struct msm_cvp_inst *inst, - unsigned int fd, - unsigned int size, - struct msm_cvp_internal_buffer **cbuf_ptr) -{ - int rc = 0; - bool found; - struct msm_cvp_internal_buffer *cbuf; - - if (!inst || !inst->core || !cbuf_ptr) { - dprintk(CVP_ERR, "%s: invalid params\n", __func__); - return -EINVAL; - } - - mutex_lock(&inst->cvpcpubufs.lock); - found = false; - list_for_each_entry(cbuf, &inst->cvpcpubufs.list, list) { - if (cbuf->buf.fd == fd) { - found = true; - break; - } - } - mutex_unlock(&inst->cvpcpubufs.lock); - if (found) { - print_internal_buffer(CVP_ERR, "duplicate", inst, cbuf); - return -EINVAL; - } - - cbuf = kmem_cache_zalloc(cvp_driver->internal_buf_cache, GFP_KERNEL); - if (!cbuf) - return -ENOMEM; - - cbuf->buf.fd = fd; - cbuf->buf.size = size; - /* HFI doesn't have buffer type, set it as HAL_BUFFER_INPUT */ - cbuf->smem.buffer_type = HAL_BUFFER_INPUT; - cbuf->smem.fd = cbuf->buf.fd; - cbuf->smem.size = cbuf->buf.size; - cbuf->smem.flags = 0; - cbuf->smem.offset = 0; - - rc = msm_cvp_smem_map_dma_buf(inst, &cbuf->smem); - if (rc) { - print_internal_buffer(CVP_ERR, "map failed", inst, cbuf); - goto exit; - } - - mutex_lock(&inst->cvpcpubufs.lock); - list_add_tail(&cbuf->list, &inst->cvpcpubufs.list); - mutex_unlock(&inst->cvpcpubufs.lock); - - *cbuf_ptr = cbuf; - - return rc; - -exit: - if (cbuf->smem.device_addr) - msm_cvp_smem_unmap_dma_buf(inst, &cbuf->smem); - kmem_cache_free(cvp_driver->internal_buf_cache, cbuf); - cbuf = NULL; - - return rc; -} - static void __msm_cvp_cache_operations(struct msm_cvp_internal_buffer *cbuf) { enum smem_cache_ops cache_op; @@ -716,8 +597,7 @@ static int msm_cvp_map_user_persist(struct msm_cvp_inst *inst, struct cvp_kmd_hfi_packet *in_pkt, unsigned int offset, unsigned int buf_num) { - struct cvp_buf_desc *buf_ptr; - struct cvp_buf_type *new_buf; + struct cvp_buf_type *buf; int i, rc = 0; unsigned int iova; @@ -725,20 +605,17 @@ static int msm_cvp_map_user_persist(struct msm_cvp_inst *inst, return 0; for (i = 0; i < buf_num; i++) { - buf_ptr = (struct cvp_buf_desc *) - &in_pkt->pkt_data[offset]; - - offset += sizeof(*new_buf) >> 2; - new_buf = (struct cvp_buf_type *)buf_ptr; + buf = (struct cvp_buf_type *)&in_pkt->pkt_data[offset]; + offset += sizeof(*buf) >> 2; /* * Make sure fd or dma_buf field doesn't have any * garbage value. */ if (inst->session_type == MSM_CVP_USER) { - new_buf->dbuf = 0; + buf->dbuf = NULL; } else if (inst->session_type == MSM_CVP_KERNEL) { - new_buf->fd = 0; + buf->fd = 0; } else if (inst->session_type >= MSM_CVP_UNKNOWN) { dprintk(CVP_ERR, "%s: unknown session type %d\n", @@ -746,10 +623,10 @@ static int msm_cvp_map_user_persist(struct msm_cvp_inst *inst, return -EINVAL; } - if (new_buf->fd <= 0 && !new_buf->dbuf) + if (buf->fd <= 0 && !buf->dbuf) continue; - rc = msm_cvp_map_buf_user_persist(inst, new_buf, &iova); + rc = msm_cvp_map_buf_user_persist(inst, buf, &iova); if (rc) { dprintk(CVP_ERR, "%s: buf %d register failed.\n", @@ -757,7 +634,7 @@ static int msm_cvp_map_user_persist(struct msm_cvp_inst *inst, return rc; } - new_buf->fd = iova; + buf->fd = iova; } return rc; } @@ -766,136 +643,79 @@ static int msm_cvp_map_buf(struct msm_cvp_inst *inst, struct cvp_kmd_hfi_packet *in_pkt, unsigned int offset, unsigned int buf_num) { - struct msm_cvp_internal_buffer *cbuf = NULL; - struct cvp_buf_desc *buf_ptr; - struct cvp_buf_type *new_buf; + struct cvp_buf_type *buf; int i, rc = 0; - u32 version; unsigned int iova; u64 ktid; struct msm_cvp_frame *frame; - - version = get_hfi_version(); - version = (version & HFI_VERSION_MINOR_MASK) >> HFI_VERSION_MINOR_SHIFT; - - if (version >= 1 && buf_num) { - struct cvp_hfi_cmd_session_hdr *cmd_hdr; - - cmd_hdr = (struct cvp_hfi_cmd_session_hdr *)in_pkt; - ktid = atomic64_inc_return(&inst->core->kernel_trans_id); - ktid &= (FENCE_BIT - 1); - cmd_hdr->client_data.kdata = ktid; - - frame = kmem_cache_zalloc(cvp_driver->frame_cache, GFP_KERNEL); - if (!frame) - return -ENOMEM; - - INIT_MSM_CVP_LIST(&frame->bufs); - frame->ktid = ktid; - } else { - frame = NULL; - } + struct cvp_hfi_cmd_session_hdr *cmd_hdr; if (!offset || !buf_num) return 0; + cmd_hdr = (struct cvp_hfi_cmd_session_hdr *)in_pkt; + ktid = atomic64_inc_return(&inst->core->kernel_trans_id); + ktid &= (FENCE_BIT - 1); + cmd_hdr->client_data.kdata = ktid; + + frame = kmem_cache_zalloc(cvp_driver->frame_cache, GFP_KERNEL); + if (!frame) + return -ENOMEM; + + INIT_MSM_CVP_LIST(&frame->bufs); + frame->ktid = ktid; + + for (i = 0; i < buf_num; i++) { - buf_ptr = (struct cvp_buf_desc *) - &in_pkt->pkt_data[offset]; - if (version >= 1) - offset += sizeof(*new_buf) >> 2; - else - offset += sizeof(*buf_ptr) >> 2; + buf = (struct cvp_buf_type *)&in_pkt->pkt_data[offset]; + offset += sizeof(*buf) >> 2; - if (version >= 1) { - new_buf = (struct cvp_buf_type *)buf_ptr; - - /* - * Make sure fd or dma_buf field doesn't have any - * garbage value. - */ - if (inst->session_type == MSM_CVP_USER) { - new_buf->dbuf = 0; - } else if (inst->session_type == MSM_CVP_KERNEL) { - new_buf->fd = 0; - } else if (inst->session_type >= MSM_CVP_UNKNOWN) { - dprintk(CVP_ERR, - "%s: unknown session type %d\n", - __func__, inst->session_type); - return -EINVAL; - } - - if (new_buf->fd <= 0 && !new_buf->dbuf) - continue; - - rc = msm_cvp_map_buf_cpu(inst, new_buf, &iova, frame); - if (rc) { - struct msm_cvp_frame_buf *frame_buf, *dummy; - - dprintk(CVP_ERR, - "%s: buf %d register failed.\n", - __func__, i); - - list_for_each_entry_safe(frame_buf, - dummy, &frame->bufs.list, list) { - list_del(&frame_buf->list); - __unmap_buf(inst, frame_buf); - kmem_cache_free( - cvp_driver->frame_buf_cache, - frame_buf); - } - DEINIT_MSM_CVP_LIST(&frame->bufs); - kmem_cache_free(cvp_driver->frame_cache, - frame); - return rc; - } - new_buf->fd = iova; - } else { - if (!buf_ptr->fd) - continue; - - rc = msm_cvp_session_get_iova_addr_d(inst, - &cbuf, - buf_ptr->fd, - buf_ptr->size, - &buf_ptr->fd, - &buf_ptr->size); - - if (rc == -ENOENT) { - dprintk(CVP_DBG, - "%s map buf fd %d size %d\n", - __func__, buf_ptr->fd, - buf_ptr->size); - rc = msm_cvp_map_buf_cpu_d(inst, - buf_ptr->fd, - buf_ptr->size, &cbuf); - if (rc || !cbuf) { - dprintk(CVP_ERR, - "%s: buf %d register failed. rc=%d\n", - __func__, i, rc); - return rc; - } - buf_ptr->fd = cbuf->smem.device_addr; - buf_ptr->size = cbuf->buf.size; - } else if (rc) { - dprintk(CVP_ERR, - "%s: buf %d register failed. rc=%d\n", - __func__, i, rc); - return rc; - } - msm_cvp_smem_cache_operations( - cbuf->smem.dma_buf, - SMEM_CACHE_CLEAN_INVALIDATE, - 0, buf_ptr->size); + /* + * Make sure fd or dma_buf field doesn't have any + * garbage value. + */ + if (inst->session_type == MSM_CVP_USER) { + buf->dbuf = NULL; + } else if (inst->session_type == MSM_CVP_KERNEL) { + buf->fd = 0; + } else if (inst->session_type >= MSM_CVP_UNKNOWN) { + dprintk(CVP_ERR, + "%s: unknown session type %d\n", + __func__, inst->session_type); + return -EINVAL; } + + if (buf->fd <= 0 && !buf->dbuf) + continue; + + rc = msm_cvp_map_buf_cpu(inst, buf, &iova, frame); + if (rc) { + struct msm_cvp_frame_buf *frame_buf, *dummy; + + dprintk(CVP_ERR, + "%s: buf %d register failed.\n", + __func__, i); + + list_for_each_entry_safe(frame_buf, + dummy, &frame->bufs.list, list) { + list_del(&frame_buf->list); + __unmap_buf(inst, frame_buf); + kmem_cache_free( + cvp_driver->frame_buf_cache, + frame_buf); + } + DEINIT_MSM_CVP_LIST(&frame->bufs); + kmem_cache_free(cvp_driver->frame_cache, + frame); + return rc; + } + buf->fd = iova; } - if (frame != NULL) { - mutex_lock(&inst->frames.lock); - list_add_tail(&frame->list, &inst->frames.list); - mutex_unlock(&inst->frames.lock); - dprintk(CVP_DBG, "%s: map frame %llu\n", __func__, ktid); - } + mutex_lock(&inst->frames.lock); + list_add_tail(&frame->list, &inst->frames.list); + mutex_unlock(&inst->frames.lock); + dprintk(CVP_DBG, "%s: map frame %llu\n", __func__, ktid); return rc; } @@ -1670,8 +1490,8 @@ static int msm_cvp_request_power(struct msm_cvp_inst *inst, } static int msm_cvp_update_power(struct msm_cvp_inst *inst) - -{ int rc = 0; +{ + int rc = 0; struct msm_cvp_core *core; struct msm_cvp_inst *s; diff --git a/drivers/media/platform/msm/cvp/msm_cvp_internal.h b/drivers/media/platform/msm/cvp/msm_cvp_internal.h index 969cda81e888..e88963ed56b1 100644 --- a/drivers/media/platform/msm/cvp/msm_cvp_internal.h +++ b/drivers/media/platform/msm/cvp/msm_cvp_internal.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2020, The Linux Foundation. All rights reserved. */ #ifndef _MSM_CVP_INTERNAL_H_ @@ -147,12 +147,6 @@ struct msm_cvp_ubwc_config_data { u32 bank_spreading; }; -#define IS_VPU_4(ver) \ - (ver == VPU_VERSION_4) - -#define IS_VPU_5(ver) \ - (ver == VPU_VERSION_5) - struct msm_cvp_platform_data { struct msm_cvp_common_data *common_data; unsigned int common_data_length; @@ -185,20 +179,6 @@ enum profiling_points { MAX_PROFILING_POINTS, }; -struct cvp_buf_type { - s32 fd; - u32 size; - u32 offset; - u32 flags; - union { - struct dma_buf *dbuf; - struct { - u32 reserved1; - u32 reserved2; - }; - }; -}; - struct cvp_clock_data { int buffer_counter; int load;