Loading drivers/media/platform/msm/vidc/msm_vidc.c +70 −48 Original line number Original line Diff line number Diff line Loading @@ -293,15 +293,66 @@ err_invalid_input: return temp; return temp; } } static inline void populate_buf_info(struct buffer_info *binfo, struct v4l2_buffer *b, u32 i) { binfo->type = b->type; binfo->fd[i] = b->m.planes[i].reserved[0]; binfo->buff_off[i] = b->m.planes[i].reserved[1]; binfo->size[i] = b->m.planes[i].length; binfo->uvaddr[i] = b->m.planes[i].m.userptr; binfo->device_addr[i] = 0; binfo->handle[i] = NULL; } int map_and_register_buf(struct msm_vidc_inst *inst, struct v4l2_buffer *b) static struct msm_smem *map_buffer(struct msm_vidc_inst *inst, struct v4l2_plane *p, enum hal_buffer buffer_type) { { struct msm_smem *handle = NULL; struct msm_smem *handle = NULL; struct buffer_info *binfo; handle = msm_smem_user_to_kernel(inst->mem_client, struct buffer_info *temp; p->reserved[0], p->reserved[1], buffer_type); if (!handle) { dprintk(VIDC_ERR, "%s: Failed to get device buffer address\n", __func__); return NULL; } if (msm_smem_cache_operations(inst->mem_client, handle, SMEM_CACHE_CLEAN)) dprintk(VIDC_WARN, "CACHE Clean failed: %d, %d, %d\n", p->reserved[0], p->reserved[1], p->length); return handle; } static inline enum hal_buffer get_hal_buffer_type( struct msm_vidc_inst *inst, struct v4l2_buffer *b) { if (inst->session_type == MSM_VIDC_DECODER) { if (b->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) return HAL_BUFFER_INPUT; else /* V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE */ return HAL_BUFFER_OUTPUT; } else { /* FIXME in the future. See comment in msm_comm_get_\ * domain_partition. Same problem here. */ if (b->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) return HAL_BUFFER_OUTPUT; else /* V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE */ return HAL_BUFFER_INPUT; } return -EINVAL; } int map_and_register_buf(struct msm_vidc_inst *inst, struct v4l2_buffer *b) { struct buffer_info *binfo = NULL; struct buffer_info *temp = NULL; int plane = 0; int plane = 0; int i, rc = 0; int i, rc = 0; enum hal_buffer buffer_type; if (!b || !inst) { if (!b || !inst) { dprintk(VIDC_ERR, "%s: invalid input\n", __func__); dprintk(VIDC_ERR, "%s: invalid input\n", __func__); Loading Loading @@ -340,74 +391,45 @@ int map_and_register_buf(struct msm_vidc_inst *inst, struct v4l2_buffer *b) dprintk(VIDC_DBG, dprintk(VIDC_DBG, "This memory region has already been prepared\n"); "This memory region has already been prepared\n"); rc = -EINVAL; rc = -EINVAL; kfree(binfo); goto exit; goto exit; } } if (inst->session_type == MSM_VIDC_DECODER) { if (b->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) buffer_type = HAL_BUFFER_INPUT; else /* V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE */ buffer_type = HAL_BUFFER_OUTPUT; } else { /* FIXME in the future. See comment in msm_comm_get_\ * domain_partition. Same problem here. */ if (b->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) buffer_type = HAL_BUFFER_OUTPUT; else /* V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE */ buffer_type = HAL_BUFFER_INPUT; } temp = get_same_fd_buffer(&inst->registered_bufs, temp = get_same_fd_buffer(&inst->registered_bufs, b->m.planes[i].reserved[0], &plane); b->m.planes[i].reserved[0], &plane); if (temp) { if (temp) { binfo->type = b->type; populate_buf_info(binfo, b, i); binfo->fd[i] = b->m.planes[i].reserved[0]; binfo->buff_off[i] = b->m.planes[i].reserved[1]; binfo->size[i] = b->m.planes[i].length; binfo->uvaddr[i] = b->m.planes[i].m.userptr; binfo->device_addr[i] = binfo->device_addr[i] = temp->handle[plane]->device_addr + binfo->buff_off[i]; temp->handle[plane]->device_addr + binfo->buff_off[i]; binfo->handle[i] = NULL; b->m.planes[i].m.userptr = binfo->device_addr[i]; } else { } else { handle = msm_smem_user_to_kernel(inst->mem_client, populate_buf_info(binfo, b, i); b->m.planes[i].reserved[0], binfo->handle[i] = b->m.planes[i].reserved[1], map_buffer(inst, &b->m.planes[i], buffer_type); get_hal_buffer_type(inst, b)); if (!handle) { if (!binfo->handle[i]) { dprintk(VIDC_ERR, rc = -EINVAL; "Failed to get device buffer address\n"); kfree(binfo); goto exit; goto exit; } } binfo->type = b->type; binfo->fd[i] = b->m.planes[i].reserved[0]; binfo->buff_off[i] = b->m.planes[i].reserved[1]; binfo->size[i] = b->m.planes[i].length; binfo->uvaddr[i] = b->m.planes[i].m.userptr; binfo->device_addr[i] = binfo->device_addr[i] = handle->device_addr + binfo->buff_off[i]; binfo->handle[i]->device_addr + binfo->handle[i] = handle; binfo->buff_off[i]; b->m.planes[i].m.userptr = binfo->device_addr[i]; dprintk(VIDC_DBG, "Registering buffer: %d, %d, %d\n", dprintk(VIDC_DBG, "Registering buffer: %d, %d, %d\n", b->m.planes[i].reserved[0], b->m.planes[i].reserved[0], b->m.planes[i].reserved[1], b->m.planes[i].reserved[1], b->m.planes[i].length); b->m.planes[i].length); rc = msm_smem_cache_operations(inst->mem_client, binfo->handle[i], SMEM_CACHE_CLEAN); if (rc) dprintk(VIDC_WARN, "CACHE Clean failed: %d, %d, %d\n", b->m.planes[i].reserved[0], b->m.planes[i].reserved[1], b->m.planes[i].length); } } b->m.planes[i].m.userptr = binfo->device_addr[i]; } } binfo->num_planes = b->length; binfo->num_planes = b->length; list_add_tail(&binfo->list, &inst->registered_bufs); list_add_tail(&binfo->list, &inst->registered_bufs); return 0; exit: exit: kfree(binfo); return rc; return rc; } } int msm_vidc_prepare_buf(void *instance, struct v4l2_buffer *b) int msm_vidc_prepare_buf(void *instance, struct v4l2_buffer *b) { { struct msm_vidc_inst *inst = instance; struct msm_vidc_inst *inst = instance; Loading Loading
drivers/media/platform/msm/vidc/msm_vidc.c +70 −48 Original line number Original line Diff line number Diff line Loading @@ -293,15 +293,66 @@ err_invalid_input: return temp; return temp; } } static inline void populate_buf_info(struct buffer_info *binfo, struct v4l2_buffer *b, u32 i) { binfo->type = b->type; binfo->fd[i] = b->m.planes[i].reserved[0]; binfo->buff_off[i] = b->m.planes[i].reserved[1]; binfo->size[i] = b->m.planes[i].length; binfo->uvaddr[i] = b->m.planes[i].m.userptr; binfo->device_addr[i] = 0; binfo->handle[i] = NULL; } int map_and_register_buf(struct msm_vidc_inst *inst, struct v4l2_buffer *b) static struct msm_smem *map_buffer(struct msm_vidc_inst *inst, struct v4l2_plane *p, enum hal_buffer buffer_type) { { struct msm_smem *handle = NULL; struct msm_smem *handle = NULL; struct buffer_info *binfo; handle = msm_smem_user_to_kernel(inst->mem_client, struct buffer_info *temp; p->reserved[0], p->reserved[1], buffer_type); if (!handle) { dprintk(VIDC_ERR, "%s: Failed to get device buffer address\n", __func__); return NULL; } if (msm_smem_cache_operations(inst->mem_client, handle, SMEM_CACHE_CLEAN)) dprintk(VIDC_WARN, "CACHE Clean failed: %d, %d, %d\n", p->reserved[0], p->reserved[1], p->length); return handle; } static inline enum hal_buffer get_hal_buffer_type( struct msm_vidc_inst *inst, struct v4l2_buffer *b) { if (inst->session_type == MSM_VIDC_DECODER) { if (b->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) return HAL_BUFFER_INPUT; else /* V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE */ return HAL_BUFFER_OUTPUT; } else { /* FIXME in the future. See comment in msm_comm_get_\ * domain_partition. Same problem here. */ if (b->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) return HAL_BUFFER_OUTPUT; else /* V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE */ return HAL_BUFFER_INPUT; } return -EINVAL; } int map_and_register_buf(struct msm_vidc_inst *inst, struct v4l2_buffer *b) { struct buffer_info *binfo = NULL; struct buffer_info *temp = NULL; int plane = 0; int plane = 0; int i, rc = 0; int i, rc = 0; enum hal_buffer buffer_type; if (!b || !inst) { if (!b || !inst) { dprintk(VIDC_ERR, "%s: invalid input\n", __func__); dprintk(VIDC_ERR, "%s: invalid input\n", __func__); Loading Loading @@ -340,74 +391,45 @@ int map_and_register_buf(struct msm_vidc_inst *inst, struct v4l2_buffer *b) dprintk(VIDC_DBG, dprintk(VIDC_DBG, "This memory region has already been prepared\n"); "This memory region has already been prepared\n"); rc = -EINVAL; rc = -EINVAL; kfree(binfo); goto exit; goto exit; } } if (inst->session_type == MSM_VIDC_DECODER) { if (b->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) buffer_type = HAL_BUFFER_INPUT; else /* V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE */ buffer_type = HAL_BUFFER_OUTPUT; } else { /* FIXME in the future. See comment in msm_comm_get_\ * domain_partition. Same problem here. */ if (b->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) buffer_type = HAL_BUFFER_OUTPUT; else /* V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE */ buffer_type = HAL_BUFFER_INPUT; } temp = get_same_fd_buffer(&inst->registered_bufs, temp = get_same_fd_buffer(&inst->registered_bufs, b->m.planes[i].reserved[0], &plane); b->m.planes[i].reserved[0], &plane); if (temp) { if (temp) { binfo->type = b->type; populate_buf_info(binfo, b, i); binfo->fd[i] = b->m.planes[i].reserved[0]; binfo->buff_off[i] = b->m.planes[i].reserved[1]; binfo->size[i] = b->m.planes[i].length; binfo->uvaddr[i] = b->m.planes[i].m.userptr; binfo->device_addr[i] = binfo->device_addr[i] = temp->handle[plane]->device_addr + binfo->buff_off[i]; temp->handle[plane]->device_addr + binfo->buff_off[i]; binfo->handle[i] = NULL; b->m.planes[i].m.userptr = binfo->device_addr[i]; } else { } else { handle = msm_smem_user_to_kernel(inst->mem_client, populate_buf_info(binfo, b, i); b->m.planes[i].reserved[0], binfo->handle[i] = b->m.planes[i].reserved[1], map_buffer(inst, &b->m.planes[i], buffer_type); get_hal_buffer_type(inst, b)); if (!handle) { if (!binfo->handle[i]) { dprintk(VIDC_ERR, rc = -EINVAL; "Failed to get device buffer address\n"); kfree(binfo); goto exit; goto exit; } } binfo->type = b->type; binfo->fd[i] = b->m.planes[i].reserved[0]; binfo->buff_off[i] = b->m.planes[i].reserved[1]; binfo->size[i] = b->m.planes[i].length; binfo->uvaddr[i] = b->m.planes[i].m.userptr; binfo->device_addr[i] = binfo->device_addr[i] = handle->device_addr + binfo->buff_off[i]; binfo->handle[i]->device_addr + binfo->handle[i] = handle; binfo->buff_off[i]; b->m.planes[i].m.userptr = binfo->device_addr[i]; dprintk(VIDC_DBG, "Registering buffer: %d, %d, %d\n", dprintk(VIDC_DBG, "Registering buffer: %d, %d, %d\n", b->m.planes[i].reserved[0], b->m.planes[i].reserved[0], b->m.planes[i].reserved[1], b->m.planes[i].reserved[1], b->m.planes[i].length); b->m.planes[i].length); rc = msm_smem_cache_operations(inst->mem_client, binfo->handle[i], SMEM_CACHE_CLEAN); if (rc) dprintk(VIDC_WARN, "CACHE Clean failed: %d, %d, %d\n", b->m.planes[i].reserved[0], b->m.planes[i].reserved[1], b->m.planes[i].length); } } b->m.planes[i].m.userptr = binfo->device_addr[i]; } } binfo->num_planes = b->length; binfo->num_planes = b->length; list_add_tail(&binfo->list, &inst->registered_bufs); list_add_tail(&binfo->list, &inst->registered_bufs); return 0; exit: exit: kfree(binfo); return rc; return rc; } } int msm_vidc_prepare_buf(void *instance, struct v4l2_buffer *b) int msm_vidc_prepare_buf(void *instance, struct v4l2_buffer *b) { { struct msm_vidc_inst *inst = instance; struct msm_vidc_inst *inst = instance; Loading