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.

[参考译文] Linux/DRA744:在 IPU (M4)上使用 GPIO 和/或 SPI 会在 MPU (A15)的矢量00处创建意外的 IRQ 陷阱

Guru**** 2539500 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/823846/linux-dra744-using-gpio-and-or-spi-on-ipu-m4-creates-unexpected-irq-trap-at-vector-00-on-mpu-a15

器件型号:DRA744

工具/软件:Linux

在我们的系统中、DRA744 (J6)处理器通过条 SPI 总线(GPIO7)以及一些 GPIO4引脚连接到 SPC560B64微控制器。 Linux  版本4.14.40 J6处理器的 A15内核上运行。 J6中的 IPU (M4)通过 SPI 和 GPIO 引脚处理 J6和 SPC560B64之间的通信。 IPU 通过 J6中的共享存储器和硬件邮箱向 A15 Linux 发送/接收数据。 Linux 中的可加载内核驱动程序可处理 Linux 中 M4和 A15之间的通信。 一旦我将 LKM 插入内核、内核就会在矢量00持续生成大量意外的 IRQ 陷阱。 会发生与该线程类似的情况:

e2e.ti.com/.../627064

dmesg 的一部分显示了以下问题:

[53.692626]  IRQ 0、描述:ee803700、深度:1、计数:0、未处理:0
[53.692631]->  Handle_IRQ(): c0175ab0、
[53.692648]  Handle_BAD_IRQ+0x0/0x268
[53.692653]  -> irq_data.chip(): c0931aa4、
[53.692659]  0xc0931aa4.
[53.692666]->  操作():  (空)
[53.692671]     IRQ_NOPROBE 置1
[53.692675]   IRQ_NOREQUEST 置位
[53.69261]  矢量00处发生意外的 IRQ 陷阱
[53.697017]  cxx_CAN -已注册 MQ 消息引擎
[53.712686]  cxx_CAN -接收到的 CAN 位时序参数(1)
[53.712701]  无法在虚拟地址00000000处处理内核 NULL 指针解除引用
[53.715042]  IRQ 0、描述:ee803700、深度:1、计数:0、未处理:0
[53.715045]  -> Handle_IRQ(): c0175ab0、
[53.715054]  handle_bad_IRQ+0x0/0x268
[53.715057]  -> irq_data.chip(): c0931aa4、
[53.715062]  0xc0931aa4.
[53.715066]->  操作():  (空)
[53.715070]     IRQ_NOPROBE 置1
[53.715073]   IRQ_NOREQUEST 置1
[53.715077]  矢量00处的意外 IRQ 陷阱
[53.725145]  PgD = c0004000
[53.727890]  [00000000]* PgD=00000000
[53.731489]  内部错误:Oops -错误:5 [#1]抢占 SMP ARM
[53.745892]  IRQ 0、描述:ee803700、深度:1、计数:0、未处理:0
[53.745896]  -> Handle_IRQ(): c0175ab0、
[53.745904]  Handle_BAD_IRQ+0x0/0x268
[53.745907]->  irq_data.chip(): c0931aa4、
[53.745912]  0xc0931aa4.
[53.745916]->  操作():  (空)
[53.745920]     IRQ_noprobe set
[53.745923]   IRQ_NOREQUEST 置位
[53.745926]  矢量00处的意外 IRQ 陷阱
[53.780151]  IRQ 0、desc:ee803700、depth:1、count:0、unhandled:0
[53.780155]  -> Handle_IRQ(): c0175ab0、
[53.780164]  handle_bad_IRQ+0x0/0x268
[53.780167]->  irq_data.chip(): c0931aa4、
[53.780172]  0xc0931aa4.
[53.780176]  ->操作():  (空)
[53.780180]     IRQ_NOPROBE 置1
[53.780182]   IRQ_NOREQUEST 置位
[53.780186]  引导程序00处的意外 IRQ 陷阱
[53.814638]  IRQ 0、描述:ee803700、深度:1、计数:0、未处理:0
[53.814641]  -> Handle_IRQ(): c0175ab0、
[53.814650]  Handle_BAD_IRQ+0x0/0x268
[53.814653]  -> irq_data.chip(): c0931aa4、
[53.814658]  0xc0931aa4.
[53.814661]  ->操作():  (空)
[53.814664]     IRQ_NOPROBE 置1
[53.814667]   IRQ_NOREQUEST 置位
[53.814670]  矢量00处的意外 IRQ 陷阱
[53.816696]  引导程序00处的意外 IRQ 陷阱
[53.821296]  矢量00处的意外 IRQ 陷阱
[53.897185]  CPU:1 PID:317 Comm:K_cxx_CAN_Rx 被污染:G          O   4.14.40 #1
[53.904874]  硬件名称:通用 DRA74X (平展器件树)
[53.910994]  任务:ecca8600 task.stack:ecde8000
[53.915559]  PC 位于 cxx_CAN_Rx_thread+0x678/0xf08 [cxx_CAN]
[53.921248]  LR 位于 IRQ_Work_queue+0xc8/0xf0
[53.925623]  PC:[ ]   LR:[ ]   PSR:60010013
[53.931917]  sp:ecde9f10 IP:ecde9dd0 fp:ecde9f74
[53.937165]  R10:3b9aca00 R9:bf2cb660 R8:ece2c000
[53.942412]  r7:bf2ca230 r6:00000825 r5:bf2cc5c0 r4:ecf80000
[53.948967]  r3:00000000 r2:00000000 r1:00000001 r0:ecdc1c00
[53.955523]  标志:   模式 SVC_32 ISA ARM 段无时 FIQ 上的 nZCv IRQ
[53.96269]  控制:10c5387d 表:ad88806a DAC:00000051
[53.968460]  处理 k_cxx_CAN_Rx (pid:317、栈限制= 0xecde8210)
[53.974929]  堆栈:(0xecde9f10至0xecdea000)
[53.979306]  9f00:                                    ecde9f34 ecde9f20 c05f6d84 c05f64b4
[53.987522]  9f20:ecdc1c04 ecdc1c00 ecde9f44 ecde9f38 c05f6de0 00000000 ecc8600 c016a584
[53.995738]  9f40:ecde9f40 ecde9f40 bf2c7b3c 00000000 ecd36f00 ecd36e80 ecde8000 ece2c000
[54.00181]  引导程序00处出现意外的 IRQ 陷阱
[54.008233]  9f60:bf2c7b3c ecdc1c00 ecde9f13ecde9f78 c014d684 bf2c7b48 36fecd1c 36fecd1c
[54.016447]  9f80:ecde9ecd36ecd80 c014d538 00000000 00000000 00000000 00000000 00000000 00000000 0000 00000000
[54.024663]  9fa0:00000000 ecde9fb0 c0108048 c014d544 00000000 00000000 00000000 00000000 00000000
[54.032877]  9fc0:00000000 00000000 00000000 00000000 00000000 00000000 00000000
[54.041091]  9fe0:00000000 00000000 00000000 000000000013 00000000 00000000 00000000 00000000 00000000
[54.049301]  回溯:
[54.051778]  [ ](cxx_CAN_Rx_thread [cxx_CAN])、来自[ ](kthread+0x14c/0x164)
[54.060429]   r10:ecdc1c00 r9:bf2c7b3c r8:ece2c000 r7:ecde8000 r6:ecd36e80 r5:ecd36f00
[54.068291]   R4:00000000
[54.070844][   ](kthread)、来自[ ](RET_FANK_F叉+0x14/0x2C)
[54.078099]   R10:00000000 R9:00000000 R8:00000000 r7:00000000 R6:00000000 R5:c014d538
[54.078304]  引导程序00处出现意外的 IRQ 陷阱
[54.090243]   R4:ecd36e80
[54.092790]  代码:e3530000 1a00018d e3a03000 e51b0050 (e893000a)
[54.098957]  --[结束线迹6da5cd570c595e54 ]--
[54.114547]  矢量00处的意外 IRQ 陷阱
[54.159991]  矢量00处的意外 IRQ 陷阱
[54.178104]  引导程序00处的意外 IRQ 陷阱
[54.196223]  矢量00处的意外 IRQ 陷阱
[54.210230]  矢量00处的意外 IRQ 陷阱
[54.241379]  矢量00处的意外 IRQ 陷阱
[54.255514]  矢量00处的意外 IRQ 陷阱
[54.273634]  矢量00处的意外 IRQ 陷阱
[54.290206]  引导程序00处的意外 IRQ 陷阱
[54.300825]  矢量00处的意外 IRQ 陷阱
[54.313863]  在矢量00处发生意外的 IRQ 陷阱
[54.331978]  向量00处的意外 IRQ 陷阱
[54.364140]  矢量00处的意外 IRQ 陷阱
[54.382354]  引导程序00处的意外 IRQ 陷阱
[54.413660]  矢量00处的意外 IRQ 陷阱
[54.431780]  矢量00处的意外 IRQ 陷阱
[54.445781]  引导程序00处发生意外的 IRQ 陷阱
[54.458821]  矢量00处的意外 IRQ 陷阱

插入 LKM 之前"cat /proc/interrupts 命令的输出:

          CPU0      CPU1       
 17:         0         0     CBAR 32级别    gp_timer
 20:     87665     76686    GIC-027 电平    ARCH_TIMER
 22:         0         0     CBAR  4级    L3-dbg-IRQ
 23:         0         0    WUGEN 10 Level    L3-APP-IRQ
 25:         1         0     CBAR 121电平    警报器
 27:        51         0     CBAR  8级    OMAP-DMA-引擎
 30:         0         0     CBAR 361级别    43300000。EDMA_ccint
 32:         0         0     CBAR 359级别    43300000。EDMA_cerrint
 35:         0         0     CBAR 24级别    4ae1000.GPIO
 36:        10         0     CBAR 25电平    48055000.GPIO
 37:         0         0     CBAR 26电平    48057000.GPIO
 38:         0         0     CBAR 27电平    480590.GPIO
 39:         0         0     CBAR 28电平    4805b000.GPIO
 40:         0         0     CBAR 29电平    4805d000.GPIO
 41:         0         0     CBAR 30电平    480510.GPIO
 42:         0         0     CBAR 116级别    480530.GPIO
 43:      2329         0     CBAR 67级别    4806a000.serial
 62:         8         0     CBAR 108级    OMAP_DMM_IRQ_handler
 63:       451         0     CBAR 51电平    48070000.i2c
 64:       510         0     CBAR 52 Level    48072000.i2c
 65:      8779         0     CBAR 57电平    4807a000.i2c
 66:      6144         0     CBAR 81级    mmc0
 67:         0         0     CBAR 23级别    40d01000.MMU
 68:         0         0     CBAR 145级    40d02000.MMU
 69:         0         0     CBAR 395级    588820.MMU
 70:         0         0     CBAR 396级别    55082000.MMU
 73:         0         0     CBAR 217电平    rtc0
 77:         0         0     CBAR 149电平    48464000.McASP_TX
 78:         0         0     CBAR 148电平    48464000.McASP_Rx
 79:         0         0     CBAR 161电平    4847c000.McASP_TX
 80:         0         0     CBAR 160电平    4847c000.McASP_Rx
 82:       126         0     CBAR 335级别    48484000以太网
 83:         0         0     CBAR 336级    48484000以太网
 85:    754259         0     CBAR 16级    SGX ISR
 90:         0         0     CBAR 46级别    4b101000.sham
 91:         0         0     CBAR 47电平    48090000.rng
 92:         0         0     CBAR 354级别    VPE
 93:         0         0     CBAR 146级别    41501000.MMU
 94:         0         0     CBAR 147级别    41500.MMU
 95:         0         0     CBAR 352电平    vip2-s0
 97:         0         0    WUGEN 131级别    ARM-PMU
 98:         0         0    WUGEN 132级    ARM-PMU
 99:    188827         0     CBAR 20级    OMAP DISPC
194:        10         0 48055000。GPIO 26边缘     3-0024
IPI0:         0         1 个 CPU 唤醒中断
IPI1:         0          定时器广播中断
IPI2:    374440    783251 重新安排中断
IPI3:      1085      1134 函数调用中断
IPI4:         0         0 CPU 停止中断
IPI5:         0          IRQ 工作中断
IPI6:         0         0 完成中断
错误:         0

以及之后:

          CPU0      CPU1       
 0:       108         0     无    边沿    
 17:         0         0     CBAR 32级别    gp_timer
 20:      2710      3197    GIC-027 级    ARI_TIMER
 22:         0         0     CBAR  4级    L3-dbg-IRQ
 23:         0         0    WUGEN 10 Level    L3-APP-IRQ
 25:         2         0     CBAR 121电平    talert
 27:        51         0     CBAR  8级    OMAP-DMA-引擎
 30:         0         0     CBAR 361级别    43300000。EDMA_ccint
 32:         0         0     CBAR 359级别    43300000。EDMA_cerrint
 35:         0         0     CBAR 24级别    4ae1000.GPIO
 36:        10         0     CBAR 25电平    48055000.GPIO
 37:         0         0     CBAR 26电平    48057000.GPIO
 38:         0         0     CBAR 27电平    480590.GPIO
 39:         0         0     CBAR 28电平    4805b000.GPIO
 40:         0         0     CBAR 29电平    4805d000.GPIO
 41:       335         0     CBAR 30电平    480510.GPIO
 42:         0         0     CBAR 116级别    480530.GPIO
 43:       442         0     CBAR 67级    4806a000.serial
 44:       748         0     CBAR 21边缘     CAN 处理程序
 62:         8         0     CBAR 108级    OMAP_DMM_IRQ_handler
 63:       451         0     CBAR 51电平    48070000.i2c
 64:       510         0     CBAR 52 Level    48072000.i2c
 65:       394         0     CBAR 57电平    4807a000。i2c
 66:      3369         0     CBAR 81级    mmc0
 67:         0         0     CBAR 23级别    40d01000.MMU
 68:         0         0     CBAR 145级    40d02000.MMU
 69:         0         0     CBAR 395级    588820.MMU
 70:         0         0     CBAR 396级别    55082000.MMU
 73:         0         0     CBAR 217电平    rtc0
 77:         0         0     CBAR 149电平    48464000.McASP_TX
 78:         0         0     CBAR 148电平    48464000.McASP_Rx
 79:         0         0     CBAR 161电平    4847c000.McASP_TX
 80:         0         0     CBAR 160电平    4847c000.McASP_Rx
 82:         0         0     CBAR 335级别    48484000。以太网
 83:         0         0     CBAR 336级    48484000以太网
 85:     18745         0     CBAR 16级    SGX ISR
 90:         0         0     CBAR 46级别    4b101000.sham
 91:         0         0     CBAR 47电平    48090000.rng
 92:         0         0     CBAR 354级别    VPE
 93:         0         0     CBAR 146级别    41501000.MMU
 94:         0         0     CBAR 147级别    41500.MMU
 95:         0         0     CBAR 352电平    vip2-s0
 97:         0         0    WUGEN 131级别    ARM-PMU
 98:         0         0    WUGEN 132级    ARM-PMU
 99:      4949         0     CBAR 20级    OMAP DISPC
194:        10         0 48055000。GPIO 26边缘     3-0024
IPI0:         0         1 个 CPU 唤醒中断
IPI1:         0          定时器广播中断
IPI2:      9348     21719 重新安排中断
IPI3:      1841       621 函数调用中断
IPI4:         0         0 CPU 停止中断
IPI5:        82         0 IRQ 工作中断
IPI6:         0         0 完成中断
错误:       108

应该提到的是、在 IPU (M4)代码内、GPIO4和 GPIO7 IRQ 连接到 A15内核被禁用:

 //取消 GPIO_4 IRQ 交叉开关连接到 A15
 *(uint32_t *) CTRL_CORE_MPU_IRQ_32_33 = 0x1c0000;
 //取消 GPIO_7 IRQ 交叉开关连接到 A15
 *(uint32_t *) CTRL_CORE_MPU_IRQ_34_35 = 0x1d;
 

此外、在 Linux 器件树中、这些子系统完全禁用:

#define disable_complete (label)&label{status ="disabled";ti、no-idle;ti、no-reset-on-init;}
/*从 Linux 禁用的模块*/

disable_complete (mmc1);
disable_complete (MMC4);
disable_complete (mcspi1);
disable_complete (mcspi2);
disable_complete (vin4a);
disable_complete (i2c5);
disable_complete (i2c3);
disable_complete (GPMC);
disable_complete (dcan1);
disable_complete (dcan2);
disable_complete (vin1a);
disable_complete (ipu2);
disable_complete (ipu1);
disable_complete (dsp1);
disable_complete (dsp2);
disable_complete (uart2);
disable_complete (uart3);
disable_complete (uart4);
disable_complete (uart5);
disable_complete (uart6);
disable_complete (WDT2);

插入 LKM 后、中断交叉开关寄存器的内容如下:

# devmem2 0x4a002a7c
/dev/mem 已打开。
映射到地址 bb6fa4000的内存。
地址0x4A002A7C (0xb6fa4a7c)的值:0x1C0000

# devmem2 0x4a002a80
/dev/mem 已打开。
映射到地址 bb6f5e000的内存。
地址0x4A002A80 (0xb6f5ea80)的值:0x1D

为了解决这个问题、我想知道为什么以及如何创建中断#0、以及如何在 Linux 中避免中断#0?!

          CPU0      CPU1       
 0:       108         0     无    边沿    

谢谢、此致、

Armin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我在 DTS 中看不到 disable_complete (GPIO4)和 disable_complete (GPIO7)。

    避免在使用 devmem/omapconf 中更改交叉开关设置。 如果您禁用此设备,驱动程序将不会注册 IRQ。

    但是、M4将继续获取 IRQ、因为它使用单独的纵横制。

    此致、

    Nikhil D