From: Vladimir Barinov <vladimir.barinov@cogentembedded.com>
To: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Cc: Sergei Shtylyov <sergei.shtylyov@cogentembedded.com>,
mchehab@redhat.com,
Linux Media Mailing List <linux-media@vger.kernel.org>,
Magnus Damm <magnus.damm@gmail.com>,
linux-sh@vger.kernel.org, phil.edworthy@renesas.com,
matsu@igel.co.jp
Subject: Re: [PATCH v2 1/4] V4L2: soc_camera: Renesas R-Car VIN driver
Date: Tue, 30 Apr 2013 17:35:42 +0000 [thread overview]
Message-ID: <518000EE.40502@cogentembedded.com> (raw)
In-Reply-To: <517D7195.1020301@cogentembedded.com>
Hi, Guennadi,
Thank you for the review!
Sergei Shtylyov wrote:
>
>> I also strongly suspent some #include <media/v4l2-*.h> headers are
>> missing
>> above.
>
> Hm, I wonder which. I'm certainly not V4L2 expert...
added following:
#include <media/v4l2-common.h>
#include <media/v4l2-dev.h>
#include <media/v4l2-device.h>
#include <media/v4l2-mediabus.h>
#include <media/v4l2-subdev.h>
>>> + alloc_ctxs[0] = priv->alloc_ctx;
>>> +
>>> + if (!vq->num_buffers)
>>> + priv->sequence = 0;
>>> +
>>> + if (!*count)
>>> + *count = 2;
>>> + priv->vb_count = *count;
>>> +
>>> + *num_planes = 1;
>>> +
>>> + /* Number of hardware slots */
>>> + if (priv->vb_count > MAX_BUFFER_NUM)
>>> + priv->nr_hw_slots = MAX_BUFFER_NUM;
>>> + else
>>> + priv->nr_hw_slots = 1;
>
>> Is this really correct: with up to 3 buffers only one HW slot is used?
>
> Probably not.
After replacing (priv->vb_count > MAX_BUFFER_NUM) with
is_continuous_transfer(priv) the logic becomes clear.
>>> + break;
>>> + default:
>>> + vnmc = VNMC_IM_ODD;
>>> + break;
>>> + }
>>> +
>>> + /* input interface */
>>> + switch (icd->current_fmt->code) {
>>> + case V4L2_MBUS_FMT_YUYV8_1X16:
>>> + /* BT.601/BT.1358 16bit YCbCr422 */
>>> + vnmc |= VNMC_INF_YUV16;
>>> + input_is_yuv = 1;
>>> + break;
>>> + case V4L2_MBUS_FMT_YUYV8_2X8:
>>> + input_is_yuv = 1;
>>> + /* BT.656 8bit YCbCr422 or BT.601 8bit YCbCr422 */
>>> + vnmc |= priv->pdata->flags & RCAR_VIN_BT656 ?
>>> + VNMC_INF_YUV8_BT656 : VNMC_INF_YUV8_BT601;
>
>> Let's clarify this. By BT.656 you mean embedded synchronisation
>> patterns,
>> right? In that case HSYNC and VSYNC signals aren't used.
>
> Probably so, at least I know for sure HSYNC/VSYNC aren't used.
Yes, it is.
BT.656 uses embedded synchronization and HSYNC/VSYNC are not used for
this type of interface.
The BT.601 is a so-called by soc-camera layer MBUS_PARALLEL.
>
>> But in your
>> .set_bus_param() method you only support V4L2_MBUS_PARALLEL and not
>> V4L2_MBUS_BT656. And what do you call BT601? A bus with sync signals
>> used?
> Yeah, judging from the manual, HSYNC, VSYNC, FIELD are used in BT.601.
The name ITUR BT601 YCbCr that comes from specification is a
MBUS_PARALLEL name per soc-camera layer naming.
The BT601 is expected to use h/w sync signals.
I've removed the pre initialization of v4l2_mbus_config .type filed in
favour of getting it from camera/decoder subdevice.
Thx for pointing to this.
>>> + }
>>> + }
>>> + spin_unlock_irq(&priv->lock);
>>> +
>>> + pm_runtime_put_sync(ici->v4l2_dev.dev);
>
>> Do you really need the _sync version above?
>
> I'm not runtime PM expert, to be honest...
replaced with pm_runtime_put().
thx for pointing to this.
>
>>> +static u16 calc_scale(unsigned int src, unsigned int *dst)
>>> +{
>>> + u16 scale;
>>> +
>>> + if (src = *dst)
>>> + return 0;
>>> +
>>> + scale = (src * 4096 / *dst) & ~7;
>>> +
>>> + while (scale > 4096 && size_dst(src, scale) < *dst)
>>> + scale -= 8;
>>> +
>>> + *dst = size_dst(src, scale);
>>> +
>>> + return scale;
>
>> return value of this function is unused by the caller. Generally,
>> your use
>> of these two functions is different than on CEU, you might want to
>> get rid
>> of them completely.
I'd prefer to leave this function and provide fixes after scaling is
fully tested.
>>> + /* Set Start/End Pixel/Line Pre-Clip */
>>> + iowrite32(left_offset << dsize, priv->base + VNSPPRC_REG);
>>> + iowrite32((left_offset + cam->width - 1) << dsize,
>>> + priv->base + VNEPPRC_REG);
>
>> Do you have to shift for all 32-bit formats, not only for RGB32? I
>> understand this is related to the fact, that you don't support
>> pass-through...
>
> At least the manual says to program an even number to VnSPPrC...
The driver explicitly says that V4L2_PIX_FMT_RGB32 is the only 32bit
format supported.
>>> +static void capture_stop_preserve(struct rcar_vin_priv *priv, u32
>>> *vnmc)
>>> +{
>>> + *vnmc = ioread32(priv->base + VNMC_REG);
>>> + /* module disable */
>>> + iowrite32(*vnmc & ~VNMC_ME, priv->base + VNMC_REG);
>>> +}
>>> +
>>> +static void capture_restore(struct rcar_vin_priv *priv, u32 vnmc)
>>> +{
>>> + unsigned long timeout = jiffies + 10 * HZ;
>>> +
>>> + if (!(vnmc & ~VNMC_ME))
>>> + /* Nothing to restore */
>>> + return;
>
>> And you don't have to wait for a frame end?
>
> If the module wasn't active, there's probably no point... however,
> let's
> defer it to Vladimir.
Right. Thx for catching this.
>>> + },
>>> + {
>>> + .fourcc = V4L2_PIX_FMT_YUYV,
>>> + .name = "YUYV",
>>> + .bits_per_sample = 16,
>>> + .packing = SOC_MBUS_PACKING_NONE,
>>> + .order = SOC_MBUS_ORDER_LE,
>
>> This conversion block is identical to the respective one in
>> soc_mediabus.c, which suggests to me, that no conversion is taking place
>> here. Then this mode should be usable for generic 8- or 16-bit
>> pass-through?
>
> Let's defer this question to Vladimir.
Will add pass-through. Thank you.
>>> + switch (code) {
>>> + case V4L2_MBUS_FMT_YUYV8_1X16:
>>> + case V4L2_MBUS_FMT_YUYV8_2X8:
>>> + if (cam->extra_fmt)
>>> + break;
>>> +
>>> + /* Add all our formats that can be generated by VIN */
>>> + cam->extra_fmt = rcar_vin_formats;
>>> +
>>> + n = ARRAY_SIZE(rcar_vin_formats);
>>> + formats += n;
>>> + for (k = 0; xlate && k < n; k++, xlate++) {
>>> + xlate->host_fmt = &rcar_vin_formats[k];
>>> + xlate->code = code;
>>> + dev_dbg(dev, "Providing format %s using code %d\n",
>>> + rcar_vin_formats[k].name, code);
>>> + }
>>> + break;
>>> + default:
>>> + return 0;
>
>> The above tells me, that VIN (or at least this driver) can only capture
>> YUYV8 either over an 8- or a 16-bit bus. Isn't it possible to provide a
>> pass-through mode?
>
> 10/12-bit bus is also possible in UYUV format and 20/24-bit bus in
> 10/12 bits (Y) + 10/12 bits (CbCr) format on R-Car H1 VIN0/1. Not all
> VIN interfaces are created equal in capabilities even within one
> SoC... VIN2 indeed only supports 8 or 16 bits, and VIN3 only supports
> 8-bit bus.
Ditto
>>> +/* Similar to set_crop multistage iterative algorithm */
>>> +static int rcar_vin_set_fmt(struct soc_camera_device *icd,
>>> + struct v4l2_format *f)
>>> +{
>>> + struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
>>> + struct rcar_vin_priv *priv = ici->priv;
>>> + struct rcar_vin_cam *cam = icd->host_priv;
>>> + struct v4l2_pix_format *pix = &f->fmt.pix;
>>> + struct v4l2_mbus_framefmt mf;
>>> + struct device *dev = icd->parent;
>>> + __u32 pixfmt = pix->pixelformat;
>>> + const struct soc_camera_format_xlate *xlate;
>>> + unsigned int vin_sub_width = 0, vin_sub_height = 0;
>>> + u16 scale_v, scale_h;
>>> + int ret;
>>> + bool can_scale;
>>> + bool data_through;
>
>> What exactly does data_through mean? I thought it meant a pass-through
>> mode, but it is set to true for a YUYV->RGB32 conversion, which isn't
>> pass-through obviously.
>
> Maybe it's just bset incorrectly. As I said, data through should
> only be supported on R-Car E1 IIRC.
the data_through is removed per prev request and added just the check
for RGB32 FMT in order to use a shift.
>
> [...]
>>> + data_through = pixfmt = V4L2_PIX_FMT_RGB32;
>
>> What is "data_through" and why is RGB32 so special?
>
> DIIK, to be honest. :-)
We will provide all detailed info once E1 will be up. Unfortunately, the
E1 is not up but it is on the schedule.
>> VIN can scale _everything_ except NV16 and RGB32?
>
Depends on SOC ..... RGB32 and NV16 are applicable to E1 only .... we'll
make the VIN module differentiation depending on SoC (H/M/E ...)
>>> +static int rcar_vin_init_videobuf2(struct vb2_queue *vq,
>>> + struct soc_camera_device *icd)
>>> +{
>>> + vq->type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
>>> + vq->io_modes = VB2_MMAP | VB2_USERPTR;
>>> + vq->drv_priv = icd;
>>> + vq->ops = &rcar_vin_vb2_ops;
>>> + vq->mem_ops = &vb2_dma_contig_memops;
>>> + vq->buf_struct_size = sizeof(struct rcar_vin_buffer);
>
>> Please, add
>
>> vq->timestamp_type = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
>
There is not such field in "struct vb2_queue".
All other parts of review are reworked per suggestions.
Regards,
Vladimir
next prev parent reply other threads:[~2013-04-30 17:35 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-19 22:31 [PATCH v2 1/4] V4L2: soc_camera: Renesas R-Car VIN driver Sergei Shtylyov
2013-04-23 3:08 ` Katsuya MATSUBARA
2013-04-23 4:38 ` Sergei Shtylyov
2013-04-23 5:45 ` Katsuya MATSUBARA
2013-04-24 15:53 ` Magnus Damm
2013-04-25 14:20 ` Guennadi Liakhovetski
2013-04-28 18:59 ` Sergei Shtylyov
2013-04-29 7:23 ` Guennadi Liakhovetski
2013-04-29 11:12 ` Sergei Shtylyov
2013-04-30 17:35 ` Vladimir Barinov [this message]
2013-05-01 5:38 ` Guennadi Liakhovetski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=518000EE.40502@cogentembedded.com \
--to=vladimir.barinov@cogentembedded.com \
--cc=g.liakhovetski@gmx.de \
--cc=linux-media@vger.kernel.org \
--cc=linux-sh@vger.kernel.org \
--cc=magnus.damm@gmail.com \
--cc=matsu@igel.co.jp \
--cc=mchehab@redhat.com \
--cc=phil.edworthy@renesas.com \
--cc=sergei.shtylyov@cogentembedded.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox