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
 }