04 DWMAC4 与描述符 / DMA
源码:
dwmac4_core.c、dwmac4_dma.c、dwmac4_descs.c、dwmac4_lib.c、dwmac4.h
RK3588 使用 GMAC4 Core 4.10+(dwmac410_ops/dwmac410_dma_ops)
1. 模块划分
| 文件 | 职责 |
|---|---|
dwmac4.h |
寄存器偏移、MTL/DMA/MAC 位域 |
dwmac4_core.c |
MAC + MTL:地址过滤、队列、VLAN、RSS、流控 |
dwmac4_dma.c |
DMA 通道:reset、启停、IRQ、tail pointer |
dwmac4_descs.c |
Normal/Extended 描述符读写 |
dwmac4_lib.c |
dwmac4_setup()、公共初始化 |
ring_mode.c |
GMAC4 ring 模式 desc3 管理 |
2. GMAC4 描述符格式
2.1 Normal Descriptor
每个 TX/RX descriptor 为 16 字节(4×u32):
TX (TDES):
- TDES0:status(own bit 在 MSB)、timestamp status
- TDES1:buffer 长度、checksum insert、LS/FS
- TDES2:buffer 物理地址
- TDES3:buffer 地址高位 / 控制位
RX (RDES):
- RDES0:帧长度、error summary、LS/FS
- RDES1:buffer 长度
- RDES2/3:buffer 地址
2.2 Extended / Context Descriptor
- Extended desc:更大 status 域,支持 PTP、RSS hash
- Context desc:VLAN 插入、TSO MSS、TBS 时间戳
priv->extend_desc 由 HW capability 或平台 enh_desc 决定。
3. desc_ops 关键方法
dwmac4_desc_ops(dwmac4_descs.c):
| 方法 | TX/RX | 说明 |
|---|---|---|
init_rx_desc |
RX | 初始化空描述符,设 buffer size |
init_tx_desc |
TX | 初始化 TX 环 |
prepare_tx_desc |
TX | 填长度、checksum、FS/LS |
prepare_tso_tx_desc |
TX | TSO 分段描述符 |
set_tx_owner / set_rx_owner |
两者 | 切换 DMA/CPU ownership |
tx_status / rx_status |
两者 | 解析完成状态 |
get_rx_hash |
RX | RSS hash 与类型 |
set_vlan_tag |
TX | VLAN context |
set_mss |
TX | TSO MSS context |
4. DMA 引擎
4.1 通道模型
GMAC4 支持多 DMA channel,每 channel 映射 MTL queue:
1 | MTL TX Queue N ←→ DMA TX Channel N |
stmmac_map_mtl_to_dma() 配置映射关系。
4.2 dma_ops 关键方法
| 方法 | 说明 |
|---|---|
reset |
DMA 软复位 |
init / init_chan |
全局/单通道初始化 |
init_rx_chan / init_tx_chan |
设 ring 基址、长度 |
start_tx / stop_tx |
启停 TX DMA |
start_rx / stop_rx |
启停 RX DMA |
set_tx_tail_ptr / set_rx_tail_ptr |
通知硬件新 descriptor |
enable_dma_irq / disable_dma_irq |
通道 IRQ 掩码 |
dma_interrupt |
读 DMA 状态,返回 handle_rx/handle_tx |
get_hw_feature |
读 HW Feature 寄存器 |
enable_tso |
通道 TSO 使能 |
rx_watchdog |
RIWT 接收中断合并 |
4.3 Tail Pointer 机制
驱动填好 descriptor 后写 Tail Pointer 寄存器,DMA 从 cur 追到 tail 发送/接收。这是典型 环形队列 + 生产者/消费者 模型。
5. Ring vs Chain 模式
| 模式 | 文件 | desc3 用途 |
|---|---|---|
| Ring | ring_mode.c |
下一描述符物理地址(环回) |
| Chain | chain_mode.c |
链式指向下一块 |
GMAC4 默认 ring mode(dwmac4_ring_mode_ops)。
GMAC3 可通过模块参数 chain_mode 切换。
6. MTL 调度
dwmac4_core.c 中 MTL 相关 ops:
rx_queue_enable/tx_queue_prio:队列优先级prog_mtl_rx_algorithms/prog_mtl_tx_algorithms:DWRR/WRR/SPconfig_cbs:Credit-Based Shaper(AVB)set_mtl_tx_queue_weight:队列权重
TC offload(CBS/TAPRIO)最终配置 MTL 寄存器。
7. MAC 层功能
| 功能 | ops 方法 |
|---|---|
| 单播/组播过滤 | set_filter, set_umac_addr |
| 流控 | flow_ctrl |
| VLAN | enable_vlan, add_hw_vlan_rx_fltr |
| RSS | rss_configure |
| L3/L4 过滤 | config_l3_filter, config_l4_filter |
| PCS(SGMII) | pcs_ctrl_ane, pcs_get_adv_lp |
| EST/TAS | est_configure(DWMAC5+) |
| FPE | fpe_configure(帧抢占) |
8. HW Feature 寄存器
get_hw_feature() 填充 struct dma_features:
- 队列数量、TSO、checksum 类型
- VLAN、AV、TBS、SPH
- hash 表大小、64 位地址
stmmac_hw_init() 据此设置 ndev->hw_features。
9. RK3588 注意点
- Core ID 通常 ≥
0x41(4.10),匹配dwmac410_ops CONFIG_STMMAC_FULL=y时链接完整 dwmac4 + dwmac5 代码dche(descriptor cache):Core ≥ 5.20 才支持 HW prefetch- 平台
sph_disable=true时不暴露 GRO/SPH
10. 数据结构与内存布局
1 | stmmac_tx_queue: |
Ring 大小须为 2 的幂(DMA_MIN_* 64 ~ DMA_MAX_* 1024)。
正在加载留言…