Hi3093 PCIe源码看起来是 RC-only,但系统里为什么还能表现出OS侧 EP 能力?

我目前从开源资料里看到的情况是:

  1. 设备树侧
    PCIe 节点使用的是:
  • compatible = “hisilicon,hip-pcie”
  • reg-names = “misc”, “rc_dbi”, “pcs”, “config”

看起来是标准 RC 侧配置,没有看到 ep_dbi。

  1. Linux 驱动侧,HI3093代码,个人买的消费者板子会赠送uboot源码,BL31,linux kernel源码
    相关代码主要在:
  • open_source/linux5.10/pcie_host/pcie_hisi02.c
  • open_source/linux5.10/pcie_host/pcie_hisi_hip02.c
  • open_source/linux5.10/pcie_host/pcie_framework.c

这里几个点让我感觉它是 RC-only:

  • 驱动目录本身就是 pcie_host
  • pcie_hisi_hip02.c 的 hisi_pcie_mode_set_hip() 会把控制器模式设置成 HOST
  • probe/初始化流程也是按 root complex 路径走
  • 模块 pcie_hisi02_drv.ko 的 modinfo 描述也是 Hip PCIe host controller driver
  1. 全树搜索
    整个开源树里当然能搜到不少 EP 相关代码,但基本都是别的平台的:
  • pcie-designware-ep.c
  • pcie-rockchip-ep.c
  • U-Boot 的 drivers/pci_endpoint/*

没有看到 Hi3093 专属的 EP 驱动实现。

但是我现在的困惑是:

实际编译出来并运行到 OS 以后,又似乎能表现出某种“OS 侧 EP”能力。

所以我想问的是:

  • 这是不是说明 EP 模式不是靠 Linux 里的 pcie_host 驱动决定的?
  • 是否可能在更早阶段就已经由:
    • Bootloader
    • L1/L0 固件
    • 硬件 strap / CPLD
    • 某些寄存器初始化
      把 PCIe 角色先配置好了?
  • 还是说这里所谓“OS 侧 EP”其实并不是严格意义上的 PCIe endpoint mode,而是别的机制?

我当前真正的疑问不是“源码里有没有 EP 框架”,而是:

为什么表面上源码只看到 RC/host 路径,但最终系统运行时却好像还能呈现出 EP 相关行为?

Hi3093原本不是用来做BMC的,所以你看到的Hi3093的驱动代码并非openUBMC实际使用的驱动代码。尤其是PCIe这部分。

在openUBMC中的PCIe RC是由带内OS承担的,UBMC还是表现为Endpoint。

openubmc的设备树也看了,也是rc模式,驱动用hexdump其实貌似看也是host

之前的解答有些错误。修正一下:

核心结论:PCIe0 确实是 EP(Endpoint)模式,而且这个角色不是由 Linux pcie_host 驱动决定的。

具体来说:

1. Hi3093 有两个 PCIe 端口,角色不同

端口 基地址 模式 用途
PCIe0 0x8B10000 (DM) / 0x8B21000 (MISC) LEP (Legacy Endpoint) BMC 作为 EP 暴露给带内 Host
PCIe1 0xCD10000 (DM) / 0xCD0E000 (MISC) RC (Root Complex) BMC 作为 RC 枚举下游设备

2. 关键代码证据

pci_fix_ker.h 中定义了三种 PCIe 模式枚举:

enum PCIE_MODE {

    MODE_EEP = 0,   // External Endpoint

    MODE_LEP = 1,   // Legacy Endpoint

    MODE_RC = 4     // Root Complex

};

pci_fix_ker.ccheck_working_mode() 函数中:

static unsigned int check_working_mode(unsigned int portid)
{
    if (portid == 0) {
        return MODE_LEP;  // PCIe0 硬编码为 Legacy Endpoint
    } else {
        // PCIe1 通过读 MISC_CTRL 寄存器动态判断
        // PCIE1_RST_DOMAIN 置位 → RC,否则 → LEP
    }
}

PCIe0 直接硬编码返回 MODE_LEP,没有任何条件判断——它就是 Endpoint。

3. 设备树为什么只有 PCIe1 的 RC 节点

设备树中唯一的 pcie@0xCD0E000 节点对应的是 PCIe1(注意基地址 0xCD0E000 是 PCI1_MISC_BASE),它带有 rc_dbibus-rangeranges 等 RC 属性。

PCIe0 没有独立的主机桥节点,因为它工作在 EP 模式,不需要枚举下游设备。PCIe0 的寄存器只出现在 pci_fix 等辅助节点中,用于 linkdown 处理、serdes 调参等。