From: Asheesh Bhardwaj <asheesh@xxxxxxxxxx> --- drivers/media/video/davinci/vpif_capture.c | 56 +++++++++++++++++++++++++++- drivers/media/video/davinci/vpif_capture.h | 2 + 2 files changed, 57 insertions(+), 1 deletions(-) diff --git a/drivers/media/video/davinci/vpif_capture.c b/drivers/media/video/davinci/vpif_capture.c index b4b5905..9ba015d 100644 --- a/drivers/media/video/davinci/vpif_capture.c +++ b/drivers/media/video/davinci/vpif_capture.c @@ -53,18 +53,24 @@ static u32 ch0_numbuffers = 3; static u32 ch1_numbuffers = 3; static u32 ch0_bufsize = 1920 * 1080 * 2; static u32 ch1_bufsize = 720 * 576 * 2; +static u32 cont_bufoffset = 0; +static u32 cont_bufsize = 0; module_param(debug, int, 0644); module_param(ch0_numbuffers, uint, S_IRUGO); module_param(ch1_numbuffers, uint, S_IRUGO); module_param(ch0_bufsize, uint, S_IRUGO); module_param(ch1_bufsize, uint, S_IRUGO); +module_param(cont_bufoffset, uint, S_IRUGO); +module_param(cont_bufsize, uint, S_IRUGO); MODULE_PARM_DESC(debug, "Debug level 0-1"); MODULE_PARM_DESC(ch2_numbuffers, "Channel0 buffer count (default:3)"); MODULE_PARM_DESC(ch3_numbuffers, "Channel1 buffer count (default:3)"); MODULE_PARM_DESC(ch2_bufsize, "Channel0 buffer size (default:1920 x 1080 x 2)"); MODULE_PARM_DESC(ch3_bufsize, "Channel1 buffer size (default:720 x 576 x 2)"); +MODULE_PARM_DESC(cont_bufoffset,"Capture buffer offset(default 0)"); +MODULE_PARM_DESC(cont_bufsize,"Capture buffer size(default 0)"); static struct vpif_config_params config_params = { .min_numbuffers = 3, @@ -187,10 +193,27 @@ static int vpif_buffer_setup(struct videobuf_queue *q, unsigned int *count, /* Calculate the size of the buffer */ *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 ycmuxmode = 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) *count = config_params.min_numbuffers; - return 0; + + return 0; } /** @@ -1892,6 +1915,8 @@ static __init int vpif_probe(struct platform_device *pdev) struct video_device *vfd; struct resource *res; int subdev_count; + unsigned long phys_end_kernel; + size_t size; vpif_dev = &pdev->dev; @@ -1941,6 +1966,35 @@ static __init int vpif_probe(struct platform_device *pdev) /* Set video_dev to the video device */ ch->video_dev = vfd; } + + /* Initialising the memory from the bootargs for contiguous memory buffers and avoid defragmentation */ + if(cont_bufsize) { + /* attempt to determine the end of Linux kernel memory */ + phys_end_kernel = virt_to_phys((void *)PAGE_OFFSET) + + (num_physpages << PAGE_SHIFT); + size = cont_bufsize; + phys_end_kernel += cont_bufoffset; + err = dma_declare_coherent_memory(&pdev->dev, phys_end_kernel, + phys_end_kernel, + size, + DMA_MEMORY_MAP | + DMA_MEMORY_EXCLUSIVE); + if (!err) { + dev_err(&pdev->dev, "Unable to declare MMAP memory.\n"); + err = -ENOMEM; + goto probe_out; + } + + /*The resources are divided into two equal memory and when we have HD output we can add them together*/ + for (j = 0; j < VPIF_CAPTURE_MAX_DEVICES; j++) { + ch = vpif_obj.dev[j]; + ch->channel_id = j; + config_params.video_limit[ch->channel_id] = 0; /* only enabled if second resource exists */ + if(cont_bufsize) { + config_params.video_limit[ch->channel_id] = size/2; + } + } + } for (j = 0; j < VPIF_CAPTURE_MAX_DEVICES; j++) { ch = vpif_obj.dev[j]; diff --git a/drivers/media/video/davinci/vpif_capture.h b/drivers/media/video/davinci/vpif_capture.h index 4e12ec8..b526887 100644 --- a/drivers/media/video/davinci/vpif_capture.h +++ b/drivers/media/video/davinci/vpif_capture.h @@ -155,6 +155,8 @@ struct vpif_config_params { u32 channel_bufsize[VPIF_CAPTURE_NUM_CHANNELS]; u8 default_device[VPIF_CAPTURE_NUM_CHANNELS]; u8 max_device_type; + /* Used for limiting the video buffers when we allocate memory*/ + u32 video_limit[VPIF_CAPTURE_NUM_CHANNELS]; }; /* Struct which keeps track of the line numbers for the sliced vbi service */ struct vpif_service_line { -- 1.6.3.3 -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html