RK3588 DWC3 DMA 寻址能力分析
问题现象
在 RK3588 设备上测试 CrabUSB DWC3 驱动时发现:
- 32 位地址作为 DMA buffer 时,工作正常 ✅
- 36 位地址(超过 4GB)时,读取数据全为 0 ❌
根本原因
xHCI 控制器寻址能力
xHCI 规范定义了控制器的寻址能力通过 HCCPARAMS1 寄存器的 Bit[0] (AC64) 来标识:
| AC64 位 | 寻址能力 | 说明 |
|---|---|---|
| 1 | 64-bit addressing | 控制器支持完整的 64 位物理地址 |
| 0 | 32-bit addressing | 控制器只支持 32 位物理地址(< 4GB) |
Linux 内核的处理逻辑
Linux xHCI 驱动(drivers/usb/host/xhci.c)的标准流程:
// 读取 HCCPARAMS1 寄存器
if (HCC_64BIT_ADDR(xhci->hcc_params) &&
!dma_set_mask(dev, DMA_BIT_MASK(64))) {
xhci_dbg(xhci, "Enabling 64-bit DMA addresses.\n");
dma_set_coherent_mask(dev, DMA_BIT_MASK(64));
} else {
retval = dma_set_mask(dev, DMA_BIT_MASK(32));
xhci_dbg(xhci, "Enabling 32-bit DMA addresses.\n");
}
RK3588 DWC3 控制器的实际情况
关键发现:RK3588 的 DWC3 xHCI 控制器 AC64=0,只支持 32 位地址寻址!
这解释了为什么:
- ✅ 32 位地址(< 4GB)正常工作
- ❌ 36 位地址(≥ 4GB)全零读取
DWC3 控制器地址范围:
- 物理地址:
0x0000_0000-0xFFFF_FFFF(32 位) - 如果物理内存超过 4GB,高地址部分无法直接用于 DMA