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.

[参考译文] TDA4VH-Q1:总线错误

Guru**** 2482105 points
Other Parts Discussed in Thread: TDA4VM

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1367338/tda4vh-q1-bus-error

器件型号:TDA4VH-Q1
主题中讨论的其他器件:TDA4VM

工具与软件:

尊敬的 TI:

关于将 PCIe 条映射到过程空间并对其进行访问后发生总线错误的问题、已经取得了新的进展。

使用 gdb 调试时、我们发现每次执行汇编指令"str Q0、[x1]"时、都会发生总线错误、其中 x1 = 0xfff7f90028。 过程 mmap PCIe bar 后的地址是0xfff7f90000。 该地址似乎是8字节对齐的。 我不知道此汇编指令为什么会导致总线错误。 此外、在执行该指令之前、我已经检查了地址范围0xfff7f90000-0xfff7fA0000具有 RW-s 权限。

更令人困惑的是,当运行 Valgrind 时,没有发生总线错误,执行正常完成,结果检查中没有任何错误。 我想知道此问题是否与 PCIe 有关。 TI 专家能否对此提供帮助?

此致、

Qiang

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

    大家好、Qiang:

    感谢您尝试一些实验并在最后研究了这个问题 如果使用 Valgrind 运行不会导致问题、则可能与计时有关。

    我们可以尝试的一个实验是将 PCIe 驱动程序构建为一个模块、并在运行时将其加载、而不是引导。

    此致、

    Takuma

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

    你好、Takuma、

    虽然我不明白为什么这个问题与时间有关、但我尝试了您的建议。 我们可以尝试的一个实验是将 PCIe 驱动程序构建为模块、并在运行时(而不是在引导时)加载该模块。 此实验的效果与将 PCIe 驱动程序编译到内核中的效果相同。 我真的需要你们的帮助,这个问题一直困扰着我很长一段时间。 在使用 C++的放置新运算符在 mmap 返回的地址创建对象时会发生此问题、并且在执行构造函数之前会发生此问题。 这意味着在为类成员分配内存时可能会发生错误。 我已经简化了类成员、并找到了几个触发了总线错误的实例。 这些错误似乎遵循带有"tr q0、[x1]"等指令的模式、其中 Q0存储在以0x****结尾的地址 8.

    此致、

    Qiang

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

    大家好、Qiang:  

    感谢您试用该实验。 由于您提到使用 Valgrind 运行不会导致任何问题、因此您怀疑时间安排、因此认为可能存在加载的其他一些软件依赖项。

    至于新信息、可能与对齐有关、并且/或者我们正在映射某些区域、这些区域不应以某种方式在器件树中访问。

    此致、

    Takuma

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

    你好、Takuma、

    感谢您的答复。 今天、我研究了器件树和对齐问题。 我检查了设备树配置、发现没有问题。 然后、我尝试将所有类与对齐class alignas(*) xxx、使用*=8导致了总线错误、但使用*=16不会导致总线错误、尽管它导致了挂起。 我怀疑问题可能是因为互斥体无法正常工作。 因此、我想确认几个问题:

    1. 为什么需要16字节对齐?
    2. 此对齐要求是否由驱动程序确定? 如果是、请告诉我它的配置位置。
    3. 当用户使用 mmap 访问 PCI 条形空间时、他们是否需要特定对齐? 不能像 DDR 那样自由访问它?
    4. 如果 mutex 放置在 mmap PCI bar 空间中、它是否可以正常工作?


    此致、

    Qiang

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

    大家好、Qiang:

    TRM 中有一个名为"12.2.3.3.6.2 PCIe 事务限制"的部分。 我看到对齐方面的一些限制、例如:

    •事务地址对齐
    PCIe 子系统限制了最多128字节的出站读取/写入命令。 不过、
    如果起始地址未与8字节边界对齐、则最大事务大小会减少为
    120字节。 进行此限制是为了避免在计算从 CBA 到 AXI 的事务长度时发生算术溢出。
    如果出站方向的未对齐事务不限于最大数量、则会发生未指定的行为
    120字节。

    •字节选通限制
    对于任何类型的写入事务、字节使能只能包含一个连续的1字符串。 换言之、
    在传输中、如果一个字节的写选通信号被置位、那么后面所有字节都必须有写选通信号、直到最后一个字节
    启用写入的字节。 字节使能之间不允许有"空洞"或"零"。
    由于内部总线宽度大于32位、因此 TLP (事务层数据包)的大小将不为1 (PCIe)
    计数为32位单位)、因此、实际数据是通过 FBE/LBE (第一个/最后一个字节使能)获得的
    待传输数目受控。

    可能是我们遇到了其中一个问题。

    此致、

    Takuma

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

    你好、Takuma、

    非常感谢您的帮助。 通过调试、我发现、memcpy并且memset经常会导致总线错误、尤其是在奇字节边界上。 然而、执行单独的赋值操作不会导致总线错误。 我不明白为什么会发生这种情况。 它是否与您提到的字节使能相关? 启用字节是否意味着解决存储器碎片问题?

    此致、

    Qiang

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

    大家好、Qiang:

    可能是、但您的公司是否碰巧有 PCIe 协议分析器? 检查 TLP 数据包应该会让我们知道所设置的 FBE/LBE。

    此致、

    Takuma

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

    你好、Takuma、
    我们公司没有 PCIe 协议分析器。 对 PCIe 空间使用 mmap 时是否必须遵循特定规则? 它不像使用常规存储器那样灵活吗? 这似乎是一个常见问题、对吧? 其他人如何处理此问题? 我想知道如何让用户轻松地将其用作常规存储器、而无需在编写代码之前了解 PCIe 规则。

    此致、

    Qiang

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

    大家好、Qiang:

    我们公司没有 PCIe 协议分析器。 [报价]

    我懂了。

    其他人如何处理此事?

    我需要更深入地了解一下驱动器、但我们的 EP / RC 驱动器使用以下方式:

    https://github.com/torvalds/linux/blob/master/drivers/pci/endpoint/functions/pci-epf-test.c#L806

    此致、

    Takuma

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

    你好、Takuma、

    https://github.com/torvalds/linux/blob/master/drivers/pci/endpoint/functions/pci-epf-test.c#L806上的驱动程序 不符合我的使用要求。 我们希望用户能够像使用常规存储器一样使用 PCIe 空间、因此我们在驱动程序中实现了 mmap 接口。

    我在应用层中编写了一个非常简单的测试程序。 首先、我打开 PCIe 设备、然后映射 PCIe 条的起始空间。 最后、我使用 mmap 返回的地址、应用偏移、并将其传递到 memset 以进行归零。 我发现、无论地址如何对齐、传递给 memset 的最大大小都只有240字节。 当地址对齐小于16字节时、传递给 memset 的最大大小会降至8字节以下。 我不知道为什么会发生这种情况。 我列出了一个表供参考。



    此致、

    Qiang

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

    大家好、Qiang:

    您共享的数据非常有趣、因为240是120的倍数。  如前所述、根据 TRM、 120是不与8字节边界对齐时允许的最大事务大小。 此外、128个字节(或在120未对齐的情况下)是最大有效负载大小、这意味着240精确地是2个未对齐数据包的最大大小、而不是1个数据包。  

    这可能与问题有关、也可能与问题无关... 您是否可以转储 PCIe_RC_I_RC_PCIe_BASE_I_PCIe_dev_ctrl_status 寄存器内容? 这应该具有已配置的最大 TLP 有效载荷大小。 PCIe0、1、寄存器地址为0xD0000C8、0x0D8000C8、0x0E0000C8、0x0E8000C8 2、3。

    此致、

    Takuma

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

    你好、Takuma、

    所有240个字节与8字节地址对齐。 我怀疑另外一种情况:240字节是有效载荷、而使用 TLP 标头和摘要/ECRC 时、它总共可以增加256字节。 巧合的是、DevCap:MaxPayload 也是256字节。 但是、MaxPayload 是指有效有效有效负载、而不限制 TLP 大小。

    关于您提到的 MP 寄存器、我检查了它的值、发现它是0、应该对应于128字节。 将其更改为1对我的问题没有帮助。

    发生总线错误时、没有 AER 错误。

    在驱动程序中使用 memset_io/memcpy_toio 不会导致错误、无论大小如何、但这些都需要特定的 I/O 接口。 我不确定在用户空间中使用 memset 后会发生什么情况、因为它不使用特定的 I/O 接口。

    此致、

    Qiang

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

    嗨、Quant、

    为了澄清一点、这些是正在发送的存储器写入请求、而 IO、器件或配置请求不正确?

    错误仅发生在64位存储器地址上?

    此致、

    Takuma

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

    你好、Takuma、

    有。 操作地址是用户空间中 PCIe 条的 mmap 返回的64位地址。 从用户的角度来看、执行 memset 是对内存的写入操作。 但是、此地址映射到端点(EP)的 PCIE 条形空间。 我知道、这样的低级别写入操作应该访问 PCIe 总线、从而操作器件。 我不十分清楚在较低级别如何做到这一点的具体细节。

    此致、

    Qiang

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

    大家好、Qiang:

    感谢您的澄清。 我刚找到一组可能很有趣的寄存器。 您是否可以转储以下寄存器:

    0D10 0300h 0D90 0300h 0E10 0300h 0E90 0300h 32. 100300h CORE_DBN_CFG_PCIE_CORE PCIe_LM_I_regf_lm_pci_base_i_RC_BAR_CONFIG_reg
    0D10 0300h 0D90 0300h 0E10 0300h 0E90 0300h 32. 100300h CORE_DBN_CFG_PCIE_CORE PCIe_LM_I_regf_lm_pci_base_i_RC_BAR_CONFIG_reg
    0D10 0300h 0D90 0300h 0E10 0300h 0E90 0300h 32. 100300h CORE_DBN_CFG_PCIE_CORE PCIe_LM_I_regf_lm_pci_base_i_RC_BAR_CONFIG_reg
    0D10 0300h 0D90 0300h 0E10 0300h 0E90 0300h 32. 100300h CORE_DBN_CFG_PCIE_CORE PCIe_LM_I_regf_lm_pci_base_i_RC_BAR_CONFIG_reg
    0D10 0300h 0D90 0300h 0E10 0300h 0E90 0300h 32. 100300h CORE_DBN_CFG_PCIE_CORE PCIe_LM_I_regf_lm_pci_base_i_RC_BAR_CONFIG_reg
    0D10 0300h 0D90 0300h 0E10 0300h 0E90 0300h 32. 100300h CORE_DBN_CFG_PCIE_CORE PCIe_LM_I_regf_lm_pci_base_i_RC_BAR_CONFIG_reg
    0D10 0300h 0D90 0300h 0E10 0300h 0E90 0300h 32. 100300h CORE_DBN_CFG_PCIE_CORE PCIe_LM_I_regf_lm_pci_base_i_RC_BAR_CONFIG_reg
    0D10 0300h 0D90 0300h 0E10 0300h 0E90 0300h 32. 100300h CORE_DBN_CFG_PCIE_CORE PCIe_LM_I_regf_lm_pci_base_i_RC_BAR_CONFIG_reg
    0D10 0300h 0D90 0300h 0E10 0300h 0E90 0300h 32. 100300h CORE_DBN_CFG_PCIE_CORE PCIe_LM_I_regf_lm_pci_base_i_RC_BAR_CONFIG_reg
    0D10 0300h 0D90 0300h 0E10 0300h 0E90 0300h 32. 100300h CORE_DBN_CFG_PCIE_CORE PCIe_LM_I_regf_lm_pci_base_i_RC_BAR_CONFIG_reg
    0D10 0300h 0D90 0300h 0E10 0300h 0E90 0300h 32. 100300h CORE_DBN_CFG_PCIE_CORE PCIe_LM_I_regf_lm_pci_base_i_RC_BAR_CONFIG_reg

    此致、

    Takuma

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

    你好、Takuma、

    我使用的是 PCIe 1。 PCIe_LM_I_regf_lm_pci_base_i_RC_BAR_CONFIG_reg 的寄存器地址为0x0D900300。 相应的寄存器值为0x001E0000。

    此致、

    Qiang

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

    你好、Takuma、

    补充 RC 的 lspci 信息

    0000:00:00.0 PCI bridge: Texas Instruments Device b00d (prog-if 00 [Normal decode])
            Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+
            Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
            Latency: 0
            Interrupt: pin A routed to IRQ 36
            Bus: primary=00, secondary=01, subordinate=01, sec-latency=0
            I/O behind bridge: [disabled]
            Memory behind bridge: 18100000-1fdfffff [size=125M]
            Prefetchable memory behind bridge: [disabled]
            Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- <SERR- <PERR-
            BridgeCtl: Parity- SERR+ NoISA- VGA- VGA16- MAbort- >Reset- FastB2B-
                    PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn-
            Capabilities: [80] Power Management version 3
                    Flags: PMEClk- DSI- D1+ D2- AuxCurrent=0mA PME(D0+,D1+,D2-,D3hot+,D3cold-)
                    Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-
            Capabilities: [90] MSI: Enable+ Count=1/1 Maskable+ 64bit+
                    Address: 0000000001040000  Data: 0000
                    Masking: 00000000  Pending: 00000000
            Capabilities: [b0] MSI-X: Enable- Count=1 Masked-
                    Vector table: BAR=0 offset=00000000
                    PBA: BAR=0 offset=00000008
            Capabilities: [c0] Express (v2) Root Port (Slot+), MSI 00
                    DevCap: MaxPayload 256 bytes, PhantFunc 0
                            ExtTag- RBE+
                    DevCtl: CorrErr+ NonFatalErr+ FatalErr+ UnsupReq+
                            RlxdOrd+ ExtTag- PhantFunc- AuxPwr- NoSnoop+
                            MaxPayload 256 bytes, MaxReadReq 512 bytes
                    DevSta: CorrErr- NonFatalErr- FatalErr- UnsupReq- AuxPwr- TransPend-
                    LnkCap: Port #0, Speed 8GT/s, Width x2, ASPM L1, Exit Latency L1 <8us
                            ClockPM- Surprise- LLActRep- BwNot+ ASPMOptComp+
                    LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- CommClk-
                            ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-
                    LnkSta: Speed 8GT/s (ok), Width x2 (ok)
                            TrErr- Train- SlotClk- DLActive- BWMgmt+ ABWMgmt-
                    SltCap: AttnBtn- PwrCtrl- MRL- AttnInd- PwrInd- HotPlug- Surprise-
                            Slot #0, PowerLimit 0.000W; Interlock- NoCompl-
                    SltCtl: Enable: AttnBtn- PwrFlt- MRL- PresDet- CmdCplt- HPIrq- LinkChg-
                            Control: AttnInd Off, PwrInd Off, Power+ Interlock-
                    SltSta: Status: AttnBtn- PowerFlt- MRL+ CmdCplt- PresDet- Interlock-
                            Changed: MRL- PresDet- LinkState-
                    RootCap: CRSVisible-
                    RootCtl: ErrCorrectable- ErrNon-Fatal- ErrFatal- PMEIntEna+ CRSVisible-
                    RootSta: PME ReqID 0000, PMEStatus- PMEPending-
                    DevCap2: Completion Timeout: Range B, TimeoutDis+, NROPrPrP-, LTR+
                             10BitTagComp+, 10BitTagReq-, OBFF Not Supported, ExtFmt+, EETLPPrefix+, MaxEETLPPrefixes 1
                             EmergencyPowerReduction Not Supported, EmergencyPowerReductionInit-
                             FRS-, LN System CLS Not Supported, TPHComp-, ExtTPHComp-, ARIFwd+
                             AtomicOpsCap: Routing- 32bit- 64bit- 128bitCAS-
                    DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis-, LTR+, OBFF Disabled ARIFwd+
                             AtomicOpsCtl: ReqEn- EgressBlck-
                    LnkCtl2: Target Link Speed: 8GT/s, EnterCompliance- SpeedDis-
                             Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS-
                             Compliance De-emphasis: -6dB
                    LnkSta2: Current De-emphasis Level: -6dB, EqualizationComplete+, EqualizationPhase1+
                             EqualizationPhase2+, EqualizationPhase3+, LinkEqualizationRequest-
            Capabilities: [100 v2] Advanced Error Reporting
                    UESta:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
                    UEMsk:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
                    UESvrt: DLP+ SDES+ TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol-
                    CESta:  RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr-
                    CEMsk:  RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr+
                    AERCap: First Error Pointer: 00, ECRCGenCap+ ECRCGenEn- ECRCChkCap+ ECRCChkEn-
                            MultHdrRecCap- MultHdrRecEn- TLPPfxPres- HdrLogCap-
                    HeaderLog: 00000000 00000000 00000000 00000000
                    RootCmd: CERptEn+ NFERptEn+ FERptEn+
                    RootSta: CERcvd- MultCERcvd- UERcvd- MultUERcvd-
                             FirstFatal- NonFatalMsg- FatalMsg- IntMsg 0
                    ErrorSrc: ERR_COR: 0000 ERR_FATAL/NONFATAL: 0000
            Capabilities: [150 v1] Device Serial Number 00-00-00-00-00-00-00-00
            Capabilities: [300 v1] Secondary PCI Express
                    LnkCtl3: LnkEquIntrruptEn-, PerformEqu-
                    LaneErrStat: 0
            Capabilities: [4c0 v1] Virtual Channel
                    Caps:   LPEVC=0 RefClk=100ns PATEntryBits=1
                    Arb:    Fixed- WRR32- WRR64- WRR128-
                    Ctrl:   ArbSelect=Fixed
                    Status: InProgress-
                    VC0:    Caps:   PATOffset=00 MaxTimeSlots=1 RejSnoopTrans-
                            Arb:    Fixed- WRR32- WRR64- WRR128- TWRR128- WRR256-
                            Ctrl:   Enable+ ID=0 ArbSelect=Fixed TC/VC=ff
                            Status: NegoPending- InProgress-
                    VC1:    Caps:   PATOffset=00 MaxTimeSlots=1 RejSnoopTrans-
                            Arb:    Fixed- WRR32- WRR64- WRR128- TWRR128- WRR256-
                            Ctrl:   Enable- ID=1 ArbSelect=Fixed TC/VC=00
                            Status: NegoPending- InProgress-
                    VC2:    Caps:   PATOffset=00 MaxTimeSlots=1 RejSnoopTrans-
                            Arb:    Fixed- WRR32- WRR64- WRR128- TWRR128- WRR256-
                            Ctrl:   Enable- ID=2 ArbSelect=Fixed TC/VC=00
                            Status: NegoPending- InProgress-
                    VC3:    Caps:   PATOffset=00 MaxTimeSlots=1 RejSnoopTrans-
                            Arb:    Fixed- WRR32- WRR64- WRR128- TWRR128- WRR256-
                            Ctrl:   Enable- ID=3 ArbSelect=Fixed TC/VC=00
                            Status: NegoPending- InProgress-
            Capabilities: [5c0 v1] Address Translation Service (ATS)
                    ATSCap: Invalidate Queue Depth: 01
                    ATSCtl: Enable-, Smallest Translation Unit: 00
            Capabilities: [640 v1] Page Request Interface (PRI)
                    PRICtl: Enable- Reset-
                    PRISta: RF- UPRGI- Stopped+
                    Page Request Capacity: 00000001, Page Request Allocation: 00000000
            Capabilities: [900 v1] L1 PM Substates
                    L1SubCap: PCI-PM_L1.2+ PCI-PM_L1.1+ ASPM_L1.2+ ASPM_L1.1+ L1_PM_Substates+
                              PortCommonModeRestoreTime=255us PortTPowerOnTime=26us
                    L1SubCtl1: PCI-PM_L1.2- PCI-PM_L1.1- ASPM_L1.2- ASPM_L1.1-
                               T_CommonMode=0us LTR1.2_Threshold=0ns
                    L1SubCtl2: T_PwrOn=10us
            Kernel driver in use: pcieport

    此致、

    Qiang

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

    大家好、Qiang:

    感谢您分享这些信息。 看起来寄存器在默认 PCIe DAT0和 DAT1空间之间没有变化。

    另一个注意事项是、该主题是否与此处的主题相关: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1360433/tda4vh-q1-how-to-modify-pcie-shared-memory-size-to-1gb/5246415#5246415

    我对我之前分享的补丁进行了一些改进、以便可以正确检测到 SSD 卡并在没有错误的情况下正常工作。

    此致、

    Takuma

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

    你好、Takuma、

    如果没记错、所谓的 PCIe DATA0/DATA1将用作 PCIe EPC 空间。 它用于 CPU<->PCIe 地址转换。 它在 EP 侧驱动器上运行、用于映射 RC 侧的传输缓冲器。 对于 PCIe DATA0/DATA1 (我的理解可能不是完全准确、您能否向我解释一下?)、由于我没有使用该方法、这与我的实验无关。 我在 RC 侧实现了 mmap EP bar、期望 RC 侧的用户空间直接操作 EP 的 bar 空间。 我可以大致列出我的实验代码,你可以进行一个实验;它非常简单。 解决这一问题对我来说非常重要、我希望您能够专注于它。 对于您提到的其他主题、这显然不是同一个问题。

    // driver
    static int pci_rc_mmap(struct file *file, struct vm_area_struct *vma)
    {
        resource_size_t offset = vma->vm_pgoff << PAGE_SHIFT;
        resource_size_t start = 0;
    
        start = bar2_start_addr;  // bar2_start_addr = pci_resource_start(pdev, BAR_2); bar2_start_addr = 0x1fB00000
    
        vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
    
        return io_remap_pfn_range(vma, vma->vm_start, ((start + offset) >> PAGE_SHIFT), vma->vm_end - vma->vm_start, vma->vm_page_prot);
    }
    
    
    // user
    int main(int argc, char **argv)
    {
        int fd;
        char *bar = NULL;
    
        fd = open("/dev/pcie-dev", O_RDWR);
        if (fd < 0)
        {
            perror("open");
            return -1;
        }
    
        bar = mmap(0, 65536, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    
        memset(bar, 0, 241); // Bus error
    
        munmap(bar, 65536);
    
        close(fd);
    
        return 0;
    }

    此致、

    Qiang

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

    大家好、Qiang:

    如果同一个器件树用作另一个线程、我会发现所遇到问题可能会重叠。

    原因如下:

    1. 切换到64位4GB 存储器和尝试访问存储器时也会遇到总线错误。
    2. 我遇到一个错误、从无法在4GB 存储器空间中分配条的区域开始 PCIe 地址。
    3. 我发现、对于较大的条形图分配、CMA 区域大小对于 RC 和 EP 都很重要、并且具有较小的 CMA 区域大小可能会导致问题。

    为了区分这两个问题、您可以向我发送 正在使用的 k3-j784s4-main.dtsi 设备树、查看我 的配置是否与您的设置相同?

    此致、

    Takuma

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

    大家好、Qiang:

    我没有使用其他设备树文件。 但是、很抱歉造成混淆、因为我发现我使用的是 TDA4-VM 而不是 VH。 尽管如此、我还是希望获得更大的酒吧空间。 我是否需要为此添加另一个补丁?

    知道这是 TDA4VM。 PCIE1_DAT1的寄存器位置在 VH 和 VM 之间是相同的、因此相同的 VH 补丁应适用于 VM。 但是、使用 PCIE1_DAT1的补丁仍然非常实验性(也是、我经常遇到总线错误)。

    要查看这是否是使用 PCIE1_DAT1空间造成的问题、您是否可以恢复该补丁并使用 PCIE1_DAT0空间?  

    此致、

    Takuma

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

    你好、Takuma、

    我计划下周在虚拟机上试用补丁、看看它是否起作用。 我希望您可以继续帮助调查总线错误问题。 总线错误是我最大的问题。

    此致、

    Qiang

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

    大家好、Qiang:

    是的、将同时考虑 PCIe DAT1区域和总线错误。 当我们同时查看这些内容时、可能会出现延迟、但我们不会忘记它们。

    另一方面、我记得您在尝试数据传输时可能尝试过使用 DMA 的一些方法。 使用 DMA 时是否观察到总线错误?

    此致、

    Takuma

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

    你好、Takuma、

    我需要和你确认几件事。 首先、我仅在使用 mmap 之后在用户空间中操作 PCIE 条时遇到总线错误、而内核空间中不会发生总线错误。 区别在于、用户空间使用 memset/memcpy 等存储器操作、而内核空间使用 memset_io/memcpy_toio 等 I/O 操作。 其次、我没有在用户空间中使用 DMA 操作、但在内核中使用了 EP DMA RC。 但是、此过程中未发生总线错误。 用户空间是否可以直接对 PCIe 执行 DMA? 如果是、您能告诉我如何操作吗? 最后、您能否告诉我您的终端上的哪种操作会导致总线错误?

    此致、

    Qiang

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

    大家好、Qiang:

    userspace 执行系统调用以访问内核,而内核是硬件和 userspace 之间的接口。 这里有一个用户空间应用程序: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/tools/pci/pcitest.c?h=ti-linux-6.1.y、 它会调用此处: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/drivers/misc/pci_endpoint_test.c?h=ti-linux-6.1.y、它 使用 DMA 来传输数据。

    关于总线错误、我怀疑是使用 DMA 而不是使用 DMA 引起了问题、因为对于 PCIe、有一个特定于数据包的 uDMA 通道、称为 uDMA-P: https://software-dl.ti.com/jacinto7/esd/processor-sdk-rtos-jacinto7/09_02_00_05/exports/docs/pdk_jacinto_09_02_00_30/packages/ti/drv/udma/docs/UDMA_Overview.pdf。 由于总线和架构是围绕使用 uDMA-P 的假设建立的、因此不使用 uDMA 会丢失一些原本由 uDMA 提供的信息。

    此致、

    Takuma

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

    你好、Takuma、

    长时间无接触。 有更新吗?  

    我发现在 mmap 实现期间将 pgprot 设置为 NC 会导致在使用 memset 时出现总线错误。 然而、将其设置为 WC 不会导致总线错误、但这显然不合适。

    此致、

    Qiang

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

    大家好、Qiang:

    根据该补丁、WC 似乎适用于 PCIe: https://lore.kernel.org/linux-pci/7c16b64b4099fac734cb2c53759b9c975df3d73b.1490188942.git.dwmw2@infradead.org/

    是否有具体的原因导致它不合适?

    此致、

    Takuma

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

    你好、Takuma、

    在我的理解中、ARM DeviceGRE 和 Normal NC 之间存在显著差异。 DeviceGRE 不符合 WC 要求。

    参考 https://github.com/torvalds/linux/blob/v5.4/Documentation/filesystems/sysfs-pci.txt#L124-L127上的 sysfs 文档、可以看出支持 WC 的平台需要将 arch_can_pci_mmap_wc ()定义为1。 我检查了 sdk7.3并且没有找到该定义 https://github.com/torvalds/linux/blob/v5.4/arch/arm64/include/asm/pci.h、因此我认为 在 sdk7.3中将 pgprot 设置为 WC 是不合适的。

    直到今天,我看到了一个补丁,推翻了我的理解://lore.kernel.org/linux-arm-kernel/20200917160851.GA29999@Willie-the-truck/T/#t我意识到 ARM64也可能支持 PCI mmap WC。 我仍然需要花一些时间研究我的 sdk7.3是否可以直接应用此补丁或是否有较新的 SDK 已经应用此补丁。

    此致、

    Qiang

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

    大家好、Qiang:

    直到今天,我看到一个补丁推翻了我的理解://lore.kernel.org/linux-arm-kernel/20200917160851.GA29999@willie-the-truck/T/#t.

    这是您发现的一个非常有趣的对话。 无论如何、在我们较新的 SDK 使用的较新内核中、已经集成了在该电子邮件线程中讨论的补丁: https://patchwork.kernel.org/project/linux-arm-kernel/patch/20200821155154.umharcbew46hkhuq@amazon.com/

    作为参考、我们的 Linux 内核源代码基于9.x SDK 中使用的首要6.1内核: https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/arch/arm64/include/asm/pci.h?h=ti-linux-6.1.y

    因此、您可以尝试迁移到更新的 SDK 以获得这些更改。

    此致、

    Takuma

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

    你好、Takuma、

    很抱歉我迟到了答复。 我没有更新 SDK、仅更新了补丁、并在 EP 端启用了可预取功能。 我发现资源 wc 可以在 sys 中看到。 然后、在 RC 端、我 mmap 资源 wc 并对返回的地址执行 memset 操作。 这不会导致总线错误、但会导致整个 SoC 崩溃、从而无法通过 SSH 或串行端口访问。 我目前没有足够的精力或知识来进一步调查此问题、因此我尝试绕过 memset 作为临时解决方法。 如果您有任何进一步的发现、您能否更新并分享这些结果? 我不确定启用预取功能是否会产生任何负面影响。

    此致、

    Qiang

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

    大家好、Qiang:

    如果您有任何进一步的发现、您可以更新并分享它们吗?

    是的、我们将在内部保持该主题处于打开状态。 如果我们有发现、我们将在该主题中更新。

    此致、

    Takuma

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

    你好、Takuma、

    该主题的任何进一步更新?  

    此致、

    Brijesh

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

    正在解锁该线程。