Re: [PATCH v3 3/3] media: rcar-{csi2,vin}: Move to full Virtual Channel routing per CSI-2 IP

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Niklas,

On Mon, Jan 24, 2022 at 8:13 PM Niklas Söderlund
<niklas.soderlund+renesas@xxxxxxxxxxxx> wrote:
> When Gen3 support was first added to this R-Car VIN and CSI-2 driver the
> routing was centred around the CHSEL register which multiplexes the
> different parallel buses that sit between the CSI-2 receivers source
> side and the VIN dma engines. This was a bad design as the multiplexing
> do allow for only a few combinations and do not play nice with many
> video streams in the system.
>
> For example it's only possible for CSI-2 Virtual Channels 0 and 1 of any
> given CSI-2 receiver to be used together with the scaler.
>
> Later datasheets have expanded the documentation and it is now possible
> to improve on this design by allowing any Virtual Channel to be routed
> to any R-Car VIN instance, provided that there exists a parallel bus
> between them. This increases the flexibility as all Virtual Channels can
> now be used together with the scaler for example.
>
> The redesign is not however perfect. While the new design allows for
> many more routes, two constrains limit a small portion of routes that
> was possible in the old design but are no more.
>
> - It is no longer possible to route the same CSI-2 and VC to more then
>   one VIN at a time. This was theoretically possible before if the
>   specific SoC allowed for the same CSI-2 and VC to be routed to two
>   different VIN capture groups.
>
> - It is no longer possible to simultaneously mix links from two CSI-2 IP
>   blocks to the same VIN capture group.
>
>   For example if VIN2 is capturing from CSI40 then VIN{0,1,3} must also
>   capture from CSI40. While VIN{4,5,6,7} is still free to capture from
>   any other CSI-2 IP in the system. Once all VIN{0,1,2,3} links to CSI40
>   are disabled that VIN capture group is free again to capture from any
>   other CSI-2 IP it is connected to.
>
> At the core of the redesign is greater cooperator of the R-Car VIN and
> CSI-2 drivers in configuring the routing. The VIN driver is after this
> change only responsible to configure the full VIN capture groups
> parallel buses to be to a particular CSI-2 IP. While the configuration
> of which CSI-2 Virtual Channel is outputted on which of the R-Car CSI-2
> IP output ports is handled by the CSI-2 driver.
>
> Before this change the CSI-2 Virtual Channel to output port was static
> in the CSI-2 driver and the different links only manipulated the VIN
> capture groups CHSEL register. With this change both the CHSEl register
> and the CSI-2 routing VCDT registers are modified for greater
> flexibility.
>
> This change touches both the R-Car VIN and R-Car CSI-2 drivers in the
> same commit as both drivers cooperate closely and one change without the
> other would more or less break video capture.
>
> Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@xxxxxxxxxxxx>
> Tested-by: Jacopo Mondi <jacopo+renesas@xxxxxxxxxx>

Thanks for your patch, which is now commit 3e52419ec04f9769 ("media:
rcar-{csi2,vin}: Move to full Virtual Channel routing per CSI-2 IP")
in v5.18-rc1.

This patch causes, depending on probe order, either one of the two
failures below (with some debug info added) on Ebisu-4D (but not
on Salvator-X(S)):

  1. rcar-vin: probe of e6ef5000.video failed with error -22

     Probing e6500000.i2c
     Probing adv748x
       adv748x 0-0070: Endpoint
/soc/i2c@e6500000/video-receiver@70/ports/port@7/endpoint on port 7
       adv748x 0-0070: Endpoint
/soc/i2c@e6500000/video-receiver@70/ports/port@8/endpoint on port 8
       adv748x 0-0070: Endpoint
/soc/i2c@e6500000/video-receiver@70/ports/port@a/endpoint on port 10
     Probing feaa0000.csi2
       Probing e6ef4000.video
         rcar-csi2 feaa0000.csi2: Consider updating driver rcar-csi2
to match on endpoints
         rcar-vin e6ef4000.video: Device registered as video0
       Probing e6ef5000.video
         rcar-vin e6ef5000.video: Device registered as video1
         rcar-vin e6ef4000.video: Removing video0
         rcar-vin e6ef5000.video: Removing video1
         rcar-vin e6ef5000.video: Notifier registration failed
         rcar-vin e6ef5000.video: rcar_vin_probe: rvin_csi2_init()
returned -EINVAL
         rcar-vin: probe of e6ef5000.video failed with error -22

     This is seen with v5.18-rc1 and later, but somehow I never noticed before.

  2. rcar-csi2: probe of feaa0000.csi2 failed with error -22

     Probing e6500000.i2c
     Probing adv748x
       adv748x 0-0070: Endpoint
/soc/i2c@e6500000/video-receiver@70/ports/port@7/endpoint on port 7
       adv748x 0-0070: Endpoint
/soc/i2c@e6500000/video-receiver@70/ports/port@8/endpoint on port 8
       adv748x 0-0070: Endpoint
/soc/i2c@e6500000/video-receiver@70/ports/port@a/endpoint on port 10
     Probing feaa0000.csi2
       rcar-csi2 feaa0000.csi2: Consider updating driver rcar-csi2 to
match on endpoints
         Probing e6ef4000
           rcar-vin e6ef4000.video: Device registered as video0
         Probing e6ef5000
           rcar-vin e6ef5000.video: Device registered as video1
       rcar-vin e6ef4000.video: Removing video0
       rcar-vin e6ef5000.video: Removing video1
       rcar-csi2 feaa0000.csi2: rcsi2_probe:
v4l2_async_register_subdev() returned -EINVAL
       rcar-csi2: probe of feaa0000.csi2 failed with error -22

     This is seen with[1], and did draw my attention, as it causes
     a big splat later:

         [  OK  ] Started D-Bus System Message Bus.
         Unable to handle kernel NULL pointer dereference at virtual
address 0000000000000000
         Unable to handle kernel NULL pointer dereference at virtual
address 0000000000000000
         Mem abort info:
           ESR = 0x0000000096000004
         Mem abort info:
           ESR = 0x0000000096000004
           EC = 0x25: DABT (current EL), IL = 32 bits
           SET = 0, FnV = 0
           EC = 0x25: DABT (current EL), IL = 32 bits
           EA = 0, S1PTW = 0
           FSC = 0x04: level 0 translation fault
           SET = 0, FnV = 0
         Data abort info:
           ISV = 0, ISS = 0x00000004
           EA = 0, S1PTW = 0
           FSC = 0x04: level 0 translation fault
           CM = 0, WnR = 0
         user pgtable: 4k pages, 48-bit VAs, pgdp=000000004ec45000
         [0000000000000000] pgd=0000000000000000, p4d=0000000000000000
         Data abort info:
         Internal error: Oops: 96000004 [#1] PREEMPT SMP
         CPU: 0 PID: 374 Comm: v4l_id Tainted: G        W
5.19.0-rc1-arm64-renesas-00799-gc13c3e49e8bd #1660
           ISV = 0, ISS = 0x00000004
         Hardware name: Renesas Ebisu-4D board based on r8a77990 (DT)
         pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
           CM = 0, WnR = 0
         pc : subdev_open+0x8c/0x128
         lr : subdev_open+0x78/0x128
         sp : ffff80000aadba60
         x29: ffff80000aadba60 x28: 0000000000000000 x27: ffff80000aadbc58
         x26: 0000000000020000 x25: ffff00000b3aaf00 x24: 0000000000000000
         x23: ffff00000c331c00 x22: ffff000009aa61b8 x21: ffff000009aa6000
         x20: ffff000008bae3e8 x19: ffff00000c3fe200 x18: 0000000000000000
         x17: ffff800076945000 x16: ffff800008004000 x15: 00008cc6bf550c7c
         x14: 000000000000038f x13: 000000000000001a x12: ffff00007fba8618
         x11: 0000000000000001 x10: 0000000000000000 x9 : ffff800009253954
         x8 : ffff00000b3aaf00 x7 : 0000000000000004 x6 : 000000000000001a
         x5 : 0000000000000000 x4 : 0000000000000000 x3 : 0000000000000001
         x2 : 0000000100000001 x1 : 0000000000000000 x0 : 0000000000000000
         Call trace:
          subdev_open+0x8c/0x128
          v4l2_open+0xa4/0x120
          chrdev_open+0x78/0x178
          do_dentry_open+0xfc/0x398
          vfs_open+0x28/0x30
          path_openat+0x584/0x9c8
          do_filp_open+0x80/0x108
          do_sys_openat2+0x20c/0x2d8
          user pgtable: 4k pages, 48-bit VAs, pgdp=000000004ec53000
          do_sys_open+0x54/0xa0
          __arm64_sys_openat+0x20/0x28
          invoke_syscall+0x40/0xf8
          el0_svc_common.constprop.0+0xf0/0x110
          do_el0_svc+0x20/0x78
          el0_svc+0x48/0xd0
          el0t_64_sync_handler+0xb0/0xb8
          el0t_64_sync+0x148/0x14c
         Code: f9405280 f9400400 b40000e0 f9400280 (f9400000)
         ---[ end trace 0000000000000000 ]---

     Adding debug prints to subdev_open() shows the opened files are
     v4l-subdev1 and v4l-subdev2, which correspond to subdevs on
     /soc/e6500000.i2c/i2c-0/0-0070.

Reverting this commit fixes the issue.

[1] "[PATCH v2 0/9] deferred_probe_timeout logic clean up"
    https://lore.kernel.org/r/20220601070707.3946847-1-saravanak@xxxxxxxxxx

Gr{oetje,eeting}s,

                        Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx

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



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux