[QUESTION] Possible ways of preventing GPIO probing

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

 



Hi,

I'm on a Xilinx UltraScale+ MPSoC SoC, and the kernel is v6.6.

It's a heterogeneous SoC including:

- Cortex-A53*4 (APU, Application Processing Unit)
- Cortex-R5*2 (RPU, Real-time Processing Unit)
- MicroBlaze based platform management unit (PMU)
- MicroBlaze based configuration security unit (CSU)

The SoC features a facility called Xilinx Peripheral Protection Unit
(XPPU), which prevents unintended access of GPIO (and the likes) from
particular processing units.

In my case, I found that Linux running on APU (A53 cores) attempts to
probe the GPIO used by the RPU (R5 cores), which requires the RPU to
do GPIO init again after the probe. Given this, I employ XPPU to
prevent Linux from accessing the GPIO [0], which seemingly works since
Linux then panic'd after the provisioning of XPPU. Following is the
panic message:

[    3.627182] SError Interrupt on CPU0, code 0x00000000bf000002 -- SError
[    3.627190] CPU: 0 PID: 32 Comm: kworker/u9:0 Not tainted
6.6.40-xilinx-g2b7f6f70a62a #1
[    3.627197] Hardware name: ZynqMP ZCU102 Rev1.0 (DT)
[    3.627201] Workqueue: events_unbound deferred_probe_work_func
[    3.627216] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
[    3.627223] pc : zynq_gpio_probe+0x1fc/0x3b4
[    3.627232] lr : zynq_gpio_probe+0x190/0x3b4
[    3.627238] sp : ffff8000819d3b60
[    3.627240] x29: ffff8000819d3b60 x28: ffff0008001dd0c0 x27: ffff000800011498
[    3.627250] x26: ffff0008001dd100 x25: ffff000800011400 x24: ffff00080372b0c0
[    3.627258] x23: ffff0008000fcc00 x22: 0000000000000001 x21: ffff0008000fcc10
[    3.627266] x20: ffff000802ea6880 x19: ffff000802ea6940 x18: ffffffffffffffff
[    3.627275] x17: ffff000800134c00 x16: ffff000800d3e000 x15: ffff8000819d3510
[    3.627284] x14: ffff00080002791c x13: ffff80008172b520 x12: 0000000000000019
[    3.627292] x11: ffff80008112cba0 x10: ffff84008349feaf x9 : 0000000000000028
[    3.627301] x8 : ffff00080372b120 x7 : 0000000000000000 x6 : 00000000552478d3
[    3.627309] x5 : 00000000ffffffff x4 : ffff800081d54000 x3 : ffff8000806a6d1c
[    3.627317] x2 : 0000000000000000 x1 : ffff800081d54354 x0 : ffff0008000fcc10
[    3.627326] Kernel panic - not syncing: Asynchronous SError Interrupt
[    3.627330] CPU: 0 PID: 32 Comm: kworker/u9:0 Not tainted 6.6.40
-xilinx-g2b7f6f70a62a #1
[    3.627335] Hardware name: ZynqMP ZCU102 Rev1.0 (DT)
[    3.627338] Workqueue: events_unbound deferred_probe_work_func
[    3.627346] Call trace:
[    3.627349]  dump_backtrace+0x90/0xe8
[    3.627360]  show_stack+0x18/0x24
[    3.627369]  dump_stack_lvl+0x48/0x60
[    3.627379]  dump_stack+0x18/0x24
[    3.627387]  panic+0x314/0x370
[    3.627394]  nmi_panic+0x8c/0x90
[    3.627401]  arm64_serror_panic+0x6c/0x78
[    3.627407]  do_serror+0x28/0x68
[    3.627413]  el1h_64_error_handler+0x30/0x48
[    3.627423]  el1h_64_error+0x64/0x68
[    3.627429]  zynq_gpio_probe+0x1fc/0x3b4
[    3.627435]  platform_probe+0x68/0xc4
[    3.627443]  really_probe+0x148/0x2b0
[    3.627449]  __driver_probe_device+0x78/0x12c
[    3.627456]  driver_probe_device+0xd8/0x15c
[    3.627462]  __device_attach_driver+0xb8/0x134
[    3.627468]  bus_for_each_drv+0x88/0xe8
[    3.627473]  __device_attach+0xa0/0x190
[    3.627480]  device_initial_probe+0x14/0x20
[    3.627486]  bus_probe_device+0xac/0xb0
[    3.627492]  deferred_probe_work_func+0x88/0xc0
[    3.627498]  process_one_work+0x138/0x28c
[    3.627506]  worker_thread+0x2a4/0x4bc
[    3.627512]  kthread+0xe0/0xe4
[    3.627519]  ret_from_fork+0x10/0x20
[    3.627527] SMP: stopping secondary CPUs
[    3.627533] Kernel Offset: disabled
[    3.627535] CPU features: 0x0,00000008,00020000,0000420b
[    3.627540] Memory Limit: none
[    3.885271] ---[ end Kernel panic - not syncing: Asynchronous
SError Interrupt ]---

At the moment of the panic, which is just after the employment of the
XPPU, I thought that I should disable the GPIO in devicetree. However,
after the GPIO got disabled [1], the panic still present.  Is it
because that, in this case, I can't simply disabling the GPIO through
adding 'status="disable";' ?

If there's any RTFM thing I should do beforehand, please provide me
some keywords or in-tree document names.

[0] I believe this is simply an initial step since I would also need
to teach Linux not to use/probe this particular GPIO.
[1] I can assure that the GPIO does get disabled since it was a
heartbeat LED for Linux, which no longer beats/flashes after the
devicetree disable thing.

Thanks!
Fox




[Index of Archives]     [Linux SPI]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux