SMP多核启动向内核传递参数信息

描述

spin_table_cpu_release_addr的传递

由于在armv8架构下, uboot只能通过devicetree向内核传递参数信息 ,因此当其开启了CONFIG_ARMV8_SPIN_TABLE配置选项后,就需要在适当的时候将该值写入devicetree中。

我们知道uboot一般通过bootm命令启动操作系统(aarch64支持的booti命令,其底层实现与bootm相同),因此在bootm中会执行一系列启动前的准备工作,其中就包括将spin-table地写入devicetree的工作。以下其执行流程图:

内核
spin_table_update_dt的代码实现如下:

int spin_table_update_dt(void *fdt)
{
	…
	unsigned long rsv_addr = (unsigned long)&spin_table_reserve_begin;   
	unsigned long rsv_size = &spin_table_reserve_end -
						&spin_table_reserve_begin;                 (1)

	cpus_offset = fdt_path_offset(fdt, "/cpus");                                       (2if (cpus_offset < 0)
		return -ENODEV;

	for (offset = fdt_first_subnode(fdt, cpus_offset);                    
	     offset >= 0;
	     offset = fdt_next_subnode(fdt, offset)) {
		prop = fdt_getprop(fdt, offset, "device_type", NULL);
		if (!prop || strcmp(prop, "cpu"))
			continue;
		prop = fdt_getprop(fdt, offset, "enable-method", NULL);                    (3if (!prop || strcmp(prop, "spin-table"))
			return 0;
	}

	for (offset = fdt_first_subnode(fdt, cpus_offset);
	     offset >= 0;
	     offset = fdt_next_subnode(fdt, offset)) {
		prop = fdt_getprop(fdt, offset, "device_type", NULL);
		if (!prop || strcmp(prop, "cpu"))
			continue;

		ret = fdt_setprop_u64(fdt, offset, "cpu-release-addr",
				(unsigned long)&spin_table_cpu_release_addr);              (4if (ret)
			return -ENOSPC;
	}

	ret = fdt_add_mem_rsv(fdt, rsv_addr, rsv_size);                                    (5)
	…
}

(1)获取其起始地址和长度

(2)从devicetree中获取cpus节点

(3)遍历该节点的所有cpu子节点,并校验其enable-method是否为spin-table。若不是所有cpu的都该类型,则不设置

(4)若所有cpu的enable-method都为spin-table,则将该参数设置到cpu-release-addr属性中

(5)由于这段地址有特殊用途,内核的内存管理系统不能将其分配给其它模块。因此,需要将其添加到保留内存中

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分