修改DTS 出现下面错误
ERROR: reserving fdt memory region failed
在 boot_fdt_add_mem_rsv_regions调用boot_fdt_reserve_region前加入打印:
void boot_fdt_add_mem_rsv_regions(struct lmb *lmb, void *fdt_blob)
{
uint64_t addr, size;
int i, total, ret;
int nodeoffset, subnode;
struct fdt_resource res;
enum lmb_flags flags;
if (fdt_check_header(fdt_blob) != 0)
return;
/* process memreserve sections */
total = fdt_num_mem_rsv(fdt_blob);
for (i = 0; i < total; i++) {
if (fdt_get_mem_rsv(fdt_blob, i, &addr, &size) != 0)
continue;
boot_fdt_reserve_region(lmb, addr, size, LMB_NONE);
}
/* process reserved-memory */
nodeoffset = fdt_subnode_offset(fdt_blob, 0, "reserved-memory");
if (nodeoffset >= 0) {
subnode = fdt_first_subnode(fdt_blob, nodeoffset);
while (subnode >= 0) {
/* check if this subnode has a reg property */
ret = fdt_get_resource(fdt_blob, subnode, "reg", 0,
&res);
if (!ret && fdtdec_get_is_enabled(fdt_blob, subnode)) {
flags = LMB_NONE;
if (fdtdec_get_bool(fdt_blob, subnode,
"no-map"))
flags = LMB_NOMAP;
addr = res.start;
size = res.end - res.start + 1;
boot_fdt_reserve_region(lmb, addr, size, flags);
}
subnode = fdt_next_subnode(fdt_blob, subnode);
}
}
}
发现错误和LINUX DTS 对应的保留内存对应
分析发现是保留内存申请太大超界导致异常。
Booting using the fdt blob at 0x12000000
2xx 800000 12000000 0
2xx 1000000 13000000 0
ERROR: reserving fdt memory region failed (addr=13000000 size=1000000 flags=0)
vpu_cma_region:resion@0x12000000{
compatible = “shared-dma-pool”;
reg = <0x12000000 0x1000000>;
reusable;
};
csi_cma_region:resion@0x12800000{
compatible = "shared-dma-pool";
reg = <0x13000000 0x800000>;
reusable;
};
boot_fdt_add_mem_rsv_regions–从reserved-memory节点获取保留内存信息。申请保留内存,LINUX DTS 如果保留内存错误会导致异常。