修改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 如果保留内存错误会导致异常。

Logo

一站式 AI 云服务平台

更多推荐