arch
(Evan(bx))
1
我目前从开源资料里看到的情况是:
- 设备树侧
PCIe 节点使用的是:
- compatible = “hisilicon,hip-pcie”
- reg-names = “misc”, “rc_dbi”, “pcs”, “config”
看起来是标准 RC 侧配置,没有看到 ep_dbi。
- 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
- 全树搜索
整个开源树里当然能搜到不少 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。
arch
(Evan(bx))
3
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.c 的 check_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_dbi、bus-range、ranges 等 RC 属性。
PCIe0 没有独立的主机桥节点,因为它工作在 EP 模式,不需要枚举下游设备。PCIe0 的寄存器只出现在 pci_fix 等辅助节点中,用于 linkdown 处理、serdes 调参等。