04 DWMAC4 与描述符 / DMA

04 DWMAC4 与描述符 / DMA

源码:dwmac4_core.cdwmac4_dma.cdwmac4_descs.cdwmac4_lib.cdwmac4.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
2
MTL TX Queue N  ←→  DMA TX Channel N
MTL RX Queue M ←→ DMA RX Channel M

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 modedwmac4_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/SP
  • config_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
2
3
4
5
6
7
8
9
10
11
stmmac_tx_queue:
dma_tx[] ── DMA 一致性内存(descriptor ring)
tx_skbuff[] ── 与每个 desc 关联的 skb 指针
tx_skbuff_dma[] ── DMA 映射信息
cur_tx / dirty_tx ── 生产者/消费者索引

stmmac_rx_queue:
dma_rx[] ── RX descriptor ring
buf_pool[] ── 每 desc 对应 page + dma_addr
page_pool ── 页分配器
cur_rx ── 当前处理位置

Ring 大小须为 2 的幂DMA_MIN_* 64 ~ DMA_MAX_* 1024)。

11. 相关文档

文章互动

阅读 --

留言

0 条留言

正在加载留言…