On 5/10/2024 9:05 AM, romank@xxxxxxxxxxxxxxxxxxx wrote: > From: Roman Kisel <romank@xxxxxxxxxxxxxxxxxxx> > > Update the driver to support DeviceTree boot as well along with ACPI. > This enables the Virtual Trust Level platforms boot up on ARM64. > > Signed-off-by: Roman Kisel <romank@xxxxxxxxxxxxxxxxxxx> > --- > arch/arm64/hyperv/mshyperv.c | 34 +++++++++++++++++++++++++++++----- > 1 file changed, 29 insertions(+), 5 deletions(-) > > diff --git a/arch/arm64/hyperv/mshyperv.c b/arch/arm64/hyperv/mshyperv.c > index b1a4de4eee29..208a3bcb9686 100644 > --- a/arch/arm64/hyperv/mshyperv.c > +++ b/arch/arm64/hyperv/mshyperv.c > @@ -15,6 +15,9 @@ > #include <linux/errno.h> > #include <linux/version.h> > #include <linux/cpuhotplug.h> > +#include <linux/libfdt.h> > +#include <linux/of.h> > +#include <linux/of_fdt.h> > #include <asm/mshyperv.h> > > static bool hyperv_initialized; > @@ -27,6 +30,29 @@ int hv_get_hypervisor_version(union hv_hypervisor_version_info *info) > return 0; > } > > +static bool hyperv_detect_fdt(void) > +{ > +#ifdef CONFIG_OF > + const unsigned long hyp_node = of_get_flat_dt_subnode_by_name( > + of_get_flat_dt_root(), "hypervisor"); > + > + return (hyp_node != -FDT_ERR_NOTFOUND) && > + of_flat_dt_is_compatible(hyp_node, "microsoft,hyperv"); > +#else > + return false; > +#endif > +} > + > +static bool hyperv_detect_acpi(void) > +{ > +#ifdef CONFIG_ACPI > + return !acpi_disabled && > + !strncmp((char *)&acpi_gbl_FADT.hypervisor_id, "MsHyperV", 8); > +#else > + return false; > +#endif > +} > + Could using IS_ENABLED() allow collapsing these two functions into one hyperv_detect_fw()? I am wondering if #ifdef was explicitly chosen to allow for the code to be compiled in if CONFIG* is defined v/s IS_ENABLED() only being true if the CONFIG value is true. > static int __init hyperv_init(void) > { > struct hv_get_vp_registers_output result; > @@ -35,13 +61,11 @@ static int __init hyperv_init(void) > > /* > * Allow for a kernel built with CONFIG_HYPERV to be running in > - * a non-Hyper-V environment, including on DT instead of ACPI. > + * a non-Hyper-V environment. > + * > * In such cases, do nothing and return success. > */ > - if (acpi_disabled) > - return 0; > - > - if (strncmp((char *)&acpi_gbl_FADT.hypervisor_id, "MsHyperV", 8)) > + if (!hyperv_detect_fdt() && !hyperv_detect_acpi()) > return 0; > > /* Setup the guest ID */