Loading drivers/media/platform/msm/cvp/msm_cvp.c +59 −56 Original line number Diff line number Diff line Loading @@ -518,7 +518,7 @@ static int msm_cvp_session_process_hfi( static int msm_cvp_thread_fence_run(void *data) { int i, pkt_idx, rc = 0; int i, rc = 0; unsigned long timeout_ms = 1000; int synx_obj; struct hfi_device *hdev; Loading @@ -527,9 +527,6 @@ static int msm_cvp_thread_fence_run(void *data) struct cvp_kmd_hfi_packet *in_pkt; struct msm_cvp_inst *inst; int *fence; struct msm_cvp_internal_buffer *cbuf = NULL; struct buf_desc *buf_ptr; unsigned int offset, buf_num; if (!data) { dprintk(CVP_ERR, "%s Wrong input data %pK\n", __func__, data); Loading @@ -549,57 +546,6 @@ static int msm_cvp_thread_fence_run(void *data) fence = (int *)(in_fence_pkt->fence_data); hdev = inst->core->device; pkt_idx = get_pkt_index((struct cvp_hal_session_cmd_pkt *)in_pkt); if (pkt_idx < 0) { dprintk(CVP_ERR, "%s incorrect packet %d, %x\n", __func__, in_pkt->pkt_data[0], in_pkt->pkt_data[1]); rc = pkt_idx; goto exit; } offset = cvp_hfi_defs[pkt_idx].buf_offset; buf_num = cvp_hfi_defs[pkt_idx].buf_num; if (offset != 0 && buf_num != 0) { buf_ptr = (struct buf_desc *)&in_pkt->pkt_data[offset]; for (i = 0; i < buf_num; i++) { if (!buf_ptr[i].fd) continue; rc = msm_cvp_session_get_iova_addr(inst, &cbuf, buf_ptr[i].fd, buf_ptr[i].size, &buf_ptr[i].fd, &buf_ptr[i].size); if (rc == -ENOENT) { dprintk(CVP_DBG, "%s map buf fd %d size %d\n", __func__, buf_ptr[i].fd, buf_ptr[i].size); rc = msm_cvp_map_buf_cpu(inst, buf_ptr[i].fd, buf_ptr[i].size, &cbuf); if (rc || !cbuf) { dprintk(CVP_ERR, "%s: buf %d register failed. rc=%d\n", __func__, i, rc); do_exit(rc); } buf_ptr[i].fd = cbuf->smem.device_addr; buf_ptr[i].size = cbuf->buf.size; } else if (rc) { dprintk(CVP_ERR, "%s: buf %d register failed. rc=%d\n", __func__, i, rc); do_exit(rc); } msm_cvp_smem_cache_operations(cbuf->smem.dma_buf, SMEM_CACHE_CLEAN_INVALIDATE, 0, buf_ptr[i].size); } } //wait on synx before signaling HFI switch (fence_thread_data->arg_type) { case CVP_KMD_HFI_DME_FRAME_FENCE_CMD: Loading Loading @@ -691,8 +637,13 @@ static int msm_cvp_session_process_hfi_fence( { static int thread_num; struct task_struct *thread; int rc = 0; int i, rc = 0; char thread_fence_name[32]; int pkt_idx; struct cvp_kmd_hfi_packet *in_pkt; unsigned int offset, buf_num; struct msm_cvp_internal_buffer *cbuf = NULL; struct buf_desc *buf_ptr; dprintk(CVP_DBG, "%s: Enter inst = %d", __func__, inst); Loading @@ -701,6 +652,58 @@ static int msm_cvp_session_process_hfi_fence( return -EINVAL; } in_pkt = (struct cvp_kmd_hfi_packet *)&arg->data.hfi_pkt; pkt_idx = get_pkt_index((struct cvp_hal_session_cmd_pkt *)in_pkt); if (pkt_idx < 0) { dprintk(CVP_ERR, "%s incorrect packet %d, %x\n", __func__, in_pkt->pkt_data[0], in_pkt->pkt_data[1]); rc = pkt_idx; return rc; } offset = cvp_hfi_defs[pkt_idx].buf_offset; buf_num = cvp_hfi_defs[pkt_idx].buf_num; if (offset != 0 && buf_num != 0) { buf_ptr = (struct buf_desc *)&in_pkt->pkt_data[offset]; for (i = 0; i < buf_num; i++) { if (!buf_ptr[i].fd) continue; rc = msm_cvp_session_get_iova_addr(inst, &cbuf, buf_ptr[i].fd, buf_ptr[i].size, &buf_ptr[i].fd, &buf_ptr[i].size); if (rc == -ENOENT) { dprintk(CVP_DBG, "%s map buf fd %d size %d\n", __func__, buf_ptr[i].fd, buf_ptr[i].size); rc = msm_cvp_map_buf_cpu(inst, buf_ptr[i].fd, buf_ptr[i].size, &cbuf); if (rc || !cbuf) { dprintk(CVP_ERR, "%s: buf %d register failed. rc=%d\n", __func__, i, rc); return rc; } buf_ptr[i].fd = cbuf->smem.device_addr; buf_ptr[i].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[i].size); } } thread_num = thread_num + 1; fence_thread_data.inst = inst; fence_thread_data.device_id = (unsigned int)inst->core->id; Loading drivers/media/platform/msm/cvp/msm_v4l2_cvp.c +2 −2 Original line number Diff line number Diff line Loading @@ -68,8 +68,8 @@ static const struct file_operations cvp_fops = { .owner = THIS_MODULE, .open = cvp_open, .release = cvp_close, .unlocked_ioctl = msm_cvp_v4l2_private, .compat_ioctl = msm_cvp_v4l2_private, .unlocked_ioctl = cvp_unblocked_ioctl, .compat_ioctl = cvp_compat_ioctl, .poll = cvp_poll, }; Loading drivers/media/platform/msm/cvp/msm_v4l2_private.c +53 −13 Original line number Diff line number Diff line Loading @@ -130,13 +130,32 @@ static int _copy_fence_pkt_to_user(struct cvp_kmd_arg *kp, return 0; } static void _set_deprecate_bitmask(struct cvp_kmd_arg *kp, struct msm_cvp_inst *inst) { int bit_offset; dprintk(CVP_DBG, "%s: kp->type = %#x\n", __func__, kp->type); if (kp->type == CVP_KMD_HFI_DFS_FRAME_CMD || kp->type == CVP_KMD_HFI_DME_FRAME_CMD || kp->type == CVP_KMD_HFI_PERSIST_CMD) { bit_offset = kp->type - CVP_KMD_CMD_START; set_bit(bit_offset, &inst->deprecate_bitmask); } if (kp->type == CVP_KMD_HFI_DME_FRAME_FENCE_CMD) { bit_offset = CVP_KMD_HFI_DME_FRAME_CMD - CVP_KMD_CMD_START; set_bit(bit_offset, &inst->deprecate_bitmask); } } static int convert_from_user(struct cvp_kmd_arg *kp, unsigned long arg, struct msm_cvp_inst *inst) { int rc = 0; int i, bit_offset; struct cvp_kmd_arg __user *up = compat_ptr(arg); int i; struct cvp_kmd_arg __user *up = (struct cvp_kmd_arg *)arg; struct cvp_hal_session_cmd_pkt pkt_hdr; if (!kp || !up) { Loading @@ -147,12 +166,7 @@ static int convert_from_user(struct cvp_kmd_arg *kp, if (get_user(kp->type, &up->type)) return -EFAULT; if (kp->type == CVP_KMD_HFI_DFS_FRAME_CMD || kp->type == CVP_KMD_HFI_DME_FRAME_CMD || kp->type == CVP_KMD_HFI_PERSIST_CMD) { bit_offset = kp->type - CVP_KMD_CMD_START; set_bit(bit_offset, &inst->deprecate_bitmask); } _set_deprecate_bitmask(kp, inst); if (get_user(kp->buf_offset, &up->buf_offset) || get_user(kp->buf_num, &up->buf_num)) Loading Loading @@ -290,7 +304,7 @@ static int convert_to_user(struct cvp_kmd_arg *kp, unsigned long arg) { int rc = 0; int i, size = sizeof(struct hfi_msg_session_hdr) >> 2; struct cvp_kmd_arg __user *up = compat_ptr(arg); struct cvp_kmd_arg __user *up = (struct cvp_kmd_arg *)arg; struct cvp_hal_session_cmd_pkt pkt_hdr; if (!kp || !up) { Loading Loading @@ -435,14 +449,13 @@ static int convert_to_user(struct cvp_kmd_arg *kp, unsigned long arg) return rc; } long msm_cvp_v4l2_private(struct file *filp, static long cvp_ioctl(struct msm_cvp_inst *inst, unsigned int cmd, unsigned long arg) { int rc; struct msm_cvp_inst *inst; struct cvp_kmd_arg karg; if (!filp || !filp->private_data) { if (!inst) { dprintk(CVP_ERR, "%s: invalid params\n", __func__); return -EINVAL; } Loading @@ -451,7 +464,6 @@ long msm_cvp_v4l2_private(struct file *filp, if (cmd != VIDIOC_CVP_CMD) return 0; inst = filp->private_data; memset(&karg, 0, sizeof(struct cvp_kmd_arg)); if (convert_from_user(&karg, arg, inst)) { Loading @@ -475,3 +487,31 @@ long msm_cvp_v4l2_private(struct file *filp, return rc; } long cvp_unblocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { struct msm_cvp_inst *inst; if (!filp || !filp->private_data) { dprintk(CVP_ERR, "%s: invalid params\n", __func__); return -EINVAL; } inst = filp->private_data; return cvp_ioctl(inst, cmd, arg); } long cvp_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { struct msm_cvp_inst *inst; if (!filp || !filp->private_data) { dprintk(CVP_ERR, "%s: invalid params\n", __func__); return -EINVAL; } inst = filp->private_data; return cvp_ioctl(inst, cmd, (unsigned long)compat_ptr(arg)); } drivers/media/platform/msm/cvp/msm_v4l2_private.h +4 −1 Original line number Diff line number Diff line Loading @@ -9,7 +9,10 @@ #include <media/msm_cvp_private.h> #include "msm_cvp_debug.h" long msm_cvp_v4l2_private(struct file *file, long cvp_unblocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); long cvp_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); #endif Loading
drivers/media/platform/msm/cvp/msm_cvp.c +59 −56 Original line number Diff line number Diff line Loading @@ -518,7 +518,7 @@ static int msm_cvp_session_process_hfi( static int msm_cvp_thread_fence_run(void *data) { int i, pkt_idx, rc = 0; int i, rc = 0; unsigned long timeout_ms = 1000; int synx_obj; struct hfi_device *hdev; Loading @@ -527,9 +527,6 @@ static int msm_cvp_thread_fence_run(void *data) struct cvp_kmd_hfi_packet *in_pkt; struct msm_cvp_inst *inst; int *fence; struct msm_cvp_internal_buffer *cbuf = NULL; struct buf_desc *buf_ptr; unsigned int offset, buf_num; if (!data) { dprintk(CVP_ERR, "%s Wrong input data %pK\n", __func__, data); Loading @@ -549,57 +546,6 @@ static int msm_cvp_thread_fence_run(void *data) fence = (int *)(in_fence_pkt->fence_data); hdev = inst->core->device; pkt_idx = get_pkt_index((struct cvp_hal_session_cmd_pkt *)in_pkt); if (pkt_idx < 0) { dprintk(CVP_ERR, "%s incorrect packet %d, %x\n", __func__, in_pkt->pkt_data[0], in_pkt->pkt_data[1]); rc = pkt_idx; goto exit; } offset = cvp_hfi_defs[pkt_idx].buf_offset; buf_num = cvp_hfi_defs[pkt_idx].buf_num; if (offset != 0 && buf_num != 0) { buf_ptr = (struct buf_desc *)&in_pkt->pkt_data[offset]; for (i = 0; i < buf_num; i++) { if (!buf_ptr[i].fd) continue; rc = msm_cvp_session_get_iova_addr(inst, &cbuf, buf_ptr[i].fd, buf_ptr[i].size, &buf_ptr[i].fd, &buf_ptr[i].size); if (rc == -ENOENT) { dprintk(CVP_DBG, "%s map buf fd %d size %d\n", __func__, buf_ptr[i].fd, buf_ptr[i].size); rc = msm_cvp_map_buf_cpu(inst, buf_ptr[i].fd, buf_ptr[i].size, &cbuf); if (rc || !cbuf) { dprintk(CVP_ERR, "%s: buf %d register failed. rc=%d\n", __func__, i, rc); do_exit(rc); } buf_ptr[i].fd = cbuf->smem.device_addr; buf_ptr[i].size = cbuf->buf.size; } else if (rc) { dprintk(CVP_ERR, "%s: buf %d register failed. rc=%d\n", __func__, i, rc); do_exit(rc); } msm_cvp_smem_cache_operations(cbuf->smem.dma_buf, SMEM_CACHE_CLEAN_INVALIDATE, 0, buf_ptr[i].size); } } //wait on synx before signaling HFI switch (fence_thread_data->arg_type) { case CVP_KMD_HFI_DME_FRAME_FENCE_CMD: Loading Loading @@ -691,8 +637,13 @@ static int msm_cvp_session_process_hfi_fence( { static int thread_num; struct task_struct *thread; int rc = 0; int i, rc = 0; char thread_fence_name[32]; int pkt_idx; struct cvp_kmd_hfi_packet *in_pkt; unsigned int offset, buf_num; struct msm_cvp_internal_buffer *cbuf = NULL; struct buf_desc *buf_ptr; dprintk(CVP_DBG, "%s: Enter inst = %d", __func__, inst); Loading @@ -701,6 +652,58 @@ static int msm_cvp_session_process_hfi_fence( return -EINVAL; } in_pkt = (struct cvp_kmd_hfi_packet *)&arg->data.hfi_pkt; pkt_idx = get_pkt_index((struct cvp_hal_session_cmd_pkt *)in_pkt); if (pkt_idx < 0) { dprintk(CVP_ERR, "%s incorrect packet %d, %x\n", __func__, in_pkt->pkt_data[0], in_pkt->pkt_data[1]); rc = pkt_idx; return rc; } offset = cvp_hfi_defs[pkt_idx].buf_offset; buf_num = cvp_hfi_defs[pkt_idx].buf_num; if (offset != 0 && buf_num != 0) { buf_ptr = (struct buf_desc *)&in_pkt->pkt_data[offset]; for (i = 0; i < buf_num; i++) { if (!buf_ptr[i].fd) continue; rc = msm_cvp_session_get_iova_addr(inst, &cbuf, buf_ptr[i].fd, buf_ptr[i].size, &buf_ptr[i].fd, &buf_ptr[i].size); if (rc == -ENOENT) { dprintk(CVP_DBG, "%s map buf fd %d size %d\n", __func__, buf_ptr[i].fd, buf_ptr[i].size); rc = msm_cvp_map_buf_cpu(inst, buf_ptr[i].fd, buf_ptr[i].size, &cbuf); if (rc || !cbuf) { dprintk(CVP_ERR, "%s: buf %d register failed. rc=%d\n", __func__, i, rc); return rc; } buf_ptr[i].fd = cbuf->smem.device_addr; buf_ptr[i].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[i].size); } } thread_num = thread_num + 1; fence_thread_data.inst = inst; fence_thread_data.device_id = (unsigned int)inst->core->id; Loading
drivers/media/platform/msm/cvp/msm_v4l2_cvp.c +2 −2 Original line number Diff line number Diff line Loading @@ -68,8 +68,8 @@ static const struct file_operations cvp_fops = { .owner = THIS_MODULE, .open = cvp_open, .release = cvp_close, .unlocked_ioctl = msm_cvp_v4l2_private, .compat_ioctl = msm_cvp_v4l2_private, .unlocked_ioctl = cvp_unblocked_ioctl, .compat_ioctl = cvp_compat_ioctl, .poll = cvp_poll, }; Loading
drivers/media/platform/msm/cvp/msm_v4l2_private.c +53 −13 Original line number Diff line number Diff line Loading @@ -130,13 +130,32 @@ static int _copy_fence_pkt_to_user(struct cvp_kmd_arg *kp, return 0; } static void _set_deprecate_bitmask(struct cvp_kmd_arg *kp, struct msm_cvp_inst *inst) { int bit_offset; dprintk(CVP_DBG, "%s: kp->type = %#x\n", __func__, kp->type); if (kp->type == CVP_KMD_HFI_DFS_FRAME_CMD || kp->type == CVP_KMD_HFI_DME_FRAME_CMD || kp->type == CVP_KMD_HFI_PERSIST_CMD) { bit_offset = kp->type - CVP_KMD_CMD_START; set_bit(bit_offset, &inst->deprecate_bitmask); } if (kp->type == CVP_KMD_HFI_DME_FRAME_FENCE_CMD) { bit_offset = CVP_KMD_HFI_DME_FRAME_CMD - CVP_KMD_CMD_START; set_bit(bit_offset, &inst->deprecate_bitmask); } } static int convert_from_user(struct cvp_kmd_arg *kp, unsigned long arg, struct msm_cvp_inst *inst) { int rc = 0; int i, bit_offset; struct cvp_kmd_arg __user *up = compat_ptr(arg); int i; struct cvp_kmd_arg __user *up = (struct cvp_kmd_arg *)arg; struct cvp_hal_session_cmd_pkt pkt_hdr; if (!kp || !up) { Loading @@ -147,12 +166,7 @@ static int convert_from_user(struct cvp_kmd_arg *kp, if (get_user(kp->type, &up->type)) return -EFAULT; if (kp->type == CVP_KMD_HFI_DFS_FRAME_CMD || kp->type == CVP_KMD_HFI_DME_FRAME_CMD || kp->type == CVP_KMD_HFI_PERSIST_CMD) { bit_offset = kp->type - CVP_KMD_CMD_START; set_bit(bit_offset, &inst->deprecate_bitmask); } _set_deprecate_bitmask(kp, inst); if (get_user(kp->buf_offset, &up->buf_offset) || get_user(kp->buf_num, &up->buf_num)) Loading Loading @@ -290,7 +304,7 @@ static int convert_to_user(struct cvp_kmd_arg *kp, unsigned long arg) { int rc = 0; int i, size = sizeof(struct hfi_msg_session_hdr) >> 2; struct cvp_kmd_arg __user *up = compat_ptr(arg); struct cvp_kmd_arg __user *up = (struct cvp_kmd_arg *)arg; struct cvp_hal_session_cmd_pkt pkt_hdr; if (!kp || !up) { Loading Loading @@ -435,14 +449,13 @@ static int convert_to_user(struct cvp_kmd_arg *kp, unsigned long arg) return rc; } long msm_cvp_v4l2_private(struct file *filp, static long cvp_ioctl(struct msm_cvp_inst *inst, unsigned int cmd, unsigned long arg) { int rc; struct msm_cvp_inst *inst; struct cvp_kmd_arg karg; if (!filp || !filp->private_data) { if (!inst) { dprintk(CVP_ERR, "%s: invalid params\n", __func__); return -EINVAL; } Loading @@ -451,7 +464,6 @@ long msm_cvp_v4l2_private(struct file *filp, if (cmd != VIDIOC_CVP_CMD) return 0; inst = filp->private_data; memset(&karg, 0, sizeof(struct cvp_kmd_arg)); if (convert_from_user(&karg, arg, inst)) { Loading @@ -475,3 +487,31 @@ long msm_cvp_v4l2_private(struct file *filp, return rc; } long cvp_unblocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { struct msm_cvp_inst *inst; if (!filp || !filp->private_data) { dprintk(CVP_ERR, "%s: invalid params\n", __func__); return -EINVAL; } inst = filp->private_data; return cvp_ioctl(inst, cmd, arg); } long cvp_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { struct msm_cvp_inst *inst; if (!filp || !filp->private_data) { dprintk(CVP_ERR, "%s: invalid params\n", __func__); return -EINVAL; } inst = filp->private_data; return cvp_ioctl(inst, cmd, (unsigned long)compat_ptr(arg)); }
drivers/media/platform/msm/cvp/msm_v4l2_private.h +4 −1 Original line number Diff line number Diff line Loading @@ -9,7 +9,10 @@ #include <media/msm_cvp_private.h> #include "msm_cvp_debug.h" long msm_cvp_v4l2_private(struct file *file, long cvp_unblocked_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); long cvp_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); #endif