Kernel panic when trying to use DSI-B

Hi all,

I have an application where I need a second HDMI output in TX1. For that purpose I’m trying to enable the DSI port.

As a starting point I’m using panel-a-wuxga-8-0 and it seems to be working properly with the default configuration as the board boots properly and I can see the DSI port listed when a run xrandr.
My problem is that I need to use port B and not A. To try to enable this I changed nvidia,dsi-instance from DSI_INSTANCE_0 to DSI_INSTANCE_1. When I do so, I get a kernel panic in tegra_dsi_init_hw function when calling tegra_dsi_panelB_enable, specifically at this line:

val = readl(IO_ADDRESS(APB_MISC_GP_MIPI_PAD_CTRL_0));

As a reference, here is the kernel output:

[    3.512536] Unable to handle kernel paging request at virtual address ffffffbdbf1f0820
[    3.512538] pgd = ffffffc0015af000
[    3.512548] [ffffffbdbf1f0820] *pgd=0000000178bc2003, *pud=0000000178bc2003, *pmd=0000000000000000
[    3.512555] Internal error: Oops: 96000006 [#1] PREEMPT SMP
[    3.512560] Modules linked in:
[    3.512567] CPU: 0 PID: 6 Comm: kworker/u8:0 Not tainted 4.4.38+ #12
[    3.512570] Hardware name: jetson_cv (DT)
[    3.512584] Workqueue: events_unbound async_run_entry_fn
[    3.512589] task: ffffffc0fb2f3e80 ti: ffffffc0fb320000 task.ti: ffffffc0fb320000
[    3.512599] PC is at tegra_dc_dsi_enable+0x350/0xb98
[    3.512605] LR is at tegra_dc_dsi_enable+0x350/0xb98
[    3.512609] pc : [<ffffffc000498798>] lr : [<ffffffc000498798>] pstate: 80000045
[    3.512611] sp : ffffffc0fb3239f0
[    3.512618] x29: ffffffc0fb3239f0 x28: ffffffbdbf1f0820 
[    3.512623] x27: ffffffc000be5f98 x26: ffffffc000be5f98 
[    3.512629] x25: ffffffc001049720 x24: ffffffc030270070 
[    3.512634] x23: ffffffc030238000 x22: ffffffc000be5fb0 
[    3.512639] x21: ffffffc001049000 x20: ffffffc030270000 
[    3.512644] x19: ffffffc000be5000 x18: 0000000000020000 
[    3.512649] x17: 000000000000135c x16: 0000000000000010 
[    3.512654] x15: ffffffc00132a7e8 x14: ffffffc001530c3a 
[    3.512659] x13: ffffffc00132a000 x12: ffffffc00150d000 
[    3.512664] x11: 0000000000000000 x10: 0000000000000000 
[    3.512669] x9 : 00000000000172f8 x8 : ffffffc00151753b 
[    3.512674] x7 : 0000000000000000 x6 : 000000000d0d1f8d 
[    3.512679] x5 : 0000000000000015 x4 : 00000000001aece7 
[    3.512684] x3 : 0000000000000004 x2 : ffffffc0fb320000 
[    3.512689] x1 : 0000000000000000 x0 : 0000000000000023 
[    3.512690] 
[    3.512694] Process kworker/u8:0 (pid: 6, stack limit = 0xffffffc0fb320020)
[    3.512696] Call trace:
[    3.512703] [<ffffffc000498798>] tegra_dc_dsi_enable+0x350/0xb98
[    3.512713] [<ffffffc00046fe30>] _tegra_dc_controller_enable+0x410/0x15e8
[    3.512719] [<ffffffc000471070>] _tegra_dc_enable+0x68/0xa8
[    3.512726] [<ffffffc0004735d4>] tegra_dc_probe+0x123c/0x1718
[    3.512733] [<ffffffc000610800>] platform_drv_probe+0x50/0xb8
[    3.512740] [<ffffffc00060e3f4>] driver_probe_device+0x17c/0x3d8
[    3.512746] [<ffffffc00060e6b8>] __driver_attach+0x68/0x98
[    3.512754] [<ffffffc00060c3a4>] bus_for_each_dev+0x54/0xa8
[    3.512759] [<ffffffc00060de18>] driver_attach+0x20/0x28
[    3.512765] [<ffffffc00060c89c>] driver_attach_async+0x14/0x50
[    3.512772] [<ffffffc0000c46d8>] async_run_entry_fn+0x78/0x158
[    3.512780] [<ffffffc0000bb8c8>] process_one_work+0x268/0x508
[    3.512786] [<ffffffc0000bbdec>] worker_thread+0x284/0x4a0
[    3.512791] [<ffffffc0000c2148>] kthread+0xf8/0x100
[    3.512799] [<ffffffc0000847a0>] ret_from_fork+0x10/0x30

Is this a known issue?
Am I missing something when trying to use port B? All I’m changing from the reference device tree is the nvidia,dsi-instance field.

Any help will be reaaly appriciated.

Just in case, I’m running this in a Jetson TX1 using Jetpack 3.2 (l4t 28.2).

  • Edison

tegra210-jetson-tx1-p2597-2180-a01-devkit.dtb.dts.txt (1.19 MB)

Edison_F_A,

I believe DSIb is not covered by our internal test and that code was added long time ago.

Not sure if rel-28.2 can work it or not. Could you also enable it on rel-24.2.1 with jetpack 2.3.1?

If old BSP can work, we can compare the difference between the driver.

Hi WayneWWW,

Thanks for your reply, I’ll give the old Jetpack a try and let you know how it goes.

Hi Edison,

Can you please try with the patch below and check if it helps?

diff --git a/drivers/video/tegra/dc/dsi.c b/drivers/video/tegra/dc/dsi.c
index 5b07fea…58a9f9d 100644
— a/drivers/video/tegra/dc/dsi.c
+++ b/drivers/video/tegra/dc/dsi.c
@@ -52,9 +52,6 @@
/* HACK! This needs to come from DT */
#include “…/…/…/…/arch/arm/mach-tegra/iomap.h”

-#define APB_MISC_GP_MIPI_PAD_CTRL_0 (TEGRA_APB_MISC_BASE + 0x820)
-#define DSIB_MODE_ENABLE 0x2

#define DSI_USE_SYNC_POINTS 1

#define S_TO_MS(x) (1000 * (x))
@@ -2494,16 +2491,6 @@ static void tegra_dsi_pad_calibration(struct tegra_dc_dsi_data *dsi)
tegra_dsi_mipi_calibration_21x(dsi);
}

-#if !defined(CONFIG_TEGRA_NVDISPLAY)
-static void tegra_dsi_panelB_enable(void)
-{

  •   unsigned int val;
    
  •   val = readl(IO_ADDRESS(APB_MISC_GP_MIPI_PAD_CTRL_0));
    
  •   val |= DSIB_MODE_ENABLE;
    
  •   writel(val, (IO_ADDRESS(APB_MISC_GP_MIPI_PAD_CTRL_0)));
    

-}
-#endif
static int tegra_dsi_init_hw(struct tegra_dc *dc,
struct tegra_dc_dsi_data *dsi)
{
@@ -2534,12 +2521,7 @@ static int tegra_dsi_init_hw(struct tegra_dc dc,
DSI_POWER_CONTROL);
/
stabilization delay */
udelay(300);
-#if !defined(CONFIG_TEGRA_NVDISPLAY)

  •   if (dsi->info.dsi_instance || dsi->info.ganged_type ||
    
  •           dsi->info.dsi_csi_loopback)
    
  •           tegra_dsi_panelB_enable();
    

-#endif
tegra_dsi_set_phy_timing(dsi, DSI_LPHS_IN_LP_MODE);

    /* Initialize DSI registers */

Hi galmar,

Thanks for the path, I tested it and the kernel doesn’t crash any more but I don’t think port B is working. When I put a scope in the MIPI lines I see some activity but it looks more like noise.
Removing the tegra_dsi_panelB_enable function avoids the crash but setting the DSIB_MODE_ENABLE bit seems to be necessary to enable port B and is at that point where the kernel crashes.

I also tested with JP 2.3.1 and in this case the kernel boots fine but still don’t get anything in the MIPI lines.

I’ll continue debugging and see if I can find anything else.

  • Edison

Edison_F_A,

May I ask why do you need to use DSI-B? Isn’t DSI-A working well? I fear it would take some time to investigate this issue and influence your project progress.

Hi Wayne,

We are using a custom board to interface with Jetson eval board and it uses DSI-B so at this point DSI-A is not an option for us. We also need this to work with TX2 so I’ll give it a try and see how it works.

Do you know what is the status of this support in TX2?

-Edison

Edison_F_A,

I guess tx2 needs to use DSI-C instead of DSI-B and it should work, because few weeks ago, there was a forum user who is able to do it.

Please share your device tree on tx1 for us. Thanks!

Hi Wayne,

You are right, in TX2 it would be DSI-C/D (Port B in the eval board). Also, I’m attaching my device tree.

-Edison

Edison_F_A,

Could you also share the full dmesg?

Hi Edison_F_A,

Do you need to enable dual DSI on either TX1 or TX2, or both module?

Hi Wayne,

Thanks a lot for your help and sorry about the delay in my responses. I can’t get the dmesg log today but I’ll try to do it tomorrow.
Regarding TX1/TX2, I need to have both working. I was able to get port B (DSI-C/D) working on TX2 so now I need to have the same functionality on TX1.

  • Edison

Hi Wayne,

Please find attached the complete boot log. I created 2 versions: One is without any patch which is the one that crashes and one with the patch suggested by galmar.
In the second case the kernel doesn’t crash but in both cases port B (DSI_INSTANCE_1) is not working.

Regards,
Edison
dmesg_crash.log (56.6 KB)
dmesg_patched.log (111 KB)

Edison_F_A,

Could you see this panel in xrandr after applying galmar’s patch?

Hi Wayne,

Yes, if I run xrandr I can see both the HDMI and DSI outputs listed.

-Edison

Edison_F_A,

xrandr can work, but ubuntu GUI cannot reach(show on) your DSIB?
Is the panel info from xrandr correct?

Hi Wayne,

The information shown be xrandr is correct but I have no video in the DSI port.

I’m using the same setup with a TX2 and in that case it works as expected (I can get both the HDMI and DSI outputs working).

-Edison

Edison_F_A,

Are you using full rootfs from Jetpack? That is, do you have gnome desktop?

If you are using gnome desktop, what did you see? Totally blanked dsi? Are you using dual monitor(HDMI+DSI) or single one (DSI)?

Hi Wayne,

Yes, I have the full rootfs with ubuntu. It is configured for dual monitor. The HDMI output is working properly (I can see ubuntu desktop) but in the DSI output I see nothing. This is the same for any configuration (mirror, DSI right, DSI left, …).

-Edison