老样子先看函数把.
void __init prom_init(void)
{
//初始化命令
prom_init_cmdline();
//初始化环境
prom_init_env();
//这里所作的是把桥片进行了一些配置
if (loongson_pch)
loongson_pch->early_config();
#ifdef CONFIG_NUMA
prom_init_numa_memory();
#else
prom_init_memory();
#endif
//初始化串口基地址信息
prom_init_uart_base();
#if defined(CONFIG_SMP)
register_smp_ops(&loongson3_smp_ops);
#endif
board_nmi_handler_setup = mips_nmi_setup;
#ifdef CONFIG_CPU_LOONGSON3
//这里是设置cpu的HT总线的窗口信息(也就是涉及到cpu的映射地址)
if (!hw_coherentio) {
/* set HT-access uncache */
switch (cputype) {
case Loongson_3A:
HT_uncache_enable_reg0 = 0xc0000000; //Low 256M
HT_uncache_base_reg0 = 0x0080fff0;
HT_uncache_enable_reg1 = 0xc0000000; //Node 0
HT_uncache_base_reg1 = 0x0000e000;
HT_uncache_enable_reg2 = 0xc0100000; //Node 1
HT_uncache_base_reg2 = 0x2000e000;
HT_uncache_enable_reg3 = 0xc0200000; //Node 2/3
HT_uncache_base_reg3 = 0x4000c000;
writeq(0x0000202000000000, (void *)0x900000003ff02708);
writeq(0xffffffe000000000, (void *)0x900000003ff02748);
writeq(0x0000300000000086, (void *)0x900000003ff02788);
break;
default:
break;
}
}
printk("SET HT_DMA CACHED\n");
}
__sync();
#endif /* CONFIG_CPU_LOONGSON3 */
}
今天只分析函数 prom_init_cmdline();, prom_init_env();
分别是接收bios传递的信息,和初始化环境
void __init prom_init_cmdline(void)
{
int prom_argc; //记录参数的个数
/* pmon passes arguments in 32bit pointers */
int *_prom_argv; //记录参数的内容
int i;
long l;
/* fw_arg0和fw_arg1在head.s文件中初始化,也就是记录了bios传递的参数 */
prom_argc = fw_arg0; //参数个数
_prom_argv = (int *)fw_arg1; //参数内容
/*第一个参数为什么是g呢?因为pmon下载内核后运行的命令是g */
arcs_cmdline[0] = '\0'; //第一个参数是g,所以吧第一个空出来
for (i = 1; i < prom_argc; i++) {
l = (long)_prom_argv[i];
//判断参数有没有超过规定的长度
if (strlen(arcs_cmdline) + strlen(((char *)l) + 1)
>= sizeof(arcs_cmdline))
break;
//strcat的作用就是合并两个字符串,在这里就是把参数内容放入到arcs_cmdline数组中,并且
//参数之间由空格隔开
strcat(arcs_cmdline, ((char *)l));
strcat(arcs_cmdline, " ");
}
prom_init_machtype();
}
初始化机器类型
#define MACHTYPE_LEN 50
//系统定义的机器的类型
static const char *system_types[] = {
[MACH_LOONGSON_UNKNOWN] "unknown loongson machine",
[MACH_LEMOTE_FL2E] "lemote-fuloong-2e-box",
[MACH_LEMOTE_FL2F] "lemote-fuloong-2f-box",
[MACH_LEMOTE_ML2F7] "lemote-mengloong-2f-7inches",
[MACH_LEMOTE_YL2F89] "lemote-yeeloong-2f-8.9inches",
[MACH_DEXXON_GDIUM2F10] "dexxon-gdium-2f",
[MACH_LEMOTE_NAS] "lemote-nas-2f",
[MACH_LEMOTE_LL2F] "lemote-lynloong-2f",
[MACH_LOONGSON_GENERIC] "generic-loongson-machine",
[MACH_LOONGSON_END] NULL,
};
//初始化系统的机器类型
void __init prom_init_machtype(void)
{
char *p, str[MACHTYPE_LEN + 1];
int machtype = MACH_LEMOTE_FL2E; //默认的初始值
mips_machtype = LOONGSON_MACHTYPE; //在板级setup文件中定义,初始时位unknow
//在arcs_cmdline中查找有没有定义machtype
p = strstr(arcs_cmdline, "machtype=");
//没有传递就使用