mirror of https://gitee.com/openkylin/linux.git
[media] davinci: vpif display: size up the memory for the buffers from the buffer pool
Size up the memory for the buffers from the buffer pool allocated in board file. Then adjust the reqbuf count depending the available memory. Signed-off-by: Manjunath Hadli <manjunath.hadli@ti.com> Signed-off-by: Lad, Prabhakar <prabhakar.lad@ti.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
3bc1953b22
commit
fc613d44e0
|
@ -187,6 +187,24 @@ static int vpif_buffer_setup(struct videobuf_queue *q, unsigned int *count,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
*size = config_params.channel_bufsize[ch->channel_id];
|
*size = config_params.channel_bufsize[ch->channel_id];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Checking if the buffer size exceeds the available buffer
|
||||||
|
* ycmux_mode = 0 means 1 channel mode HD and
|
||||||
|
* ycmux_mode = 1 means 2 channels mode SD
|
||||||
|
*/
|
||||||
|
if (ch->vpifparams.std_info.ycmux_mode == 0) {
|
||||||
|
if (config_params.video_limit[ch->channel_id])
|
||||||
|
while (*size * *count > (config_params.video_limit[0]
|
||||||
|
+ config_params.video_limit[1]))
|
||||||
|
(*count)--;
|
||||||
|
} else {
|
||||||
|
if (config_params.video_limit[ch->channel_id])
|
||||||
|
while (*size * *count >
|
||||||
|
config_params.video_limit[ch->channel_id])
|
||||||
|
(*count)--;
|
||||||
|
}
|
||||||
|
|
||||||
if (*count < config_params.min_numbuffers)
|
if (*count < config_params.min_numbuffers)
|
||||||
*count = config_params.min_numbuffers;
|
*count = config_params.min_numbuffers;
|
||||||
|
|
||||||
|
@ -828,7 +846,7 @@ static int vpif_reqbufs(struct file *file, void *priv,
|
||||||
|
|
||||||
common = &ch->common[index];
|
common = &ch->common[index];
|
||||||
|
|
||||||
if (common->fmt.type != reqbuf->type)
|
if (common->fmt.type != reqbuf->type || !vpif_dev)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (0 != common->io_usrs)
|
if (0 != common->io_usrs)
|
||||||
|
@ -845,7 +863,7 @@ static int vpif_reqbufs(struct file *file, void *priv,
|
||||||
|
|
||||||
/* Initialize videobuf queue as per the buffer type */
|
/* Initialize videobuf queue as per the buffer type */
|
||||||
videobuf_queue_dma_contig_init(&common->buffer_queue,
|
videobuf_queue_dma_contig_init(&common->buffer_queue,
|
||||||
&video_qops, NULL,
|
&video_qops, vpif_dev,
|
||||||
&common->irqlock,
|
&common->irqlock,
|
||||||
reqbuf->type, field,
|
reqbuf->type, field,
|
||||||
sizeof(struct videobuf_buffer), fh,
|
sizeof(struct videobuf_buffer), fh,
|
||||||
|
@ -1690,9 +1708,9 @@ static __init int vpif_probe(struct platform_device *pdev)
|
||||||
struct video_device *vfd;
|
struct video_device *vfd;
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
int subdev_count;
|
int subdev_count;
|
||||||
|
size_t size;
|
||||||
|
|
||||||
vpif_dev = &pdev->dev;
|
vpif_dev = &pdev->dev;
|
||||||
|
|
||||||
err = initialize_vpif();
|
err = initialize_vpif();
|
||||||
|
|
||||||
if (err) {
|
if (err) {
|
||||||
|
@ -1747,6 +1765,24 @@ static __init int vpif_probe(struct platform_device *pdev)
|
||||||
ch->video_dev = vfd;
|
ch->video_dev = vfd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
|
if (res) {
|
||||||
|
size = resource_size(res);
|
||||||
|
/* The resources are divided into two equal memory and when
|
||||||
|
* we have HD output we can add them together
|
||||||
|
*/
|
||||||
|
for (j = 0; j < VPIF_DISPLAY_MAX_DEVICES; j++) {
|
||||||
|
ch = vpif_obj.dev[j];
|
||||||
|
ch->channel_id = j;
|
||||||
|
|
||||||
|
/* only enabled if second resource exists */
|
||||||
|
config_params.video_limit[ch->channel_id] = 0;
|
||||||
|
if (size)
|
||||||
|
config_params.video_limit[ch->channel_id] =
|
||||||
|
size/2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (j = 0; j < VPIF_DISPLAY_MAX_DEVICES; j++) {
|
for (j = 0; j < VPIF_DISPLAY_MAX_DEVICES; j++) {
|
||||||
ch = vpif_obj.dev[j];
|
ch = vpif_obj.dev[j];
|
||||||
/* Initialize field of the channel objects */
|
/* Initialize field of the channel objects */
|
||||||
|
|
|
@ -158,6 +158,7 @@ struct vpif_config_params {
|
||||||
u32 min_bufsize[VPIF_DISPLAY_NUM_CHANNELS];
|
u32 min_bufsize[VPIF_DISPLAY_NUM_CHANNELS];
|
||||||
u32 channel_bufsize[VPIF_DISPLAY_NUM_CHANNELS];
|
u32 channel_bufsize[VPIF_DISPLAY_NUM_CHANNELS];
|
||||||
u8 numbuffers[VPIF_DISPLAY_NUM_CHANNELS];
|
u8 numbuffers[VPIF_DISPLAY_NUM_CHANNELS];
|
||||||
|
u32 video_limit[VPIF_DISPLAY_NUM_CHANNELS];
|
||||||
u8 min_numbuffers;
|
u8 min_numbuffers;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue