spin_table_cpu_release_addr的傳遞
由于在armv8架構(gòu)下, uboot只能通過devicetree向內(nèi)核傳遞參數(shù)信息 ,因此當(dāng)其開啟了CONFIG_ARMV8_SPIN_TABLE配置選項(xiàng)后,就需要在適當(dāng)?shù)臅r候?qū)⒃撝祵懭雂evicetree中。
我們知道uboot一般通過bootm命令啟動操作系統(tǒng)(aarch64支持的booti命令,其底層實(shí)現(xiàn)與bootm相同),因此在bootm中會執(zhí)行一系列啟動前的準(zhǔn)備工作,其中就包括將spin-table地寫入devicetree的工作。以下其執(zhí)行流程圖:
spin_table_update_dt的代碼實(shí)現(xiàn)如下:
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"); (2)
if (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); (3)
if (!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); (4)
if (ret)
return -ENOSPC;
}
ret = fdt_add_mem_rsv(fdt, rsv_addr, rsv_size); (5)
…
}
(1)獲取其起始地址和長度
(2)從devicetree中獲取cpus節(jié)點(diǎn)
(3)遍歷該節(jié)點(diǎn)的所有cpu子節(jié)點(diǎn),并校驗(yàn)其enable-method是否為spin-table。若不是所有cpu的都該類型,則不設(shè)置
(4)若所有cpu的enable-method都為spin-table,則將該參數(shù)設(shè)置到cpu-release-addr屬性中
(5)由于這段地址有特殊用途,內(nèi)核的內(nèi)存管理系統(tǒng)不能將其分配給其它模塊。因此,需要將其添加到保留內(nèi)存中
-
內(nèi)核
+關(guān)注
關(guān)注
3文章
1378瀏覽量
40345 -
cpu
+關(guān)注
關(guān)注
68文章
10890瀏覽量
212429 -
多核
+關(guān)注
關(guān)注
0文章
43瀏覽量
12378 -
SMP
+關(guān)注
關(guān)注
0文章
75瀏覽量
19700
發(fā)布評論請先 登錄
相關(guān)推薦
評論