Merge "msm: sde: add compression ratio support to v4l2 rotator"
This commit is contained in:
commit
6a7da89b84
3 changed files with 119 additions and 4 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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];
|
||||
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -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…
Add table
Reference in a new issue