generic-arm64: Set device tree in dtb_service when present. Bug: 359345227 Test: Map desktop boot params into gsc_service TA. Change-Id: Ifd45ecb67fa924a8f4efeccedd0bb9d2f2c224a1
diff --git a/platform/generic-arm64/debug.c b/platform/generic-arm64/debug.c index 9d3885b..1d18293 100644 --- a/platform/generic-arm64/debug.c +++ b/platform/generic-arm64/debug.c
@@ -87,7 +87,7 @@ uart_base = (uint8_t*)page_vaddr + (reg_paddr - reg_pbase); } -void generic_arm64_setup_uart(void* fdt) { +void generic_arm64_setup_uart(const void* fdt) { enum uart_type uart_type; int fdt_chosen_offset = fdt_path_offset(fdt, "/chosen"); int fdt_stdout_path_len;
diff --git a/platform/generic-arm64/debug.h b/platform/generic-arm64/debug.h index b197949..ca8990d 100644 --- a/platform/generic-arm64/debug.h +++ b/platform/generic-arm64/debug.h
@@ -24,7 +24,7 @@ #pragma once #if GENERIC_ARM64_DEBUG_UART -void generic_arm64_setup_uart(void* fdt); +void generic_arm64_setup_uart(const void* fdt); #else -static inline void generic_arm64_setup_uart(void* fdt) {} +static inline void generic_arm64_setup_uart(const void* fdt) {} #endif
diff --git a/platform/generic-arm64/platform.c b/platform/generic-arm64/platform.c index 93ce40d..6b77366 100644 --- a/platform/generic-arm64/platform.c +++ b/platform/generic-arm64/platform.c
@@ -27,6 +27,7 @@ #include <inttypes.h> #include <kernel/vm.h> #include <lib/device_tree/libfdt_helpers.h> +#include <lib/dtb_service/dtb_service.h> #include <lk/init.h> #include <platform/gic.h> #include <string.h> @@ -190,32 +191,39 @@ paddr_t gicr = generic_arm64_get_reg_base(SMC_GET_GIC_BASE_GICR); #elif ARM64_BOOT_PROTOCOL_X0_DTB int ret; - void* fdt; + void* fdt_temp; size_t fdt_size; paddr_t fdt_paddr = lk_boot_args[0]; - ret = vmm_alloc_physical( - vmm_get_kernel_aspace(), "device_tree_probe", PAGE_SIZE, &fdt, 0, - fdt_paddr, 0, ARCH_MMU_FLAG_PERM_NO_EXECUTE | ARCH_MMU_FLAG_CACHED); + ret = vmm_alloc_physical(vmm_get_kernel_aspace(), "device_tree_probe", + PAGE_SIZE, &fdt_temp, 0, fdt_paddr, 0, + ARCH_MMU_FLAG_PERM_NO_EXECUTE | + ARCH_MMU_FLAG_CACHED | + ARCH_MMU_FLAG_PERM_RO); if (ret) { dprintf(CRITICAL, "failed to map device tree page at 0x%" PRIxPADDR ": %d\n", fdt_paddr, ret); return; } + const void* fdt = fdt_temp; + if (fdt_check_header(fdt)) { dprintf(CRITICAL, "invalid device tree at 0x%" PRIxPADDR ": %d\n", fdt_paddr, ret); return; } + fdt_size = fdt_totalsize(fdt); if (fdt_size > PAGE_SIZE) { fdt_size = page_align(fdt_size); dprintf(INFO, "remapping device tree with size 0x%zx\n", fdt_size); vmm_free_region(vmm_get_kernel_aspace(), (vaddr_t)fdt); - ret = vmm_alloc_physical( - vmm_get_kernel_aspace(), "device_tree_full", fdt_size, &fdt, 0, - fdt_paddr, 0, - ARCH_MMU_FLAG_PERM_NO_EXECUTE | ARCH_MMU_FLAG_CACHED); + ret = vmm_alloc_physical(vmm_get_kernel_aspace(), "device_tree_full", + fdt_size, &fdt_temp, 0, fdt_paddr, 0, + ARCH_MMU_FLAG_PERM_NO_EXECUTE | + ARCH_MMU_FLAG_CACHED | + ARCH_MMU_FLAG_PERM_RO); + fdt = fdt_temp; if (ret) { dprintf(CRITICAL, "failed to map device tree at 0x%" PRIxPADDR @@ -292,6 +300,9 @@ arm_generic_timer_init(ARM_GENERIC_TIMER_INT, 0); #if ARM64_BOOT_PROTOCOL_X0_DTB + if (dtb_set(fdt, fdt_size) != NO_ERROR) { + dprintf(CRITICAL, "failed to set device tree\n"); + } pci_init_fdt(fdt); /* ignore pci init errors */ #endif }