编辑: hgtbkwd | 2019-08-29 |
0 创建人 研发中心 创建日期 2015-03-01 更新历史 序号 更新日期 版本号 更新内容
1 2015.03.01 V1.0 发布文档初始版本 V1.0 版. ii 目次1范围
1 2 术语
1 3 概述
1 3.1 上电启动过程
1 3.2 复位后 CPU 的初始状态
3 3.3 窗口配置部分约定
3 3.4 内存初始化
5 4 PMON 的系统需求
7 4.1 PMON 的地址空间分配
7 4.2 PMON 低256M 的空间分配
7 4.3 PMON 的板卡存储需求
8 5 PMON 启动及内核加载
8 6 驱动与设备路由
8 6.1 PMON 设备驱动模型
8 6.2 PMON 中断路由
9 7 固件与内核接口
11 7.1 与内核接口的约定
11 7.2 运行时服务的约定
12 8 PMON 的人机界面
12 8.1 命令格式
12 8.2 命令相关的数据结构
13 8.3 命令的相关的数据结构及函数实现
14 8.4 命令分类
15 9 PMON 编译、配置、目录结构及代码风格
16 9.1 编译器的版本
16 9.2 PMON 编译配置
17 9.3 PMON 的目录结构
17 9.4 PMON 代码风格
17 附录 A.18 附录 B
24 附录 C
26 附录 D.34 附录 E
39 附录 F.43 iii 前言本规范是龙芯中科技术有限公司制定的企业规范,暂无国家相关行业通用规范可参考. 本规范涉及到龙芯 CPU 开发系统 PMON 固件开发的相关要求,内容包括 PMON 上电过程、内存初始化 及地址窗口配置、驱动、中断路由、PMON 命令、固件与内核接口、编译配置、代码风格等方面. 本规范的起草单位:龙芯中科技术有限公司. 本规范的起草人:乔崇,成修治,王玉钱,马健,陈新科,黄沛,袁利,李雪峰,蒙天放,张宝祺. 本规范审核人:刘奇,邱吉,高翔,简方军,孟小甫,段玮,王焕东,苏孟豪,李文刚,符兴建, 褚越杰. 本规范批准人:胡伟武.
1 龙芯 CPU 开发系统 PMON 固件开发规范
1 范围 本规范规定龙芯
2 号、
3 号系列 CPU 开发系统
32 位PMON 的详细开发要求,内容包括 PMON 上电过程、 内存初始化及地址窗口配置、驱动及中断路由、PMON 命令、固件与内核接口、编译配置等方面.建议龙 芯1号系列 CPU 开发 PMON 时参照此标准.建议其它系统厂商遵循此规范开发相关产品.
2 术语 a) 固件(Firmware):写入 ROM、EEPROM 等非易失存储器中的程序,负责控制和协调集成电路. b) BIOS(Basic Input Output System) :基本输入输出系统,一组固化到主板的一个 ROM 芯片上 的程序,它保存着计算机基本输入输出程序、系统设置信息、开机后自检程序和系统自启动程 序.BIOS 与硬件系统集成在一起,也被称为固件,本规范中固件和 BIOS 不做区分. c) HT(HyperTransport) :是一种为主板上的集成电路互连而设计的端到端总线技术,目的是加 快芯片间的数据传输速度.HT 通常指 CPU 到主板芯片(或北桥)之间的连接总线,即HT 总线. 类似于 Intel 平台中的前端总线(FSB) ,HT 按技术规格分有 HT1.
0、HT2.
0、HT3.
0、HT3.1. d) PCI(Peripheral Component Interconnect) :是连接电子计算机主板和外部设备的总线标准, 用于定义局部总线的标准. e) PMON:MIPS 架构机器上使用的一种 具有 BIOS部分功能的开放源码软件 . f) SMBIOS(System Management BIOS) :是主板或系统制造者以标准格式显示产品管理信息所需 遵循的统一规范. DMI (Desktop Management Interface)是帮助收集电脑系统信息的管理系统, DMI 信息的收集必须在严格遵照 SMBIOS 规范的前提下进行.SMBIOS 和DMI 是由行业指导机构 Desktop Management Task Force (DMTF)起草的开放性的技术标准. g) XBAR: 龙芯 CPU 中用于片上地址路由的交叉开关, 二级 XBAR 中有 CPU 地址空间(包括 HT 空间)、DDR2 地址空间、以及 PCI 地址空间共三个 IP 相关的地址空间. h) LS:是Loongson 的缩写,通常作为芯片型号的前缀出现,如LS3A 表示龙芯 3A 芯片. i) LS2HSB:表示以龙芯 2H 作为南桥使用. j) LS3A2H 系统:以龙芯 3A 为CPU,龙芯 2H 为桥片的开发板系统. k) LS3A780E 系统: 以龙芯 3A 为CPU,AMD RS780E 为桥片的开发板系统. l) LS3B780E 系统: 以龙芯 3B 为CPU,AMD RS780E 为桥片的开发板系统. m) LS1B 系统: 龙芯 1B SOC 的开发板系统. n) LS2H 系统:龙芯 2H SOC 的开发板系统.
3 概述 本章涉及 PMON 上电启动过程、窗口配置、内存初始化过程等方面的内容. 3.1 上电启动过程 PMON 的上电启动过程如图
1 所示:
2 图1PMON 上电启动过程 针对启动过程的注释如下: [1] PMON基本运行环境建立,即保证处理器正常运行的最基本设置,如:关中断,配置异常向量;
如果多核,确定PMON启动核、从核自初始化Cache、TLB、清Mailbox(缓存寄存器)等. [2] 如果串口在桥片上,则还需对桥片做初步配置. [3] 处理器自身相关配置,如:修正频率、初始化Cache、CPU内部互联配置、非法地址处理. [4] 如果连接内存的I2C控制器在桥片上,则还需对桥片做初步配置. [5] 处理器级IO相关的一些配置,如:IO地址映射、桥片互联配置等. 处理器基本初始化[1] 调试串口初始化[2] 判断自 身位置 处理器相关配置[3] Cache 模式运行 内存初始化[4] 处理器 IO 访问 相关配置[5] 转入内存执行[6] 自解压 跳入到解压代码 执行构造函数, 注册数据结构、命令 环境变量初始化 初始化桥片 PCI 设备探测 构造驱动框架 初始化设备[7] 开始轮询中断 构造传入内核的数据[8] 自动启动系统[9] 加载内核 启动系统 进入 PMON 交互界面 RAM ROM 是否3[6] 内存运行的相关准备工作,如:拷贝代码到内存、设置堆栈、设置传参等. [7] 初始化显示,以及PCI设备中断初始化. [8] 构造提供给内核与系统的信息,如:内存布局、开发板类型等. [9] 自启动系统时会查找boot.cfg或相关环境变量,根据查找结果来启动系统,如果找不到上述 文件或变量,则会返回到命令行界面. 各类开发板系统详细的启动过程参见附录 E. 3.2 复位后 CPU 的初始状态 龙芯 CPU 上电启动后处理器核处于以下状态: a) 小端模式(龙芯只支持小端模式);
b) 特权等级处于内核态;
c) 浮点寄存器处于
32 位数据模式(PMON 启动过程中应将浮点寄存器配置为
64 位模式);
d) 中断处于关闭态;
e) 非对齐访问会引发例外;
f)
64 位地址空间未使能,用户态
64 位操作未使能(龙芯
1 号系列除外);
g) TLB 未初始化(PMON 启动过程中地址空间一直处于未映射段);
h) 所有的 Cache 处于未初始化、 未使能态 (软件应该在初始化内存之前首先初始化并使能 Cache) . 3.3 窗口配置部分约定 3.3.1 窗口配置流程及注意事项 窗口的配置过程可分为以下步骤: a) 配置用于阻挡猜测执行的地址窗口;
b) 配置不可预取的地址窗口,如IO 寄存器映射地址区;
c) 配置高端内存及双通道交错窗口;
d) 配置
32 位地址到
64 位地址转换功能的窗口(GS464);
e) 配置其它窗口,如龙芯 3A 中HT 接收窗口等. 其中步骤 a)b)的配置需要在串口初始化完成且 TLB,Cache 尚未初始化之前进行;
步骤 c)需要 在内存容量探测及内存控制器初始化阶段完成;
步骤 d)需要在用
32 位地址访问 IO 桥片之前完成,此 项配置完成后即可使用
32 位的指针去访问 IO 桥片资源,如果不配置需要
64 位指针才能访问;
步骤 e) 需要在进入 C 语言前完成. 需要注意的是: a) 窗口是有优先级的,序号越小,优先级越高;
b) 窗口配置的过程中,建议用汇编语言或内嵌汇编语言对其进行配置;
c) 有些窗口是有默认功能的,在配置之前最好先保留通过此窗口的通路;
d) 有些窗口寄存器是只写的,配置完后不一定能读出写入的值;
e) 各窗口相关的寄存器描述及窗口的作用请查阅各芯片的用户手册. 地址窗口与 CPU 的具体设计密切相关,一般由龙芯公司统一进行配置和发布. 3.3.2 窗口配置约定及示例 在窗口配置过程中,定义如下的宏对两级交叉开关进行配置:
4 #define set_Xbar_win(xbarbase,mas_i, win_i, base, mask, mmap) li t0, xbarbase ;
daddiu t0, t0, mas_i*0x100 ;
daddiu t0, t0, win_i*0x8 ;
dli t1, base ;
sd t1, 0x0(t0) ;
dli t1, mask ;
sd t1, 0x40(t0) ;
dli t1, mmap ;
sd t1, 0x80(t0) 对上述约定说明如下: a) 需要用到寄存器:t0,t1. b) 参数及其含义: xbarbase:交叉开关配置寄存器的基址;
mas_i:主设备号;
win_i:此主设备的窗口号(即第win_i个窗口);
base:接收地址基址;
mask:接收地址掩码;
mmap:转换后的地址基址及路由的次设备号. c) 功能:检查输入的地址是否满足过滤条件(in_addr&
mask)==base ,若满足此条件则将进来的 地址 in_addr 转换后发出去,转换规则是(in_addr&
(~mask))|mmap ;
反之则不做处理,直接 向下转发.C 代码可实现为: (in_addr&
mask)==base?out_addr=(in_addr&
(~mask))|mmap:out_addr=in_addr. 例如在LS3A2H系统中,对南桥LS2HSB的PCIE控制器(在XBAR2上的主设备上)窗口的配置如下: #PCIE window #define LS2HSB_XBAR2_BASE 0xbbd80000 #define LS2HSB_PCIE_MASTER
4 set_Xbar_win(LS2HSB_XBAR2_BASE, LS2HSB_PCIE_MASTER, 0, 0x0000000000000000, 0xffffffffc0000000, 0x00000010800000f3) # 0~1G set_Xbar_win(LS2HSB_XBAR2_BASE, LS2HSB_PCIE_MASTER, 1, 0x0000000040000000, 0xffffffffc0000000, 0x00000020800000f3) # 1~2G set_Xbar_win(LS2HSB_XBAR2_BASE, LS2HSB_PCIE_MASTER, 2, 0x0000000080000000, 0xffffffffc0000000, 0x00000030800000f3) # 2~3G set_Xbar_win(LS2HSB_XBAR2_BASE, LS2HSB_PCIE_MASTER, 3, 0x00000000c0000000, 0xffffffffc0000000, 0x00000040800000f3) # 3~4G set_Xbar_win(LS2HSB_XBAR2_BASE,4, LS2HSB_PCIE_MASTER, 0xffffffff80000000, 0xffffffffc0000000, 0x00000030800000f3) # 2~3G set_Xbar_win(LS2HSB_XBAR2_BASE,4, LS2HSB_PCIE_MASTER, 0xffffffffc0000000, 0xffffffffc0000000, 0x00000040800000f3) # 3~4G
5 例如在LS3A2H系统中, 对南桥LS2HSB的IODMA控制器(在XBAR1上的主设备上) 窗口的配置如下: #define LS2HSB_XBAR1_BASE 0xbbd82000 set_Xbar_win(LS2HSB_XBAR1_BASE ,
6 , 7, 0x0000000000000000, 0x0000000000000000, 0x00000000000000f0) # others, all to L2$ (默认通路 为第二个窗口,因此在使用窗口
2 之前应先将此通路备用) set_Xbar_win (LS2HSB_XBAR1_BASE ,
6 , 0, 0x0000001080000000, 0xfffffffff0000000, 0x00000000000000f6) set_Xbar_win (LS2HSB_XBAR1_BASE ,
6 , 1, 0x0000001080000000, 0xffffffffc0000000, 0x00000001000000f6) set_Xbar_win (LS2HSB_XBAR1_BASE ,
6 , 2, 0x0000002080000000, 0xffffffffc0000000, 0x00000001400000f6) set_Xbar_win (LS2HSB_XBAR1_BASE ,
6 , 3, 0x0000003080000000, 0xffffffffc0000000, 0x00000001800000f6) set_Xbar_win (LS2HSB_XBAR1_BASE ,
6 , 4, 0x0000004080000000, 0xffffffffc0000000, 0x00000001c00000f6) 可用如下方法检验配置结果: PMON>
d8 0xffffffffbbd82600
30 ffffffffbbd82600:
0000001080000000 0000001080000000 ffffffffbbd82610:
0000002080000000 0000003080000000 0... ffffffffbbd82620:
0000004080000000 000000f080000000 ffffffffbbd82630:
0000000040000000 0000000000000000 ffffffffbbd82640: fffffffff0000000 ffffffffc0000000 ffffffffbbd82650: ffffffffc0000000 ffffffffc0000000 ffffffffbbd82660: ffffffffc0000000 ffffffffff000000 ffffffffbbd82670: ffffffffc0000000
0000000000000000 ffffffffbbd82680: 00000000000000f6 00000001000000f6 ffffffffbbd82690: 00000001400000f6 00000001800000f6 ffffffffbbd826a0: 00000001c00000f6 000000fdf80000f6 ffffffffbbd826b0: 00000000000000f0 00000000000000f0 ffffffffbbd826c0:
0000000000000000 0000000000000000 ffffffffbbd826d0:
0000000000000000 0000000000000000 ffffffffbbd826e0:
0000000000000000 0000000000000000 通过上述的配置,连接在LS2HSB PCIE控制器上的设备作为主设备发起DMA访问时,发出的总线地址 范围是0x00000000至0xFFFFFFFF,会依次被LS2HSB二级交叉开关、LS2HSB一级交叉开关、LS2HSB IODMA 模块、HT接收窗口、龙芯3A一级交叉开关、龙芯3A二级交叉开关转换最终到达内存控制器访存. 附录 D 给出了 LS3A2H 窗口配置的具体实现. 3.4 内存初始化 内存初始化的主要工作包括:配置内存控制器、配置二级XBAR.
6 目前PMON内存初始化的过程如下图所示: 图2PMON 内存初始化流程图 [1] 配置内存条信息 该步骤的作用是获得需要的内存信息,包括:内存类型(DDR2 还是 DDR3) 、内存条类型(UDIMM、 RDIMM、是否带 ECC) 、内存条的数据线宽度、内存颗粒的 Bank 个数/地址线的行数/列数、是否进行地址 mirror、与CPU 的引脚连接方式(CS 的映射方式) 、内存的容量等.分为两种模式(通过配置选项 AUTO_DDR_CONFIG 选择) :根据内存条 SPD 自动检测和人工配置.通过 SPD 自动检测时,需要提供内存................