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/AM5728:PCI 还原时出现唤醒错误

Guru**** 2540720 points
Other Parts Discussed in Thread: OMAP-L138, AM5728, AM5726, BEAGLEBOARD-X15, TPD12S015

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/759517/linux-am5728-wakeup-error-on-pci-restore

器件型号:AM5728
主题中讨论的其他器件:OMAP-L138AM5726BeagleBoard-X15TPD12S015

工具/软件:Linux

很抱歉耽误你的时间、我现在只能再次讨论这个问题。

我在中添加了一些调试打印件
__pci_restore_msi_state
的功能
drivers/pci/msi.c
在唤醒期间调用的函数:

静态空__pci_restore_msi_state (struct pci_dev *dev)

       U16控制;
       struct msi_desc *条目;

       printk (Kern_ERR "__pci_restore_msi_state dev bus: 0x%02x %s 供应商:0x%02x 设备:0x%02x 资源:0x%08x\n",dev->bus->number,dev->bus->name,dev->vendor,dev->device, (Int)(dev->bus->resources[0]);

+/- 4行:如果(!dev->msi_enabled){-----------------------------------------------------------

       printk (Kern_ERR "IRQ_GET_msi_desc、dev:%p、dev->IRQ:%p\n"、dev、dev->IRQ);

       条目= IRQ_GET_msi_desc (dev->IRQ);

       printk (Kern_ERR "int:%i\n",dev->IRQ);

       printk (Kern_ERR "PCI_INTx_for_msi\n");
       PCI_INTx_for_msi (dev、0);
       PCI_msi_set_enable (dev、0);
       arch_restore_msi_IRQ (dev);

       printk (Kern_ERR "pci_read_config_worm\n");

       PCI_READ_CONFIG_WORD (dev、dev->msi_cap + PCI_MSI_FLAGS、&CONTROL);

       printk (Kern_ERR "msi_mask_IRQ:%p\n"、entry);

       MSI_MASK_IRQ (条目、msi_MASK (条目->msi_attrib.multi_cap)、
                    entry->masked);
       CONTROL &=~PCI_MSI_FLAGS_QSIZE;
       control |=(entry->msi_attrib.multiple <<4)| PCI_MSI_FLAGS_ENABLE;

       printk (Kern_ERR "pci_write_config_worm\n");


这将产生以下输出:

[1641.716315] SD 0:0:0:0:[SDA]正在同步 SCSI 高速缓存
[1641.721663] SD 0:0:0:0:[SDA]正在停止磁盘
[1641.750497] PM:35.630ms 后设备挂起完成
[1641.759764] PM:3.366毫秒后器件延迟挂起完成
[1641.766284]__PCI_msi_desc_mask_IRQ
[1641.769787] desc->已屏蔽
[1641.772329] PCI_msi_ignore_mask
[1641.775527]__PCI_msi_desc_mask_IRQ
[1641.779027] desc->已屏蔽
[1641.781569] PCI_msi_ignore_mask
[1641.787718] PM:21.706毫秒后设备挂起完成
[1645.033410]__PCI_RESTORE_msi_state dev 总线:0x00 供应商:0x104c 设备:0x8888资源:0x00000000
[1645.042889]__PCI_RESTORE_msi_state dev 总线:0x00 供应商:0x104c 设备:0x8888资源:0x00000000
[1645.042892] IRQ_GET_msi_desc
[1645.042895] int:407
[1645.042897] PCI_INTx_for_msi
[1645.042906] PCI_READ_CONFIG_WORD
[1645.042909] msi_mask_IRQ:ee13b740                '中断 nr 407的一切正常'
[1645.042911]__PCI_msi_desc_MASK_IRQ
[1645.042913] desc->已屏蔽
[1645.042914] PCI_msi_ignore_mask
[1645.042916] PCI_WRITE_CONFIG_WORD
[1645.080124] IRQ_GET_msi_desc
[1645.083015] int:406
[1645.085395] PCI_INTx_for_msi
[1645.088292] PCI_READ_CONFIG_WORD
[1645.091535] msi_mask_IRQ:  (空)                'null-pointer for IRQ 406
[1645.094954]无法在虚拟地址00000028处处理内核 NULL 指针解除引用
[1645.103092] PgD = c0003000
[1645.105822][00000028]* PgD=80000080004003、* PMD=00000000
[1645.111266]内部错误:Oops:207 [#1]抢占 SMP ARM

简而言之、就是功能
条目= IRQ_GET_msi_desc (dev->IRQ);
返回 IRQ 406的空指针

以下是一些进一步的信息:

Cat /proc/interrupts 退货:

374:         0         0  PCI-MSI  0 Edge     PCIe PME、aerdrv
407:         0         0  PCI-MSI  0 Edge     PCIe PME、aerdrv


root@tqma574x-mba57xx:/sys/devices/platform/44000000.ocp/44000000.ocp:axi@0/51000000.PCIe/pci0000:00/0000:00:00.0# cat IRQ
406.
root@tqma574x-mba57xx:/sys/devices/platform/44000000.ocp/44000000.ocp:axi@0/51000000.PCIe/pci0000:00/0000:00:00.0/msi_ir                                                                                                                                                                                                                                                                  QS# ls
374.

root@tqma574x-mba57xx:/sys/devices/platform/44000000.ocp/44000000.ocp:axi@1/518000.PCIe/pci0001:00/0001:00:00.0# cat IRQ
407.
root@tqma574x-mba57xx:/sys/devices/platform/44000000.ocp/44000000.ocp:axi@1/518000.PCIe/pci0001:00/0001:00:00.0/msi_IRQs# ls
407.

PCIe 和 msi IRQ 号似乎存在相互不对应的问题。

不确定这是怎么发生的。

在我们的器件树中、我们仅启用状态为"正常"的相关器件节点、而不会在此处接触到任何 IRQ 释放的内容。  

/* PCIe 通道0 PCIe x4连接器*/
pcie1_rc{(&P)
   状态="正常";
};

/* PCIe 通道1 mPCIe 连接器*/
&PCIe2_RC{
       状态="正常";
       /*未放置 PCIe 重置 R532 */
};

PCIe2_phy{
   状态="正常";
};

      AXI@1{
         状态="正常";
     
请参阅附加到初始线程的 DTS 文件。
     
     
PCIe 通道2之前是否在 TI 或自定义电路板上进行过测试? 我在公共存储库中找不到任何东西。
如果是、在这种情况下、器件树的外观如何?
 

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

    是否有旧的问题主题? 您能否提供链接以便我刷新您的设置。 TI 尚未在我们的任何电路板上测试2个 PCIe RCS、因为它们都没有暴露在外的2个端口。

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

    当然、旧问题是
    e2e.ti.com/.../686510

    由于原始帖子已关闭、TI 员工告诉我只需"提出相关问题"。

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

    我看了一下旧线程。 我看到 TI 发布的 Processor SDK 存在一些差异,但不确定是否是导致这种差异的原因。 您使用了 ti Linux 内核或 git reposritory 中的处理器 SDK、但两者都使用相同的 defcofnig。 使用 TI Linux 内核、您没有为 AM572x 平台引入补丁。 TI Linux 内核用于上游、没有不同平台、KeyStone、AM57x、OMAP-L138等所需的补丁 使用处理器 SDK 存储库但使用相同的 defconfig、您仍然错过了平台所需的一些配置。 您需要按照 Linux 开发人员指南中的说明来创建 tisdk_am57xx-evm_defconfig。 下面是指南的片段:

    下面是从内核 git 存储库构建 defconfig 的过程。

    $ ti_config_frages/defconfig_builder.sh -t ti_sdk_[device]_release
    $导出 arch=arm
    $ make ti_sdk_[device]_release_defconfig
    $ mv .config arch/arm/configs/tisdk_[platformName]-evm_defconfig

    我将您在旧线程中发布的 defconfig 与 Processor Linux SDK 中的.config 进行了比较、但有一些 PCIe 相关 config_未定义。 在构建配置完成后、如果问题仍然发生、我们将进一步了解问题。

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

    尊敬的 Rex:

    如前所述、我们使用来自 git://git.ti.com/ti-linux-kernel/ti-linux-kernel.git 的 ti-rt-linux-4.9.77

    正如我所看到的、这一个确实包含 AM572x 平台的补丁:

    1|tq@tqma57xx-build:/opt/tqma57xx-bsp/linux-tqmaxx grep -r AM572。
    /Documentation/devicetree/bindings/arm/omap/omap.txt:- AM5728
    /Documentation/devicetree/bindings/arm/omap/omap.txt:- AM5726
    /Documentation/devicetree/bindings/arm/omap/omap.txt:- AM5728 IDK
    /Documentation/devicetree/bindings/arm/omap/omap.txt:- AM5728 GPEVM
    /drivers/pci/dwc/pci-dra7xx.c:* dra7xx_PCIe_EP_LEGACY_MODE:AM572x/AM571x 勘误表 i870的权变措施
    /drivers/bus/omap-ocp2scp.c:   *根据 AM572x TRM: www.ti.com/.../spruhz6.pdf
    /drivers/phy/phy-ti-pipe3.c:   *根据 AM572x TRM SPRUHZ6第18.5.2.2节的建议、表
    /drivers/dma/omap-dma.c:       *来自 AM572x TRM、16.1.4.18在传输期间禁用通道:
    二进制文件/.git/objects/pack/pack-fcfdc7609f254c9537d0435d040faf269636d00a.pack 匹配
    /arch/arm/mach-omap2/timer.c:          *这至少会影响 DRA7/AM572x 1.0、1.1修订版。
    /arch/arm/boot/dts/am572x-idk.dts:    模型="TI AM5728 IDK";
    /arch/arm/boot/dts/.am572x-idk-lcd-osd101t2045.dtb.dts.tmp:模型="TI AM5728 IDK";
    /arch/arm/boot/dts/.am572x-idk-lcd-osd101t2045.dtb.dts.tmp:模型="TI AM572x IDK-LCD-OSD-Display";
    /arch/arm/boot/dts/am57xx-beagle-x15-revb1.dts:       模型="TI AM5728 BeagleBoard-X15修订版 B1";
    /arch/arm/boot/dts/am57xx-evm.dts:    模型="TI AM5728 EVM";
    /arch/arm/boot/dts/am57xx-evm-reva3.dts:      模型="TI AM572x EVM 修订版 A3";
    二进制文件/arch/arm/boot/dts/am572x-idk.dtb 匹配
    /arch/arm/boot/dts/am57xx-idk-common.dtsi:                                    /* AM572上的 VDD_DSPEVE *
    /arch/arm/boot/dts/am57xx-idk-common.dtsi:     * XXX:支持 AM572x-Rev 1.2a。 对于 AM571x-rev 1.3a、这是错误的、
    /arch/arm/boot/dts/am57xx-idk-common.dtsi:     * AM572x-Rev1.3a -但由于始终保持开启状态、因此它们能够正常工作。
    /arch/arm/boot/dts/am57xx-beagle-x15-revc.dts:模型="TI AM5728 BeagleBoard-X15修订版 C";
    /arch/arm/boot/dts/am57xx-tqma57xx.dtsi:                                      /* AM572上的 VDD_DSPEVE *
    /arch/arm/boot/dts/dra74x-mmc-iodelay.dtsi:* TI DRA74x、DRA75x 和 AM572x SoC 的 MMC IOdelay 值。
    /arch/arm/boot/dts/dra74x-mmc-iodelay.dtsi:* AM572x 器件修订版本2.0:SPRS953B、2016年11月修订
    /arch/arm/boot/dts/dra74x-mmc-iodelay.dtsi:* AM572x 芯片修订版本1.1:SPRS915R、2016年11月修订
    /arch/arm/boot/dts/.am572x-idk.dtb.dts.tmp:模型="TI AM5728 IDK";
    二进制文件/arch/arm/boot/dts/am572x-idk-lcd-osd101t2045.dtb 匹配
    /arch/arm/boot/dts/am57xx-beagle-x15.dts:     模型="TI AM5728 BeagleBoard-X15";
    /arch/arm/boot/dts/backup/tqma571x.dtsi:                                      /* AM572上的 VDD_DSPEVE *
    /arch/arm/boot/dts/backup/tqma572x.dtsi:                                      /* AM572上的 VDD_DSPEVE *
    /arch/arm/boot/dts/am572x-idk-lcd-osd101t2045.dts:    模型="TI AM572x IDK-LCD-OSD-Display";


    否则、我们的整个硬件很可能根本不起作用。

    我还对 git://git.ti.com/processor-sdk/processor-sdk-linux.git 的内核4.9.69进行了相同的尝试、结果相同。

    现在关于 defconfigs:

    我将 tisdk_am57xx-evm_defconfig 与我的.config 进行了比较、但没有发现与 PCI 相关的任何差异:

    1|tq@tqma57xx-build:/opt/tqma57xx-bsp/linux-tqmaxx diff .config arch/arm/configs/tisdk_am57xx-evm-rt_defconfig | grep pci
     未设置# CONFIG_CAN_C_CAN_PCI
    -# CONFIG_NE2K_PCI 未设置
     未设置# CONFIG_UIO_PCI_generic

    请参阅随附的完整 diff 和 Current .config。

    我个人认为这个问题与 defconfig 无关。

    更多信息:

    PCIe 1 (PCIe2_phy)接口本身正常工作。

    由于硬件问题需要重新设计、因此无法测试 PCIe 0 (pcie1_phy)接口。 不过,引导日志看起来不错,只是链路没有出现。

    当我在器件树中禁用 PCIe2_phy 时、唤醒过程成功。

    请参阅以下有关禁用 PCIe2_phy 的一些信息:


    PCIe2_phy{
           STATUS ="禁用";
    ##############################

    root@tqma574x-mba57xx:/sys/devices/platform/44000000.ocp/44000000.ocp:axi@1/51800000。PCIe# ls
    driver_override modalias        of _node         power           subsystem       uevent

    Leer



    [70.057044]  __PCI_RESTORE_msi_state dev 总线:0x00 供应商:0x104c 设备:0x8888资源:0x00000000
    [70.066359]  IRQ_GET_msi_desc、DEV:e072000、DEV->IRQ:00000176
    [70.072305]  内部:374


    tqma574x-mba57xx 登录名:root
    root@tqma574x-mba57xx:/sys/devices/platform/44000000.ocp/44000000.ocp:axi@0/51000000.PCIe/pci0000:00/0000:00:00.0# cat IRQ
    root@tqma574x-mba57xx:/sys/devices/platform/44000000.ocp/44000000.ocp:axi@0/51000000.PCIe/pci0000:00/0000:00:00.0# cd msi_IRQ
    root@tqma574x-mba57xx:/sys/devices/platform/44000000.ocp/44000000.ocp:axi@0/51000000.PCIe/pci0000:00/0000:00:00.0/msi_IRQs# ls
    374.
    root@tqma574x-mba57xx:/sys/devices/platform/44000000.ocp/44000000.ocp:axi@0/51000000.PCIe/pci0000:00/0000:00:00.0# cat IRQ
    374.

    root@tqma574x-mba57xx:~# cat /proc/interrupts
              CPU0      CPU1
     17:         0         0     CBAR 32级别    gp_timer
     18:         0         0    GIC-029 电平    ARI_TIMER
     19:      4116      4964    GIC-030 级    ARI_TIMER
     22:         0         0     CBAR  4级    L3-dbg-IRQ
     23:         0         0    WUGEN 10 Level    L3-APP-IRQ
     25:         3         0     CBAR 232电平    触发7xx-PCIe-main
     26:         0         0     CBAR 233级别    dra7-PCIe-msi
     29:         1         0     CBAR 121电平    talert
     31:        49         0     CBAR  8级    OMAP-DMA 引擎
     34:         0         0     CBAR 361级别    43300000。EDMA_ccint
     36:         0         0     CBAR 359级别    43300000。EDMA_cerrint
     39:         0         0     CBAR 24级别    4ae1000.GPIO
     40:         0         0     CBAR 25电平    48055000。GPIO
     41:         0         0     CBAR 26电平    48057000.GPIO
     74:         0         0     CBAR 27电平    480590.GPIO
     75:         0          480590.gpio  0 Edge     stmpe
     76:         0          480590.GPIO  1级    PALMAS
    107:         0         0     CBAR 28电平    4805b000。GPIO
    140:         0         0     CBAR 29电平    4805d000.GPIO
    168:         0          4805d000.GPIO 27 Edge     4809c000.MMC CD
    173:         0         0     CBAR 30电平    480510.GPIO
    186:         0          0 480510.GPIO 12 Edge     tpd12s015 HPD
    206:         0         CBAR     116电平    480530.GPIO
    239:       181         0     CBAR 69 Level    48020000.serial
    273:         8         0     CBAR 108级别    OMAP_DMM_IRQ_handler
    274:       506         0     CBAR 51电平    48070000.i2c
    275:       194         0     CBAR 57 Level    4807a000。i2c
    276:       293         0     CBAR 78 Level    mmc0
    277:       572         0     CBAR 81级    mmc1
    278:         0         0     CBAR 23级别    40d01000.MMU
    279:         0         0     CBAR 145级    40d02000.MMU
    280:         0         0     CBAR 395级    588820.MMU
    281:         0         0     CBAR 396级别    55082000.MMU
    283:        81         0     CBAR 49级别    AHCI[4a140000.SATA]
    287:     10878         0     CBAR 335级别    48484000以太网
    288:      2855         0     CBAR 336级    48484000以太网
    298:         1         0     CBAR 47层    48090000.rng
    300:         0         0     CBAR 146级别    41501000.MMU
    301:         0         0     CBAR 147级别    41500.MMU
    304:         0         0     CBAR 20级    OMAP DISPC
    305:         0         0     CBAR 96级    OMAP HDMI
    373:         0         0    stmpe  1 Edge     stmpe-ts
    374:         0         0  PCI-MSI  0 Edge     PCIe PME、aerdrv
    407:         1         0  pinctrl 960 Edge     48020000.serial
    433:         0         0 4ae1000.gpio  0 Edge     ds1339
    467:         0          48055000。GPIO  2级别    3-0020
    498:         0         0  pca953x  1 Edge     button_1
    499:         0         0  pca953x  2 Edge     button_2
    500:         0         0  pca953x  3 Edge     button_3
    IPI0:         0         1 个 CPU 唤醒中断
    IPI1:         0          定时器广播中断
    IPI2:      1676      3788 重新安排中断
    IPI3:       117       213 函数调用中断
    IPI4:         0         0 CPU 停止中断
    IPI5:         0          IRQ 工作中断
    IPI6:         0         0 完成中断

    谢谢、此致、

    Stefan

    e2e.ti.com/.../3731_2E00_.config.txte2e.ti.com/.../defconfig_5F00_diff.txt

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

    好的。 我正在比较您在旧线程中的旧 defconfig、我看到了以下差异:

    < CONFIG_PCIEAER=y
    < CONFIG_PCIEASPM=y
    < CONFIG_PCIEASPM_DEFAULT=y
    < CONFIG_PCIe_PME=y
    < CONFIG_PCIe_DW=y
    < CONFIG_PCIe_DW_HOST=y
    < CONFIG_PCIe_DW_EP=y

    但这些不会显示在与此线程中的新附件的差异中。 现在、我们将与此保持一致。

    在旧线程中发布的 DTS 文件中、您使用 PCIe_SS1和 PCIe_SS2、每个都使用1通道。
    您还提到、如果仅配置了1个 PCIe_SS (或同时启用了两个 PCIe_SS、但仅启用了1个 PHY)、则可以正常工作。
    我的理解是否正确?

    我不认为 SUSPEND 是一个测试用例、但我会尝试查看我得到的结果。

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

    "在旧线程中发布的 DTS 文件中、您使用 PCIe_SS1和 PCIe_SS2、每个都使用1通道。"
    正确。

    "您还提到、如果仅配置了1个 PCIe_SS (或同时启用了两个 PCIe_SS、但仅启用了1个 PHY)、则会起作用。"
    正确。

    我知道这不是典型的测试用例。
    结果(如果我们得到一个)可能会很有趣。

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

    我浏览了我们的平台、无法重现问题以进一步调查。 没有任何 TI EVM 具有2个端口。
    我建议您检查是否有某个共享数据结构导致了这种情况。

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

    Rex、

    "一些共享数据结构"到底是什么意思? 您能否根据我提供的信息和 Linux 控制台输出提供有关在何处进一步调试的提示?

    此致、

    Stefan

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

    正如我在之前的帖子中提到的、TI 没有在任何 EVM 上真正测试过2个 RC。 您还提到1个 RC 正在工作。 我们怀疑可能是某些代码阻止了支持2个控制器、因为它们可能共享相同的数据结构。

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

    TI 没有重现此问题并继续工作的设置。 我们建议您在终端进行调试、并在启用2个端口时检查数据结构是否被覆盖。

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

    您是否有任何进展来确定两个端口之间的数据结构共享是否是原因?

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

    我们一段时间没有收到您的回复。 我现在要关闭这个线程。 如果您有任何其他问题、请提交新主题帖。

    雷克斯