From ef410594320fecf8ea59196f76b8b18b91696b38 Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Mon, 14 Mar 2022 21:43:30 +0100 Subject: [PATCH] EFI: get address-cells and size-cells from the device tree They were hardcoded to 2, which is not correct on all devices. As a result, getting addresses and sizes on pure 32bit devices would fail. Change-Id: Icf542c9e8d6b7136219014fe08dd601387de4762 Reviewed-on: https://review.haiku-os.org/c/haiku/+/5102 Reviewed-by: Fredrik Holmqvist Reviewed-by: waddlesplash Tested-by: Commit checker robot --- src/system/boot/platform/efi/dtb.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/system/boot/platform/efi/dtb.cpp b/src/system/boot/platform/efi/dtb.cpp index 60a7a0bf49..106542d0ef 100644 --- a/src/system/boot/platform/efi/dtb.cpp +++ b/src/system/boot/platform/efi/dtb.cpp @@ -298,11 +298,11 @@ dtb_get_reg(const void* fdt, int node, uint32 addressCells, uint32 sizeCells, si if (prop == NULL) return false; - size_t entrySize = 4*(addressCells + sizeCells); - if ((idx + 1)*entrySize > (size_t)propSize) + size_t entrySize = 4 * (addressCells + sizeCells); + if ((idx + 1) * entrySize > (size_t)propSize) return false; - prop += idx*entrySize; + prop += idx * entrySize; switch (addressCells) { case 1: range.start = fdt32_to_cpu(*(uint32*)prop); prop += 4; break; @@ -471,8 +471,20 @@ dtb_init() int node = -1; int depth = -1; + uint32 addressCells = 0; + uint32 sizeCells = 0; while ((node = fdt_next_node(sDtbTable, node, &depth)) >= 0 && depth >= 0) { - dtb_handle_fdt(sDtbTable, node, 2, 2); + if (addressCells == 0) { + uint32* prop = (uint32*)fdt_getprop(sDtbTable, node, "#address-cells", NULL); + addressCells = fdt32_to_cpu(*prop); + INFO("Address cells at %p: %u\n", prop, addressCells); + } + if (sizeCells == 0) { + uint32* prop = (uint32*)fdt_getprop(sDtbTable, node, "#size-cells", NULL); + sizeCells = fdt32_to_cpu(*prop); + INFO("Size cells at %p: %u\n", prop, sizeCells); + } + dtb_handle_fdt(sDtbTable, node, addressCells, sizeCells); } break; }