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

相关推荐
春天花会开13111 小时前
Kubernetes 高可用架构实战指南
架构
码云之上12 小时前
万星入坞·其三:SDK 轻量组件如何优雅地"点亮"
性能优化·架构·前端框架
枫叶林FYL12 小时前
【强化学习】3 双系统持续强化学习:快速迁移与元知识整合架构手册
人工智能·机器学习·架构
AI科技星12 小时前
哥德巴赫猜想1+1基于平行素数对等腰梯形网格拓扑与素数渐近密度的大偶数满填充完备性证明
人工智能·线性代数·架构·概率论·学习方法
小短腿的代码世界12 小时前
信号路由风暴:Qt算法交易系统的高频信号分发架构
qt·算法·架构
2301_7807896613 小时前
手游遇到攻击为什么要用SDK游戏盾手游遇到攻击为什么要用 SDK 游戏盾?
安全·web安全·游戏·架构·kubernetes·ddos
中小企业实战军师刘孙亮13 小时前
小微企业生存发展指南:从求稳到扩张的实战策略-佛山鼎策创局破局增长咨询
架构·产品运营·音视频·制造·业界资讯
sanduo11214 小时前
什么是优秀的部署架构?
架构
国科安芯14 小时前
ASP7A84AS与主流架构兼容替代及系统级电源完整性解决方案的深度研究
单片机·嵌入式硬件·架构
JZC_xiaozhong14 小时前
研发体系集成架构:打通OA与PLM的核心参考
大数据·架构·流程自动化·数据集成与应用集成