LS2K1000启动全链路架构解析

这份 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()

相关推荐
“码”力全开11 分钟前
解耦安防黑盒:基于 Docker 容器化与 GB28181/RTSP 双协议架构的 AI 边缘计算视频平台(全源码交付)
人工智能·docker·架构
Caldalis15 分钟前
别再让 LLM 裸奔了,开始尝试 Thin Harness,Fat Skills
架构
LT101579744429 分钟前
2026年接口自动化测试平台选型指南:微服务高效测试工具
测试工具·微服务·架构
caimouse1 小时前
Reactos 第2章 系统调用
windows·架构
阿坤带你走近大数据2 小时前
flink的架构介绍
大数据·架构·flink
小短腿的代码世界2 小时前
高性能订单路由与智能拆单算法:Qt在量化交易系统中的核心架构——毫秒级延迟下如何隐藏你的交易意图?
开发语言·qt·架构
阿正的梦工坊2 小时前
【Rust】20-Rust 编译器架构与 MIR/LLVM 优化管线
开发语言·架构·rust
霸道流氓气质2 小时前
Spring Boot 微服务中“调用第三方接口 → 数据加工 → 分接口返回“的完整架构实践
spring boot·微服务·架构
Java识堂11 小时前
多级负载均衡架构
运维·架构·负载均衡
阿狸猿12 小时前
论软件可靠性设计与应用
架构