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.

[参考译文] AM6548:PCIe 端点配置

Guru**** 2644125 points

Other Parts Discussed in Thread: AM6548

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/881426/am6548-pcie-endpoint-configuration

器件型号:AM6548

尊敬的 TI 支持团队:

我们使用 AM6548的 PCIe 子系统建立与 x86 CPU 的 PCIe 连接。 在此设置中、AM6548以端点模式运行、我们的代码使用 TI-RTOS /处理器 SDK 06.01在 R5f 上运行。

由于处理器 SDK 附带的 PCIe 驱动程序(pdk_am65xx_1_0_6\packages/ti\drv\PCIe\src\v2)似乎是专为连接在一起的两个 AM*器件而定制的示例,因此我们编写了自己的代码来设置 PCIe 端点。

端点由 RC 检测、访问配置空间有效。 在 x86上执行的 lspci 命令显示了默认的条形布局:

# lspci -vv -n -s 01:00.0
(笑声)
       区域0:存储器位于 (64位、不可预取)[size=1M]
       区域2:存储器位于 (64位、不可预取)[SIZE=8M]
       区域4:I/O 端口位于 [已禁用][size=256]
       区域5:存储器位于 (32位、不可预取)[size=2G]
(笑声)

此布局与 TRM (SPRUID7E)第12.2.2.4.15节中的布局匹配-尽管此部分仅对 SR2.0有效。 SR1.0的对应段不存在。

  • TRM 的第12.2.4.15节为何仅对 SR2.0有效? SR1.0如何?

我们需要更改此布局。 更改条形类型和存储器类型(更改为 MEM 32位)的工作正常、并被 RC 正确检测到。

但是、更改条形尺寸不能按预期工作。 根据手册、屏蔽寄存器是条形寄存器地址处的影子寄存器。

我们执行了以下步骤对其进行更改(如手册中所述):

  • 设置 PCIe_EP_CMD_STATUS (05500004h 处的位5)中的字段 DBI_CS2
  • 写入新的条形码(例如、将0000ffh 写入寄存器05501024h)
  • 清除 PCIe_EP_CMD_STATUS 中的字段 DBI_CS2

之后、条形的尺寸没有变化。

当值 ffffffffffh 将被写入5501024h 并立即回读时、返回的值仍然为80000000h。 这对应于2G 条码大小(如默认配置)。

KeyStoneArchitecture PCI 用户指南(不适用于 AM6548)建议条形码屏蔽寄存器的位0启用或禁用条形码。
实际上、在设置 DBI_CS2、写入值 fffffeh 和清除 DBI_CS2后、该栏将被禁用。 这意味着写入屏蔽寄存器会产生结果。 但是、更改条形尺寸不起作用。

处理器 SDK 附带的 PCIe 示例中有代码、但由于该代码从未使用条形寄存器的内容、该示例无法检测条形尺寸的编程是否出错。

  • 如何更改条形尺寸?
  • AM6548是否也有 BAR_ENABLE 位(手册中没有提到它、或者根本没有记录条形码屏蔽寄存器)?
  • 哪些掩码值对应于哪些条码大小(我们猜是:00000fffh 为4K、00001fffh 为8k、等等)?

此致、

Dominic

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

    尊敬的 Dominic:

    TRM (SPRUID7E)的12.2.2.4.15只是一个澄清。 SR1.0和 SR 2.0都有该函数。

    根据 TRM

    ----------------------------------------------------------------------

    12.2.2.5.1.79 PCIe_EP_BAR0_REG 寄存器(偏移= 1010h)[复位= 4h]

    PCIe_EP_BAR0_REG图12-803所示并在表12-1882中进行介绍

    返回汇总表

    BAR0和条形码。 有关此标准 PCIe 寄存器的说明、请参阅 PCI Express 规范。

    该条的掩码作为影子寄存器存在于(如果实现)该地址。 CS2的断言

    (即使 dBi 桥接器的 dBi CS2输入或 CS2地址位有效)需要写入

    第二个寄存器。

    ------------------------------------------------------

    BAR0和 BAR0掩码使用同一寄存器(0x1010)。 DBI_CS2用作交换机。 如果将 DBI_CSI2设置为1、则对寄存器的读取/写入将被屏蔽、否则它是起始地址。

    • 设置 PCIe_EP_CMD_STATUS (05500004h 处的位5)中的字段 DBI_CS2
    • 写入新的条形码(例如、将0000ffh 写入寄存器05501024h)
    • 清除 PCIe_EP_CMD_STATUS 中的字段 DBI_CS2

    将设置新的条形码掩码值、但要读取该值、您需要执行以下操作:

    • 设置 PCIe_EP_CMD_STATUS (05500004h 处的位5)中的字段 DBI_CS2
    • 读取 新的条形码(例如 、读取0000ffh 至寄存器05501024h)
    • 清除 PCIe_EP_CMD_STATUS 中的字段 DBI_CS2

    Ming

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

    Ming、您好!

    我们知道正在通过相同的地址访问 BAR0和 BAR0掩码、我们设置了 DBI_CS2字段、但我们似乎无法读回编程到 BAR0掩码寄存器中的值。

    如果清除禁用相应条形的位[0]、我们就能看到写入该寄存器的效果。 如果我们清除 bit [0]、则该栏在主机 Linux 上显示为已禁用。

    无论我们将其他位[30]-[01]设置为什么、条的大小始终确定为相同(BAR0 1M、bar2 8M、bar5 2G)。

    这与之前版本的 DWC PCIe 参考手册中所述的说明相匹配

    • 条形码寄存器只可写、不可读
    • 要禁用任意条形码、应用程序可以向相应条形码屏蔽寄存器的位0写入0。
    • 如果`BAR0_MASK_writable_N = 0、则不能通过 DBI 写入 Bar 0掩码寄存器。

    AM65x SR1.0中的 PCIe 控制器是否有可能在 barn_mask_writee_N = 0时实现?

    您是否能够验证您的描述是否适合您? 您是否能够读回写入条形码屏蔽寄存器的值?

    此致、

    Dominic

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

    尊敬的 Dominic:

    我必须就此与设计团队进行核实、并尽快与您联系。

    Ming

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

    尊敬的 Dominic:

    我们的 Linux 团队确认可以 更改某些条码(0/1/2)大小。 我们的 RTOS 代码还将 pcieCfgEP 中的 BAR0和 bar 1大小更改为 PCIe_bar_mask (0x0FFFFFFF)。  您能否尝试更改此项以查看其是否真正有效?

    Ming

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

    Ming、您好!

    我们已经进一步研究了这一点、似乎我们能够更改条0、2和5的大小、但使用了可调整的条功能寄存器、而不是条屏蔽寄存器。

    我们尚未完全了解条形图的可配置性、但我们刚刚执行了一项测试、其中我们配置了条形图0至8 MB、条形图2至16 MB、而条形图显示在 Linux 中、具有所需的大小。

    我们将 PCIe_EP_RESBAR_CAP_REG_0_REG 从0x10 (1MB)编程为0x80 (8MB)、并将 PCIe_EP_RESBAR_CAP_REG_1_REG 从0xf0 (1、2、4或8MB)编程为0x100 (16MB)。

    我知道 RTOS 代码会配置条屏蔽寄存器、但该示例绝不依赖于条的内容。 即使不更改条形图掩码、该示例也能正常工作。

    此致、

    Dominic

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

    我已经对此进行了更多研究、似乎 PCIe_EP_RESBAR_CAP_REG_0_REG 的设置控制了 BAR0的掩码。 功能位中报告的最大大小定义了不能从主机写入的条形中的位数、即、如果我将功能寄存器写入0xf0 (1、2、4或8 MB)、条形寄存器的位[22:0]固定为 b0 (写入0xffffffff 将产生0x800000)。

    我检查了是否可以写入 BAR4的屏蔽、因为该条没有可调整的条形寄存器、但该条形图似乎停留在256字节。

    我仍然对如何在 AM65x 上配置 PCI EP 条感到好奇、因为到目前为止、这一切都是试错。

    [引用用户="Ming Wei]TRM (SPRUID7E)的12.2.2.4.15只是一个澄清。 SR1.0和 SR 2.0都有该函数。[/quot]

    我不确定您在这里想告诉我什么。 您所指的"功能"是什么? SR1.0和 SR2.0之间有何差异?

    第一个配置将显示条配置的重置默认值。 条形寄存器通过位[3:0](预取、32/64、mem/IO)配置条形的类型、RESBAR 寄存器配置 BAR0、条形2和条形5支持的大小。 此配置对于 SR1.0应该同样有效、除非我缺少某些内容。

    第二种配置是一种可能的配置、如果所有条都配置为32位、但我认为这不是唯一可能的配置。 可以禁用条形图并具有不同的类型、BAR0/1可以是32位、而 bar2可能仍然是64位、等等。

    您是否有机会了解该注释为何将本章限制为 SR 2.0?

    此致、

    Dominic

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

    尊敬的 Dominic:

    我很抱歉造成任何混淆。

    我已确认 TRM (SPRUID7E)的12.2.2.4.15适用于 SR1.0和 SR2.0。 仅 SR 2.0是一个拼写错误。

    Ming

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

    Ming、您好!

    我们已经取得了一些进展、但我想我们仍然不能完全理解我们为配置 PCIe EP 提供了哪些选项。

    • 表12-1997/12-1998中 TRGT0和 TRGT1指的是什么?
    • 通过 BAR0访问哪些"应用寄存器"(请参阅12.2.2.4.7.2 PCIe 入站地址转换、"BAR0入站地址转换异常")?
      • 我们假设我们可能能够通过将 BAR0映射到0x05500000来访问 PCIe EP 寄存器空间、但显然这不起作用
      • 我们意识到、我们可以在器件的配置空间中的偏移量0xD00处访问 EP 寄存器0x000至0x200、但这不使用 BAR0
      • 在设置 PCIe_EP_MISC_CONTRAL_1_OFF 中的 DEFAULT_TARGET 位后、我们设法通过 BAR0映射任意(DDR)存储器、但我们并不真正理解其工作原理/该位的含义。
    • 是否可以通过入站 iATU 映射任意的 AM65x 外设寄存器(例如 PCIe、但也包括其他寄存器)、以允许通过 PCIe 从外部 RC 访问它们?
    • TRM 告诉我们、如果我们只使用32位地址(请参阅12.2.2.4.7 PCIe 子系统地址转换)、我们应该能够在每个方向具有32个 iATU 区域(而不是16个)-我们如何配置这32个区域? TRM 仅列出16个区域的寄存器。
    • 表12-1996告诉我们、本地偏移量0xA0000处有一个"PCIe 远程配置空间(远程 PF0)"-这意味着什么? 我们找不到任何其他对此偏移的引用。
      • 生成配置空间访问是否像固定的出站转换窗口?

    • 表12-1996中列出的本地偏移量0xB0000处的"PCIe IO 配置空间(远程 IO)"是什么?
      • 乍一看、"IO 配置空间"看起来像是一个拼写错误。
      • 这是否像生成 I/O 访问的固定出站转换窗口?
    • 下表12-1996的具体内容是什么、它告诉我们如果启用了 MSI-X 地址匹配、我们将无法访问"PCIe 本地应用寄存器"?
      • 我们希望 RC 能够在 EP (AM65xx)中生成中断。 根据我们的理解,我们应该为此使用 PCIe_EP_MRx_IRQ_*寄存器,但这意味着我们需要访问"PCIe 本地应用寄存器"。
    • "MSI-X 地址匹配"功能如何工作? 第12.2.2.4.1.3章 MSI-X 中断生成告诉我们有一个"集成的 MSI-X 传输(iMSIX-TX)功能"、但除此之外、没有太多关于此功能的信息。
      • PCIe_EP_MSIX_ADDRESS_MATC__*寄存器的说明告诉我们,如果(MSI_X 表 RAM 特性)为(MSIX_TABLE _EN=1),但我认为 MSIX_TABLE _EN 是 TI 在集成 PCIe IP 内核时配置的东西。 PCIe IP 内核是否在 AM65x 中启用了该功能的情况下实现?
      • 我们应该为 MSI-X 地址匹配配置哪个地址? 该地址与下表12-1996中的说明有何关系?
    • iATU "inver_mode"是如何工作的? TRM 告诉我们、如果为 iATU 区域设置了该位、则在地址超出定义的范围(从基址到限制)时会发生地址匹配、但在这种情况下如何计算目标地址? 对于非反相_mode、目标地址是定义范围(从基址到限制)加上配置的目标地址中的偏移量、但这似乎对反相_mode 没有意义?
    • 如果我们将入站 iATU 配置为条形匹配模式、则似乎忽略了基准和限值、但 TRM 会告诉我们这是"按预期工作"还是配置中存在错误。
      • 我们想要配置的是单个条形图到本地地址空间中多个区域的"散射"映射、例如
        • BAR0、偏移量0x00000000 -> 0x80000000
        • BAR0、偏移量0x00100000 -> 0x90000000
      • 如果我们不使用条形匹配模式而是地址匹配模式、这种配置似乎是可能的、但这样我们需要与 RC 进行某种同步、即我们需要等待 RC 来配置条形、 然后使用条中的地址配置入站 iATU。

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

    尊敬的 Dominic:

    • 表12-1997/12-1998中 TRGT0和 TRGT1指的是什么?

    [MV] TRGT0被用来访问控制器中的寄存器。 TRGT1用于数据传输

    • 通过 BAR0访问哪些"应用寄存器"(请参阅12.2.2.4.7.2 PCIe 入站地址转换、"BAR0入站地址转换异常")?
      • 我们假设我们可能能够通过将 BAR0映射到0x05500000来访问 PCIe EP 寄存器空间、但显然这不起作用
      • 我们意识到、我们可以在器件的配置空间中的偏移量0xD00处访问 EP 寄存器0x000至0x200、但这不使用 BAR0
      • 在设置 PCIe_EP_MISC_CONTRAL_1_OFF 中的 DEFAULT_TARGET 位后、我们设法通过 BAR0映射任意(DDR)存储器、但我们并不真正理解其工作原理/该位的含义。

    [MV]应用寄存器是 PCIe 控制器寄存器(0x0000至0x0200)。 默认情况下、BAR0设置为访问 TRGT0。 更改 DEFAULT_TAREGT 将将 BAR0访问路由到 TRGT1

    • 是否可以通过入站 iATU 映射任意的 AM65x 外设寄存器(例如 PCIe、但也包括其他寄存器)、以允许通过 PCIe 从外部 RC 访问它们?

    [MW]是的、 如果你研究从 EP 到 RC 的 MSI 中断的实现、你会发现我们正在 使用 IATU 映射 RC 的 GIC500寄存器  

    • TRM 告诉我们、如果我们只使用32位地址(请参阅12.2.2.4.7 PCIe 子系统地址转换)、我们应该能够在每个方向具有32个 iATU 区域(而不是16个)-我们如何配置这32个区域? TRM 仅列出16个区域的寄存器。

    [MV]这是 TRM 中的一个问题。 我们仅支持16个入站 iATU 区域。

    • 表12-1996告诉我们、本地偏移量0xA0000处有一个"PCIe 远程配置空间(远程 PF0)"-这意味着什么? 我们找不到任何其他对此偏移的引用。
    • 生成配置空间访问是否像固定的出站转换窗口?

    [MV]是的。

    • 表12-1996中列出的本地偏移量0xB0000处的"PCIe IO 配置空间(远程 IO)"是什么?
      • 乍一看、"IO 配置空间"看起来像是一个拼写错误。
      • 这是否像生成 I/O 访问的固定出站转换窗口? [MV]是的

    [MW]这是 PCIe IO 空间–与 PCI 向后兼容

    • 下表12-1996的具体内容是什么、它告诉我们如果启用了 MSI-X 地址匹配、我们将无法访问"PCIe 本地应用寄存器"?
      • 我们希望 RC 能够在 EP (AM65xx)中生成中断。 根据我们的理解,我们应该为此使用 PCIe_EP_MRx_IRQ_*寄存器,但这意味着我们需要访问"PCIe 本地应用寄存器"。

    [MW]我们只使用从 EP 到 RC GIC 的 MemWr 来创建中断、而不是 PCIe MSI-X 在这种情况下、RC 到 EP MemWr 可以使用 PCIe_EP_MRx_IRQ 创建中断

    • "MSI-X 地址匹配"功能如何工作? 第12.2.2.4.1.3章 MSI-X 中断生成告诉我们有一个"集成的 MSI-X 传输(iMSIX-TX)功能"、但除此之外、没有太多关于此功能的信息。
      • PCIe_EP_MSIX_ADDRESS_MATC__*寄存器的说明告诉我们,如果(MSI_X 表 RAM 特性)为(MSIX_TABLE _EN=1),但我认为 MSIX_TABLE _EN 是 TI 在集成 PCIe IP 内核时配置的东西。 PCIe IP 内核是否在 AM65x 中启用了该功能的情况下实现?
      • 我们应该为 MSI-X 地址匹配配置哪个地址? 该地址与下表12-1996中的说明有何关系?

    {MW] MSI-X 功能是根据 PCIe 标准实现的。 有关详细信息、请参阅 PCIe 标准。

    • iATU "inver_mode"是如何工作的? TRM 告诉我们、如果为 iATU 区域设置了该位、则在地址超出定义的范围(从基址到限制)时会发生地址匹配、但在这种情况下如何计算目标地址? 对于非反相_mode、目标地址是定义范围(从基址到限制)加上配置的目标地址中的偏移量、但这似乎对反相_mode 没有意义?


    [MV]我不知道 iATU"inver_mode"的工作方式。

    • 如果我们将入站 iATU 配置为条形匹配模式、则似乎忽略了基准和限值、但 TRM 会告诉我们这是"按预期工作"还是配置中存在错误。
      • 我们想要配置的是单个条形图到本地地址空间中多个区域的"散射"映射、例如
        • BAR0、偏移量0x00000000 -> 0x80000000
        • BAR0、偏移量0x00100000 -> 0x90000000
      • 如果我们不使用条形匹配模式而是地址匹配模式、这种配置似乎是可能的、但这样我们需要与 RC 进行某种同步、即我们需要等待 RC 来配置条形、 然后使用条中的地址配置入站 iATU。

    [MV]是的、条匹配模式是 PCIe 标准模式、而 iATU 不是。 为了使用地址匹配模式、您必须等待 RC 来配置条形图。

    Ming