Loading drivers/media/platform/msm/sde/rotator/sde_rotator_dev.c +98 −4 Original line number Diff line number Diff line Loading @@ -123,6 +123,25 @@ static void sde_rotator_get_config_from_ctx(struct sde_rotator_ctx *ctx, config->output.format = ctx->format_cap.fmt.pix.pixelformat; config->output.comp_ratio.numer = 1; config->output.comp_ratio.denom = 1; /* * Use compression ratio of the first buffer to estimate * performance requirement of the session. If core layer does * not support dynamic per buffer compression ratio recalculation, * this configuration will determine the overall static compression * ratio of the session. */ if (ctx->vbinfo_out) config->input.comp_ratio = ctx->vbinfo_out[0].comp_ratio; if (ctx->vbinfo_cap) config->output.comp_ratio = ctx->vbinfo_cap[0].comp_ratio; SDEDEV_DBG(ctx->rot_dev->dev, "config s:%d out_cr:%u/%u cap_cr:%u/%u\n", ctx->session_id, config->input.comp_ratio.numer, config->input.comp_ratio.denom, config->output.comp_ratio.numer, config->output.comp_ratio.denom); } /* Loading Loading @@ -274,8 +293,11 @@ static int sde_rotator_queue_setup(struct vb2_queue *q, ctx->nbuf_out, GFP_KERNEL); if (!ctx->vbinfo_out) return -ENOMEM; for (i = 0; i < ctx->nbuf_out; i++) for (i = 0; i < ctx->nbuf_out; i++) { ctx->vbinfo_out[i].fd = -1; ctx->vbinfo_out[i].comp_ratio.numer = 1; ctx->vbinfo_out[i].comp_ratio.denom = 1; } break; case V4L2_BUF_TYPE_VIDEO_CAPTURE: ctx->nbuf_cap = *num_buffers; Loading @@ -284,8 +306,11 @@ static int sde_rotator_queue_setup(struct vb2_queue *q, ctx->nbuf_cap, GFP_KERNEL); if (!ctx->vbinfo_cap) return -ENOMEM; for (i = 0; i < ctx->nbuf_cap; i++) for (i = 0; i < ctx->nbuf_cap; i++) { ctx->vbinfo_cap[i].fd = -1; ctx->vbinfo_cap[i].comp_ratio.numer = 1; ctx->vbinfo_cap[i].comp_ratio.denom = 1; } break; default: return -EINVAL; Loading Loading @@ -1723,6 +1748,7 @@ static long sde_rotator_private_ioctl(struct file *file, void *fh, sde_rotator_ctx_from_fh(file->private_data); struct sde_rotator_device *rot_dev = ctx->rot_dev; struct msm_sde_rotator_fence *fence = arg; struct msm_sde_rotator_comp_ratio *comp_ratio = arg; struct sde_rotator_vbinfo *vbinfo; switch (cmd) { Loading Loading @@ -1801,6 +1827,52 @@ static long sde_rotator_private_ioctl(struct file *file, void *fh, ctx->session_id, fence->index, fence->fd); break; case VIDIOC_S_SDE_ROTATOR_COMP_RATIO: if (!comp_ratio) return -EINVAL; else if (!comp_ratio->numer || !comp_ratio->denom) return -EINVAL; else if (comp_ratio->type == V4L2_BUF_TYPE_VIDEO_OUTPUT && comp_ratio->index < ctx->nbuf_out) vbinfo = &ctx->vbinfo_out[comp_ratio->index]; else if (comp_ratio->type == V4L2_BUF_TYPE_VIDEO_CAPTURE && comp_ratio->index < ctx->nbuf_cap) vbinfo = &ctx->vbinfo_cap[comp_ratio->index]; else return -EINVAL; vbinfo->comp_ratio.numer = comp_ratio->numer; vbinfo->comp_ratio.denom = comp_ratio->denom; SDEDEV_DBG(rot_dev->dev, "VIDIOC_S_SDE_ROTATOR_COMP_RATIO s:%d i:%d t:%d cr:%u/%u\n", ctx->session_id, comp_ratio->index, comp_ratio->type, vbinfo->comp_ratio.numer, vbinfo->comp_ratio.denom); break; case VIDIOC_G_SDE_ROTATOR_COMP_RATIO: if (!comp_ratio) return -EINVAL; else if (comp_ratio->type == V4L2_BUF_TYPE_VIDEO_OUTPUT && comp_ratio->index < ctx->nbuf_out) vbinfo = &ctx->vbinfo_out[comp_ratio->index]; else if (comp_ratio->type == V4L2_BUF_TYPE_VIDEO_CAPTURE && comp_ratio->index < ctx->nbuf_cap) vbinfo = &ctx->vbinfo_cap[comp_ratio->index]; else return -EINVAL; comp_ratio->numer = vbinfo->comp_ratio.numer; comp_ratio->denom = vbinfo->comp_ratio.denom; SDEDEV_DBG(rot_dev->dev, "VIDIOC_G_SDE_ROTATOR_COMP_RATIO s:%d i:%d t:%d cr:%u/%u\n", ctx->session_id, comp_ratio->index, comp_ratio->type, comp_ratio->numer, comp_ratio->denom); break; default: SDEDEV_WARN(rot_dev->dev, "invalid ioctl type %x\n", cmd); return -ENOTTY; Loading Loading @@ -1840,6 +1912,24 @@ static long sde_rotator_compat_ioctl32(struct file *file, break; } case VIDIOC_S_SDE_ROTATOR_COMP_RATIO: case VIDIOC_G_SDE_ROTATOR_COMP_RATIO: { struct msm_sde_rotator_comp_ratio comp_ratio; if (copy_from_user(&comp_ratio, (void __user *)arg, sizeof(struct msm_sde_rotator_comp_ratio))) return -EFAULT; ret = sde_rotator_private_ioctl(file, file->private_data, 0, cmd, (void *)&comp_ratio); if (copy_to_user((void __user *)arg, &comp_ratio, sizeof(struct msm_sde_rotator_comp_ratio))) return -EFAULT; break; } default: ret = -ENOIOCTLCMD; break; Loading Loading @@ -1984,13 +2074,15 @@ static int sde_rotator_process_buffers(struct sde_rotator_ctx *ctx, vbinfo_cap = &ctx->vbinfo_cap[dst_buf->index]; SDEDEV_DBG(rot_dev->dev, "process buffer s:%d.%u src:(%u,%u,%u,%u) dst:(%u,%u,%u,%u) rot:%d flip:%d/%d sec:%d\n", "process buffer s:%d.%u src:(%u,%u,%u,%u) dst:(%u,%u,%u,%u) rot:%d flip:%d/%d sec:%d src_cr:%u/%u dst_cr:%u/%u\n", ctx->session_id, vbinfo_cap->fence_ts, ctx->crop_out.left, ctx->crop_out.top, ctx->crop_out.width, ctx->crop_out.height, ctx->crop_cap.left, ctx->crop_cap.top, ctx->crop_cap.width, ctx->crop_cap.height, ctx->rotate, ctx->hflip, ctx->vflip, ctx->secure); ctx->rotate, ctx->hflip, ctx->vflip, ctx->secure, vbinfo_out->comp_ratio.numer, vbinfo_out->comp_ratio.denom, vbinfo_cap->comp_ratio.numer, vbinfo_cap->comp_ratio.denom); /* allocate slot for timestamp */ ts = stats->ts[stats->count++ % SDE_ROTATOR_NUM_EVENTS]; Loading Loading @@ -2050,12 +2142,14 @@ static int sde_rotator_process_buffers(struct sde_rotator_ctx *ctx, item.input.planes[0].stride = ctx->format_out.fmt.pix.bytesperline; item.input.plane_count = 1; item.input.fence = NULL; item.input.comp_ratio = vbinfo_out->comp_ratio; item.output.planes[0].buffer = dst_handle->buffer; item.output.planes[0].handle = dst_handle->handle; item.output.planes[0].offset = dst_handle->addr; item.output.planes[0].stride = ctx->format_cap.fmt.pix.bytesperline; item.output.plane_count = 1; item.output.fence = NULL; item.output.comp_ratio = vbinfo_cap->comp_ratio; item.sequence_id = vbinfo_cap->fence_ts; item.ts = ts; Loading drivers/media/platform/msm/sde/rotator/sde_rotator_dev.h +2 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,7 @@ struct sde_rotator_buf_handle { * @fence_ts: completion timestamp associated with fd * @qbuf_ts: timestamp associated with buffer queue event * @dqbuf_ts: Pointer to timestamp associated with buffer dequeue event * @comp_ratio: compression ratio of this buffer */ struct sde_rotator_vbinfo { int fd; Loading @@ -75,6 +76,7 @@ struct sde_rotator_vbinfo { u32 fence_ts; ktime_t qbuf_ts; ktime_t *dqbuf_ts; struct sde_mult_factor comp_ratio; }; /* Loading include/uapi/media/msm_sde_rotator.h +19 −0 Original line number Diff line number Diff line Loading @@ -77,11 +77,30 @@ struct msm_sde_rotator_fence { __u32 reserved[5]; }; /* * struct msm_sde_rotator_comp_ratio - v4l2 buffer compression ratio * @index: id number of the buffer * @type: enum v4l2_buf_type; buffer type * @numer: numerator of the ratio * @denom: denominator of the ratio */ struct msm_sde_rotator_comp_ratio { __u32 index; __u32 type; __u32 numer; __u32 denom; __u32 reserved[4]; }; /* SDE Rotator private ioctl ID */ #define VIDIOC_G_SDE_ROTATOR_FENCE \ _IOWR('V', BASE_VIDIOC_PRIVATE + 10, struct msm_sde_rotator_fence) #define VIDIOC_S_SDE_ROTATOR_FENCE \ _IOWR('V', BASE_VIDIOC_PRIVATE + 11, struct msm_sde_rotator_fence) #define VIDIOC_G_SDE_ROTATOR_COMP_RATIO \ _IOWR('V', BASE_VIDIOC_PRIVATE + 12, struct msm_sde_rotator_comp_ratio) #define VIDIOC_S_SDE_ROTATOR_COMP_RATIO \ _IOWR('V', BASE_VIDIOC_PRIVATE + 13, struct msm_sde_rotator_comp_ratio) /* SDE Rotator private control ID's */ #define V4L2_CID_SDE_ROTATOR_SECURE (V4L2_CID_USER_BASE + 0x1000) Loading Loading
drivers/media/platform/msm/sde/rotator/sde_rotator_dev.c +98 −4 Original line number Diff line number Diff line Loading @@ -123,6 +123,25 @@ static void sde_rotator_get_config_from_ctx(struct sde_rotator_ctx *ctx, config->output.format = ctx->format_cap.fmt.pix.pixelformat; config->output.comp_ratio.numer = 1; config->output.comp_ratio.denom = 1; /* * Use compression ratio of the first buffer to estimate * performance requirement of the session. If core layer does * not support dynamic per buffer compression ratio recalculation, * this configuration will determine the overall static compression * ratio of the session. */ if (ctx->vbinfo_out) config->input.comp_ratio = ctx->vbinfo_out[0].comp_ratio; if (ctx->vbinfo_cap) config->output.comp_ratio = ctx->vbinfo_cap[0].comp_ratio; SDEDEV_DBG(ctx->rot_dev->dev, "config s:%d out_cr:%u/%u cap_cr:%u/%u\n", ctx->session_id, config->input.comp_ratio.numer, config->input.comp_ratio.denom, config->output.comp_ratio.numer, config->output.comp_ratio.denom); } /* Loading Loading @@ -274,8 +293,11 @@ static int sde_rotator_queue_setup(struct vb2_queue *q, ctx->nbuf_out, GFP_KERNEL); if (!ctx->vbinfo_out) return -ENOMEM; for (i = 0; i < ctx->nbuf_out; i++) for (i = 0; i < ctx->nbuf_out; i++) { ctx->vbinfo_out[i].fd = -1; ctx->vbinfo_out[i].comp_ratio.numer = 1; ctx->vbinfo_out[i].comp_ratio.denom = 1; } break; case V4L2_BUF_TYPE_VIDEO_CAPTURE: ctx->nbuf_cap = *num_buffers; Loading @@ -284,8 +306,11 @@ static int sde_rotator_queue_setup(struct vb2_queue *q, ctx->nbuf_cap, GFP_KERNEL); if (!ctx->vbinfo_cap) return -ENOMEM; for (i = 0; i < ctx->nbuf_cap; i++) for (i = 0; i < ctx->nbuf_cap; i++) { ctx->vbinfo_cap[i].fd = -1; ctx->vbinfo_cap[i].comp_ratio.numer = 1; ctx->vbinfo_cap[i].comp_ratio.denom = 1; } break; default: return -EINVAL; Loading Loading @@ -1723,6 +1748,7 @@ static long sde_rotator_private_ioctl(struct file *file, void *fh, sde_rotator_ctx_from_fh(file->private_data); struct sde_rotator_device *rot_dev = ctx->rot_dev; struct msm_sde_rotator_fence *fence = arg; struct msm_sde_rotator_comp_ratio *comp_ratio = arg; struct sde_rotator_vbinfo *vbinfo; switch (cmd) { Loading Loading @@ -1801,6 +1827,52 @@ static long sde_rotator_private_ioctl(struct file *file, void *fh, ctx->session_id, fence->index, fence->fd); break; case VIDIOC_S_SDE_ROTATOR_COMP_RATIO: if (!comp_ratio) return -EINVAL; else if (!comp_ratio->numer || !comp_ratio->denom) return -EINVAL; else if (comp_ratio->type == V4L2_BUF_TYPE_VIDEO_OUTPUT && comp_ratio->index < ctx->nbuf_out) vbinfo = &ctx->vbinfo_out[comp_ratio->index]; else if (comp_ratio->type == V4L2_BUF_TYPE_VIDEO_CAPTURE && comp_ratio->index < ctx->nbuf_cap) vbinfo = &ctx->vbinfo_cap[comp_ratio->index]; else return -EINVAL; vbinfo->comp_ratio.numer = comp_ratio->numer; vbinfo->comp_ratio.denom = comp_ratio->denom; SDEDEV_DBG(rot_dev->dev, "VIDIOC_S_SDE_ROTATOR_COMP_RATIO s:%d i:%d t:%d cr:%u/%u\n", ctx->session_id, comp_ratio->index, comp_ratio->type, vbinfo->comp_ratio.numer, vbinfo->comp_ratio.denom); break; case VIDIOC_G_SDE_ROTATOR_COMP_RATIO: if (!comp_ratio) return -EINVAL; else if (comp_ratio->type == V4L2_BUF_TYPE_VIDEO_OUTPUT && comp_ratio->index < ctx->nbuf_out) vbinfo = &ctx->vbinfo_out[comp_ratio->index]; else if (comp_ratio->type == V4L2_BUF_TYPE_VIDEO_CAPTURE && comp_ratio->index < ctx->nbuf_cap) vbinfo = &ctx->vbinfo_cap[comp_ratio->index]; else return -EINVAL; comp_ratio->numer = vbinfo->comp_ratio.numer; comp_ratio->denom = vbinfo->comp_ratio.denom; SDEDEV_DBG(rot_dev->dev, "VIDIOC_G_SDE_ROTATOR_COMP_RATIO s:%d i:%d t:%d cr:%u/%u\n", ctx->session_id, comp_ratio->index, comp_ratio->type, comp_ratio->numer, comp_ratio->denom); break; default: SDEDEV_WARN(rot_dev->dev, "invalid ioctl type %x\n", cmd); return -ENOTTY; Loading Loading @@ -1840,6 +1912,24 @@ static long sde_rotator_compat_ioctl32(struct file *file, break; } case VIDIOC_S_SDE_ROTATOR_COMP_RATIO: case VIDIOC_G_SDE_ROTATOR_COMP_RATIO: { struct msm_sde_rotator_comp_ratio comp_ratio; if (copy_from_user(&comp_ratio, (void __user *)arg, sizeof(struct msm_sde_rotator_comp_ratio))) return -EFAULT; ret = sde_rotator_private_ioctl(file, file->private_data, 0, cmd, (void *)&comp_ratio); if (copy_to_user((void __user *)arg, &comp_ratio, sizeof(struct msm_sde_rotator_comp_ratio))) return -EFAULT; break; } default: ret = -ENOIOCTLCMD; break; Loading Loading @@ -1984,13 +2074,15 @@ static int sde_rotator_process_buffers(struct sde_rotator_ctx *ctx, vbinfo_cap = &ctx->vbinfo_cap[dst_buf->index]; SDEDEV_DBG(rot_dev->dev, "process buffer s:%d.%u src:(%u,%u,%u,%u) dst:(%u,%u,%u,%u) rot:%d flip:%d/%d sec:%d\n", "process buffer s:%d.%u src:(%u,%u,%u,%u) dst:(%u,%u,%u,%u) rot:%d flip:%d/%d sec:%d src_cr:%u/%u dst_cr:%u/%u\n", ctx->session_id, vbinfo_cap->fence_ts, ctx->crop_out.left, ctx->crop_out.top, ctx->crop_out.width, ctx->crop_out.height, ctx->crop_cap.left, ctx->crop_cap.top, ctx->crop_cap.width, ctx->crop_cap.height, ctx->rotate, ctx->hflip, ctx->vflip, ctx->secure); ctx->rotate, ctx->hflip, ctx->vflip, ctx->secure, vbinfo_out->comp_ratio.numer, vbinfo_out->comp_ratio.denom, vbinfo_cap->comp_ratio.numer, vbinfo_cap->comp_ratio.denom); /* allocate slot for timestamp */ ts = stats->ts[stats->count++ % SDE_ROTATOR_NUM_EVENTS]; Loading Loading @@ -2050,12 +2142,14 @@ static int sde_rotator_process_buffers(struct sde_rotator_ctx *ctx, item.input.planes[0].stride = ctx->format_out.fmt.pix.bytesperline; item.input.plane_count = 1; item.input.fence = NULL; item.input.comp_ratio = vbinfo_out->comp_ratio; item.output.planes[0].buffer = dst_handle->buffer; item.output.planes[0].handle = dst_handle->handle; item.output.planes[0].offset = dst_handle->addr; item.output.planes[0].stride = ctx->format_cap.fmt.pix.bytesperline; item.output.plane_count = 1; item.output.fence = NULL; item.output.comp_ratio = vbinfo_cap->comp_ratio; item.sequence_id = vbinfo_cap->fence_ts; item.ts = ts; Loading
drivers/media/platform/msm/sde/rotator/sde_rotator_dev.h +2 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,7 @@ struct sde_rotator_buf_handle { * @fence_ts: completion timestamp associated with fd * @qbuf_ts: timestamp associated with buffer queue event * @dqbuf_ts: Pointer to timestamp associated with buffer dequeue event * @comp_ratio: compression ratio of this buffer */ struct sde_rotator_vbinfo { int fd; Loading @@ -75,6 +76,7 @@ struct sde_rotator_vbinfo { u32 fence_ts; ktime_t qbuf_ts; ktime_t *dqbuf_ts; struct sde_mult_factor comp_ratio; }; /* Loading
include/uapi/media/msm_sde_rotator.h +19 −0 Original line number Diff line number Diff line Loading @@ -77,11 +77,30 @@ struct msm_sde_rotator_fence { __u32 reserved[5]; }; /* * struct msm_sde_rotator_comp_ratio - v4l2 buffer compression ratio * @index: id number of the buffer * @type: enum v4l2_buf_type; buffer type * @numer: numerator of the ratio * @denom: denominator of the ratio */ struct msm_sde_rotator_comp_ratio { __u32 index; __u32 type; __u32 numer; __u32 denom; __u32 reserved[4]; }; /* SDE Rotator private ioctl ID */ #define VIDIOC_G_SDE_ROTATOR_FENCE \ _IOWR('V', BASE_VIDIOC_PRIVATE + 10, struct msm_sde_rotator_fence) #define VIDIOC_S_SDE_ROTATOR_FENCE \ _IOWR('V', BASE_VIDIOC_PRIVATE + 11, struct msm_sde_rotator_fence) #define VIDIOC_G_SDE_ROTATOR_COMP_RATIO \ _IOWR('V', BASE_VIDIOC_PRIVATE + 12, struct msm_sde_rotator_comp_ratio) #define VIDIOC_S_SDE_ROTATOR_COMP_RATIO \ _IOWR('V', BASE_VIDIOC_PRIVATE + 13, struct msm_sde_rotator_comp_ratio) /* SDE Rotator private control ID's */ #define V4L2_CID_SDE_ROTATOR_SECURE (V4L2_CID_USER_BASE + 0x1000) Loading