[RFC] arm64: dts: imx8mm: Add MIPI and LCDIF nodes

Adam Ford aford173 at gmail.com
Wed Nov 10 04:41:06 UTC 2021


On Tue, Nov 9, 2021 at 6:24 PM Adam Ford <aford173 at gmail.com> wrote:
>
> On Tue, Nov 9, 2021 at 11:34 AM Tim Harvey <tharvey at gateworks.com> wrote:
> >
> > Add nodes for MIPI DSI and LCDIF on IMX8MM
> >
> > I'm currently working with a set of patches to convert drm/exynos
> > to a bridge [1] and add IMX8MM support [2] in order to get IMX8MM DSI
> > working for display with a Raspberry Pi DSI touchscreen compatible with
> > a Toshiba TC358762 DSI bridge and Powertip PH800480T013-IDF02
> > touchscreen.
> >
> > I had this working on a 5.10 kernel with the old blk-ctl and
> > power-domain drivers that didn't make it into mainline but my 5.15
> > series with blk-ctl backported from next hangs right after
> > "[drm] Initialized mxsfb-drm 1.0.0 20160824 for 32e00000.lcdif on minor 0"
> > so I assume I have a power-domain not getting enabled.
> >
> > Please let me know if you see an issue with the way I've configured
> > power-domain or clocks here.


I don't get hanging, but the samsung-dsi-imx driver doesn't load
automatically for some reason, so I manually modprobe it.  In my
configuration, I have lcdif->dsi->hdmi-bridge
When I modprobe the samsung-dsim-imx driver, I get the following:

[   50.217288] Unable to handle kernel NULL pointer dereference at
virtual address 0000000000000010
[   50.217292] Mem abort info:
[   50.217294]   ESR = 0x96000004
[   50.217297]   EC = 0x25: DABT (current EL), IL = 32 bits
[   50.217301]   SET = 0, FnV = 0
[   50.217303]   EA = 0, S1PTW = 0
[   50.217306]   FSC = 0x04: level 0 translation fault
[   50.217309] Data abort info:
[   50.217311]   ISV = 0, ISS = 0x00000004
[   50.217313]   CM = 0, WnR = 0
[   50.217316] user pgtable: 4k pages, 48-bit VAs, pgdp=0000000044dfb000
[   50.217320] [0000000000000010] pgd=0000000000000000, p4d=0000000000000000
[   50.217331] Internal error: Oops: 96000004 [#1] PREEMPT SMP
[   50.217336] Modules linked in: samsung_dsim_imx samsung_dsim 8021q
garp mrp stp llc caam_jr caamhash_desc caamalg_desc snd_soc_hdmi_codec
crypto_engine rng_core authenc libdes brcmfmac brcmutil cfg80211
crct10dif_ce etnaviv snd_soc_fsl_asoc_card mxsfb snd_soc_imx_audmux
gpu_sched fsl_imx8_ddr_perf imx8m_ddrc spi_imx spi_bitbang adv7511 cec
drm_kms_helper at24 caam clk_bd718x7 snd_soc_wm8962 rtc_pcf85363 error
rtc_snvs snvs_pwrkey imx8mm_thermal snd_soc_fsl_sai imx_pcm_dma
snd_soc_simple_card snd_soc_simple_card_utils imx_cpufreq_dt bluetooth
display_connector ecdh_generic ecc rfkill fuse drm ipv6
[   50.217453] CPU: 0 PID: 252 Comm: kworker/u8:4 Not tainted
5.15.0-ga6004e62a74a-dirty #3
[   50.217459] Hardware name: Beacon EmbeddedWorks i.MX8M Mini
Development Kit (DT)
[   50.217464] Workqueue: events_unbound deferred_probe_work_func
[   50.217482] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[   50.217488] pc : mxsfb_crtc_atomic_enable+0x60/0x5e0 [mxsfb]
[   50.217500] lr : mxsfb_crtc_atomic_enable+0x60/0x5e0 [mxsfb]
[   50.217508] sp : ffff800012b6b500
[   50.217510] x29: ffff800012b6b500 x28: ffff00000a52fe30 x27: 0000000000000000
[   50.217519] x26: ffff000004fb0800 x25: 0000000000000038 x24: ffff8000091ab770
[   50.217528] x23: 0000000000000038 x22: ffff800009150c80 x21: ffff000009f4b5e8
[   50.217536] x20: ffff00000a538d80 x19: ffff000009f4b080 x18: fffffffffffeae28
[   50.217544] x17: 0000000000000000 x16: 0000000000000000 x15: 0000000000000048
[   50.217552] x14: 0000000000000001 x13: 78696d7073696420 x12: fffffffffffcae27
[   50.217560] x11: ffff800011d32ed0 x10: 000000000000000a x9 : ffff800008fc3000
[   50.217569] x8 : ffff000003c71b80 x7 : 0000000000000000 x6 : 000000001abc391d
[   50.217577] x5 : 0000000000000130 x4 : 0000000000000000 x3 : 0000000000000000
[   50.217585] x2 : 0000000000000000 x1 : ffff00000874b880 x0 : 0000000000000000
[   50.217593] Call trace:
[   50.217596]  mxsfb_crtc_atomic_enable+0x60/0x5e0 [mxsfb]
[   50.217604]  drm_atomic_helper_commit_modeset_enables+0x208/0x250
[drm_kms_helper]
[   50.217725]  drm_atomic_helper_commit_tail_rpm+0x50/0xa0 [drm_kms_helper]
[   50.217797]  commit_tail+0xa4/0x184 [drm_kms_helper]
[   50.217869]  drm_atomic_helper_commit+0x160/0x370 [drm_kms_helper]
[   50.217940]  drm_atomic_commit+0x50/0x60 [drm]
[   50.218151]  drm_client_modeset_commit_atomic+0x1c8/0x260 [drm]
[   50.218284]  drm_client_modeset_commit_locked+0x60/0x19c [drm]
[   50.218413]  drm_client_modeset_commit+0x34/0x60 [drm]
[   50.218543]  drm_fb_helper_set_par+0xcc/0x124 [drm_kms_helper]
[   50.218649]  fbcon_init+0x394/0x4e0
[   50.218659]  visual_init+0xb4/0x104
[   50.218668]  do_bind_con_driver.isra.0+0x1c4/0x394
[   50.218676]  do_take_over_console+0x144/0x1fc
[   50.218683]  do_fbcon_takeover+0x6c/0xe0
[   50.218688]  fbcon_fb_registered+0x104/0x11c
[   50.218693]  register_framebuffer+0x1f4/0x350
[   50.218701]  __drm_fb_helper_initial_config_and_unlock+0x338/0x534
[drm_kms_helper]
[   50.218775]  drm_fbdev_client_hotplug+0x148/0x230 [drm_kms_helper]
[   50.218846]  drm_fbdev_generic_setup+0xb4/0x190 [drm_kms_helper]
[   50.218919]  mxsfb_probe+0x324/0x42c [mxsfb]
[   50.218929]  platform_probe+0x6c/0xe0
[   50.218938]  really_probe.part.0+0x9c/0x310
[   50.218946]  __driver_probe_device+0x98/0x144
[   50.218953]  driver_probe_device+0xc8/0x15c
[   50.218959]  __device_attach_driver+0xb8/0x120
[   50.218964]  bus_for_each_drv+0x78/0xd0
[   50.218971]  __device_attach+0xd8/0x180
[   50.218977]  device_initial_probe+0x18/0x24
[   50.218982]  bus_probe_device+0xa0/0xac
[   50.218988]  deferred_probe_work_func+0x88/0xc0
[   50.218995]  process_one_work+0x1d0/0x354
[   50.219001]  worker_thread+0x13c/0x470
[   50.219006]  kthread+0x154/0x160
[   50.219012]  ret_from_fork+0x10/0x20
[   50.219024] Code: f944ee61 b40000a1 aa1403e0 97f73bf5 (b9401017)
[   50.219030] ---[ end trace 8e3f6b78d85cbf0f ]---


Looking at the power domain, it appears that the LCDIf is enabled and
the power domain for it is active, but the dispblk-mipi-dsi power
domain is not:

root at beacon-imx8mm-kit:~# cat /sys/kernel/debug/pm_genpd/pm_genpd_summary
domain                          status          children
            performance
    /device                                             runtime status
----------------------------------------------------------------------------------------------
vpublk-h1                       off-0
            0
vpublk-g2                       off-0
            0
vpublk-g1                       off-0
            0
vpumix                          off-0
            0
    /devices/genpd:0:38330000.blk-ctrl                  suspended
            0
gpu                             off-0
            0
    /devices/platform/soc at 0/38000000.gpu                suspended
            0
    /devices/platform/soc at 0/38008000.gpu                suspended
            0
dispblk-mipi-csi                off-0
            0
dispblk-mipi-dsi                off-0
            0
    /devices/platform/soc at 0/32c00000.bus/32e10000.mipi_dsi  suspended
                0
dispblk-lcdif                   on
            0
    /devices/platform/soc at 0/32c00000.bus/32e00000.lcdif  active
             0
dispblk-csi-bridge              off-0
            0
mipi                            off-0
            0
    /devices/genpd:3:32e28000.blk-ctrl                  suspended
            0
    /devices/genpd:4:32e28000.blk-ctrl                  suspended
            0
dispmix                         on
            0
    /devices/genpd:0:32e28000.blk-ctrl                  active
            0
    /devices/genpd:1:32e28000.blk-ctrl                  suspended
            0
    /devices/genpd:2:32e28000.blk-ctrl                  active
            0
vpu-h1                          off-0
            0
    /devices/genpd:3:38330000.blk-ctrl                  suspended
            0
vpu-g2                          off-0
            0
    /devices/genpd:2:38330000.blk-ctrl                  suspended
            0
vpu-g1                          off-0
            0
    /devices/genpd:1:38330000.blk-ctrl                  suspended
            0
gpumix                          off-0
            0
    /devices/platform/soc at 0/30000000.bus/303a0000.gpc/imx-pgc-domain.5
 suspended                  0
usb-otg2                        off-0
            0
usb-otg1                        off-0
            0
pcie                            off-0
            0
hsiomix                         off-0
            0
    /devices/platform/soc at 0/30000000.bus/303a0000.gpc/imx-pgc-domain.1
 suspended                  0
    /devices/platform/soc at 0/30000000.bus/303a0000.gpc/imx-pgc-domain.2
 suspended                  0
    /devices/platform/soc at 0/30000000.bus/303a0000.gpc/imx-pgc-domain.3
 suspended                  0

I'll be traveling for the rest of the week, but I'll try to help when
I come back.

adam

> >
> > Best Regards,
> >
> > Tim
> > [1] https://patchwork.kernel.org/project/dri-devel/list/?series=347439&archive=both&state=*
> > [2] https://patchwork.kernel.org/project/linux-arm-kernel/list/?series=359775&archive=both&state=*
> > ---
> >  arch/arm64/boot/dts/freescale/imx8mm.dtsi | 68 +++++++++++++++++++++++
> >  1 file changed, 68 insertions(+)
> >
> > diff --git a/arch/arm64/boot/dts/freescale/imx8mm.dtsi b/arch/arm64/boot/dts/freescale/imx8mm.dtsi
> > index 208a0ed840f4..195dcbff7058 100644
> > --- a/arch/arm64/boot/dts/freescale/imx8mm.dtsi
> > +++ b/arch/arm64/boot/dts/freescale/imx8mm.dtsi
> > @@ -188,6 +188,12 @@
> >                 clock-output-names = "clk_ext4";
> >         };
> >
> > +       mipi_phy: mipi-video-phy {
> > +               compatible = "fsl,imx8mm-mipi-video-phy";
> > +               syscon = <&disp_blk_ctrl>;
> > +               #phy-cells = <1>;
> > +       };
> > +
> >         psci {
> >                 compatible = "arm,psci-1.0";
> >                 method = "smc";
> > @@ -1068,6 +1074,68 @@
> >                         #size-cells = <1>;
> >                         ranges = <0x32c00000 0x32c00000 0x400000>;
> >
> > +                       lcdif: lcdif at 32e00000 {
> > +                               #address-cells = <1>;
> > +                               #size-cells = <0>;
>
> If there is only 1 port I don't think you need address-cells and
> size-cells.  See more below....
>
> > +                               compatible = "fsl,imx8mm-lcdif", "fsl,imx6sx-lcdif";
> > +                               reg = <0x32e00000 0x10000>;
> > +                               clocks = <&clk IMX8MM_CLK_LCDIF_PIXEL>,
> > +                                        <&clk IMX8MM_CLK_DISP_AXI_ROOT>,
> > +                                        <&clk IMX8MM_CLK_DISP_APB_ROOT>;
> > +                               clock-names = "pix", "disp_axi", "axi";
> > +                               assigned-clocks = <&clk IMX8MM_CLK_LCDIF_PIXEL>,
> > +                                                 <&clk IMX8MM_CLK_DISP_AXI>,
> > +                                                 <&clk IMX8MM_CLK_DISP_APB>;
> > +                               assigned-clock-parents = <&clk IMX8MM_VIDEO_PLL1_OUT>,
> > +                                                        <&clk IMX8MM_SYS_PLL2_1000M>,
> > +                                                        <&clk IMX8MM_SYS_PLL1_800M>;
> > +                               assigned-clock-rate = <594000000>, <500000000>, <200000000>;
> > +                               interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;
> > +                               power-domains = <&disp_blk_ctrl IMX8MM_DISPBLK_PD_LCDIF>;
> > +                               status = "disabled";
> > +
> > +                               port at 0 {
> > +                                       reg = <0>;
>
> This should be just "port {" and we can get rid of the @0 and the "reg=0"
>
> This eliminates some build warnings.
> > +
> > +                                       lcdif_to_dsim: endpoint {
> > +                                               remote-endpoint = <&dsim_from_lcdif>;
> > +                                       };
> > +                               };
> > +                       };
> > +
> > +                       mipi_dsi: mipi_dsi at 32e10000 {
> > +                               #address-cells = <1>;
> > +                               #size-cells = <0>;
>
> I think this should move into a sub node...see below
>
> > +                               compatible = "fsl,imx8mm-mipi-dsim";
> > +                               reg = <0x32e10000 0x400>;
> > +                               clocks = <&clk IMX8MM_CLK_DSI_CORE>,
> > +                                        <&clk IMX8MM_CLK_DSI_PHY_REF>;
> > +                               clock-names = "bus_clk", "sclk_mipi";
> > +                               assigned-clocks = <&clk IMX8MM_CLK_DSI_CORE>,
> > +                                                 <&clk IMX8MM_VIDEO_PLL1_OUT>,
> > +                                                 <&clk IMX8MM_CLK_DSI_PHY_REF>;
> > +                               assigned-clock-parents = <&clk IMX8MM_SYS_PLL1_266M>,
> > +                                                        <&clk IMX8MM_VIDEO_PLL1_BYPASS>,
> > +                                                        <&clk IMX8MM_VIDEO_PLL1_OUT>;
> > +                               assigned-clock-rates = <266000000>, <594000000>, <27000000>;
> > +                               interrupts = <GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>;
> > +                               phys = <&mipi_phy 0>;
> > +                               phy-names = "dsim";
>
> I think the mipi_phy is the equivalent to the mipi_rst_mask in the
> power domain I added to the CSI.  Looking through the NXP 5.10 kernel,
>  BIT(17) is the reset for the MIPI_DSI.  I haven't tried it yet, but
> it makes me assume that BIT(16) is for the MIPI_CSI.
>
> Both bits are set in the imx-atf code, and the documentation isn't
> clear, but I tweaked the blk-ctrl driver to only set BIT(16) for the
> mipi_rst_mask on the CSI.  I still get some hanging, so it's not any
> better that way.
>
> > +                               power-domains = <&disp_blk_ctrl IMX8MM_DISPBLK_PD_MIPI_DSI>;
> > +                               samsung,burst-clock-frequency = <891000000>;
> > +                               samsung,esc-clock-frequency = <54000000>;
> > +                               samsung,pll-clock-frequency = <27000000>;
> > +                               status = "disabled";
> > +
>
> Add a subnode called "ports" and move address-cells and size-cells
> into it along wtih "port at 0"
>
> > +                               port at 0 {
> > +                                       reg = <0>;
> > +
> > +                                       dsim_from_lcdif: endpoint {
> > +                                               remote-endpoint = <&lcdif_to_dsim>;
> > +                                       };
> > +                               };
> > +                       };
> > +
> >                         csi: csi at 32e20000 {
> >                                 compatible = "fsl,imx8mm-csi", "fsl,imx7-csi";
> >                                 reg = <0x32e20000 0x1000>;
> > --
> > 2.17.1
> >


More information about the dri-devel mailing list