这份 tgt_machdep.c 基本就是 LS2K1000 PMON/Bootloader 的"总控制中枢",它已经把你前面关心的 DDR / PCIe / 启动流全部串起来了。
我帮你把它"升维成系统架构 + 执行流图",你可以直接拿去做分析或画 CSDN 系列文章。
🧠 LS2K1000 Boot 全链路执行架构(对应这份代码)
🔥 0. 启动总流程(从复位到 main)
text
Reset Vector
↓
PMON entry
↓
init_loongarch()
↓
├─ unlock_scache()
├─ SMP slave_core 释放
├─ mem_win_cfg() ← DDR地址映射
├─ get_memorysize_soc() ← DDR size识别
├─ mul_pin_def_cfg() ← pinmux
├─ tgt_cpufreq() ← 时钟探测
├─ rtc / i2c init
├─ NAND / SPI NOR init
├─ PCIe device init
├─ framebuffer / VGA init
↓
main()
🧩 1. DDR 子系统(核心链路)
📌 关键函数:get_memorysize_soc() + mem_win_cfg()
🧠 DDR 初始化逻辑(抽象状态机)
text
[DDR UNKNOWN]
↓
read tgt_memsz
↓
decode mem_size
↓
configure XBAR windows
↓
map CPU ↔ DDR ↔ PCIe/GPU
↓
[DDR READY]
🔥 DDR size 解析逻辑(非常关键)
c
mem_size = raw_memsz & 0xff;
mem_size = mem_size << 29;
mem_size = mem_size - 0x1000000;
mem_size = mem_size >> 20;
👉 本质:
text
BIOS/bootrom → 传入 encoded DDR size
→ decode 成 MB级容量
🧠 DDR地址映射(XBAR)
📌 mem_win_cfg()
text
CPU_WIN0 → 0x1c000000 (Boot region)
CPU_WIN1 → 0x10000000
CPU_WIN2 → low memory alias
CPU_WIN3 → 0x80000000
CPU_WIN4/5 → high memory (4GB / 8GB / 16GB)
🔥 DDR关键本质(非常重要)
👉 LS2K1000 DDR不是"单纯内存控制器"
而是:
text
CPU
↓
XBAR (交叉互联)
↓
DDR Controller
↓
Physical DRAM
所以 DDR training 成功 ≠ 可用
还必须:
✔ mem_win_cfg 正确
✔ XBAR window 正确
✔ high memory mapping 正确
⚡ 2. PCIe 全链路初始化
📌 入口:
c
init_pcidev()
🧠 PCIe 启动状态机
text
[PCIe RESET]
↓
_pci_devinit()
↓
扫描 device (bus 0 dev 0~x)
↓
建立 BAR 映射
↓
ls_pcie_config_set()
↓
interrupt fixup
payload fixup
MSI window
↓
GPU / SATA / GMAC 可访问
🔥 PCIe修复逻辑(非常关键)
1️⃣ interrupt fixup
c
_pci_conf_write16(dev, 0x3c, irq | 0x100);
👉 本质:
text
PCI INTx → CPU interrupt routing
2️⃣ payload fixup
text
Max Payload Size
Max Read Request Size
👉 影响:
- DMA吞吐
- GPU性能
- NVMe稳定性
3️⃣ MSI window
c
0x1fe10000 → MSI vector base
👉 MSI中断映射区
🧠 3. Boot关键"隐式依赖链"
很多人看不懂这份代码,是因为漏了这条链:
🔥 系统依赖关系图
text
DDR OK
↓
XBAR window OK
↓
PCIe config space OK
↓
DMA可访问 DDR
↓
GPU / SATA / GMAC 才能工作
⚠️ 关键点(非常重要)
👉 PCIe BAR 不可访问 = 通常不是 PCIe bug
而是:
text
❌ DDR mapping错
❌ XBAR window没开
❌ cache/uncached映射错误
🧨 4. Cache & SMP 启动链
📌 unlock_scache()
text
unlock L2 cache window
flush hit-invalidate
👉 本质:
text
cache → DDR一致性初始化
📌 SMP启动
c
st.d slave_main → 0x1fe01100
👉 含义:
text
core0 → core1 boot entry address
🧭 5. GPIO / PINMUX 系统
📌 mul_pin_def_cfg()
text
HDA / CAN / I2C / SDIO / NAND pin mux
USB prefetch disable
👉 本质:
text
SoC外设复用矩阵初始化
💾 6. 存储系统初始化
text
NAND / SPI NAND / NOR
路径:
text
init_loongarch
↓
ls2k_nand_init()
ls2k_spi_nand_probe()
ls2k_m25p_probe()
🖥️ 7. Display / GPU / FB链路
📌 init_pcidev() 后半段:
text
vga_bios_init()
dc_init()
fb_init()
HDMI bridge (LT9211 / LT8618 / SII9022A)
👉 本质:
text
PCIe GPU / DC → framebuffer → HDMI输出
🔥 8. 一张"系统级启动总图"
text
┌──────────────┐
│ Reset CPU │
└──────┬───────┘
↓
┌─────────────────┐
│ PMON entry │
└──────┬──────────┘
↓
┌────────────────────────────┐
│ init_loongarch() │
└──────────┬─────────────────┘
↓
┌──────────── DDR TRAIN / MAP ────────────┐
│ mem_win_cfg + get_memorysize_soc │
└────────────┬────────────────────────────┘
↓
┌──────── PCIe + DMA + XBAR ─────────┐
│ init_pcidev + ls_pcie_config_set │
└────────────┬───────────────────────┘
↓
┌──────── Storage + Display ────────┐
│ NAND / SPI / VGA / FB / HDMI │
└────────────┬──────────────────────┘
↓
main()