This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM4372: PRU processor rpmsg device node not created and GPIO pin controlled by PRU is asserted

Part Number: AM4372

Kernel version used: 5.4.28

Over board firmware updates, sometimes we see device node /dev/rpmsg_pru31 not created and hence communication to the PRU is not happening.

Another problem is PRU controls one of the GPIO pin and that too is found asserted at the same time. Not sure about the correlation of GPIO assertion vs rpmsg_pru31 device not created

However, try to check the state of PRU core(s) in that state shows that they are in running state

bash-5.0# ls -lh /dev/rpmsg_pru31
ls: /dev/rpmsg_pru31: No such file or directory

bash-5.0# cat /sys/class/remoteproc/remoteproc1/state
running
bash-5.0# cat /sys/class/remoteproc/remoteproc2/state
running

 

bash-5.0# lsmod | grep pru
pru_rproc              24576  2
irq_pruss_intc         16384  2 pru_rproc
pruss                  16384  1 pru_rproc

 

bash-5.0# lsmod | grep rp
virtio_rpmsg_bus       20480  0
pru_rproc              24576  2
irq_pruss_intc         16384  2 pru_rproc
pruss                  16384  1 pru_rproc

 

Also, below is the capture of dmesg during the bootup where the issue was found. Let me know for any further info needed

bash-5.0# dmesg
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 5.4.28-MS_OCS_RM_1.1.37.254421-g6f3bf13d53 (oe-user@oe-host) (gcc version 9.2.0 (GCC)) #1 PREEMPT Tue Nov 4 05:00:41 UTC 2025
[    0.000000] CPU: ARMv7 Processor [412fc09a] revision 10 (ARMv7), cr=10c53c7d
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] OF: fdt: Machine model: MS_OCS_RM_1.1.37.254421
[    0.000000] Memory policy: Data cache writeback
[    0.000000] efi: Getting EFI parameters from FDT:
[    0.000000] efi: UEFI not found.
[    0.000000] cma: Reserved 48 MiB at 0xbd000000
[    0.000000] On node 0 totalpages: 262144
[    0.000000]   Normal zone: 1728 pages used for memmap
[    0.000000]   Normal zone: 0 pages reserved
[    0.000000]   Normal zone: 196608 pages, LIFO batch:63
[    0.000000]   HighMem zone: 65536 pages, LIFO batch:15
[    0.000000] CPU: All CPU(s) started in SVC mode.
[    0.000000] AM437x ES1.2 (neon)
[    0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
[    0.000000] pcpu-alloc: [0] 0
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 260416
[    0.000000] Kernel command line: console=ttyO1,115200n8 bootmedium=QSPI serverip= msocsbootver=-MS_OCS_RM_2016.05 fwup=active panic_on_rcu_stall=1 bootsrc=NORMAL root=/dev/mtdblock5 ro verity=/dev/mtdblock4 rootfstype=squashfs rootwait=1 verity_disable=0 verity_version=1 verity_blocks=7319 verity_data_block=4096 verity_hash_block=4096 verity_algo=sha256 verity_salt=d9efd2ec7e268c1a7052e2aa34dcbacd5d8bd53b0c1012591f68d629b830137c verity_root_hash=f1f8a04164dbdc71a3e3c8d90174e8397a90705045ce93010ba5bfd6715df7e2
[    0.000000] Dentry cache hash table entries: 131072 (order: 7, 524288 bytes, linear)
[    0.000000] Inode-cache hash table entries: 65536 (order: 6, 262144 bytes, linear)
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[    0.000000] Memory: 967704K/1048576K available (8192K kernel code, 266K rwdata, 2428K rodata, 1024K init, 252K bss, 31720K reserved, 49152K cma-reserved, 212992K highmem)
[    0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
[    0.000000] rcu: Preemptible hierarchical RCU implementation.
[    0.000000]  RCU CPU stall will panic kernel.
[    0.000000]  Tasks RCU enabled.
[    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies.
[    0.000000] NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16
[    0.000000] L2C: platform modifies aux control register: 0x0e030000 -> 0x3e430000
[    0.000000] L2C: DT/platform modifies aux control register: 0x0e030000 -> 0x3e430000
[    0.000000] L2C-310 enabling early BRESP for Cortex-A9
[    0.000000] OMAP L2C310: ROM does not support power control setting
[    0.000000] L2C-310 dynamic clock gating disabled, standby mode disabled
[    0.000000] L2C-310 cache controller enabled, 16 ways, 256 kB
[    0.000000] L2C-310: CACHE_ID 0x410000c9, AUX_CTRL 0x4e430000
[    0.000000] random: get_random_bytes called from start_kernel+0x2b4/0x46c with crng_init=0
[    0.000000] OMAP clockevent source: timer2 at 24000000 Hz
[    0.000011] sched_clock: 32 bits at 24MHz, resolution 41ns, wraps every 89478484971ns
[    0.000028] clocksource: timer1: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 79635851949 ns
[    0.000037] OMAP clocksource: timer1 at 24000000 Hz
[    0.000471] clocksource: 32k_counter: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 58327039986419 ns
[    0.000480] OMAP clocksource: 32k_counter at 32768 Hz
[    0.000986] Console: colour dummy device 80x30
[    0.001019] WARNING: Your 'console=ttyO1' has been replaced by 'ttyS1'
[    0.001023] This ensures that you still see kernel messages. Please
[    0.001027] update your kernel commandline.
[    0.001065] Calibrating delay loop... 1987.37 BogoMIPS (lpj=9936896)
[    0.060187] pid_max: default: 32768 minimum: 301
[    0.060385] Mount-cache hash table entries: 2048 (order: 1, 8192 bytes, linear)
[    0.060407] Mountpoint-cache hash table entries: 2048 (order: 1, 8192 bytes, linear)
[    0.061271] CPU: Testing write buffer coherency: ok
[    0.061332] CPU0: Spectre v2: using BPIALL workaround
[    0.062185] Setting up static identity map for 0x80100000 - 0x80100060
[    0.062327] rcu: Hierarchical SRCU implementation.
[    0.062407] EFI services will not be available.
[    0.062881] devtmpfs: initialized
[    0.074040] VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 4
[    0.074431] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
[    0.074453] futex hash table entries: 256 (order: -1, 3072 bytes, linear)
[    0.077570] pinctrl core: initialized pinctrl subsystem
[    0.078317] DMI not present or invalid.
[    0.078762] NET: Registered protocol family 16
[    0.080551] DMA: preallocated 256 KiB pool for atomic coherent allocations
[    0.108330] omap_hwmod: adc1: _wait_target_disable failed
[    0.109815] audit: initializing netlink subsys (disabled)
[    0.110771] cpuidle: using governor ladder
[    0.110801] cpuidle: using governor menu
[    0.112636] omap_l3_noc 44000000.ocp: L3 debug error: target 8 mod:0 (unclearable)
[    0.112708] omap_l3_noc 44000000.ocp: L3 application error: target 8 mod:0 (unclearable)
[    0.120258] audit: type=2000 audit(0.100:1): state=initialized audit_enabled=0 res=1
[    0.130006] No ATAGs?
[    0.130027] hw-breakpoint: found 5 (+1 reserved) breakpoint and 1 watchpoint registers.
[    0.130042] hw-breakpoint: maximum watchpoint size is 4 bytes.
[    0.147830] edma 49000000.edma: TI EDMA DMA engine driver
[    0.148530] reg-fixed-voltage fixedregulator-sd: GPIO lookup for consumer (null)
[    0.148538] reg-fixed-voltage fixedregulator-sd: using device tree for GPIO lookup
[    0.148559] of_get_named_gpiod_flags: can't parse 'gpios' property of node '/fixedregulator-sd[0]'
[    0.148570] of_get_named_gpiod_flags: can't parse 'gpio' property of node '/fixedregulator-sd[0]'
[    0.148579] reg-fixed-voltage fixedregulator-sd: using lookup tables for GPIO lookup
[    0.148586] reg-fixed-voltage fixedregulator-sd: No GPIO consumer (null) found
[    0.149638] iommu: Default domain type: Translated
[    0.150950] vgaarb: loaded
[    0.151092] am437x_resetstatus: Raw value = 0x00000002
[    0.151092] Decoded reset source(s):
[    0.151092]   - GLOBAL_WARM_RST occurred
[    0.151588] SCSI subsystem initialized
[    0.152124] pps_core: LinuxPPS API ver. 1 registered
[    0.152134] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    0.152157] PTP clock support registered
[    0.152190] EDAC MC: Ver: 3.0.0
[    0.154174] clocksource: Switched to clocksource timer1
[    0.161123] thermal_sys: Registered thermal governor 'fair_share'
[    0.161130] thermal_sys: Registered thermal governor 'bang_bang'
[    0.161144] thermal_sys: Registered thermal governor 'step_wise'
[    0.161149] thermal_sys: Registered thermal governor 'user_space'
[    0.161154] thermal_sys: Registered thermal governor 'power_allocator'
[    0.161807] NET: Registered protocol family 2
[    0.162494] tcp_listen_portaddr_hash hash table entries: 512 (order: 0, 4096 bytes, linear)
[    0.162523] TCP established hash table entries: 8192 (order: 3, 32768 bytes, linear)
[    0.162582] TCP bind hash table entries: 8192 (order: 3, 32768 bytes, linear)
[    0.162654] TCP: Hash tables configured (established 8192 bind 8192)
[    0.162826] UDP hash table entries: 512 (order: 1, 8192 bytes, linear)
[    0.162850] UDP-Lite hash table entries: 512 (order: 1, 8192 bytes, linear)
[    0.162995] NET: Registered protocol family 1
[    0.163536] RPC: Registered named UNIX socket transport module.
[    0.163548] RPC: Registered udp transport module.
[    0.163553] RPC: Registered tcp transport module.
[    0.163558] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    0.163570] PCI: CLS 0 bytes, default 64
[    0.163767] Trying to unpack rootfs image as initramfs...
[    0.758962] Freeing initrd memory: 8588K
[    0.779517] Initialise system trusted keyrings
[    0.779771] workingset: timestamp_bits=14 max_order=18 bucket_order=4
[    0.784000] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[    0.785060] Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
[    0.785398] ntfs: driver 2.1.32 [Flags: R/O].
[    0.785656] jffs2: version 2.2. (NAND) (SUMMARY)  © 2001-2006 Red Hat, Inc.
[    0.786446] Key type asymmetric registered
[    0.786459] Asymmetric key parser 'x509' registered
[    0.786509] bounce: pool size: 64 pages
[    0.786558] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 247)
[    0.786567] io scheduler mq-deadline registered
[    0.786573] io scheduler kyber registered
[    0.814788] omap-mailbox 480c8000.mailbox: omap mailbox rev 0x400
[    0.844917] pinctrl-single 44e10800.pinmux: 199 pins, size 796
[    0.887329] Serial: 8250/16550 driver, 10 ports, IRQ sharing enabled
[    0.890676] omap8250 44e09000.serial: No clock speed specified: using default: 48000000
[    0.891460] 44e09000.serial: ttyS0 at MMIO 0x44e09000 (irq = 68, base_baud = 3000000) is a 8250
[    0.892140] omap8250 48022000.serial: No clock speed specified: using default: 48000000
[    0.892828] 48022000.serial: ttyS1 at MMIO 0x48022000 (irq = 74, base_baud = 3000000) is a 8250
[    1.638677] printk: console [ttyS1] enabled
[    1.643496] omap8250 48024000.serial: No clock speed specified: using default: 48000000
[    1.652215] 48024000.serial: ttyS2 at MMIO 0x48024000 (irq = 75, base_baud = 3000000) is a 8250
[    1.663623] omap_rng 48310000.rng: Random Number Generator ver. 20
[    1.670379] random: fast init done
[    1.674026] random: crng init done
[    1.690067] brd: module loaded
[    1.702437] loop: module loaded
[    1.712698] spi-nor spi0.0: mx66l51235l (65536 Kbytes)
[    1.718010] 6 fixed-partitions partitions found on MTD device spi0.0
[    1.724391] Creating 6 MTD partitions on "spi0.0":
[    1.729178] 0x000000000000-0x000000090000 : "QSPI.U-BOOT"
[    1.744891] 0x000000090000-0x000000100000 : "QSPI.U-BOOT-backup"
[    1.764818] 0x000000100000-0x000000110000 : "QSPI.U-BOOT-env"
[    1.774831] 0x000000110000-0x000001110000 : "QSPI.KERNEL-zImage"
[    1.794810] 0x000001110000-0x000001310000 : "QSPI.VERITY"
[    1.804854] 0x000001310000-0x000004000000 : "QSPI.FILESYSTEM"
[    1.815538] mdio_bus fixed-0: GPIO lookup for consumer reset
[    1.815548] mdio_bus fixed-0: using lookup tables for GPIO lookup
[    1.815555] mdio_bus fixed-0: No GPIO consumer reset found
[    1.815574] libphy: Fixed MDIO Bus: probed
[    1.821626] mdio_bus 4a101000.mdio: GPIO lookup for consumer reset
[    1.821637] mdio_bus 4a101000.mdio: using device tree for GPIO lookup
[    1.821657] of_get_named_gpiod_flags: can't parse 'reset-gpios' property of node '/ocp@44000000/interconnect@4a000000/segment@0/target-module@100000/ethernet@0/mdio@1000[0]'
[    1.821672] of_get_named_gpiod_flags: can't parse 'reset-gpio' property of node '/ocp@44000000/interconnect@4a000000/segment@0/target-module@100000/ethernet@0/mdio@1000[0]'
[    1.821682] mdio_bus 4a101000.mdio: using lookup tables for GPIO lookup
[    1.821687] mdio_bus 4a101000.mdio: No GPIO consumer reset found
[    1.874238] davinci_mdio 4a101000.mdio: davinci mdio revision 1.6, bus freq 1000000
[    1.881888] davinci_mdio 4a101000.mdio: detected phy mask fffffff9
[    1.893135] mdio_bus 4a101000.mdio:01: GPIO lookup for consumer reset
[    1.893147] mdio_bus 4a101000.mdio:01: using lookup tables for GPIO lookup
[    1.893154] mdio_bus 4a101000.mdio:01: No GPIO consumer reset found
[    1.898252] mdio_bus 4a101000.mdio:02: GPIO lookup for consumer reset
[    1.898263] mdio_bus 4a101000.mdio:02: using lookup tables for GPIO lookup
[    1.898270] mdio_bus 4a101000.mdio:02: No GPIO consumer reset found
[    1.898408] libphy: 4a101000.mdio: probed
[    1.902428] davinci_mdio 4a101000.mdio: phy[1]: device 4a101000.mdio:01, driver unknown
[    1.910527] davinci_mdio 4a101000.mdio: phy[2]: device 4a101000.mdio:02, driver unknown
[    1.919009] cpsw 4a100000.ethernet: initialized cpsw ale version 1.4
[    1.925426] cpsw 4a100000.ethernet: ALE Table size 1024
[    1.930740] cpsw 4a100000.ethernet: cpts: overflow check period 500 (jiffies)
[    1.937959] cpsw 4a100000.ethernet: Detected MACID = dc:98:40:ff:0d:e0
[    1.945215] cpsw 4a100000.ethernet: cpsw: Detected MACID = dc:98:40:ff:0d:e1
[    1.954163] omap_rtc 44e3e000.rtc: already running
[    1.959716] omap_rtc 44e3e000.rtc: char device (252:0)
[    1.959734] omap_rtc 44e3e000.rtc: registered as rtc0
[    1.965066] i2c /dev entries driver
[    1.970532] device-mapper: ioctl: 4.41.0-ioctl (2019-09-16) initialised: dm-devel@redhat.com
[    1.980494] cpuidle: enable-method property 'ti,am4372' found operations
[    1.987976] sdhci: Secure Digital Host Controller Interface driver
[    1.994146] sdhci: Copyright(c) Pierre Ossman
[    1.999679] omap_hsmmc 481d8000.mmc: GPIO lookup for consumer cd
[    1.999688] omap_hsmmc 481d8000.mmc: using device tree for GPIO lookup
[    1.999713] of_get_named_gpiod_flags: can't parse 'cd-gpios' property of node '/ocp@44000000/interconnect@48000000/segment@100000/target-module@d8000/mmc@0[0]'
[    1.999726] of_get_named_gpiod_flags: can't parse 'cd-gpio' property of node '/ocp@44000000/interconnect@48000000/segment@100000/target-module@d8000/mmc@0[0]'
[    1.999735] omap_hsmmc 481d8000.mmc: using lookup tables for GPIO lookup
[    1.999742] omap_hsmmc 481d8000.mmc: No GPIO consumer cd found
[    1.999748] omap_hsmmc 481d8000.mmc: GPIO lookup for consumer wp
[    1.999753] omap_hsmmc 481d8000.mmc: using device tree for GPIO lookup
[    1.999766] of_get_named_gpiod_flags: can't parse 'wp-gpios' property of node '/ocp@44000000/interconnect@48000000/segment@100000/target-module@d8000/mmc@0[0]'
[    1.999777] of_get_named_gpiod_flags: can't parse 'wp-gpio' property of node '/ocp@44000000/interconnect@48000000/segment@100000/target-module@d8000/mmc@0[0]'
[    1.999783] omap_hsmmc 481d8000.mmc: using lookup tables for GPIO lookup
[    1.999788] omap_hsmmc 481d8000.mmc: No GPIO consumer wp found
[    2.026147] omap_hsmmc 47810000.mmc: GPIO lookup for consumer cd
[    2.026157] omap_hsmmc 47810000.mmc: using device tree for GPIO lookup
[    2.026177] of_get_named_gpiod_flags: can't parse 'cd-gpios' property of node '/ocp@44000000/target-module@47810000/mmc@0[0]'
[    2.026189] of_get_named_gpiod_flags: can't parse 'cd-gpio' property of node '/ocp@44000000/target-module@47810000/mmc@0[0]'
[    2.026198] omap_hsmmc 47810000.mmc: using lookup tables for GPIO lookup
[    2.026205] omap_hsmmc 47810000.mmc: No GPIO consumer cd found
[    2.026211] omap_hsmmc 47810000.mmc: GPIO lookup for consumer wp
[    2.026215] omap_hsmmc 47810000.mmc: using device tree for GPIO lookup
[    2.026227] of_get_named_gpiod_flags: can't parse 'wp-gpios' property of node '/ocp@44000000/target-module@47810000/mmc@0[0]'
[    2.026237] of_get_named_gpiod_flags: can't parse 'wp-gpio' property of node '/ocp@44000000/target-module@47810000/mmc@0[0]'
[    2.026243] omap_hsmmc 47810000.mmc: using lookup tables for GPIO lookup
[    2.026248] omap_hsmmc 47810000.mmc: No GPIO consumer wp found
[    2.026570] omap_hsmmc 47810000.mmc: RX DMA channel request failed
[    2.033252] sdhci-pltfm: SDHCI platform and OF driver helper
[    2.040704] ledtrig-cpu: registered to indicate activity on CPUs
[    2.047680] remoteproc remoteproc0: wkup_m3 is available
[    2.056016] 20160704: Config ADC1 registers
[    2.060200] === Starting initial ADC ===
[    2.064112] PRCMCMCLKSELADC1CLK:0x0
[    2.067671] ADC1CLKCTRL:0x2
[    2.070484] ADC1CTRL:0x66
[    2.073094] ADC1SYSCONFIG:0x0
[    2.076065] ADC1Clk:0x7
[    2.078501] ADC1STEPCONFIG1:0x11
[    2.081717] ADC1STEPCONFIG2:0x80011
[    2.085220] ADC1STEPCONFIG3:0x100011
[    2.088811] ADC1STEPCONFIG4:0x180011
[    2.092389] ADC1STEPCONFIG5:0x200011
[    2.095977] ADC1STEPCONFIG6:0x280011
[    2.099557] ADC1STEPEN:0x7E
[    2.102352] ADC1IRQENSET:0x2
[    2.105244] ADC1CTRL:0x67
[    2.109286] NET: Registered protocol family 10
[    2.115024] Segment Routing with IPv6
[    2.118834] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
[    2.125515] NET: Registered protocol family 17
[    2.130030] Key type dns_resolver registered
[    2.134712] omap_voltage_late_init: Voltage driver support not added
[    2.141590] Loading compiled-in X.509 certificates
[    2.148516] mmc0: new high speed MMC card at address 0001
[    2.164982] mmcblk0: mmc0:0001 8GTF4R 7.28 GiB
[    2.169901] mmcblk0boot0: mmc0:0001 8GTF4R partition 1 4.00 MiB
[    2.179054] mmcblk0boot1: mmc0:0001 8GTF4R partition 2 4.00 MiB
[    2.185371] mmcblk0rpmb: mmc0:0001 8GTF4R partition 3 512 KiB, chardev (246:0)
[    2.193449] gpio gpiochip0: (gpio-0-31): added GPIO chardev (254:0)
[    2.193532] gpiochip_setup_dev: registered GPIOs 0 to 31 on device: gpiochip0 (gpio-0-31)
[    2.193576] OMAP GPIO hardware version 0.1
[    2.201241]  mmcblk0: p1 p2 p3 p4
[    2.240441] at24 0-0050: GPIO lookup for consumer wp
[    2.240452] at24 0-0050: using device tree for GPIO lookup
[    2.240474] of_get_named_gpiod_flags: can't parse 'wp-gpios' property of node '/ocp@44000000/interconnect@44c00000/segment@200000/target-module@b000/i2c@0/at24@50[0]'
[    2.240489] of_get_named_gpiod_flags: can't parse 'wp-gpio' property of node '/ocp@44000000/interconnect@44c00000/segment@200000/target-module@b000/i2c@0/at24@50[0]'
[    2.240498] at24 0-0050: using lookup tables for GPIO lookup
[    2.240505] at24 0-0050: No GPIO consumer wp found
[    2.241193] at24 0-0050: 8192 byte 24c64 EEPROM, writable, 1 bytes/write
[    2.248141] pca953x 0-0020: GPIO lookup for consumer reset
[    2.248147] pca953x 0-0020: using device tree for GPIO lookup
[    2.248166] of_get_named_gpiod_flags: can't parse 'reset-gpios' property of node '/ocp@44000000/interconnect@44c00000/segment@200000/target-module@b000/i2c@0/pca9535@20[0]'
[    2.248179] of_get_named_gpiod_flags: can't parse 'reset-gpio' property of node '/ocp@44000000/interconnect@44c00000/segment@200000/target-module@b000/i2c@0/pca9535@20[0]'
[    2.248187] pca953x 0-0020: using lookup tables for GPIO lookup
[    2.248193] pca953x 0-0020: No GPIO consumer reset found
[    2.248220] pca953x 0-0020: 0-0020 supply vcc not found, using dummy regulator
[    2.256067] gpiochip_find_base: found new base at 496
[    2.257205] gpio gpiochip1: (0-0020): added GPIO chardev (254:1)
[    2.257280] gpiochip_setup_dev: registered GPIOs 496 to 511 on device: gpiochip1 (0-0020)
[    2.257599] omap_i2c 44e0b000.i2c: bus 0 rev0.12 at 100 kHz
[    2.264467] pca953x 1-0021: GPIO lookup for consumer reset
[    2.264476] pca953x 1-0021: using device tree for GPIO lookup
[    2.264496] of_get_named_gpiod_flags: can't parse 'reset-gpios' property of node '/ocp@44000000/interconnect@48000000/segment@0/target-module@2a000/i2c@0/pca9535@21[0]'
[    2.264510] of_get_named_gpiod_flags: can't parse 'reset-gpio' property of node '/ocp@44000000/interconnect@48000000/segment@0/target-module@2a000/i2c@0/pca9535@21[0]'
[    2.264519] pca953x 1-0021: using lookup tables for GPIO lookup
[    2.264526] pca953x 1-0021: No GPIO consumer reset found
[    2.264552] pca953x 1-0021: 1-0021 supply vcc not found, using dummy regulator
[    2.294329] pca953x 1-0021: failed writing register
[    2.299329] pca953x: probe of 1-0021 failed with error -121
[    2.305404] at24 1-0050: GPIO lookup for consumer wp
[    2.305412] at24 1-0050: using device tree for GPIO lookup
[    2.305431] of_get_named_gpiod_flags: can't parse 'wp-gpios' property of node '/ocp@44000000/interconnect@48000000/segment@0/target-module@2a000/i2c@0/at24-0@50[0]'
[    2.305444] of_get_named_gpiod_flags: can't parse 'wp-gpio' property of node '/ocp@44000000/interconnect@48000000/segment@0/target-module@2a000/i2c@0/at24-0@50[0]'
[    2.305452] at24 1-0050: using lookup tables for GPIO lookup
[    2.305458] at24 1-0050: No GPIO consumer wp found
[    2.306138] at24 1-0050: 8192 byte 24c64 EEPROM, writable, 1 bytes/write
[    2.313109] at24 1-0051: GPIO lookup for consumer wp
[    2.313115] at24 1-0051: using device tree for GPIO lookup
[    2.313133] of_get_named_gpiod_flags: can't parse 'wp-gpios' property of node '/ocp@44000000/interconnect@48000000/segment@0/target-module@2a000/i2c@0/at24-1@51[0]'
[    2.313145] of_get_named_gpiod_flags: can't parse 'wp-gpio' property of node '/ocp@44000000/interconnect@48000000/segment@0/target-module@2a000/i2c@0/at24-1@51[0]'
[    2.313153] at24 1-0051: using lookup tables for GPIO lookup
[    2.313158] at24 1-0051: No GPIO consumer wp found
[    2.313806] at24 1-0051: 8192 byte 24c64 EEPROM, writable, 1 bytes/write
[    2.320866] at24 1-0052: GPIO lookup for consumer wp
[    2.320874] at24 1-0052: using device tree for GPIO lookup
[    2.320891] of_get_named_gpiod_flags: can't parse 'wp-gpios' property of node '/ocp@44000000/interconnect@48000000/segment@0/target-module@2a000/i2c@0/at24-2@52[0]'
[    2.320905] of_get_named_gpiod_flags: can't parse 'wp-gpio' property of node '/ocp@44000000/interconnect@48000000/segment@0/target-module@2a000/i2c@0/at24-2@52[0]'
[    2.320912] at24 1-0052: using lookup tables for GPIO lookup
[    2.320918] at24 1-0052: No GPIO consumer wp found
[    2.347688] pca954x 1-0070: GPIO lookup for consumer reset
[    2.347697] pca954x 1-0070: using device tree for GPIO lookup
[    2.347717] of_get_named_gpiod_flags: can't parse 'reset-gpios' property of node '/ocp@44000000/interconnect@48000000/segment@0/target-module@2a000/i2c@0/mux@70[0]'
[    2.347730] of_get_named_gpiod_flags: can't parse 'reset-gpio' property of node '/ocp@44000000/interconnect@48000000/segment@0/target-module@2a000/i2c@0/mux@70[0]'
[    2.347738] pca954x 1-0070: using lookup tables for GPIO lookup
[    2.347745] pca954x 1-0070: No GPIO consumer reset found
[    2.347895] pca954x 1-0070: probe failed
[    2.351893] omap_i2c 4802a000.i2c: bus 1 rev0.12 at 100 kHz
[    2.358155] gpio gpiochip2: (gpio-32-63): added GPIO chardev (254:2)
[    2.358236] gpiochip_setup_dev: registered GPIOs 32 to 63 on device: gpiochip2 (gpio-32-63)
[    2.358847] gpio gpiochip3: (gpio-64-95): added GPIO chardev (254:3)
[    2.358929] gpiochip_setup_dev: registered GPIOs 64 to 95 on device: gpiochip3 (gpio-64-95)
[    2.359490] gpio gpiochip4: (gpio-96-127): added GPIO chardev (254:4)
[    2.359555] gpiochip_setup_dev: registered GPIOs 96 to 127 on device: gpiochip4 (gpio-96-127)
[    2.360130] gpio gpiochip5: (gpio-128-159): added GPIO chardev (254:5)
[    2.360199] gpiochip_setup_dev: registered GPIOs 128 to 159 on device: gpiochip5 (gpio-128-159)
[    2.360746] gpio gpiochip6: (gpio-160-191): added GPIO chardev (254:6)
[    2.360813] gpiochip_setup_dev: registered GPIOs 160 to 191 on device: gpiochip6 (gpio-160-191)
[    2.372078] omap_reset_deassert: timedout waiting for gfx:0
[    2.377711] ti-sysc: probe of 44000000.ocp:target-module@56000000 failed with error -110
[    2.387375] of_get_named_gpiod_flags: parsed 'gpios' property of node '/leds/led@0[0]' - status (0)
[    2.387401] gpio gpiochip4: Persistence not supported for GPIO 13
[    2.387406] no flags found for gpios
[    2.387938] omap_rtc 44e3e000.rtc: setting system clock to 2025-11-04T15:47:27 UTC (1762271247)
[    2.400359] Freeing unused kernel memory: 1024K
[    2.414370] Run /init as init process
[    3.477354] device-mapper: verity: sha256 using implementation "sha256-neon"
[    3.564642] /dev/mapper/rootfs-verity: Can't open blockdev
[    3.667033] EXT4-fs (mmcblk0p4): mounted filesystem with ordered data mode. Opts: (null)
[    5.001259] systemd[1]: systemd 243.2+ running in system mode. (+PAM -AUDIT -SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP -LIBCRYPTSETUP -GCRYPT -GNUTLS +ACL +XZ -LZ4 -SECCOMP +BLKID -ELFUTILS +KMOD -IDN2 -IDN -PCRE2 default-hierarchy=hybrid)
[    5.023527] systemd[1]: Detected architecture arm.
[    5.126527] systemd[1]: Set hostname to <Host7332016966>.
[    5.388470] systemd-sysv-generator[389]: Overwriting existing symlink /run/systemd/generator.late/ocsrest.service with real service.
[    5.412634] systemd-sysv-generator[389]: Overwriting existing symlink /run/systemd/generator.late/Ocs-init.service with real service.
[    5.591830] systemd[1]: /lib/systemd/system/dbus.socket:5: ListenStream= references a path below legacy directory /var/run/, updating /var/run/dbus/system_bus_socket → /run/dbus/system_bus_socket; please update the unit file accordingly.
[    5.630926] systemd[1]: /lib/systemd/system/rpcbind.socket:5: ListenStream= references a path below legacy directory /var/run/, updating /var/run/rpcbind.sock → /run/rpcbind.sock; please update the unit file accordingly.
[    5.778084] systemd[1]: system-getty.slice: unit configures an IP firewall, but the local system does not support BPF/cgroup firewalling.
[    5.790669] systemd[1]: (This warning is only shown for the first unit using IP firewalling.)
[    5.802880] systemd[1]: Created slice system-getty.slice.
[    5.848187] systemd[1]: Created slice system-serial\x2dgetty.slice.
[    5.887948] systemd[1]: Created slice User and Session Slice.
[    6.830573] omap-aes 53501000.aes: OMAP AES hw accel rev: 0.1
[    6.852111] omap-aes 53501000.aes: will run requests pump with realtime priority
[    7.105546] omap-des 53701000.des: OMAP DES hw accel rev: 0.33
[    7.134541] omap-des 53701000.des: will run requests pump with realtime priority
[    7.261870] omap-sham 53100000.sham: hw accel on OMAP rev 0.0
[    7.342492] omap-sham 53100000.sham: will run requests pump with realtime priority
[    7.617892] systemd-journald[393]: Received client request to flush runtime journal.
[    9.661816] omap_wdt: OMAP Watchdog Timer Rev 0x01: initial timeout 60 sec
[   13.262687] remoteproc remoteproc1: 54434000.pru is available
[   13.284586] pru-rproc 54434000.pru: PRU rproc node /ocp@44000000/target-module@54400000/pruss@0/pru@34000 probed successfully
[   13.315688] remoteproc remoteproc2: 54438000.pru is available
[   13.321560] pru-rproc 54438000.pru: PRU rproc node /ocp@44000000/target-module@54400000/pruss@0/pru@38000 probed successfully
[   14.683562] EXT4-fs (mmcblk0p3): mounted filesystem with ordered data mode. Opts: (null)
[   15.814505] audit: type=1325 audit(1762271260.900:2): table=filter family=2 entries=0
[   16.037016] audit: type=1325 audit(1762271261.100:3): table=filter family=10 entries=0
[   17.910226] audit: type=1325 audit(1762271263.010:4): table=filter family=2 entries=4
[   17.958977] audit: type=1325 audit(1762271263.060:5): table=filter family=2 entries=4
[   17.998236] audit: type=1325 audit(1762271263.100:6): table=filter family=2 entries=4
[   18.038473] audit: type=1325 audit(1762271263.140:7): table=filter family=2 entries=4
[   18.151932] audit: type=1325 audit(1762271263.250:8): table=filter family=2 entries=4
[   18.162855] audit: type=1325 audit(1762271263.260:9): table=filter family=2 entries=6
[   18.239264] audit: type=1325 audit(1762271263.340:10): table=filter family=2 entries=8
[   18.289606] audit: type=1325 audit(1762271263.390:11): table=filter family=2 entries=9
[   20.869275] kauditd_printk_skb: 57 callbacks suppressed
[   20.869282] audit: type=1325 audit(1762271265.970:69): table=filter family=2 entries=35
[   20.911116] audit: type=1325 audit(1762271266.010:70): table=filter family=10 entries=34
[   20.921984] audit: type=1325 audit(1762271266.020:71): table=filter family=10 entries=35
[   21.066682] audit: type=1325 audit(1762271266.170:72): table=filter family=10 entries=36
[   21.090407] audit: type=1325 audit(1762271266.190:73): table=filter family=10 entries=37
[   21.101213] audit: type=1325 audit(1762271266.200:74): table=filter family=10 entries=38
[   21.180646] audit: type=1325 audit(1762271266.280:75): table=filter family=2 entries=36
[   21.222784] audit: type=1325 audit(1762271266.320:76): table=filter family=10 entries=39
[   21.990045] cpsw 4a100000.ethernet: initializing cpsw version 1.15 (0)
[   22.007536] Generic PHY 4a101000.mdio:01: attached PHY driver [Generic PHY] (mii_bus:phy_addr=4a101000.mdio:01, irq=POLL)
[   22.017788] cpsw 4a100000.ethernet eth0: Link is Up - 1Gbps/Full - flow control off
[   22.026274] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[   22.324731] IPv6: eth0: IPv6 duplicate address fe80::201:11ff:fe11:1111 used by 00:01:11:11:11:11 detected!
[   23.878948] net eth1: initializing cpsw version 1.15 (0)
[   23.887135] Generic PHY 4a101000.mdio:02: attached PHY driver [Generic PHY] (mii_bus:phy_addr=4a101000.mdio:02, irq=POLL)
[   23.901646] cpsw 4a100000.ethernet eth1: Link is Up - 1Gbps/Full - flow control off
[   23.901691] IPv6: ADDRCONF(NETDEV_CHANGE): eth1: link becomes ready
[   24.112449] ICMPv6: RA: ndisc_router_discovery failed to add default route
[   24.158486] ICMPv6: RA: ndisc_router_discovery failed to add default route
[   24.806663] remoteproc remoteproc1: powering up 54434000.pru
[   24.826845] remoteproc remoteproc1: Booting fw image am437x-pru1_0-fw, size 133624
[   24.826933] remoteproc remoteproc1: remote processor 54434000.pru is now up
[   24.827549] remoteproc remoteproc2: powering up 54438000.pru
[   24.854061] remoteproc remoteproc2: Booting fw image am437x-pru1_1-fw, size 91528
[   24.874836] pru-rproc 54438000.pru: configured system_events[63-0] = 00000000,000c0000
[   24.874850] pru-rproc 54438000.pru: configured intr_channels = 0x0000000a host_intr = 0x0000000a
[   24.883037]  remoteproc2#vdev0buffer: registered virtio0 (type 7)
[   24.883053] remoteproc remoteproc2: remote processor 54438000.pru is now up
[   24.901282] ------------[ cut here ]------------
[   24.901312] WARNING: CPU: 0 PID: 461 at drivers/bus/omap_l3_noc.c:141 l3_interrupt_handler+0x28c/0x384
[   24.901320] 44000000.ocp:L3 Standard Error: MASTER ICSS1 TARGET GPMC (Read): At Address: 0x00090018 : Data Access in Supervisor mode during Functional access
[   24.901323] Modules linked in: virtio_rpmsg_bus(+) xt_state xt_comment ip6t_REJECT nf_reject_ipv6 ipt_REJECT nf_reject_ipv4 xt_hashlimit xt_NFLOG xt_LOG nf_conntrack_tftp xt_conntrack nf_conntrack nf_defrag_ipv6 libcrc32c nfnetlink_log nfnetlink nf_defrag_ipv4 xt_multiport xt_tcpudp ip6table_filter ip6_tables iptable_filter ip_tables x_tables pru_rproc irq_pruss_intc pruss ti_emif_sram omap_wdt sch_fq_codel omap_sham omap_des libdes omap_aes_driver omap_crypto libaes crypto_engine
[   24.901393] CPU: 0 PID: 461 Comm: systemd-udevd Not tainted 5.4.28-MS_OCS_RM_1.1.37.254421-g6f3bf13d53 #1
[   24.901396] Hardware name: Generic AM43 (Flattened Device Tree)
[   24.901426] [<c010f1b8>] (unwind_backtrace) from [<c010b4d4>] (show_stack+0x10/0x14)
[   24.901440] [<c010b4d4>] (show_stack) from [<c012ccd0>] (__warn+0xbc/0xd4)
[   24.901449] [<c012ccd0>] (__warn) from [<c012cd80>] (warn_slowpath_fmt+0x98/0xc4)
[   24.901457] [<c012cd80>] (warn_slowpath_fmt) from [<c0495f2c>] (l3_interrupt_handler+0x28c/0x384)
[   24.901470] [<c0495f2c>] (l3_interrupt_handler) from [<c016f53c>] (__handle_irq_event_percpu+0x50/0x13c)
[   24.901480] [<c016f53c>] (__handle_irq_event_percpu) from [<c016f658>] (handle_irq_event_percpu+0x30/0x8c)
[   24.901486] [<c016f658>] (handle_irq_event_percpu) from [<c016f700>] (handle_irq_event+0x4c/0x8c)
[   24.901499] [<c016f700>] (handle_irq_event) from [<c0173694>] (handle_fasteoi_irq+0xb4/0x184)
[   24.901520] [<c0173694>] (handle_fasteoi_irq) from [<c016e710>] (generic_handle_irq+0x24/0x34)
[   24.901530] [<c016e710>] (generic_handle_irq) from [<c016ee88>] (__handle_domain_irq+0x54/0xa4)
[   24.901551] [<c016ee88>] (__handle_domain_irq) from [<c0494948>] (gic_handle_irq+0x3c/0x68)
[   24.901564] [<c0494948>] (gic_handle_irq) from [<c0101a8c>] (__irq_svc+0x6c/0xa8)
[   24.901569] Exception stack(0xcfc59bd8 to 0xcfc59c20)
[   24.901575] 9bc0:                                                       cfb51000 60000013
[   24.901583] 9be0: 00000001 f0a44000 00000001 00000000 00000001 00000000 00000cc0 f0c91000
[   24.901590] 9c00: 00004000 f0c92e00 eec10ef4 cfc59c28 c016fbb8 c016f038 20000013 ffffffff
[   24.901600] [<c0101a8c>] (__irq_svc) from [<c016f038>] (__irq_put_desc_unlock+0x10/0x7c)
[   24.901608] [<c016f038>] (__irq_put_desc_unlock) from [<c016fbb8>] (irq_set_irqchip_state+0x88/0xc0)
[   24.901649] [<c016fbb8>] (irq_set_irqchip_state) from [<bf056768>] (pru_rproc_kick+0x54/0x74 [pru_rproc])
[   24.901684] [<bf056768>] (pru_rproc_kick [pru_rproc]) from [<c06b569c>] (rproc_virtio_notify+0x20/0x28)
[   24.901710] [<c06b569c>] (rproc_virtio_notify) from [<c04fef4c>] (virtqueue_notify+0x1c/0x34)
[   24.901753] [<c04fef4c>] (virtqueue_notify) from [<bf0f3b4c>] (rpmsg_probe+0x2a0/0x354 [virtio_rpmsg_bus])
[   24.901789] [<bf0f3b4c>] (rpmsg_probe [virtio_rpmsg_bus]) from [<c04fedfc>] (virtio_dev_probe+0x1f4/0x2c0)
[   24.901804] [<c04fedfc>] (virtio_dev_probe) from [<c055fe4c>] (really_probe+0x1e0/0x348)
[   24.901815] [<c055fe4c>] (really_probe) from [<c0560128>] (driver_probe_device+0x60/0x170)
[   24.901824] [<c0560128>] (driver_probe_device) from [<c05603d8>] (device_driver_attach+0x58/0x60)
[   24.901833] [<c05603d8>] (device_driver_attach) from [<c0560438>] (__driver_attach+0x58/0xcc)
[   24.901840] [<c0560438>] (__driver_attach) from [<c055e00c>] (bus_for_each_dev+0x78/0xc0)
[   24.901848] [<c055e00c>] (bus_for_each_dev) from [<c055f1c8>] (bus_add_driver+0x15c/0x1e0)
[   24.901858] [<c055f1c8>] (bus_add_driver) from [<c0560d14>] (driver_register+0x74/0x108)
[   24.901873] [<c0560d14>] (driver_register) from [<bf027010>] (rpmsg_init+0x10/0x1000 [virtio_rpmsg_bus])
[   24.901877] ---[ end trace 179cf74053c64539 ]---
[   24.901923] virtio_rpmsg_bus virtio0: msg received with no recipient
[   24.901941] virtio_rpmsg_bus virtio0: msg received with no recipient
[   24.901971] virtio_rpmsg_bus virtio0: msg received with no recipient
[   24.901980] virtio_rpmsg_bus virtio0: msg received with no recipient
[   24.901988] virtio_rpmsg_bus virtio0: msg received with no recipient
[   24.901998] virtio_rpmsg_bus virtio0: input:id 16 out of range
[   24.902021] virtio_rpmsg_bus virtio0: rpmsg host is online
[   27.292846] gpio gpiochip3: Persistence not supported for GPIO 22
[   27.314833] gpio gpiochip5: Persistence not supported for GPIO 2
[   27.318321] gpio gpiochip3: Persistence not supported for GPIO 23
[   27.327194] gpio gpiochip0: Persistence not supported for GPIO 2
[   27.331119] gpio gpiochip3: Persistence not supported for GPIO 25
[   27.332654] gpio gpiochip2: Persistence not supported for GPIO 0
[   27.339364] gpio gpiochip3: Persistence not supported for GPIO 6
[   27.348326] gpio gpiochip2: Persistence not supported for GPIO 1
[   27.349686] gpio gpiochip3: Persistence not supported for GPIO 7
[   27.352640] gpio gpiochip2: Persistence not supported for GPIO 2
[   27.360166] gpio gpiochip3: Persistence not supported for GPIO 8
[   27.365002] gpio gpiochip2: Persistence not supported for GPIO 3
[   27.366136] gpio gpiochip3: Persistence not supported for GPIO 9
[   27.374818] gpio gpiochip2: Persistence not supported for GPIO 4
[   27.382357] gpio gpiochip3: Persistence not supported for GPIO 10
[   27.384906] gpio gpiochip2: Persistence not supported for GPIO 5
[   27.394829] gpio gpiochip0: Persistence not supported for GPIO 24
[   27.401060] gpio gpiochip2: Persistence not supported for GPIO 6
[   27.407334] gpio gpiochip3: Persistence not supported for GPIO 12
[   27.408679] gpio gpiochip2: Persistence not supported for GPIO 7
[   27.414871] gpio gpiochip3: Persistence not supported for GPIO 13
[   27.418080] gpio gpiochip6: Persistence not supported for GPIO 8
[   27.427103] gpio gpiochip3: Persistence not supported for GPIO 14
[   27.428093] gpio gpiochip6: Persistence not supported for GPIO 9
[   27.434795] gpio gpiochip3: Persistence not supported for GPIO 15
[   27.444871] gpio gpiochip6: Persistence not supported for GPIO 10
[   27.453764] gpio gpiochip3: Persistence not supported for GPIO 16
[   27.459155] gpio gpiochip6: Persistence not supported for GPIO 11
[   27.462241] gpio gpiochip3: Persistence not supported for GPIO 17
[   27.464869] gpio gpiochip6: Persistence not supported for GPIO 12
[   27.477009] gpio gpiochip0: Persistence not supported for GPIO 8
[   27.477989] gpio gpiochip6: Persistence not supported for GPIO 7
[   27.481850] gpio gpiochip0: Persistence not supported for GPIO 9
[   27.484976] gpio gpiochip5: Persistence not supported for GPIO 15
[   27.490244] gpio gpiochip0: Persistence not supported for GPIO 10
[   27.495014] gpio gpiochip5: Persistence not supported for GPIO 12
[   27.500290] gpio gpiochip0: Persistence not supported for GPIO 11
[   27.501532] gpio gpiochip2: Persistence not supported for GPIO 9
[   27.506991] gpio gpiochip0: Persistence not supported for GPIO 7
[   27.510152] gpio gpiochip2: Persistence not supported for GPIO 8
[   27.524874] gpio gpiochip2: Persistence not supported for GPIO 28
[   27.537091] gpio gpiochip3: Persistence not supported for GPIO 30
[   27.538279] gpio gpiochip6: Persistence not supported for GPIO 31
[   27.539204] gpio gpiochip3: Persistence not supported for GPIO 31
[   27.554594] gpio gpiochip4: Persistence not supported for GPIO 24
[   27.557653] gpio gpiochip3: Persistence not supported for GPIO 29
[   27.560839] gpio gpiochip4: Persistence not supported for GPIO 22
[   27.564868] gpio gpiochip3: Persistence not supported for GPIO 26
[   27.566061] gpio gpiochip4: Persistence not supported for GPIO 23
[   27.577190] gpio gpiochip0: Persistence not supported for GPIO 6
[   27.580364] gpio gpiochip4: Persistence not supported for GPIO 25
[   27.581347] gpio gpiochip5: Persistence not supported for GPIO 16
[   27.586702] gpio gpiochip5: Persistence not supported for GPIO 4
[   27.590028] gpio gpiochip5: Persistence not supported for GPIO 17
[   27.595036] gpio gpiochip5: Persistence not supported for GPIO 1
[   27.600893] gpio gpiochip5: Persistence not supported for GPIO 18
[   27.604971] gpio gpiochip5: Persistence not supported for GPIO 0
[   27.614757] gpio gpiochip5: Persistence not supported for GPIO 19
[   27.624952] gpio gpiochip6: Persistence not supported for GPIO 19
[   27.635015] gpio gpiochip5: Persistence not supported for GPIO 20
[   27.640311] gpio gpiochip6: Persistence not supported for GPIO 20
[   27.641504] gpio gpiochip5: Persistence not supported for GPIO 21
[   27.646949] gpio gpiochip5: Persistence not supported for GPIO 24
[   27.648166] gpio gpiochip4: Persistence not supported for GPIO 14
[   27.657039] gpio gpiochip5: Persistence not supported for GPIO 25
[   27.666944] gpio gpiochip4: Persistence not supported for GPIO 15
[   27.667964] gpio gpiochip5: Persistence not supported for GPIO 26
[   27.673116] gpio gpiochip4: Persistence not supported for GPIO 16
[   27.674820] gpio gpiochip5: Persistence not supported for GPIO 27
[   27.679548] gpio gpiochip4: Persistence not supported for GPIO 17
[   27.684835] gpio gpiochip5: Persistence not supported for GPIO 28
[   27.688310] gpio gpiochip6: Persistence not supported for GPIO 29
[   27.694896] gpio gpiochip5: Persistence not supported for GPIO 29
[   27.704774] gpio gpiochip5: Persistence not supported for GPIO 7
[   27.714981] gpio gpiochip5: Persistence not supported for GPIO 14
[   27.718127] gpio gpiochip5: Persistence not supported for GPIO 8
[   27.719066] gpio gpiochip3: Persistence not supported for GPIO 1
[   27.726664] gpio gpiochip5: Persistence not supported for GPIO 9
[   27.727882] gpio gpiochip6: Persistence not supported for GPIO 30
[   27.734859] gpio gpiochip5: Persistence not supported for GPIO 10
[   27.747200] gpio gpiochip5: Persistence not supported for GPIO 5
[   27.748449] gpio gpiochip5: Persistence not supported for GPIO 13
[   27.751496] gpio gpiochip5: Persistence not supported for GPIO 6
[   27.752503] gpio gpiochip6: Persistence not supported for GPIO 13
[   27.765521] gpio gpiochip5: Persistence not supported for GPIO 11
[   27.768759] gpio gpiochip6: Persistence not supported for GPIO 4
[   27.772026] gpio gpiochip4: Persistence not supported for GPIO 21
[   27.774857] gpio gpiochip6: Persistence not supported for GPIO 5
[   27.784839] gpio gpiochip4: Persistence not supported for GPIO 18
[   27.794999] gpio gpiochip6: Persistence not supported for GPIO 6
[   27.798195] gpio gpiochip4: Persistence not supported for GPIO 19
[   27.801417] gpio gpiochip6: Persistence not supported for GPIO 3
[   27.802398] gpio gpiochip4: Persistence not supported for GPIO 20
[   27.814730] gpio gpiochip6: Persistence not supported for GPIO 2
[   27.827738] gpio gpiochip5: Persistence not supported for GPIO 3
[   27.831192] gpio gpiochip6: Persistence not supported for GPIO 1
[   27.832170] gpio gpiochip6: Persistence not supported for GPIO 0
[   27.838071] gpio gpiochip4: Persistence not supported for GPIO 0
[   27.847103] gpio gpiochip0: Persistence not supported for GPIO 29
[   27.848105] gpio gpiochip6: Persistence not supported for GPIO 28
[   27.853243] gpio gpiochip1: Persistence not supported for GPIO 12
[   27.857770] gpio gpiochip1: Persistence not supported for GPIO 13
[   27.859582] gpio gpiochip1: Persistence not supported for GPIO 14
[   27.869308] gpio gpiochip1: Persistence not supported for GPIO 15
[   27.871410] gpio gpiochip1: Persistence not supported for GPIO 8
[   27.894612] gpio gpiochip1: Persistence not supported for GPIO 9
[   27.905284] gpio gpiochip1: Persistence not supported for GPIO 10
[   27.911229] gpio gpiochip6: Persistence not supported for GPIO 27
[   27.912404] gpio gpiochip1: Persistence not supported for GPIO 11
[   27.914136] gpio gpiochip1: Persistence not supported for GPIO 1
[   27.918297] gpio gpiochip1: Persistence not supported for GPIO 0
[   27.922256] gpio gpiochip1: Persistence not supported for GPIO 2
[   27.927882] gpio gpiochip1: Persistence not supported for GPIO 3
[   27.933408] gpio gpiochip1: Persistence not supported for GPIO 4
[   27.935622] gpio gpiochip1: Persistence not supported for GPIO 5
[   27.967437] gpio gpiochip0: Persistence not supported for GPIO 3
[   28.012965] gpio_mon: loading out-of-tree module taints kernel.
[   28.042262] gpio-mon: Starting gpio monitor module from PID=-1
[   28.042348] gpio-mon: Port 1 is mapped to IRQ: 105
[   28.042446] gpio-mon: Port 2 is mapped to IRQ: 107
[   28.042542] gpio-mon: Port 3 is mapped to IRQ: 109
[   28.042640] gpio-mon: Port 4 is mapped to IRQ: 111
[   28.042739] gpio-mon: Port 5 is mapped to IRQ: 113
[   28.042839] gpio-mon: Port 6 is mapped to IRQ: 115
[   28.042941] gpio-mon: Port 7 is mapped to IRQ: 117
[   28.043046] gpio-mon: Port 8 is mapped to IRQ: 119
[   28.043084] gpio-mon: Port 9 is mapped to IRQ: 121
[   28.043136] gpio-mon: Port 10 is mapped to IRQ: 123
[   28.043236] gpio-mon: Port 11 is mapped to IRQ: 125
[   28.043335] gpio-mon: Port 12 is mapped to IRQ: 127
[   28.043434] gpio-mon: Port 13 is mapped to IRQ: 129
[   28.043533] gpio-mon: Port 14 is mapped to IRQ: 131
[   28.043631] gpio-mon: Port 15 is mapped to IRQ: 133
[   28.043656] gpio-mon: Port 16 is mapped to IRQ: 135
[   28.043726] gpio-mon: Port 17 is mapped to IRQ: 137
[   28.043813] gpio-mon: Port 18 is mapped to IRQ: 139
[   28.043887] gpio-mon: Port 19 is mapped to IRQ: 141
[   28.043967] gpio-mon: Port 20 is mapped to IRQ: 143
[   28.043994] gpio-mon: Port 21 is mapped to IRQ: 145
[   28.044022] gpio-mon: Port 22 is mapped to IRQ: 147
[   28.044049] gpio-mon: Port 23 is mapped to IRQ: 149
[   28.054556] gpio-mon: Port 24 is mapped to IRQ: 151
[   28.054589] gpio-mon: Port 25 is mapped to IRQ: 153
[   28.054676] gpio-mon: Port 26 is mapped to IRQ: 155
[   28.054707] gpio-mon: Port 27 is mapped to IRQ: 157
[   28.054840] gpio-mon: Port 28 is mapped to IRQ: 159
[   28.054954] gpio-mon: Port 29 is mapped to IRQ: 161
[   28.054978] gpio-mon: Port 30 is mapped to IRQ: 163
[   28.055071] gpio-mon: Port 31 is mapped to IRQ: 165
[   28.055089] gpio-mon: Port 32 is mapped to IRQ: 167
[   28.055170] gpio-mon: Port 33 is mapped to IRQ: 169
[   28.055427] gpio-mon: Port 34 is mapped to IRQ: 171
[   28.055504] gpio-mon: Port 35 is mapped to IRQ: 173
[   28.055601] gpio-mon: Port 36 is mapped to IRQ: 175
[   28.055700] gpio-mon: Port 37 is mapped to IRQ: 177
[   28.055799] gpio-mon: Port 38 is mapped to IRQ: 179
[   28.055821] gpio-mon: Port 39 is mapped to IRQ: 181
[   28.055849] gpio-mon: Port 40 is mapped to IRQ: 183
[   28.055899] gpio-mon: Port 41 is mapped to IRQ: 185
[   28.055997] gpio-mon: Port 42 is mapped to IRQ: 187
[   28.056096] gpio-mon: Port 43 is mapped to IRQ: 189
[   28.056114] gpio-mon: Port 44 is mapped to IRQ: 191
[   28.056196] gpio-mon: Port 45 is mapped to IRQ: 193
[   28.056295] gpio-mon: Port 46 is mapped to IRQ: 195
[   28.056393] gpio-mon: Port 47 is mapped to IRQ: 197
[   28.056412] gpio-mon: Port 48 is mapped to IRQ: 199
[   28.056416] gpio-mon: The interrupt request rc is: 0
[   54.884340] Adding 1048572k swap on /usr/srvroot/shared/.swapfile.  Priority:-2 extents:11 across:1499132k SS
[   96.778518] ICMPv6: RA: ndisc_router_discovery failed to add default route
[  120.265970] FAT-fs (mmcblk0p1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
[  122.921649] audit: type=1325 audit(1762271368.020:77): table=filter family=2 entries=37
[  122.939923] audit: type=1325 audit(1762271368.040:78): table=filter family=2 entries=8
[  122.969851] audit: type=1325 audit(1762271368.070:79): table=filter family=2 entries=8
[  123.001878] audit: type=1325 audit(1762271368.100:80): table=filter family=2 entries=8
[  123.065878] audit: type=1325 audit(1762271368.170:81): table=filter family=10 entries=40
[  123.078344] audit: type=1325 audit(1762271368.180:82): table=filter family=10 entries=8
[  123.090320] audit: type=1325 audit(1762271368.190:83): table=filter family=10 entries=8
[  123.138039] audit: type=1325 audit(1762271368.240:84): table=filter family=10 entries=8
[  123.613950] audit: type=1325 audit(1762271368.710:85): table=filter family=2 entries=8
[  123.650171] audit: type=1325 audit(1762271368.750:86): table=filter family=2 entries=8
[  131.176382] systemd-sysv-generator[1162]: Overwriting existing symlink /run/systemd/generator.late/ocsrest.service with real service.
[  131.176671] systemd-sysv-generator[1162]: Overwriting existing symlink /run/systemd/generator.late/Ocs-init.service with real service.
[  187.048045] ICMPv6: RA: ndisc_router_discovery failed to add default route
[  244.874514] kauditd_printk_skb: 72 callbacks suppressed
[  244.874522] audit: type=1006 audit(1762271489.980:159): pid=1474 uid=0 old-auid=4294967295 auid=0 tty=(none) old-ses=4294967295 ses=1 res=1
[  283.531594] ICMPv6: RA: ndisc_router_discovery failed to add default route
[  313.747202] audit: type=1006 audit(1762271558.850:160): pid=1648 uid=0 old-auid=4294967295 auid=0 tty=(none) old-ses=4294967295 ses=2 res=1
[  356.195490] ICMPv6: RA: ndisc_router_discovery failed to add default route
[  438.393357] platform am437x_resetstatus: PRM_RSTST cleared with value 0x00000002
[  446.003225] ICMPv6: RA: ndisc_router_discovery failed to add default route
[  545.842649] ICMPv6: RA: ndisc_router_discovery failed to add default route
[  596.901532] ICMPv6: RA: ndisc_router_discovery failed to add default route
[  732.330098] ICMPv6: RA: ndisc_router_discovery failed to add default route
[  760.293292] ICMPv6: RA: ndisc_router_discovery failed to add default route
[  893.379324] ICMPv6: RA: ndisc_router_discovery failed to add default route
[  957.572103] ICMPv6: RA: ndisc_router_discovery failed to add default route
[ 1086.945613] ICMPv6: RA: ndisc_router_discovery failed to add default route
[ 1095.084608] audit: type=1006 audit(1762272340.180:161): pid=4441 uid=0 old-auid=4294967295 auid=0 tty=(none) old-ses=4294967295 ses=3 res=1
[ 1097.274486] audit: type=1006 audit(1762272342.370:162): pid=4445 uid=0 old-auid=4294967295 auid=0 tty=(none) old-ses=4294967295 ses=4 res=1
[ 1146.711247] ICMPv6: RA: ndisc_router_discovery failed to add default route
[ 1261.432407] ICMPv6: RA: ndisc_router_discovery failed to add default route
[ 1346.313099] ICMPv6: RA: ndisc_router_discovery failed to add default route
[ 1422.544512] audit: type=1006 audit(1762272667.640:163): pid=5919 uid=0 old-auid=4294967295 auid=0 tty=(none) old-ses=4294967295 ses=5 res=1
[ 1423.367676] ICMPv6: RA: ndisc_router_discovery failed to add default route
[ 1424.654596] audit: type=1006 audit(1762272669.750:164): pid=5931 uid=0 old-auid=4294967295 auid=0 tty=(none) old-ses=4294967295 ses=6 res=1
[ 1525.592943] ICMPv6: RA: ndisc_router_discovery failed to add default route
[ 1614.726577] ICMPv6: RA: ndisc_router_discovery failed to add default route
[ 1721.556096] ICMPv6: RA: ndisc_router_discovery failed to add default route
[ 1780.903424] ICMPv6: RA: ndisc_router_discovery failed to add default route
[ 1853.017534] audit: type=1006 audit(1762273098.120:165): pid=7669 uid=0 old-auid=4294967295 auid=0 tty=(none) old-ses=4294967295 ses=7 res=1
[ 1858.298159] audit: type=1006 audit(1762273103.400:166): pid=7739 uid=0 old-auid=4294967295 auid=0 tty=(none) old-ses=4294967295 ses=8 res=1
[ 1893.057679] ICMPv6: RA: ndisc_router_discovery failed to add default route
[ 1901.317290] audit: type=1006 audit(1762273146.420:167): pid=7934 uid=0 old-auid=4294967295 auid=0 tty=(none) old-ses=4294967295 ses=9 res=1
[ 1949.620209] audit: type=1006 audit(1762273194.720:168): pid=8538 uid=0 old-auid=4294967295 auid=0 tty=(none) old-ses=4294967295 ses=10 res=1
[ 1963.520801] ICMPv6: RA: ndisc_router_discovery failed to add default route
[ 2061.130717] ICMPv6: RA: ndisc_router_discovery failed to add default route
[ 2150.377681] ICMPv6: RA: ndisc_router_discovery failed to add default route
bash-5.0#

 

  • Another comment to do add to the main thread
    - The issue of GPIO assertion is seen frequently now with our new firmware. The firmware does not have any kernel changes around this area.

    Also, once this issue is seen, we also see several such crashes in the dmesg

    bash-5.0# dmesg
    [ 44.816336] ---[ end trace 5597c41047d0d1b1 ]---
    [ 44.818077] ------------[ cut here ]------------
    [ 44.818102] WARNING: CPU: 0 PID: 795 at drivers/bus/omap_l3_noc.c:141 l3_interrupt_handler+0x28c/0x384
    [ 44.818109] 44000000.ocp:L3 Standard Error: MASTER ICSS0 TARGET GPMC (Read): At Address: 0x002E0014 : Data Access in Supervisor mode during Functional access
    [ 44.818112] Modules linked in: gpio_mon(O) virtio_rpmsg_bus xt_state xt_comment ip6t_REJECT nf_reject_ipv6 ipt_REJECT nf_reject_ipv4 xt_hashlimit xt_NFLOG xt_LOG nf_conntrack_tftp xt_conntrack nf_conntrack nfnetlink_log nf_defrag_ipv6 nfnetlink libcrc32c nf_defrag_ipv4 xt_multiport xt_tcpudp ip6table_filter ip6_tables iptable_filter ip_tables x_tables pru_rproc irq_pruss_intc pruss ti_emif_sram omap_wdt sch_fq_codel omap_sham omap_des libdes omap_aes_driver omap_crypto libaes crypto_engine
    [ 44.818182] CPU: 0 PID: 795 Comm: check_redfish_s Tainted: G W O 5.4.28-MS_OCS_RM_1.1.36.254351-g6f3bf13d53 #1
    [ 44.818185] Hardware name: Generic AM43 (Flattened Device Tree)
    [ 44.818212] [<c010f1b8>] (unwind_backtrace) from [<c010b4d4>] (show_stack+0x10/0x14)
    [ 44.818225] [<c010b4d4>] (show_stack) from [<c012ccd0>] (__warn+0xbc/0xd4)
    [ 44.818234] [<c012ccd0>] (__warn) from [<c012cd80>] (warn_slowpath_fmt+0x98/0xc4)
    [ 44.818242] [<c012cd80>] (warn_slowpath_fmt) from [<c0495f2c>] (l3_interrupt_handler+0x28c/0x384)
    [ 44.818256] [<c0495f2c>] (l3_interrupt_handler) from [<c016f53c>] (__handle_irq_event_percpu+0x50/0x13c)
    [ 44.818266] [<c016f53c>] (__handle_irq_event_percpu) from [<c016f658>] (handle_irq_event_percpu+0x30/0x8c)
    [ 44.818272] [<c016f658>] (handle_irq_event_percpu) from [<c016f700>] (handle_irq_event+0x4c/0x8c)
    [ 44.818283] [<c016f700>] (handle_irq_event) from [<c0173694>] (handle_fasteoi_irq+0xb4/0x184)
    [ 44.818304] [<c0173694>] (handle_fasteoi_irq) from [<c016e710>] (generic_handle_irq+0x24/0x34)
    [ 44.818313] [<c016e710>] (generic_handle_irq) from [<c016ee88>] (__handle_domain_irq+0x54/0xa4)
    [ 44.818333] [<c016ee88>] (__handle_domain_irq) from [<c0494948>] (gic_handle_irq+0x3c/0x68)
    [ 44.818345] [<c0494948>] (gic_handle_irq) from [<c0101a8c>] (__irq_svc+0x6c/0xa8)
    [ 44.818350] Exception stack(0xed467f30 to 0xed467f78)
    [ 44.818357] 7f20: ee773418 00000000 00000001 00000000
    [ 44.818365] 7f40: ed467fb0 ffffe000 00000002 000000af c0101204 ed466000 00000020 004b8394
    [ 44.818371] 7f60: 40000028 ed467f80 c0109f7c c01894d4 600e0013 ffffffff
    [ 44.818388] [<c0101a8c>] (__irq_svc) from [<c01894d4>] (ktime_get_coarse_real_ts64+0x0/0x5c)
    [ 44.818398] [<c01894d4>] (ktime_get_coarse_real_ts64) from [<000000af>] (0xaf)
    [ 44.818402] ---[ end trace 5597c41047d0d1b2 ]---
    [ 44.818996] ------------[ cut here ]------------
    [ 44.819015] WARNING: CPU: 0 PID: 795 at drivers/bus/omap_l3_noc.c:141 l3_interrupt_handler+0x28c/0x384
    [ 44.819021] 44000000.ocp:L3 Standard Error: MASTER ICSS0 TARGET GPMC (Read): At Address: 0x002E000C : Data Access in Supervisor mode during Functional access
    [ 44.819023] Modules linked in: gpio_mon(O) virtio_rpmsg_bus xt_state xt_comment ip6t_REJECT nf_reject_ipv6 ipt_REJECT nf_reject_ipv4 xt_hashlimit xt_NFLOG xt_LOG nf_conntrack_tftp xt_conntrack nf_conntrack nfnetlink_log nf_defrag_ipv6 nfnetlink libcrc32c nf_defrag_ipv4 xt_multiport xt_tcpudp ip6table_filter ip6_tables iptable_filter ip_tables x_tables pru_rproc irq_pruss_intc pruss ti_emif_sram omap_wdt sch_fq_codel omap_sham omap_des libdes omap_aes_driver omap_crypto libaes crypto_engine
    [ 44.819082] CPU: 0 PID: 795 Comm: check_redfish_s Tainted: G W O 5.4.28-MS_OCS_RM_1.1.36.254351-g6f3bf13d53 #1
    [ 44.819085] Hardware name: Generic AM43 (Flattened Device Tree)
    [ 44.819109] [<c010f1b8>] (unwind_backtrace) from [<c010b4d4>] (show_stack+0x10/0x14)
    [ 44.819121] [<c010b4d4>] (show_stack) from [<c012ccd0>] (__warn+0xbc/0xd4)
    [ 44.819130] [<c012ccd0>] (__warn) from [<c012cd80>] (warn_slowpath_fmt+0x98/0xc4)
    [ 44.819138] [<c012cd80>] (warn_slowpath_fmt) from [<c0495f2c>] (l3_interrupt_handler+0x28c/0x384)
    [ 44.819148] [<c0495f2c>] (l3_interrupt_handler) from [<c016f53c>] (__handle_irq_event_percpu+0x50/0x13c)
    [ 44.819157] [<c016f53c>] (__handle_irq_event_percpu) from [<c016f658>] (handle_irq_event_percpu+0x30/0x8c)
    [ 44.819163] [<c016f658>] (handle_irq_event_percpu) from [<c016f700>] (handle_irq_event+0x4c/0x8c)
    [ 44.819174] [<c016f700>] (handle_irq_event) from [<c0173694>] (handle_fasteoi_irq+0xb4/0x184)
    [ 44.819192] [<c0173694>] (handle_fasteoi_irq) from [<c016e710>] (generic_handle_irq+0x24/0x34)
    [ 44.819200] [<c016e710>] (generic_handle_irq) from [<c016ee88>] (__handle_domain_irq+0x54/0xa4)
    [ 44.819216] [<c016ee88>] (__handle_domain_irq) from [<c0494948>] (gic_handle_irq+0x3c/0x68)
    [ 44.819228] [<c0494948>] (gic_handle_irq) from [<c0101a8c>] (__irq_svc+0x6c/0xa8)
    [ 44.819233] Exception stack(0xed467dd0 to 0xed467e18)
    [ 44.819239] 7dc0: ed61d2a4 60070013 00000000 00000020
    [ 44.819247] 7de0: cfc82600 ed61c660 ed61d2a0 cfc7ecc0 ed61d2a0 ed61d2a0 c0d6e380 ee7e9e1c
    [ 44.819253] 7e00: 00000004 ed467e20 c02199d8 c084cb88 60070013 ffffffff
    [ 44.819274] [<c0101a8c>] (__irq_svc) from [<c084cb88>] (down_write+0x0/0x48)
    [ 44.819293] [<c084cb88>] (down_write) from [<c02199d8>] (anon_vma_clone+0x94/0x1d0)
    [ 44.819303] [<c02199d8>] (anon_vma_clone) from [<c0219b38>] (anon_vma_fork+0x24/0x150)
    [ 44.819312] [<c0219b38>] (anon_vma_fork) from [<c0129bec>] (dup_mm+0x2f4/0x4d4)
    [ 44.819320] [<c0129bec>] (dup_mm) from [<c012b168>] (copy_process+0x1168/0x1654)
    [ 44.819326] [<c012b168>] (copy_process) from [<c012b804>] (_do_fork+0x80/0x390)
    [ 44.819334] [<c012b804>] (_do_fork) from [<c012bd20>] (sys_clone+0x70/0x94)
    [ 44.819342] [<c012bd20>] (sys_clone) from [<c01011e0>] (__sys_trace_return+0x0/0x20)
    [ 44.819346] Exception stack(0xed467fa8 to 0xed467ff0)
    [ 44.819353] 7fa0: b6efde38 b6efe290 01200011 00000000 00000000 00000000
    [ 44.819360] 7fc0: b6efde38 b6efe290 00000000 00000078 b6e9ce3c b6efddd0 00000005 00000001
    [ 44.819365] 7fe0: 00000078 beb77698 b6e2fbd3 b6de3cf6
    [ 44.819368] ---[ end trace 5597c41047d0d1b3 ]---
    [ 44.819917] ------------[ cut here ]------------
    [ 44.819937] WARNING: CPU: 0 PID: 795 at drivers/bus/omap_l3_noc.c:141 l3_interrupt_handler+0x28c/0x384
    [ 44.819943] 44000000.ocp:L3 Standard Error: MASTER ICSS0 TARGET GPMC (Read): At Address: 0x002E0004 : Data Access in Supervisor mode during Functional access
    [ 44.819945] Modules linked in: gpio_mon(O) virtio_rpmsg_bus xt_state xt_comment ip6t_REJECT nf_reject_ipv6 ipt_REJECT nf_reject_ipv4 xt_hashlimit xt_NFLOG xt_LOG nf_conntrack_tftp xt_conntrack nf_conntrack nfnetlink_log nf_defrag_ipv6 nfnetlink libcrc32c nf_defrag_ipv4 xt_multiport xt_tcpudp ip6table_filter ip6_tables iptable_filter ip_tables x_tables pru_rproc irq_pruss_intc pruss ti_emif_sram omap_wdt sch_fq_codel omap_sham omap_des libdes omap_aes_driver omap_crypto libaes crypto_engine
    [ 44.820000] CPU: 0 PID: 795 Comm: check_redfish_s Tainted: G W O 5.4.28-MS_OCS_RM_1.1.36.254351-g6f3bf13d53 #1
    [ 44.820003] Hardware name: Generic AM43 (Flattened Device Tree)
    [ 44.820023] [<c010f1b8>] (unwind_backtrace) from [<c010b4d4>] (show_stack+0x10/0x14)
    [ 44.820035] [<c010b4d4>] (show_stack) from [<c012ccd0>] (__warn+0xbc/0xd4)
    [ 44.820043] [<c012ccd0>] (__warn) from [<c012cd80>] (warn_slowpath_fmt+0x98/0xc4)
    [ 44.820051] [<c012cd80>] (warn_slowpath_fmt) from [<c0495f2c>] (l3_interrupt_handler+0x28c/0x384)
    [ 44.820061] [<c0495f2c>] (l3_interrupt_handler) from [<c016f53c>] (__handle_irq_event_percpu+0x50/0x13c)
    [ 44.820070] [<c016f53c>] (__handle_irq_event_percpu) from [<c016f658>] (handle_irq_event_percpu+0x30/0x8c)
    [ 44.820076] [<c016f658>] (handle_irq_event_percpu) from [<c016f700>] (handle_irq_event+0x4c/0x8c)
    [ 44.820087] [<c016f700>] (handle_irq_event) from [<c0173694>] (handle_fasteoi_irq+0xb4/0x184)
    [ 44.820104] [<c0173694>] (handle_fasteoi_irq) from [<c016e710>] (generic_handle_irq+0x24/0x34)
    [ 44.820113] [<c016e710>] (generic_handle_irq) from [<c016ee88>] (__handle_domain_irq+0x54/0xa4)
    [ 44.820129] [<c016ee88>] (__handle_domain_irq) from [<c0494948>] (gic_handle_irq+0x3c/0x68)
    [ 44.820139] [<c0494948>] (gic_handle_irq) from [<c0101a8c>] (__irq_svc+0x6c/0xa8)
    [ 44.820143] Exception stack(0xed467f28 to 0xed467f70)
    [ 44.820150] 7f20: 00000001 00000000 ee77369c ee77369c ee773400 00000001
    [ 44.820158] 7f40: 00000000 000000af c0101204 ed466000 000000af 00000001 00000000 ed467f78
    [ 44.820163] 7f60: c010a068 c01be0a4 60070013 ffffffff
    [ 44.820177] [<c0101a8c>] (__irq_svc) from [<c01be0a4>] (__audit_syscall_exit+0x40/0x250)
    [ 44.820198] [<c01be0a4>] (__audit_syscall_exit) from [<c010a068>] (syscall_trace_exit+0xc4/0xf4)
    [ 44.820207] [<c010a068>] (syscall_trace_exit) from [<c01011ec>] (__sys_trace_return+0xc/0x20)
    [ 44.820210] Exception stack(0xed467fb0 to 0xed467ff8)
    [ 44.820216] 7fa0: 00000000 beb7775c 00000000 00000008
    [ 44.820223] 7fc0: 00000000 00000000 00000002 000000af beb7775c 004ce1f0 00000005 00000001
    [ 44.820229] 7fe0: 000000af beb77628 b6df00e3 b6de3cf6 00070030 00000002
    [ 44.820233] ---[ end trace 5597c41047d0d1b4 ]---

  • Hello Sumit,

    Our Linux SDK for kernel 5.4 is more than 4 years old at this point. Are you planning on updating your design to a more recent kernel?

    The reason I ask is that both GPIO and the Linux PRU remoteproc driver have changed significantly over the last 4 years. So if you are planning to update to a more recent kernel (like the upcoming kernel 6.12 release in another week or so), it would probably make sense to port first, and I can discuss with you how the PRU firmware needs to be updated to be loaded by the newer kernel.

    Regards,

    Nick

  • additional questions:

    1) is there a specific timeframe by which the PRU cores must be initialized?

    2) It looks like the PRU remoteproc driver is auto-booting the PRU cores during Linux boot time, instead of booting the PRU cores during Linux runtime, or writing a custom Linux driver that calls the PRU remoteproc driver when it is probed during boot. Is that correct? Any additional information I should know?

    Regards,

    Nick

  • We have started the work to update to latest TI SDK, but that activity will take some time. In the meantime, we have to understand this issue and fix if possible soon.

  • Over firmware update of ARM SoC, we do the warm reboot and let the flasher image kick off (boot up from eMMC and update the QSPI NOR partitions) and then eventually boot up from QSPI NOR. During this procedure, we do not touch PRU cores at all.

    However, during boot up from QSPI NOR, we only do the following as part of init script (snippet below).

    <TRUNCATED>

    # Create throttlecleartime file
    PYTHONPATH=/usr/lib/commonapi python /usr/lib/commonapi/controls/write_throttlecount_clear_time.py

    echo "Starting the PRU rpmsg driver.."
    echo start > /sys/class/remoteproc/remoteproc1/state
    echo start > /sys/class/remoteproc/remoteproc2/state
    echo "Completed the PRU rpmsg driver execution. Done."

    echo "Setting permissions for i2c userspace adapter files.."
    chmod 666 /dev/i2c-0
    chmod 666 /dev/i2c-1
    echo "Setting permissions for i2c userspace adapter files. Done."

    echo "Starting runtimewatchdog daemon.. "
    systemctl start runtimewatchdog

    echo "Starting GPIO export.. "
    /usr/bin/ocs-gpio setupgpio
    modprobe gpio-mon usrpid=-1 sigid=-1

    echo "Initializing PMIC.. "
    /usr/bin/ocs-pmic initialize
    /usr/bin/ocs-pmic setfseal
    echo "Initializing PMIC done.. "

    echo "Initializing HDC Sensor.. "
    /usr/bin/ocs-hdc initialize
    echo "Initializing HDC Sensor done.. "

    echo "Clear faults on HSC Sensor.. "
    /usr/bin/ocs-hsc clearfaults
    echo "Clear faults on HSC Sensor done.. "

    # Linux 5.4 pru init linux modules are loaded as part of rminit.sh init
    echo "Setting permissions for rpmsg dev file.."
    chmod 666 /dev/rpmsg_pru31
    echo "Setting permissions for rpmsg dev file. Done."

    echo "ADC Calibration.. "
    /usr/bin/ocs-adccalibration -c
    echo "ADC Calibration done.. "

    echo "PRU persist config replay.."
    /usr/bin/ocs-pru replaypersistconfig
    echo "PRU persist config replay done."
    <TRUNCATED - other user space systemd services here after>
     
    Does the following sysfs cmds cause the PRU to boot up from initial state or it is just about loading the firmware again in PRU memory?
    echo start > /sys/class/remoteproc/remoteproc1/state
    echo start > /sys/class/remoteproc/remoteproc2/state"
    By the way any document about understanding the PRU boot up scenarios, remoteproc, rpmsg etc. Pls share
  • Hello Sumit,

    Setting support expectations

    I will do what I can to help, but I am limited in the support I can offer for Linux kernel 5.4. I can offer more support on later versions of Linux.

    What happens during boot before you call "echo start"? 

    First, Linux needs to know that the PRU cores even exist. It does that by probing the Linux devicetree nodes:

    [   13.262687] remoteproc remoteproc1: 54434000.pru is available
    [   13.284586] pru-rproc 54434000.pru: PRU rproc node /ocp@44000000/target-module@54400000/pruss@0/pru@34000 probed successfully
    [   13.315688] remoteproc remoteproc2: 54438000.pru is available
    [   13.321560] pru-rproc 54438000.pru: PRU rproc node /ocp@44000000/target-module@54400000/pruss@0/pru@38000 probed successfully

    At this point, the PRU subsystem has not been initialized. There is no clock signal applied to the PRU cores.

    Important note: PRU GPO signals are NOT deterministic before PRU cores are initialized! 

    Before the PRU has been initialized, the values in the PRU registers are non-deterministic (i.e., each bit can be randomly 1 or 0).

    If you apply pinmuxing settings that route a PRU GPO signal to a processor pin before the PRU core has been initialized, then the signal that appears on the pin will be RANDOM. If you need to make sure the signal is a fixed value, I would suggest following one of the suggestions in this e2e thread:  Linux/PROCESSOR-SDK-AM437X: GPO pin undefined until PRU starts 

    What happens after "echo start"? Is there any useful documentation? 

    After you call "echo start", then the PRU Remoteproc driver initializes the PRU core and sets up RPMsg communication (this happens by default in kernel 5.4, but it becomes optional in later Linux kernel releases).

    The resource table and INTC configuration are one of the major changes from Linux kernel 5.4 and earlier, and Linux kernel 5.10 and later. Please refer to my documentation here: (I'll link to a later SDK version since I cannot remember exactly when I added this documentation to the SDK docs): https://software-dl.ti.com/processor-sdk-linux/esd/AM335X/09_03_05_02/exports/docs/linux/Foundational_Components/PRU-ICSS-Firmware-Development.html

    Anything else? 

    Off the top of my head, I have not seen the behavior you are reporting before. Here is another thread where the customer was doing something similar, not sure if it would be helpful:  PROCESSOR-SDK-AM437X: The remoteproc is starting very late during boot  

    Regards,

    Nick

  • Thanks Nick

    Few more questions/comments

    1) About the PRU subsystem initialization, as we do warm reboot of ARM SOC, I assume that PRU cores are still active and are running. Is that not the case?

    If it is, then what impat does "echo start" do on PRU cores?

    2) does setting bit1 of PRCM_PRM_RSTCTRL reboot both the PRU cores?

    3) In a good v/s bad case (dmesg logs below). What can cause the failures/crash to happen in BAD case.

    BAD case is seen once in few iterations which include back-to-back firmware update

    Good

    [ 31.661830] remoteproc remoteproc1: powering up 54434000.pru
    [ 31.678925] remoteproc remoteproc1: Booting fw image am437x-pru1_0-fw, size 133492
    [ 31.679014] remoteproc remoteproc1: remote processor 54434000.pru is now up
    [ 31.696269] remoteproc remoteproc2: powering up 54438000.pru
    [ 31.708704] remoteproc remoteproc2: Booting fw image am437x-pru1_1-fw, size 91484
    [ 31.726321] pru-rproc 54438000.pru: configured system_events[63-0] = 00000000,000c0000
    [ 31.726335] pru-rproc 54438000.pru: configured intr_channels = 0x0000000a host_intr = 0x0000000a
    [ 31.738190] remoteproc2#vdev0buffer: registered virtio0 (type 7)
    [ 31.738208] remoteproc remoteproc2: remote processor 54438000.pru is now up
    [ 31.768160] virtio_rpmsg_bus virtio0: creating channel rpmsg-pru addr 0x1f
    [ 31.771243] virtio_rpmsg_bus virtio0: rpmsg host is online

    Bad

    [ 24.806663] remoteproc remoteproc1: powering up 54434000.pru
    [ 24.826845] remoteproc remoteproc1: Booting fw image am437x-pru1_0-fw, size 133624
    [ 24.826933] remoteproc remoteproc1: remote processor 54434000.pru is now up
    [ 24.827549] remoteproc remoteproc2: powering up 54438000.pru
    [ 24.854061] remoteproc remoteproc2: Booting fw image am437x-pru1_1-fw, size 91528
    [ 24.874836] pru-rproc 54438000.pru: configured system_events[63-0] = 00000000,000c0000
    [ 24.874850] pru-rproc 54438000.pru: configured intr_channels = 0x0000000a host_intr = 0x0000000a
    [ 24.883037] remoteproc2#vdev0buffer: registered virtio0 (type 7)
    [ 24.883053] remoteproc remoteproc2: remote processor 54438000.pru is now up
    [ 24.901282] ------------[ cut here ]------------
    [ 24.901312] WARNING: CPU: 0 PID: 461 at drivers/bus/omap_l3_noc.c:141 l3_interrupt_handler+0x28c/0x384
    [ 24.901320] 44000000.ocp:L3 Standard Error: MASTER ICSS1 TARGET GPMC (Read): At Address: 0x00090018 : Data Access in Supervisor mode during Functional access
    [ 24.901323] Modules linked in: virtio_rpmsg_bus(+) xt_state xt_comment ip6t_REJECT nf_reject_ipv6 ipt_REJECT nf_reject_ipv4 xt_hashlimit xt_NFLOG xt_LOG nf_conntrack_tftp xt_conntrack nf_conntrack nf_defrag_ipv6 libcrc32c nfnetlink_log nfnetlink nf_defrag_ipv4 xt_multiport xt_tcpudp ip6table_filter ip6_tables iptable_filter ip_tables x_tables pru_rproc irq_pruss_intc pruss ti_emif_sram omap_wdt sch_fq_codel omap_sham omap_des libdes omap_aes_driver omap_crypto libaes crypto_engine
    [ 24.901393] CPU: 0 PID: 461 Comm: systemd-udevd Not tainted 5.4.28-MS_OCS_RM_1.1.37.254421-g6f3bf13d53 #1
    [ 24.901396] Hardware name: Generic AM43 (Flattened Device Tree)
    [ 24.901426] [<c010f1b8>] (unwind_backtrace) from [<c010b4d4>] (show_stack+0x10/0x14)
    [ 24.901440] [<c010b4d4>] (show_stack) from [<c012ccd0>] (__warn+0xbc/0xd4)
    [ 24.901449] [<c012ccd0>] (__warn) from [<c012cd80>] (warn_slowpath_fmt+0x98/0xc4)
    [ 24.901457] [<c012cd80>] (warn_slowpath_fmt) from [<c0495f2c>] (l3_interrupt_handler+0x28c/0x384)
    [ 24.901470] [<c0495f2c>] (l3_interrupt_handler) from [<c016f53c>] (__handle_irq_event_percpu+0x50/0x13c)
    [ 24.901480] [<c016f53c>] (__handle_irq_event_percpu) from [<c016f658>] (handle_irq_event_percpu+0x30/0x8c)
    [ 24.901486] [<c016f658>] (handle_irq_event_percpu) from [<c016f700>] (handle_irq_event+0x4c/0x8c)
    [ 24.901499] [<c016f700>] (handle_irq_event) from [<c0173694>] (handle_fasteoi_irq+0xb4/0x184)
    [ 24.901520] [<c0173694>] (handle_fasteoi_irq) from [<c016e710>] (generic_handle_irq+0x24/0x34)
    [ 24.901530] [<c016e710>] (generic_handle_irq) from [<c016ee88>] (__handle_domain_irq+0x54/0xa4)
    [ 24.901551] [<c016ee88>] (__handle_domain_irq) from [<c0494948>] (gic_handle_irq+0x3c/0x68)
    [ 24.901564] [<c0494948>] (gic_handle_irq) from [<c0101a8c>] (__irq_svc+0x6c/0xa8)
    [ 24.901569] Exception stack(0xcfc59bd8 to 0xcfc59c20)
    [ 24.901575] 9bc0: cfb51000 60000013
    [ 24.901583] 9be0: 00000001 f0a44000 00000001 00000000 00000001 00000000 00000cc0 f0c91000
    [ 24.901590] 9c00: 00004000 f0c92e00 eec10ef4 cfc59c28 c016fbb8 c016f038 20000013 ffffffff
    [ 24.901600] [<c0101a8c>] (__irq_svc) from [<c016f038>] (__irq_put_desc_unlock+0x10/0x7c)
    [ 24.901608] [<c016f038>] (__irq_put_desc_unlock) from [<c016fbb8>] (irq_set_irqchip_state+0x88/0xc0)
    [ 24.901649] [<c016fbb8>] (irq_set_irqchip_state) from [<bf056768>] (pru_rproc_kick+0x54/0x74 [pru_rproc])
    [ 24.901684] [<bf056768>] (pru_rproc_kick [pru_rproc]) from [<c06b569c>] (rproc_virtio_notify+0x20/0x28)
    [ 24.901710] [<c06b569c>] (rproc_virtio_notify) from [<c04fef4c>] (virtqueue_notify+0x1c/0x34)
    [ 24.901753] [<c04fef4c>] (virtqueue_notify) from [<bf0f3b4c>] (rpmsg_probe+0x2a0/0x354 [virtio_rpmsg_bus])
    [ 24.901789] [<bf0f3b4c>] (rpmsg_probe [virtio_rpmsg_bus]) from [<c04fedfc>] (virtio_dev_probe+0x1f4/0x2c0)
    [ 24.901804] [<c04fedfc>] (virtio_dev_probe) from [<c055fe4c>] (really_probe+0x1e0/0x348)
    [ 24.901815] [<c055fe4c>] (really_probe) from [<c0560128>] (driver_probe_device+0x60/0x170)
    [ 24.901824] [<c0560128>] (driver_probe_device) from [<c05603d8>] (device_driver_attach+0x58/0x60)
    [ 24.901833] [<c05603d8>] (device_driver_attach) from [<c0560438>] (__driver_attach+0x58/0xcc)
    [ 24.901840] [<c0560438>] (__driver_attach) from [<c055e00c>] (bus_for_each_dev+0x78/0xc0)
    [ 24.901848] [<c055e00c>] (bus_for_each_dev) from [<c055f1c8>] (bus_add_driver+0x15c/0x1e0)
    [ 24.901858] [<c055f1c8>] (bus_add_driver) from [<c0560d14>] (driver_register+0x74/0x108)
    [ 24.901873] [<c0560d14>] (driver_register) from [<bf027010>] (rpmsg_init+0x10/0x1000 [virtio_rpmsg_bus])
    [ 24.901877] ---[ end trace 179cf74053c64539 ]---
    [ 24.901923] virtio_rpmsg_bus virtio0: msg received with no recipient
    [ 24.901941] virtio_rpmsg_bus virtio0: msg received with no recipient
    [ 24.901971] virtio_rpmsg_bus virtio0: msg received with no recipient
    [ 24.901980] virtio_rpmsg_bus virtio0: msg received with no recipient
    [ 24.901988] virtio_rpmsg_bus virtio0: msg received with no recipient
    [ 24.901998] virtio_rpmsg_bus virtio0: input:id 16 out of range
    [ 24.902021] virtio_rpmsg_bus virtio0: rpmsg host is online

    4) looks like (yet to understand the patch) more, we already have pinmuxing logic in Uboot which does pull down and GPO in output direction.

    diff --git a/arch/arm/cpu/armv7/am33xx/board.c b/arch/arm/cpu/armv7/am33xx/board.c
    index 8ca828f..2d71758 100644
    --- a/arch/arm/cpu/armv7/am33xx/board.c
    +++ b/arch/arm/cpu/armv7/am33xx/board.c
    @@ -402,6 +402,24 @@ void s_init(void)
     #endif
     }
     
    +/*
    + * Starts both PRU0 and PRU1 dual-cores for the PRU_ICSS1 processor.
    + * PRU_ICSS1 PRU1 Control register: at global memory-mapped location 0x54424000
    + * PRU_ICSS1 PRU0 Control register: at global memory-mapped location 0x54422000
    + *
    + * PRU Control Register definitions: (with value 0xB).
    + * bit 31-16: this field contains address where PRU will start executing code. (we will start at address zero)
    + * bit 3: if set, enable PRU cycle counters.
    + * bit 1: if set, enable PRU to fetch new instructions.
    + * bit 0: if set, no soft reset.
    +*/
    +void PRU_ICSS1_PRU0_and_1_Start(void)
    +
    +{
    +	*((unsigned int*)0x54424000) = 0xB;
    +	*((unsigned int*)0x54422000) = 0xB;
    +}
    +
     void early_system_init(void)
     {
     	/*
    @@ -424,6 +442,22 @@ void early_system_init(void)
     	/* Enable RTC32K clock */
     	rtc32k_enable();
     #endif
    +
    +	/*
    +	 * The following code must be done after the clock of
    +	 * the PRU modules were enabled in the setup_early_clocks().
    +	 */
    +	if (warm_reset()) {
    +		/*
    +		 * Set GPIO pin 5 for BLADE_THROTTLE_N,
    +		 * which will used by PRU0 to interrupt blade
    +		 * for power throttle alert.
    +		 */
    +		set_dss_mux_conf();
    +
    +		/* restart PRU0 firmware */
    +		PRU_ICSS1_PRU0_and_1_Start();
    +	}
     }
     
     #ifdef CONFIG_SPL_BUILD
    diff --git a/arch/arm/cpu/armv7/am33xx/clock_am43xx.c b/arch/arm/cpu/armv7/am33xx/clock_am43xx.c
    index ce5b826..d2ffa6d 100644
    --- a/arch/arm/cpu/armv7/am33xx/clock_am43xx.c
    +++ b/arch/arm/cpu/armv7/am33xx/clock_am43xx.c
    @@ -20,6 +20,8 @@ struct cm_perpll *const cmper = (struct cm_perpll *)CM_PER;
     struct cm_wkuppll *const cmwkup = (struct cm_wkuppll *)CM_WKUP;
     struct cm_dpll *const cmdpll = (struct cm_dpll *)CM_DPLL;
     
    +#define PRCM_RM_PER_RSTCTRL	0x44DF0810
    +
     const struct dpll_regs dpll_mpu_regs = {
     	.cm_clkmode_dpll	= CM_WKUP + 0x560,
     	.cm_idlest_dpll		= CM_WKUP + 0x564,
    @@ -99,6 +101,8 @@ void setup_clocks_for_console_uart1(void)
     
     void enable_basic_clocks(void)
     {
    +	u32 temp;
    +
     	u32 *const clk_domains[] = {
     		&cmper->l3clkstctrl,
     		&cmper->l3sclkstctrl,
    @@ -119,6 +123,9 @@ void enable_basic_clocks(void)
     		&cmwkup->wkctrlclkctrl,
     		&cmper->timer2clkctrl,
     		&cmper->gpmcclkctrl,
    +		&cmper->pruclkctrl, 	// Enable PRUSS module and clock
    +		&cmper->adc1clkctrl,	// Enable ADC clock
    +		&cmwkup->wkadc0clkctrl,
     		&cmper->elmclkctrl,
     		&cmper->mmc0clkctrl,
     		&cmper->mmc1clkctrl,
    @@ -145,6 +152,14 @@ void enable_basic_clocks(void)
     
     	/* For OPP100 the mac clock should be /5. */
     	writel(0x4, &cmdpll->clkselmacclk);
    +
    +	/* PRU-ICSS module local reset control */
    +	temp = readl(PRCM_RM_PER_RSTCTRL);	// Read PRCM_RM_PER_RSTCTRL register
    +	temp |= 0x2;                		// Assert Reset for PRU-ICSS
    +	writel(temp, PRCM_RM_PER_RSTCTRL);	// Write PRCM_RM_PER_RSTCTRL
    +	temp = readl(PRCM_RM_PER_RSTCTRL);	// Read PRCM_RM_PER_RSTCTRL
    +	temp &= 0xFFFFFFFD;			// Clear Reset for PRU-ICSS
    +	writel(temp, PRCM_RM_PER_RSTCTRL);	// Write PRCM_RM_PER_RSTCTRL
     }
     
     void rtc_only_enable_basic_clocks(void)
    diff --git a/arch/arm/include/asm/arch-am33xx/cpu.h b/arch/arm/include/asm/arch-am33xx/cpu.h
    index bacbee0..1c4852e 100644
    --- a/arch/arm/include/asm/arch-am33xx/cpu.h
    +++ b/arch/arm/include/asm/arch-am33xx/cpu.h
    @@ -231,8 +231,10 @@ struct prm_device_inst {
     #else
     /* Encapsulating core pll registers */
     struct cm_wkuppll {
    -	unsigned int resv0[136];
    -	unsigned int wkl4wkclkctrl;	/* offset 0x220 */
    +	unsigned int resv0[72];
    +	unsigned int wkadc0clkctrl;	/* offset 0x120 */
    +	unsigned int resv01[63];
    +	unsigned int wkl4wkclkctrl; 	/* offset 0x220 */
     	unsigned int resv1[7];
     	unsigned int usbphy0clkctrl;	/* offset 0x240 */
     	unsigned int resv112;
    @@ -313,7 +315,9 @@ struct cm_perpll {
     	unsigned int l3sclkstctrl;	/* offset 0x200 */
     	unsigned int resv8[7];
     	unsigned int gpmcclkctrl;	/* offset 0x220 */
    -	unsigned int resv9[5];
    +	unsigned int resv9[3];
    +	unsigned int adc1clkctrl;   	/* offset 0x230 */
    +	unsigned int resv91[1];
     	unsigned int mcasp0clkctrl;	/* offset 0x238 */
     	unsigned int resv10;
     	unsigned int mcasp1clkctrl;	/* offset 0x240 */
    @@ -325,7 +329,11 @@ struct cm_perpll {
     	unsigned int usb0clkctrl;	/* offset 0x260 */
     	unsigned int resv122;
     	unsigned int usb1clkctrl;	/* offset 0x268 */
    -	unsigned int resv13[101];
    +	unsigned int resv13[37];
    +	unsigned int pruclkstctrl;      /* offset 0x300 */
    +	unsigned int resv131[7];
    +	unsigned int pruclkctrl;        /* offset 0x320 */
    +	unsigned int resv132[55];
     	unsigned int l4lsclkstctrl;	/* offset 0x400 */
     	unsigned int resv14[7];
     	unsigned int l4lsclkctrl;	/* offset 0x420 */
    diff --git a/arch/arm/include/asm/arch-am33xx/sys_proto.h b/arch/arm/include/asm/arch-am33xx/sys_proto.h
    index 2d34c96..ca94ce9 100644
    --- a/arch/arm/include/asm/arch-am33xx/sys_proto.h
    +++ b/arch/arm/include/asm/arch-am33xx/sys_proto.h
    @@ -34,6 +34,7 @@ void enable_gpmc_cs_config(const u32 *gpmc_config, struct gpmc_cs *cs, u32 base,
     void omap_nand_switch_ecc(uint32_t, uint32_t);
     
     void set_uart_mux_conf(void);
    +void set_dss_mux_conf(void);
     void set_mux_conf_regs(void);
     void sdram_init(void);
     u32 wait_on_value(u32, u32, void *, u32);
    diff --git a/board/ti/am43xx_ocs/board.c b/board/ti/am43xx_ocs/board.c
    index 2879987..5e0c317 100644
    --- a/board/ti/am43xx_ocs/board.c
    +++ b/board/ti/am43xx_ocs/board.c
    @@ -459,6 +459,12 @@ void set_uart_mux_conf(void)
     	enable_uart1_pin_mux();
     }
     
    +void set_dss_mux_conf(void)
    +{
    +	enable_dss_pin_mux();
    +}
    +
    +
     void set_mux_conf_regs(void)
     {
     	enable_board_pin_mux();
    diff --git a/board/ti/am43xx_ocs/board.h b/board/ti/am43xx_ocs/board.h
    index a28a3ac..343c45f 100644
    --- a/board/ti/am43xx_ocs/board.h
    +++ b/board/ti/am43xx_ocs/board.h
    @@ -21,4 +21,5 @@ void enable_uart0_pin_mux(void);
     void enable_uart1_pin_mux(void);
     void enable_board_pin_mux(void);
     void enable_i2c0_pin_mux(void);
    +void enable_dss_pin_mux(void);
     #endif
    diff --git a/board/ti/am43xx_ocs/mux.c b/board/ti/am43xx_ocs/mux.c
    index b1a3a33..3625884 100644
    --- a/board/ti/am43xx_ocs/mux.c
    +++ b/board/ti/am43xx_ocs/mux.c
    @@ -62,6 +62,12 @@ static struct module_pin_mux uart1_pin_mux[] = {
     	{-1},
     };
     
    +/* This GPIO pin will be used by the ICSS PRU0 for BLADE_THROTTLE alert */
    +static struct module_pin_mux dss_pin_mux[] = {
    +	{OFFSET(lcd_data5), (MODE(5) | PULLDOWN_EN)},
    +	{-1},
    +};
    +
     /*
     
     {OFFSET(uart1_ctsn), (MODE(0) | PULLUP_EN | RXACTIVE | SLEWCTRL)},
    @@ -125,6 +131,11 @@ void enable_uart1_pin_mux(void)
     	configure_module_pin_mux(uart1_pin_mux);
     }
     
    +void enable_dss_pin_mux(void)
    +{
    +	configure_module_pin_mux(dss_pin_mux);
    +}
    +
     void enable_board_pin_mux(void)
     {
     	configure_module_pin_mux(mdio_pin_mux);

  • Hello Sumit,

    I am out of office until Wednesday. I am reassigning your thread to another team member to comment on the power questions. Please ping the thread if you do not get a response within a day or so.

    Regards,

    Nick

  • Hello Sumit, 

    Thank you for your query !

    Considering the following one of Nick's notes:

    " Important note: PRU GPO signals are NOT deterministic before PRU cores are initialized! 

    Before the PRU has been initialized, the values in the PRU registers are non-deterministic (i.e., each bit can be randomly 1 or 0).

    If you apply pinmuxing settings that route a PRU GPO signal to a processor pin before the PRU core has been initialized, then the signal that appears on the pin will be RANDOM. If you need to make sure the signal is a fixed value, I would suggest following one of the suggestions in this e2e thread:

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/677952/linux-processor-sdk-am437x-gpo-pin-undefined-until-pru-starts 

    "

    from hardware perspective I have the following questions:

    Q1. Do you use a custom PCB solution or the AM4372 EVM. If EVM which one ?

    Q2. I understand that the focus of your query is the behavior of the pr1_pru0_gpo5 signal muxed on the AM4372 dss_data5 pin, correct  ?

    Q3. What is the type of the Ethernet PHY that you use ? 

    Q4. What is the level of the GPO pin when unexpectedly asserted - HIGH or LOW ?

    Q5. Is the pr1_pru0_gpo5 or another PRU0 GPO signal related SoC pin connected to the reset input of the external Ethernet PHY that you use ?

    Q6. Would you please confirm my understanding that the Cortex-A9 reboot event source is the global software warm reset triggered via the  PRCM_PRM_RSTCTRL[0] RST_GLOBAL_WARM_SW bit ?

    Q7. Do you use an external pull-down resistor at the pr1_pru0_gpo5 output ?

    Q8. According to the AM4372 Datasheet, TableNote6 of the Table, Pin Attributes (ZDN Package) continued, the dss_data5 pin also plays the role of the sysboot5 pin. How do you define the sysboot5 input level - via hardware buffered or non-buffered pull resistors solution ? 

    The Table, Reset Sources of the  Section, Reset Characteristics of the AM437x TRM  specifies the following Pinmux and PRU GPO relevant impacts during a global warm reset event:

    All the AM4372 IOs including the pr1_pruo_gpo5 pin will be tri-stated during a warm reset. The pin-mux logic will be reset ( and in particular the MuxMode reset to 0x7 GPIO0_13).

    There is also a note in the Section, General-Purpose Outputs (R30): Enhanced PRU GP Module and Section, Direct Output of the Chapter, Programmable Real-Time Unit Subsystem and Industrial Communication Subsystem (PRU-ICSS) of the TRM:

    Q9. Do you re-initialize the PRU0  R30 register after the reboot of the ARM before the pr1_pru0_gpo5 pin-mux register re-initialization ?

    Q10. Do you have a similar issue upon PORz event or only during global software reset ?

    Thanks for your clarification !

    Kind Regards

    Anastas Yordanov

  • Hi Anastas,

    Sorry could not respond earlier to your queries. Please find responses for some of them as below

    - We have our custom PCB board

    - Actually, there are 2 issues. One is that the char device /dev/rpmsg_31 not created in some of the cases and the other one is GPIO assertion. For the GPIO assertion, we are internally investigating at the moment as our PRU firmware, dynamically set it. So, for now, I am mainly looking to investigate whey /dev/rpmsg_pru31 device does not get created during linux boot up?

    [ 24.806663] remoteproc remoteproc1: powering up 54434000.pru
    [ 24.826845] remoteproc remoteproc1: Booting fw image am437x-pru1_0-fw, size 133624
    [ 24.826933] remoteproc remoteproc1: remote processor 54434000.pru is now up
    [ 24.827549] remoteproc remoteproc2: powering up 54438000.pru
    [ 24.854061] remoteproc remoteproc2: Booting fw image am437x-pru1_1-fw, size 91528
    [ 24.874836] pru-rproc 54438000.pru: configured system_events[63-0] = 00000000,000c0000
    [ 24.874850] pru-rproc 54438000.pru: configured intr_channels = 0x0000000a host_intr = 0x0000000a
    [ 24.883037] remoteproc2#vdev0buffer: registered virtio0 (type 7)
    [ 24.883053] remoteproc remoteproc2: remote processor 54438000.pru is now up
    [ 24.901282] ------------[ cut here ]------------
    [ 24.901312] WARNING: CPU: 0 PID: 461 at drivers/bus/omap_l3_noc.c:141 l3_interrupt_handler+0x28c/0x384
    [ 24.901320] 44000000.ocp:L3 Standard Error: MASTER ICSS1 TARGET GPMC (Read): At Address: 0x00090018 : Data Access in Supervisor mode during Functional access
    [ 24.901323] Modules linked in: virtio_rpmsg_bus(+) xt_state xt_comment ip6t_REJECT nf_reject_ipv6 ipt_REJECT nf_reject_ipv4 xt_hashlimit xt_NFLOG xt_LOG nf_conntrack_tftp xt_conntrack nf_conntrack nf_defrag_ipv6 libcrc32c nfnetlink_log nfnetlink nf_defrag_ipv4 xt_multiport xt_tcpudp ip6table_filter ip6_tables iptable_filter ip_tables x_tables pru_rproc irq_pruss_intc pruss ti_emif_sram omap_wdt sch_fq_codel omap_sham omap_des libdes omap_aes_driver omap_crypto libaes crypto_engine
    [ 24.901393] CPU: 0 PID: 461 Comm: systemd-udevd Not tainted 5.4.28-MS_OCS_RM_1.1.37.254421-g6f3bf13d53 #1
    [ 24.901396] Hardware name: Generic AM43 (Flattened Device Tree)
    [ 24.901426] [<c010f1b8>] (unwind_backtrace) from [<c010b4d4>] (show_stack+0x10/0x14)
    [ 24.901440] [<c010b4d4>] (show_stack) from [<c012ccd0>] (__warn+0xbc/0xd4)
    [ 24.901449] [<c012ccd0>] (__warn) from [<c012cd80>] (warn_slowpath_fmt+0x98/0xc4)
    [ 24.901457] [<c012cd80>] (warn_slowpath_fmt) from [<c0495f2c>] (l3_interrupt_handler+0x28c/0x384)
    [ 24.901470] [<c0495f2c>] (l3_interrupt_handler) from [<c016f53c>] (__handle_irq_event_percpu+0x50/0x13c)
    [ 24.901480] [<c016f53c>] (__handle_irq_event_percpu) from [<c016f658>] (handle_irq_event_percpu+0x30/0x8c)
    [ 24.901486] [<c016f658>] (handle_irq_event_percpu) from [<c016f700>] (handle_irq_event+0x4c/0x8c)
    [ 24.901499] [<c016f700>] (handle_irq_event) from [<c0173694>] (handle_fasteoi_irq+0xb4/0x184)
    [ 24.901520] [<c0173694>] (handle_fasteoi_irq) from [<c016e710>] (generic_handle_irq+0x24/0x34)
    [ 24.901530] [<c016e710>] (generic_handle_irq) from [<c016ee88>] (__handle_domain_irq+0x54/0xa4)
    [ 24.901551] [<c016ee88>] (__handle_domain_irq) from [<c0494948>] (gic_handle_irq+0x3c/0x68)
    [ 24.901564] [<c0494948>] (gic_handle_irq) from [<c0101a8c>] (__irq_svc+0x6c/0xa8)
    [ 24.901569] Exception stack(0xcfc59bd8 to 0xcfc59c20)
    [ 24.901575] 9bc0: cfb51000 60000013
    [ 24.901583] 9be0: 00000001 f0a44000 00000001 00000000 00000001 00000000 00000cc0 f0c91000
    [ 24.901590] 9c00: 00004000 f0c92e00 eec10ef4 cfc59c28 c016fbb8 c016f038 20000013 ffffffff
    [ 24.901600] [<c0101a8c>] (__irq_svc) from [<c016f038>] (__irq_put_desc_unlock+0x10/0x7c)
    [ 24.901608] [<c016f038>] (__irq_put_desc_unlock) from [<c016fbb8>] (irq_set_irqchip_state+0x88/0xc0)
    [ 24.901649] [<c016fbb8>] (irq_set_irqchip_state) from [<bf056768>] (pru_rproc_kick+0x54/0x74 [pru_rproc])
    [ 24.901684] [<bf056768>] (pru_rproc_kick [pru_rproc]) from [<c06b569c>] (rproc_virtio_notify+0x20/0x28)
    [ 24.901710] [<c06b569c>] (rproc_virtio_notify) from [<c04fef4c>] (virtqueue_notify+0x1c/0x34)
    [ 24.901753] [<c04fef4c>] (virtqueue_notify) from [<bf0f3b4c>] (rpmsg_probe+0x2a0/0x354 [virtio_rpmsg_bus])
    [ 24.901789] [<bf0f3b4c>] (rpmsg_probe [virtio_rpmsg_bus]) from [<c04fedfc>] (virtio_dev_probe+0x1f4/0x2c0)
    [ 24.901804] [<c04fedfc>] (virtio_dev_probe) from [<c055fe4c>] (really_probe+0x1e0/0x348)
    [ 24.901815] [<c055fe4c>] (really_probe) from [<c0560128>] (driver_probe_device+0x60/0x170)
    [ 24.901824] [<c0560128>] (driver_probe_device) from [<c05603d8>] (device_driver_attach+0x58/0x60)
    [ 24.901833] [<c05603d8>] (device_driver_attach) from [<c0560438>] (__driver_attach+0x58/0xcc)
    [ 24.901840] [<c0560438>] (__driver_attach) from [<c055e00c>] (bus_for_each_dev+0x78/0xc0)
    [ 24.901848] [<c055e00c>] (bus_for_each_dev) from [<c055f1c8>] (bus_add_driver+0x15c/0x1e0)
    [ 24.901858] [<c055f1c8>] (bus_add_driver) from [<c0560d14>] (driver_register+0x74/0x108)
    [ 24.901873] [<c0560d14>] (driver_register) from [<bf027010>] (rpmsg_init+0x10/0x1000 [virtio_rpmsg_bus])
    [ 24.901877] ---[ end trace 179cf74053c64539 ]---
    [ 24.901923] virtio_rpmsg_bus virtio0: msg received with no recipient
    [ 24.901941] virtio_rpmsg_bus virtio0: msg received with no recipient
    [ 24.901971] virtio_rpmsg_bus virtio0: msg received with no recipient
    [ 24.901980] virtio_rpmsg_bus virtio0: msg received with no recipient
    [ 24.901988] virtio_rpmsg_bus virtio0: msg received with no recipient
    [ 24.901998] virtio_rpmsg_bus virtio0: input:id 16 out of range
    [ 24.902021] virtio_rpmsg_bus virtio0: rpmsg host is online

    In some of the BAD cases, the entire dmesg is filled with below log completely

    [ 24.901988] virtio_rpmsg_bus virtio0: msg received with no recipient

    Q6: I need to check which register is internally used by the linux. We do the WARM reboot of the SoC using linux reboot command. Is there an easy way to find out from the user space?

    Regards,

    Sumit

  • Hello Sumit,

    1) Your application is actually using the PRU RPMsg, right? If not, we do not actually need to set up PRU RPMsg communication on later Linux kernel versions (though I think it is still required on Linux kernel 5.4).

    2) Can I get you to confirm that PRU is waiting for Linux to signal the Linux is ready before PRU starts creating the RPMsg channel? Your code should look like this (taken from PSSP tag 5.9, which was for kernel 5.4)
    https://git.ti.com/cgit/pru-software-support-package/pru-software-support-package/tree/examples/am437x/PRU_RPMsg_Echo_Interrupt0_0/main.c?h=v5.9.0

    	/* Enable the OCP master port of PRUSS1 to read external memories */
    	PRUSS1_CFG_SYSCFG &= ~(STANDY_INIT_BIT);
    
    	/* Clear the status of the PRU-ICSS system event that the ARM will use to 'kick' us */
    	CT_INTC.SICR_bit.STATUS_CLR_INDEX = FROM_ARM_HOST;
    
    	/* Make sure the Linux drivers are ready for RPMsg communication */
    	status = &resourceTable.rpmsg_vdev.status;
    	while (!(*status & VIRTIO_CONFIG_S_DRIVER_OK));
    
    	/* Initialize the RPMsg transport structure */
    	pru_rpmsg_init(&transport, &resourceTable.rpmsg_vring0, &resourceTable.rpmsg_vring1, TO_ARM_HOST, FROM_ARM_HOST);
    
    	/* Create the RPMsg channel between the PRU and ARM user space using the transport structure. */
    	while (pru_rpmsg_channel(RPMSG_NS_CREATE, &transport, CHAN_NAME, CHAN_DESC, CHAN_PORT) != PRU_RPMSG_SUCCESS);

    Regards,

    Nick

  • Thanks Nick.

    1. Yes, we rely on PRU RPMsg on which ARM SoC talk to PRU cores. In the problem case, this device does not get created and we get several (virtio_rpmsg....) and eventually "rpmsg host is online". But still the device is not created.

    What does "rpmsg host is online" means?

    [ 40.657383] virtio_rpmsg_bus virtio0: msg received with no recipient
    [ 40.657391] virtio_rpmsg_bus virtio0: msg received with no recipient
    [ 40.852618] systemd-journald[393]: /dev/kmsg buffer overrun, some messages lost.
    [ 40.991504] virtio_rpmsg_bus virtio0: rpmsg host is online

    2. Yes, our code is like this (same as what you pasted).

            /* allow OCP master port access by the PRU so the PRU can read external memories */
            CT_CFG.SYSCFG_bit.STANDBY_INIT = 0;
           
            /* clear the status of event MB_INT_NUMBER (the mailbox event) and enable the mailbox event */
            //CT_INTC.SICR_bit.STATUS_CLR_INDEX = MB_INT_NUMBER;
            //CT_MBX.IRQ[MB_USER].ENABLE_SET |= 1 << (MB_FROM_ARM_HOST * 2);
            CT_INTC.SICR_bit.STATUS_CLR_INDEX = FROM_ARM_HOST;
       

            /* Make sure the Linux drivers are ready for RPMsg communication */
            status = &resourceTable.rpmsg_vdev.status;
            while (!(*status & VIRTIO_CONFIG_S_DRIVER_OK));

            /* Initialize pru_virtqueue corresponding to vring0 (PRU to ARM Host direction) */
            //pru_virtqueue_init(&transport.virtqueue0, &resourceTable.rpmsg_vring0, &CT_MBX.MESSAGE[MB_TO_ARM_HOST], &CT_MBX.MESSAGE[MB_FROM_ARM_HOST]);

            /* Initialize pru_virtqueue corresponding to vring1 (ARM Host to PRU direction) */
            //pru_virtqueue_init(&transport.virtqueue1, &resourceTable.rpmsg_vring1, &CT_MBX.MESSAGE[MB_TO_ARM_HOST], &CT_MBX.MESSAGE[MB_FROM_ARM_HOST]);
            pru_rpmsg_init(&transport, &resourceTable.rpmsg_vring0, &resourceTable.rpmsg_vring1, TO_ARM_HOST, FROM_ARM_HOST);

            /* Create the RPMsg channel between the PRU and ARM user space using the transport structure. */
            while(pru_rpmsg_channel(RPMSG_NS_CREATE, &transport, CHAN_NAME, CHAN_DESC, CHAN_PORT) != PRU_RPMSG_SUCCESS);

            while(1){
                    /* Check bit 31 of register R31 to see if the mailbox interrupt has occurred */
                    if(__R31 & HOST_INT){
                            /* Clear the mailbox interrupt */
                            //CT_MBX.IRQ[MB_USER].STATUS_CLR |= 1 << (MB_FROM_ARM_HOST * 2);
                            /* Clear the event status, event MB_INT_NUMBER corresponds to the mailbox interrupt */
                            //CT_INTC.SICR_bit.STATUS_CLR_INDEX = MB_INT_NUMBER;
                            CT_INTC.SICR_bit.STATUS_CLR_INDEX = FROM_ARM_HOST;
                            /* Use a while loop to read all of the current messages in the mailbox */
                            //while(CT_MBX.MSGSTATUS_bit[MB_FROM_ARM_HOST].NBOFMSG > 0){
                            /* Receive all available messages, multiple messages can be sent per kick */
                            while (pru_rpmsg_receive(&transport, &src, &dst, &request, &len) == PRU_RPMSG_SUCCESS) {
  • Hello Sumit,

    I did not have time to dig into your thread today. Will give a response tomorrow.

    Setting expectations, I can spend a few minutes skimming through kernel 5.4 drivers, but the PRU remoteproc driver has changed quite a bit between kernel 5.4 and the latest kernel 6.12 (SDK releasing within a week).

    Regards,

    Nick

  • Thanks Nick

    Some more updates on this issue

    Earlier in year 2019 we added below 2 uboot patches to enable support for PRU warm restart. Looks like this patch is now causing regression.

    1) Not sure at the moment, why these patches were not causing this issue (aggressively) earlier but now. Any pointers you can give which we can check?

    2) For now, we have disabled these patches, but we do have to support PRU warm restart. Can you give us the guidance that if there is anything incorrect with below patches and what changes we should do so that we do not come across this issue?

    diff --git a/arch/arm/cpu/armv7/am33xx/board.c b/arch/arm/cpu/armv7/am33xx/board.c
    index 8ca828f..2d71758 100644
    --- a/arch/arm/cpu/armv7/am33xx/board.c
    +++ b/arch/arm/cpu/armv7/am33xx/board.c
    @@ -402,6 +402,24 @@ void s_init(void)
     #endif
     }
     
    +/*
    + * Starts both PRU0 and PRU1 dual-cores for the PRU_ICSS1 processor.
    + * PRU_ICSS1 PRU1 Control register: at global memory-mapped location 0x54424000
    + * PRU_ICSS1 PRU0 Control register: at global memory-mapped location 0x54422000
    + *
    + * PRU Control Register definitions: (with value 0xB).
    + * bit 31-16: this field contains address where PRU will start executing code. (we will start at address zero)
    + * bit 3: if set, enable PRU cycle counters.
    + * bit 1: if set, enable PRU to fetch new instructions.
    + * bit 0: if set, no soft reset.
    +*/
    +void PRU_ICSS1_PRU0_and_1_Start(void)
    +
    +{
    +	*((unsigned int*)0x54424000) = 0xB;
    +	*((unsigned int*)0x54422000) = 0xB;
    +}
    +
     void early_system_init(void)
     {
     	/*
    @@ -424,6 +442,22 @@ void early_system_init(void)
     	/* Enable RTC32K clock */
     	rtc32k_enable();
     #endif
    +
    +	/*
    +	 * The following code must be done after the clock of
    +	 * the PRU modules were enabled in the setup_early_clocks().
    +	 */
    +	if (warm_reset()) {
    +		/*
    +		 * Set GPIO pin 5 for BLADE_THROTTLE_N,
    +		 * which will used by PRU0 to interrupt blade
    +		 * for power throttle alert.
    +		 */
    +		set_dss_mux_conf();
    +
    +		/* restart PRU0 firmware */
    +		PRU_ICSS1_PRU0_and_1_Start();
    +	}
     }
     
     #ifdef CONFIG_SPL_BUILD
    diff --git a/arch/arm/cpu/armv7/am33xx/clock_am43xx.c b/arch/arm/cpu/armv7/am33xx/clock_am43xx.c
    index ce5b826..d2ffa6d 100644
    --- a/arch/arm/cpu/armv7/am33xx/clock_am43xx.c
    +++ b/arch/arm/cpu/armv7/am33xx/clock_am43xx.c
    @@ -20,6 +20,8 @@ struct cm_perpll *const cmper = (struct cm_perpll *)CM_PER;
     struct cm_wkuppll *const cmwkup = (struct cm_wkuppll *)CM_WKUP;
     struct cm_dpll *const cmdpll = (struct cm_dpll *)CM_DPLL;
     
    +#define PRCM_RM_PER_RSTCTRL	0x44DF0810
    +
     const struct dpll_regs dpll_mpu_regs = {
     	.cm_clkmode_dpll	= CM_WKUP + 0x560,
     	.cm_idlest_dpll		= CM_WKUP + 0x564,
    @@ -99,6 +101,8 @@ void setup_clocks_for_console_uart1(void)
     
     void enable_basic_clocks(void)
     {
    +	u32 temp;
    +
     	u32 *const clk_domains[] = {
     		&cmper->l3clkstctrl,
     		&cmper->l3sclkstctrl,
    @@ -119,6 +123,9 @@ void enable_basic_clocks(void)
     		&cmwkup->wkctrlclkctrl,
     		&cmper->timer2clkctrl,
     		&cmper->gpmcclkctrl,
    +		&cmper->pruclkctrl, 	// Enable PRUSS module and clock
    +		&cmper->adc1clkctrl,	// Enable ADC clock
    +		&cmwkup->wkadc0clkctrl,
     		&cmper->elmclkctrl,
     		&cmper->mmc0clkctrl,
     		&cmper->mmc1clkctrl,
    @@ -145,6 +152,14 @@ void enable_basic_clocks(void)
     
     	/* For OPP100 the mac clock should be /5. */
     	writel(0x4, &cmdpll->clkselmacclk);
    +
    +	/* PRU-ICSS module local reset control */
    +	temp = readl(PRCM_RM_PER_RSTCTRL);	// Read PRCM_RM_PER_RSTCTRL register
    +	temp |= 0x2;                		// Assert Reset for PRU-ICSS
    +	writel(temp, PRCM_RM_PER_RSTCTRL);	// Write PRCM_RM_PER_RSTCTRL
    +	temp = readl(PRCM_RM_PER_RSTCTRL);	// Read PRCM_RM_PER_RSTCTRL
    +	temp &= 0xFFFFFFFD;			// Clear Reset for PRU-ICSS
    +	writel(temp, PRCM_RM_PER_RSTCTRL);	// Write PRCM_RM_PER_RSTCTRL
     }
     
     void rtc_only_enable_basic_clocks(void)
    diff --git a/arch/arm/include/asm/arch-am33xx/cpu.h b/arch/arm/include/asm/arch-am33xx/cpu.h
    index bacbee0..1c4852e 100644
    --- a/arch/arm/include/asm/arch-am33xx/cpu.h
    +++ b/arch/arm/include/asm/arch-am33xx/cpu.h
    @@ -231,8 +231,10 @@ struct prm_device_inst {
     #else
     /* Encapsulating core pll registers */
     struct cm_wkuppll {
    -	unsigned int resv0[136];
    -	unsigned int wkl4wkclkctrl;	/* offset 0x220 */
    +	unsigned int resv0[72];
    +	unsigned int wkadc0clkctrl;	/* offset 0x120 */
    +	unsigned int resv01[63];
    +	unsigned int wkl4wkclkctrl; 	/* offset 0x220 */
     	unsigned int resv1[7];
     	unsigned int usbphy0clkctrl;	/* offset 0x240 */
     	unsigned int resv112;
    @@ -313,7 +315,9 @@ struct cm_perpll {
     	unsigned int l3sclkstctrl;	/* offset 0x200 */
     	unsigned int resv8[7];
     	unsigned int gpmcclkctrl;	/* offset 0x220 */
    -	unsigned int resv9[5];
    +	unsigned int resv9[3];
    +	unsigned int adc1clkctrl;   	/* offset 0x230 */
    +	unsigned int resv91[1];
     	unsigned int mcasp0clkctrl;	/* offset 0x238 */
     	unsigned int resv10;
     	unsigned int mcasp1clkctrl;	/* offset 0x240 */
    @@ -325,7 +329,11 @@ struct cm_perpll {
     	unsigned int usb0clkctrl;	/* offset 0x260 */
     	unsigned int resv122;
     	unsigned int usb1clkctrl;	/* offset 0x268 */
    -	unsigned int resv13[101];
    +	unsigned int resv13[37];
    +	unsigned int pruclkstctrl;      /* offset 0x300 */
    +	unsigned int resv131[7];
    +	unsigned int pruclkctrl;        /* offset 0x320 */
    +	unsigned int resv132[55];
     	unsigned int l4lsclkstctrl;	/* offset 0x400 */
     	unsigned int resv14[7];
     	unsigned int l4lsclkctrl;	/* offset 0x420 */
    diff --git a/arch/arm/include/asm/arch-am33xx/sys_proto.h b/arch/arm/include/asm/arch-am33xx/sys_proto.h
    index 2d34c96..ca94ce9 100644
    --- a/arch/arm/include/asm/arch-am33xx/sys_proto.h
    +++ b/arch/arm/include/asm/arch-am33xx/sys_proto.h
    @@ -34,6 +34,7 @@ void enable_gpmc_cs_config(const u32 *gpmc_config, struct gpmc_cs *cs, u32 base,
     void omap_nand_switch_ecc(uint32_t, uint32_t);
     
     void set_uart_mux_conf(void);
    +void set_dss_mux_conf(void);
     void set_mux_conf_regs(void);
     void sdram_init(void);
     u32 wait_on_value(u32, u32, void *, u32);
    diff --git a/board/ti/am43xx_ocs/board.c b/board/ti/am43xx_ocs/board.c
    index 2879987..5e0c317 100644
    --- a/board/ti/am43xx_ocs/board.c
    +++ b/board/ti/am43xx_ocs/board.c
    @@ -459,6 +459,12 @@ void set_uart_mux_conf(void)
     	enable_uart1_pin_mux();
     }
     
    +void set_dss_mux_conf(void)
    +{
    +	enable_dss_pin_mux();
    +}
    +
    +
     void set_mux_conf_regs(void)
     {
     	enable_board_pin_mux();
    diff --git a/board/ti/am43xx_ocs/board.h b/board/ti/am43xx_ocs/board.h
    index a28a3ac..343c45f 100644
    --- a/board/ti/am43xx_ocs/board.h
    +++ b/board/ti/am43xx_ocs/board.h
    @@ -21,4 +21,5 @@ void enable_uart0_pin_mux(void);
     void enable_uart1_pin_mux(void);
     void enable_board_pin_mux(void);
     void enable_i2c0_pin_mux(void);
    +void enable_dss_pin_mux(void);
     #endif
    diff --git a/board/ti/am43xx_ocs/mux.c b/board/ti/am43xx_ocs/mux.c
    index b1a3a33..3625884 100644
    --- a/board/ti/am43xx_ocs/mux.c
    +++ b/board/ti/am43xx_ocs/mux.c
    @@ -62,6 +62,12 @@ static struct module_pin_mux uart1_pin_mux[] = {
     	{-1},
     };
     
    +/* This GPIO pin will be used by the ICSS PRU0 for BLADE_THROTTLE alert */
    +static struct module_pin_mux dss_pin_mux[] = {
    +	{OFFSET(lcd_data5), (MODE(5) | PULLDOWN_EN)},
    +	{-1},
    +};
    +
     /*
     
     {OFFSET(uart1_ctsn), (MODE(0) | PULLUP_EN | RXACTIVE | SLEWCTRL)},
    @@ -125,6 +131,11 @@ void enable_uart1_pin_mux(void)
     	configure_module_pin_mux(uart1_pin_mux);
     }
     
    +void enable_dss_pin_mux(void)
    +{
    +	configure_module_pin_mux(dss_pin_mux);
    +}
    +
     void enable_board_pin_mux(void)
     {
     	configure_module_pin_mux(mdio_pin_mux);
    

    Below patch on top of above

    diff --git a/arch/arm/cpu/armv7/am33xx/board.c b/arch/arm/cpu/armv7/am33xx/board.c
    index 2d71758..8ca828f 100644
    --- a/arch/arm/cpu/armv7/am33xx/board.c
    +++ b/arch/arm/cpu/armv7/am33xx/board.c
    @@ -402,24 +402,6 @@ void s_init(void)
     #endif
     }
     
    -/*
    - * Starts both PRU0 and PRU1 dual-cores for the PRU_ICSS1 processor.
    - * PRU_ICSS1 PRU1 Control register: at global memory-mapped location 0x54424000
    - * PRU_ICSS1 PRU0 Control register: at global memory-mapped location 0x54422000
    - *
    - * PRU Control Register definitions: (with value 0xB).
    - * bit 31-16: this field contains address where PRU will start executing code. (we will start at address zero)
    - * bit 3: if set, enable PRU cycle counters.
    - * bit 1: if set, enable PRU to fetch new instructions.
    - * bit 0: if set, no soft reset.
    -*/
    -void PRU_ICSS1_PRU0_and_1_Start(void)
    -
    -{
    -	*((unsigned int*)0x54424000) = 0xB;
    -	*((unsigned int*)0x54422000) = 0xB;
    -}
    -
     void early_system_init(void)
     {
     	/*
    @@ -442,22 +424,6 @@ void early_system_init(void)
     	/* Enable RTC32K clock */
     	rtc32k_enable();
     #endif
    -
    -	/*
    -	 * The following code must be done after the clock of
    -	 * the PRU modules were enabled in the setup_early_clocks().
    -	 */
    -	if (warm_reset()) {
    -		/*
    -		 * Set GPIO pin 5 for BLADE_THROTTLE_N,
    -		 * which will used by PRU0 to interrupt blade
    -		 * for power throttle alert.
    -		 */
    -		set_dss_mux_conf();
    -
    -		/* restart PRU0 firmware */
    -		PRU_ICSS1_PRU0_and_1_Start();
    -	}
     }
     
     #ifdef CONFIG_SPL_BUILD
    diff --git a/arch/arm/cpu/armv7/am33xx/clock_am43xx.c b/arch/arm/cpu/armv7/am33xx/clock_am43xx.c
    index d2ffa6d..8c97803 100644
    --- a/arch/arm/cpu/armv7/am33xx/clock_am43xx.c
    +++ b/arch/arm/cpu/armv7/am33xx/clock_am43xx.c
    @@ -20,8 +20,6 @@ struct cm_perpll *const cmper = (struct cm_perpll *)CM_PER;
     struct cm_wkuppll *const cmwkup = (struct cm_wkuppll *)CM_WKUP;
     struct cm_dpll *const cmdpll = (struct cm_dpll *)CM_DPLL;
     
    -#define PRCM_RM_PER_RSTCTRL	0x44DF0810
    -
     const struct dpll_regs dpll_mpu_regs = {
     	.cm_clkmode_dpll	= CM_WKUP + 0x560,
     	.cm_idlest_dpll		= CM_WKUP + 0x564,
    @@ -101,7 +99,6 @@ void setup_clocks_for_console_uart1(void)
     
     void enable_basic_clocks(void)
     {
    -	u32 temp;
     
     	u32 *const clk_domains[] = {
     		&cmper->l3clkstctrl,
    @@ -123,8 +120,6 @@ void enable_basic_clocks(void)
     		&cmwkup->wkctrlclkctrl,
     		&cmper->timer2clkctrl,
     		&cmper->gpmcclkctrl,
    -		&cmper->pruclkctrl, 	// Enable PRUSS module and clock
    -		&cmper->adc1clkctrl,	// Enable ADC clock
     		&cmwkup->wkadc0clkctrl,
     		&cmper->elmclkctrl,
     		&cmper->mmc0clkctrl,
    @@ -152,14 +147,6 @@ void enable_basic_clocks(void)
     
     	/* For OPP100 the mac clock should be /5. */
     	writel(0x4, &cmdpll->clkselmacclk);
    -
    -	/* PRU-ICSS module local reset control */
    -	temp = readl(PRCM_RM_PER_RSTCTRL);	// Read PRCM_RM_PER_RSTCTRL register
    -	temp |= 0x2;                		// Assert Reset for PRU-ICSS
    -	writel(temp, PRCM_RM_PER_RSTCTRL);	// Write PRCM_RM_PER_RSTCTRL
    -	temp = readl(PRCM_RM_PER_RSTCTRL);	// Read PRCM_RM_PER_RSTCTRL
    -	temp &= 0xFFFFFFFD;			// Clear Reset for PRU-ICSS
    -	writel(temp, PRCM_RM_PER_RSTCTRL);	// Write PRCM_RM_PER_RSTCTRL
     }
     
     void rtc_only_enable_basic_clocks(void)
    diff --git a/board/ti/am43xx_ocs/board.c b/board/ti/am43xx_ocs/board.c
    index 5e0c317..bb25ef6 100644
    --- a/board/ti/am43xx_ocs/board.c
    +++ b/board/ti/am43xx_ocs/board.c
    @@ -42,6 +42,7 @@ int ocs_i2c_eeprom_get_macid(uint8_t *mac0, uint8_t *mac1);
     
     #ifndef CONFIG_SKIP_LOWLEVEL_INIT
     #define NUM_OPPS	6
    +#define PRCM_RM_PER_RSTCTRL     0x44DF0810
     
     const struct dpll_params dpll_mpu[NUM_CRYSTAL_FREQ][NUM_OPPS] = {
     	{	/* 19.2 MHz */
    @@ -475,6 +476,61 @@ void sdram_init(void)
     	config_ddr(400, &ioregs_ddr3, NULL, NULL,
     		   &ddr3_msocs_emif_regs_400Mhz, 0);
     }
    +
    +/*
    + * Starts both PRU0 and PRU1 dual-cores for the PRU_ICSS1 processor.
    + * PRU_ICSS1 PRU1 Control register: at global memory-mapped location 0x54424000
    + * PRU_ICSS1 PRU0 Control register: at global memory-mapped location 0x54422000
    + *
    + * PRU Control Register definitions: (with value 0xB).
    + * bit 31-16: this field contains address where PRU will start executing code. (we will start at address zero)
    + * bit 3: if set, enable PRU cycle counters.
    + * bit 1: if set, enable PRU to fetch new instructions.
    + * bit 0: if set, no soft reset.
    +*/
    +void PRU_ICSS1_PRU0_and_1_Start(void)
    +
    +{
    +	*((unsigned int*)0x54424000) = 0xB;
    +	*((unsigned int*)0x54422000) = 0xB;
    +}
    +
    +int pru_init(void)
    +{
    +
    +	struct cm_perpll *const cmper = (struct cm_perpll *)CM_PER;
    +
    +	/*
    +	 * The following code must be done after the clock of
    +	 * the PRU modules were enabled in the setup_early_clocks().
    +	 */
    +	if (warm_reset()) {
    +		u32 temp, i;
    +		struct cm_perpll *const cmper = (struct cm_perpll *)CM_PER;
    +
    +		/* PRU-ICSS module local reset control */
    +		temp = readl(PRCM_RM_PER_RSTCTRL);      // Read PRCM_RM_PER_RSTCTRL register
    +		temp |= 0x2;                            // Assert Reset for PRU-ICSS
    +		writel(temp, PRCM_RM_PER_RSTCTRL);      // Write PRCM_RM_PER_RSTCTRL
    +		temp = readl(PRCM_RM_PER_RSTCTRL);      // Read PRCM_RM_PER_RSTCTRL
    +		temp &= 0xFFFFFFFD;                     // Clear Reset for PRU-ICSS
    +		writel(temp, PRCM_RM_PER_RSTCTRL);      // Write PRCM_RM_PER_RSTCTRL
    +		writel(0x0002, &cmper->pruclkctrl);	// Enable PRUSS module and clock
    +		writel(0x0002, &cmper->adc1clkctrl);	// Enable ADC clock
    +
    +		/*
    +		 * Set GPIO pin 5 for BLADE_THROTTLE_N,
    +		 * which will used by PRU0 to interrupt blade
    +		 * for power throttle alert.
    +		 */
    +		set_dss_mux_conf();
    +
    +		/* restart PRU0 firmware */
    +		PRU_ICSS1_PRU0_and_1_Start();
    +	}
    +	return 0;
    +}
    +
     #endif
     
     /* setup board specific PMIC */
    diff --git a/common/board_f.c b/common/board_f.c
    index 109025a..181935c 100644
    --- a/common/board_f.c
    +++ b/common/board_f.c
    @@ -117,7 +117,7 @@ static int init_func_watchdog_init(void)
     # if defined(CONFIG_HW_WATCHDOG) && (defined(CONFIG_BLACKFIN) || \
     	defined(CONFIG_M68K) || defined(CONFIG_MICROBLAZE) || \
     	defined(CONFIG_SH) || defined(CONFIG_AT91SAM9_WATCHDOG) || \
    -	defined(CONFIG_IMX_WATCHDOG))
    +	defined(CONFIG_IMX_WATCHDOG) || defined(CONFIG_AM43XX))
     	hw_watchdog_init();
     # endif
     	puts("       Watchdog enabled\n");
    diff --git a/common/board_r.c b/common/board_r.c
    index ad02549..f1feca4 100644
    --- a/common/board_r.c
    +++ b/common/board_r.c
    @@ -351,6 +351,11 @@ __weak int power_init_board(void)
     	return 0;
     }
     
    +__weak int pru_init(void)
    +{
    +	return 0;
    +}
    +
     static int initr_announce(void)
     {
     	debug("Now running in RAM - U-Boot at: %08lx\n", gd->relocaddr);
    @@ -841,6 +846,9 @@ init_fnc_t init_sequence_r[] = {
     	arch_early_init_r,
     #endif
     	power_init_board,
    +#ifdef	CONFIG_AM43XX
    +	pru_init,
    +#endif
     #ifndef CONFIG_SYS_NO_FLASH
     	initr_flash,
     #endif
    

    3) Is it possible that PRU warm restart enablement can cause the shared memory area to give random values in a bad case? We have few data stored at PRU shared memory area. Example below for one of the variable in that area.

    PRU_SHAREDMEM  : org = 0x00010000 len = 0x00008000 CREGISTER=28 /* 32kB Shared RAM */
    #define PRU_SRAM __far __attribute__((cregister("PRU_SHAREDMEM", near)))
    PRU_SRAM volatile uint16_t controlStateFSR;//Address:0x1004e

    [ 14.229931] remoteproc remoteproc1: 54434000.pru is available
    [ 14.255653] pru-rproc 54434000.pru: PRU rproc node /ocp@44000000/target-module@54400000/pruss@0/pru@34000 probed successfully
    [ 14.286956] remoteproc remoteproc2: 54438000.pru is available
    [ 14.292833] pru-rproc 54438000.pru: PRU rproc node /ocp@44000000/target-module@54400000/pruss@0/pru@38000 probed successfully

    For example, we have 

  • Hello,

    It looks like your response got cut off (the last thing I see is "for example, we have").

    Please note that the PRU register values, and the PRU DMEM and SMEM values, are not initialized to set values on power-on. (that is why you can get glitches on the PRU GPO signals during initialization if you do pinmuxing first, then power on the PRU subsystem. Because R30 will start driving signals high or low as soon as the PRU subsystem is powered on, but there will be a time between when the PRU subsystem is powered, and when the PRU firmware starts running and is able to zero out the R30 register).

    For the Shared RAM / SMEM, I suggest initializing the memory to zero first, then writing and reading data to it.

    For the U-Boot code, this is outside my area of expertise. However, we are working on adding support for U-Boot initializing PRU on AM62x & AM64x right now in kernel 6.12 (not AM437x unfortunately). If you want, I can make a note to point you to that U-Boot code after we publish it (in case it is helpful).

    I will be on vacation for the rest of this week, but I will be back next week. Feel free to ping the thread if I have not replied within the first couple of days next week.

    Regards,

    Nick

  • Thanks Nick.

    One quick question. Is it possible to read the value of R30 from devmem? How to find the exact register address of R30?

    sponse got cut off (the last thing I see is "for example, we have").
  • Hello Sumit,

    I am catching back up from vacation, thank you for your patience.

    R30 & R31 are internal registers in the PRU core. So you could write PRU code that copies the value of R30 into a memory location, and then use devmem2 to read the value of that memory location. However, you would not be able to read the register values directly from Linux.

    You could see an example of interacting with R30/31 in C here:
    https://git.ti.com/cgit/pru-software-support-package/pru-software-support-package/tree/examples/am335x/PRU_gpioToggle/PRU_gpioToggle.c

    and the PRU Getting Started Labs have an example of reading and writing to known memory locations for Linux to access:
    https://software-dl.ti.com/processor-sdk-linux/esd/AM437X/latest/exports/docs/common/PRU-ICSS/PRU-Getting-Started-Labs_Lab5.html

    If you are debugging with CCS, you can use CCS to read the register values. See the Lab documentation above for more details.

    Regards,

    Nick