Message ID | 20191106232304.2332121-1-niklas.soderlund+renesas@ragnatech.se (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | rcar-vin: Limit NV12 availability to supported VIN channels only | expand |
Hi Niklas, On Thu, Nov 7, 2019 at 12:25 AM Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> wrote: > When adding support for NV12 it was overlooked that the pixel format is > only supported on some VIN channels. Fix this by adding a check to only > accept NV12 on the supported channels (0, 1, 4, 5, 8, 9, 12 and 13). > > Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> Thanks for your patch! > --- a/drivers/media/platform/rcar-vin/rcar-v4l2.c > +++ b/drivers/media/platform/rcar-vin/rcar-v4l2.c > @@ -76,7 +76,12 @@ const struct rvin_video_format *rvin_format_from_pixel(struct rvin_dev *vin, > if (vin->info->model == RCAR_M1 && pixelformat == V4L2_PIX_FMT_XBGR32) > return NULL; > > - if (pixelformat == V4L2_PIX_FMT_NV12 && !vin->info->nv12) > + /* > + * If NV12 is supported it's only supported on some channels (0, 1, 4, > + * 5, 8, 9, 12 and 13). Is this true for all SoCs, or do you need a vin->info->model == RCAR_GEN3 check? > + */ > + if (pixelformat == V4L2_PIX_FMT_NV12 && > + (!vin->info->nv12 || BIT(vin->id) & 0xcccc)) > return NULL; So 0xcccc = ~(BIT(0) | BIT(1) | BIT(4) | ...)? What if you ever have an id larger than 15? Wouldn't it be safer to check for !(BIT(vin->id) & 0x3333)? Gr{oetje,eeting}s, Geert
Hi Geert, Thanks for your feedback. On 2019-11-07 08:41:11 +0100, Geert Uytterhoeven wrote: > Hi Niklas, > > On Thu, Nov 7, 2019 at 12:25 AM Niklas Söderlund > <niklas.soderlund+renesas@ragnatech.se> wrote: > > When adding support for NV12 it was overlooked that the pixel format is > > only supported on some VIN channels. Fix this by adding a check to only > > accept NV12 on the supported channels (0, 1, 4, 5, 8, 9, 12 and 13). > > > > Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> > > Thanks for your patch! > > > --- a/drivers/media/platform/rcar-vin/rcar-v4l2.c > > +++ b/drivers/media/platform/rcar-vin/rcar-v4l2.c > > @@ -76,7 +76,12 @@ const struct rvin_video_format *rvin_format_from_pixel(struct rvin_dev *vin, > > if (vin->info->model == RCAR_M1 && pixelformat == V4L2_PIX_FMT_XBGR32) > > return NULL; > > > > - if (pixelformat == V4L2_PIX_FMT_NV12 && !vin->info->nv12) > > + /* > > + * If NV12 is supported it's only supported on some channels (0, 1, 4, > > + * 5, 8, 9, 12 and 13). > > Is this true for all SoCs, or do you need a vin->info->model == RCAR_GEN3 > check? NV12 is only supported by most Gen3 SoCs, but no extra check is needed as vin->info->nv12 is only set for the Gen3 SoCs that can support NV12. > > > + */ > > + if (pixelformat == V4L2_PIX_FMT_NV12 && > > + (!vin->info->nv12 || BIT(vin->id) & 0xcccc)) > > return NULL; > > So 0xcccc = ~(BIT(0) | BIT(1) | BIT(4) | ...)? Yes. > What if you ever have an id larger than 15? > Wouldn't it be safer to check for !(BIT(vin->id) & 0x3333)? There is no SoC with more then 16 VIN instances, today... Maybe your suggestion of the inverted check makes more sens. Will respin a v2. > > Gr{oetje,eeting}s, > > Geert > > -- > Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org > > In personal conversations with technical people, I call myself a hacker. But > when I'm talking to journalists I just say "programmer" or something like that. > -- Linus Torvalds
Hi Niklas, On Thu, Nov 7, 2019 at 8:47 AM Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> wrote: > On 2019-11-07 08:41:11 +0100, Geert Uytterhoeven wrote: > > On Thu, Nov 7, 2019 at 12:25 AM Niklas Söderlund > > <niklas.soderlund+renesas@ragnatech.se> wrote: > > > When adding support for NV12 it was overlooked that the pixel format is > > > only supported on some VIN channels. Fix this by adding a check to only > > > accept NV12 on the supported channels (0, 1, 4, 5, 8, 9, 12 and 13). > > > > > > Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> > > > > Thanks for your patch! > > > > > --- a/drivers/media/platform/rcar-vin/rcar-v4l2.c > > > +++ b/drivers/media/platform/rcar-vin/rcar-v4l2.c > > > @@ -76,7 +76,12 @@ const struct rvin_video_format *rvin_format_from_pixel(struct rvin_dev *vin, > > > if (vin->info->model == RCAR_M1 && pixelformat == V4L2_PIX_FMT_XBGR32) > > > return NULL; > > > > > > - if (pixelformat == V4L2_PIX_FMT_NV12 && !vin->info->nv12) > > > + /* > > > + * If NV12 is supported it's only supported on some channels (0, 1, 4, > > > + * 5, 8, 9, 12 and 13). > > > > Is this true for all SoCs, or do you need a vin->info->model == RCAR_GEN3 > > check? > > NV12 is only supported by most Gen3 SoCs, but no extra check is needed > as vin->info->nv12 is only set for the Gen3 SoCs that can support NV12. Thanks, had missed the meaning of the vin->info->nv12 check. > > > + */ > > > + if (pixelformat == V4L2_PIX_FMT_NV12 && > > > + (!vin->info->nv12 || BIT(vin->id) & 0xcccc)) > > > return NULL; > > > > So 0xcccc = ~(BIT(0) | BIT(1) | BIT(4) | ...)? > > Yes. > > > What if you ever have an id larger than 15? > > Wouldn't it be safer to check for !(BIT(vin->id) & 0x3333)? > > There is no SoC with more then 16 VIN instances, today... Maybe your > suggestion of the inverted check makes more sens. Will respin a v2. OK. BTW, the code may look nicer if you start using a "switch (pixelformat) { ... }" block to handle all special cases. Gr{oetje,eeting}s, Geert
diff --git a/drivers/media/platform/rcar-vin/rcar-v4l2.c b/drivers/media/platform/rcar-vin/rcar-v4l2.c index 9e2e63ffcc47acad..62d308a4ddaee82e 100644 --- a/drivers/media/platform/rcar-vin/rcar-v4l2.c +++ b/drivers/media/platform/rcar-vin/rcar-v4l2.c @@ -76,7 +76,12 @@ const struct rvin_video_format *rvin_format_from_pixel(struct rvin_dev *vin, if (vin->info->model == RCAR_M1 && pixelformat == V4L2_PIX_FMT_XBGR32) return NULL; - if (pixelformat == V4L2_PIX_FMT_NV12 && !vin->info->nv12) + /* + * If NV12 is supported it's only supported on some channels (0, 1, 4, + * 5, 8, 9, 12 and 13). + */ + if (pixelformat == V4L2_PIX_FMT_NV12 && + (!vin->info->nv12 || BIT(vin->id) & 0xcccc)) return NULL; for (i = 0; i < ARRAY_SIZE(rvin_formats); i++)
When adding support for NV12 it was overlooked that the pixel format is only supported on some VIN channels. Fix this by adding a check to only accept NV12 on the supported channels (0, 1, 4, 5, 8, 9, 12 and 13). Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se> --- drivers/media/platform/rcar-vin/rcar-v4l2.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)