Relocate FDT to Xen heap instead of using early mapping as it is
expected that discard_initial_modules() ( is supposed to call in
the future ) discards the FDT boot module and remove_early_mappings()
destroys the early mapping.
Unflatten a device tree, creating the tree of struct device_node.
It also fills the "name" and "type" pointers of the nodes so the normal
device-tree walking functions can be used.
Set device_tree_flattened to NULL in the case when acpi_disabled is
equal to false.
Signed-off-by: Oleksii Kurochko <oleksii.kurochko@gmail.com>
---
xen/arch/riscv/setup.c | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/xen/arch/riscv/setup.c b/xen/arch/riscv/setup.c
index ff667260ec..41826f77fb 100644
--- a/xen/arch/riscv/setup.c
+++ b/xen/arch/riscv/setup.c
@@ -1,5 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0-only */
+#include <xen/acpi.h>
#include <xen/bug.h>
#include <xen/bootfdt.h>
#include <xen/compile.h>
@@ -71,6 +72,7 @@ void __init noreturn start_xen(unsigned long bootcpu_id,
paddr_t dtb_addr)
{
const char *cmdline;
+ size_t fdt_size;
remove_identity_mapping();
@@ -95,7 +97,7 @@ void __init noreturn start_xen(unsigned long bootcpu_id,
_end - _start, false) )
panic("Failed to add BOOTMOD_XEN\n");
- if ( !boot_fdt_info(device_tree_flattened, dtb_addr) )
+ if ( !(fdt_size = boot_fdt_info(device_tree_flattened, dtb_addr)) )
BUG();
cmdline = boot_fdt_cmdline(device_tree_flattened);
@@ -114,6 +116,18 @@ void __init noreturn start_xen(unsigned long bootcpu_id,
*/
system_state = SYS_STATE_boot;
+ if ( acpi_disabled )
+ {
+ printk("Booting using Device Tree\n");
+ device_tree_flattened = relocate_fdt(dtb_addr, fdt_size);
+ dt_unflatten_host_device_tree();
+ }
+ else
+ {
+ device_tree_flattened = NULL;
+ panic("Booting using ACPI isn't supported\n");
+ }
+
printk("All set up\n");
machine_halt();
--
2.47.0
On 27.11.2024 13:50, Oleksii Kurochko wrote: > Relocate FDT to Xen heap instead of using early mapping as it is > expected that discard_initial_modules() ( is supposed to call in > the future ) discards the FDT boot module and remove_early_mappings() > destroys the early mapping. > > Unflatten a device tree, creating the tree of struct device_node. > It also fills the "name" and "type" pointers of the nodes so the normal > device-tree walking functions can be used. > > Set device_tree_flattened to NULL in the case when acpi_disabled is > equal to false. > > Signed-off-by: Oleksii Kurochko <oleksii.kurochko@gmail.com> Acked-by: Jan Beulich <jbeulich@suse.com> Albeit ... > @@ -71,6 +72,7 @@ void __init noreturn start_xen(unsigned long bootcpu_id, > paddr_t dtb_addr) > { > const char *cmdline; > + size_t fdt_size; > > remove_identity_mapping(); > > @@ -95,7 +97,7 @@ void __init noreturn start_xen(unsigned long bootcpu_id, > _end - _start, false) ) > panic("Failed to add BOOTMOD_XEN\n"); > > - if ( !boot_fdt_info(device_tree_flattened, dtb_addr) ) > + if ( !(fdt_size = boot_fdt_info(device_tree_flattened, dtb_addr)) ) > BUG(); ... perhaps better fdt_size = boot_fdt_info(device_tree_flattened, dtb_addr); BUG_ON(!fdt_size); ? Jan
On 09.12.2024 16:56, Jan Beulich wrote: > On 27.11.2024 13:50, Oleksii Kurochko wrote: >> Relocate FDT to Xen heap instead of using early mapping as it is >> expected that discard_initial_modules() ( is supposed to call in >> the future ) discards the FDT boot module and remove_early_mappings() >> destroys the early mapping. >> >> Unflatten a device tree, creating the tree of struct device_node. >> It also fills the "name" and "type" pointers of the nodes so the normal >> device-tree walking functions can be used. >> >> Set device_tree_flattened to NULL in the case when acpi_disabled is >> equal to false. >> >> Signed-off-by: Oleksii Kurochko <oleksii.kurochko@gmail.com> > > Acked-by: Jan Beulich <jbeulich@suse.com> > > Albeit ... > >> @@ -71,6 +72,7 @@ void __init noreturn start_xen(unsigned long bootcpu_id, >> paddr_t dtb_addr) >> { >> const char *cmdline; >> + size_t fdt_size; >> >> remove_identity_mapping(); >> >> @@ -95,7 +97,7 @@ void __init noreturn start_xen(unsigned long bootcpu_id, >> _end - _start, false) ) >> panic("Failed to add BOOTMOD_XEN\n"); >> >> - if ( !boot_fdt_info(device_tree_flattened, dtb_addr) ) >> + if ( !(fdt_size = boot_fdt_info(device_tree_flattened, dtb_addr)) ) >> BUG(); > > ... perhaps better > > fdt_size = boot_fdt_info(device_tree_flattened, dtb_addr); > BUG_ON(!fdt_size); > > ? And then I notice that Arm has no such check at all. Better stay in sync? Jan
On 12/9/24 4:57 PM, Jan Beulich wrote: > On 09.12.2024 16:56, Jan Beulich wrote: >> On 27.11.2024 13:50, Oleksii Kurochko wrote: >>> Relocate FDT to Xen heap instead of using early mapping as it is >>> expected that discard_initial_modules() ( is supposed to call in >>> the future ) discards the FDT boot module and remove_early_mappings() >>> destroys the early mapping. >>> >>> Unflatten a device tree, creating the tree of struct device_node. >>> It also fills the "name" and "type" pointers of the nodes so the normal >>> device-tree walking functions can be used. >>> >>> Set device_tree_flattened to NULL in the case when acpi_disabled is >>> equal to false. >>> >>> Signed-off-by: Oleksii Kurochko<oleksii.kurochko@gmail.com> >> Acked-by: Jan Beulich<jbeulich@suse.com> >> >> Albeit ... >> >>> @@ -71,6 +72,7 @@ void __init noreturn start_xen(unsigned long bootcpu_id, >>> paddr_t dtb_addr) >>> { >>> const char *cmdline; >>> + size_t fdt_size; >>> >>> remove_identity_mapping(); >>> >>> @@ -95,7 +97,7 @@ void __init noreturn start_xen(unsigned long bootcpu_id, >>> _end - _start, false) ) >>> panic("Failed to add BOOTMOD_XEN\n"); >>> >>> - if ( !boot_fdt_info(device_tree_flattened, dtb_addr) ) >>> + if ( !(fdt_size = boot_fdt_info(device_tree_flattened, dtb_addr)) ) >>> BUG(); >> ... perhaps better >> >> fdt_size = boot_fdt_info(device_tree_flattened, dtb_addr); >> BUG_ON(!fdt_size); >> >> ? > And then I notice that Arm has no such check at all. Better stay in sync? Agree, it is better to be in sync. I will drop the BUG_ON(). Thanks. ~ Oleksii
© 2016 - 2024 Red Hat, Inc.