mips架构linux启动分析(四)(接收bios信息和环境初始化)

老样子先看函数把.


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=");
//没有传递就使用
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值