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.

[参考译文] J784S4XEVM:PCIe RC 使能 BAR 0 崩溃

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1611441/j784s4xevm-pcie-rc-enable-bar-0-crash

器件型号: J784S4XEVM

尊敬的专家:

 

我正在继续此帖子: J784S4XEVM:PCIe RC 使能栏 0 崩溃 — 处理器论坛-处理器 — TI E2E 支持论坛 

最后一个答案是“预计 BAR 寄存器在 RC 运行时不会发生变化“

但是、即使我从设备树中配置 BAR 0、它仍会崩溃。

pcie0_rc: pcie@2900000 {
		compatible = "ti,j784s4-pcie-host";
		reg = <0x00 0x02900000 0x00 0x1000>,
		      <0x00 0x02907000 0x00 0x400>,
		      <0x00 0x0d000000 0x00 0x00800000>,
		      <0x00 0x10000000 0x00 0x00001000>,
			  <0x40 0x00000000 0x01 0x00000000>;
		reg-names = "intd_cfg", "user_cfg", "reg", "cfg";
		interrupt-names = "link_state";
		interrupts = <GIC_SPI 318 IRQ_TYPE_EDGE_RISING>;
		device_type = "pci";
		ti,syscon-pcie-ctrl = <&pcie0_ctrl 0x0>;
		max-link-speed = <3>;
		num-lanes = <4>;
		power-domains = <&k3_pds 332 TI_SCI_PD_EXCLUSIVE>;
		clocks = <&k3_clks 332 0>;
		clock-names = "fck";
		#address-cells = <3>;
		#size-cells = <2>;
		bus-range = <0x0 0xff>;
		vendor-id = <0x104c>;
		device-id = <0xb012>;
		msi-map = <0x0 &gic_its 0x0 0x10000>;
		dma-coherent;
		ranges = 	<0x02000000 0x0 0x10001000 0x0 0x10001000 0x0 0x7fff000>,
			 		<0x42000000 0x40 0x0 0x40 0x0 0x1 0x0>;
		dma-ranges = <0x02000000 0x0 0xa8000000 0x0 0xa8000000 0x0 0x10000>,
					<0x02000000 0x0 0xA9000000 0x0 0xa9000000 0x0 0x10000>;  /* doesn't crash if I remove this line */
		status = "disabled";
	};

 

如果我删除第二个 dma-range 条目(配置 BAR0)、它不会崩溃。

我给驱动程序打补丁、当 dma-range 只有 1 个条目时使用 BAR 0。 它仍然崩溃

以下每个案例都会崩溃:  

  • Bar 0 32b pref
  • bar 0 32b non-pref
  • bar 0 64b pref
  • 条形图 1 +条形图 0

我是否遗漏了一些东西?

您是否已成功启用 bar 0 + bar 1?

感谢你的帮助

Charles

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

    尊敬的 Charles:

     DTS 正在将 64KB 的 PCI 地址 0xA9000000 映射到 您要删除的行中的系统地址 0xa9000000。 我认为 TI 的默认 dts 会将 PCIe 地址 0x0 映射到系统地址 0x0 且长度较大、但 DTS 是否使用存储器地址?

    此致、

    Takuma

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

    尊敬的 Takuma:
    实际上、默认配置一个大窗口。

    对于我们的应用、我们需要从 RC 暴露 2 个小窗口。 我们需要访问 DDR 中的特定数据缓冲区、并且希望防止所有其他访问。

    此致、

    Charles

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

    尊敬的 Charles:

    我看到 ranges 属性有 PCI_DAT0 空间和 PCI_DAT1 空间的组合、而 DMA 范围似乎不属于这些内存范围。  

    我们尚未测试如何混合 32 位空间与 64 位空间 DAT0 与 DAT1、以及如何定义 PCI 地址空间之外的 DMA 范围。 但这种组合可能会导致一些意想不到的行为? 是否可以使用 DAT0(即  0x10001000 范围)或 DAT1(即 0x40 0x0 范围)? 并定义 在 Ranges 属性中设置的 PCI 地址空间内的 DMA 范围?

    此致、

    Takuma

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

    尊敬的 Takuma:

    如果我的理解正确、则使用 dma 范围地址配置入站转换地址。 因此、它应该是本地存储器地址(例如 DDR)、而不是 PCIe 地址(PCI_DAT0/PCI_DAT1 空间) 。

    我已经测试了 32 位空间和 64 位空间 的混合、并且工作正常。 在混合这些 32b 和 64b 空间之前、我发生了问题。

    当我将 1 个 DMA 范围条目配置到 DDR 地址 (0xa800 0000) 时、驱动器会配置条形图 1 并使其正常工作。  

    我的问题似乎与条 0 有关。

    通过 1 个 DMA 范围条目进入 DDR:  

    驱动器选择栏 1 是因为它选择适合的最小栏和栏 1 最大大小<栏 0 最大大小(这种情况有效)。

    如果我给驱动程序打补丁、减小条 0 最大大小、驱动程序首先选择条 0、然后崩溃。 即使只有 1 个条目用于 dma-range

    此致、  

    Charles

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

    尊敬的 Charles:

    建议阅读: https://elinux.org/Device_Tree_Usage #PCI_PCI Host_Bridge。 但是的、我同意您的理解、即它用于从 PCIe 器件到本地存储器的入站转换。

    但是、我的 理解是、每个条目都是物理本地内存地址和 PCI 地址的混合。 TI 默认 DTS 的作用是将 0x0 PCI 地址映射到 0x0 物理地址、并分配一个较大的内存窗口、从而 有效地禁用 PCI 地址和物理地址之间的转换。

    从技术上讲、应该可以分配更小的内存窗口。 但是、物理内存或 PCI 内存方面可能存在一些冲突?

    此致、

    Takuma

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

    尊敬的 Takuma:

    我无法使用杆 0。

    但我找到了使用 2 个小酒吧的替代方案。

    我在 RC (RP_NO_BAR) 上使用 TI 默认配置。
    我不使用 BAR 和 IB 转换、而是对 RC 的特定存储器使用 2 个小 OB 区域(在 PCIe 窗口之外)。

    此致、

    Charles