qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2 3/5] acpi: pc: add fw_cfg device node to ssdt


From: Gabriel L. Somlo
Subject: Re: [Qemu-devel] [PATCH v2 3/5] acpi: pc: add fw_cfg device node to ssdt
Date: Mon, 14 Sep 2015 16:34:02 -0400
User-agent: Mutt/1.5.23 (2014-03-12)

On Mon, Sep 14, 2015 at 05:16:44PM -0300, Eduardo Habkost wrote:
> On Mon, Sep 14, 2015 at 02:16:49PM -0400, Gabriel L. Somlo wrote:
> > On Mon, Sep 14, 2015 at 01:09:41PM -0300, Eduardo Habkost wrote:
> > > On Mon, Sep 14, 2015 at 10:57:31AM -0400, Gabriel L. Somlo wrote:
> > > > Add a fw_cfg device node to the ACPI SSDT. While the guest-side
> > > > BIOS can't utilize this information (since it has to access the
> > > > hard-coded fw_cfg device to extract ACPI tables to begin with),
> > > > having fw_cfg listed in ACPI will help the guest kernel keep a
> > > > more accurate inventory of in-use IO port regions.
> > > > 
> > > > Signed-off-by: Gabriel Somlo <address@hidden>
> > > > ---
> > > >  hw/i386/acpi-build.c | 20 ++++++++++++++++++++
> > > >  1 file changed, 20 insertions(+)
> > > > 
> > > > diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> > > > index 95e0c65..ecdb3a5 100644
> > > > --- a/hw/i386/acpi-build.c
> > > > +++ b/hw/i386/acpi-build.c
> > > > @@ -1071,6 +1071,26 @@ build_ssdt(GArray *table_data, GArray *linker,
> > > >      aml_append(scope, aml_name_decl("_S5", pkg));
> > > >      aml_append(ssdt, scope);
> > > >  
> > > > +    if (guest_info->fw_cfg) {
> > > 
> > > I sent a reply to v1 a few minutes before seeing v2. Copying it here for
> > > reference:
> > > 
> > > Is this function ever going to be called without fw_cfg set?
> > > acpi_setup() returns immediately if fw_cfg isn't available.
> > 
> > You're right, build_ssdt() is called from acpi_build(), which is
> > called directly from acpi_setup(), and also indirectly via
> > acpi_build_update() via acpi_add_rom_blob(), but all that eventually
> > ties back to acpi_setup(), *after* it already established that
> > guest_info->fw_cfg is non-NULL.
> > 
> > > Also, this changes guest ABI, so you will need to add some compat flag
> > > to PCMachineClass indicating if the device node should be added.
> > 
> > So I'll replace the "if (guest_info->fw_cfg)" check with
> > "if machine-type >= (pc-q35-2.5 or pc-i440fx-2.5))", in v3,
> > as soon as the patches for the 2.5 machine type make it into
> > git master (I remember seeing a reviewed-by fly by for that
> > earlier today :)
> 
> Sounds good, assuming you are going to implement the "machine-type >= pc-2.5"
> check with something like: PC_MACHINE_GET_CLASS(machine)->acpi_no_fw_cfg_node.

Thanks, that gives me something to grep for ;)

I was going to mimic how other acpi related decisions are made on pc
(piix or q35), something like below. Might even be the same thing,
once I learn about PC_MACHINE_GET_CLASS :)

Thanks,
--Gabriel


diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 3f925b2..8219ed9 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -64,6 +64,7 @@ static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
 static bool pci_enabled = true;
 static bool has_acpi_build = true;
 static bool rsdp_in_ram = true;
+static bool has_acpi_fw_cfg = true;
 static int legacy_acpi_table_size;
 static bool smbios_defaults = true;
 static bool smbios_legacy_mode;
@@ -168,6 +169,7 @@ static void pc_init1(MachineState *machine,
     guest_info->isapc_ram_fw = !pci_enabled;
     guest_info->has_reserved_memory = has_reserved_memory;
     guest_info->rsdp_in_ram = rsdp_in_ram;
+    guest_info->has_acpi_fw_cfg = has_acpi_fw_cfg;
 
     if (smbios_defaults) {
         MachineClass *mc = MACHINE_GET_CLASS(machine);
@@ -316,6 +318,7 @@ static void pc_compat_2_2(MachineState *machine)
 {
     pc_compat_2_3(machine);
     rsdp_in_ram = false;
+    has_acpi_fw_cfg = false;
     machine->suppress_vmdesc = true;
 }
 
diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index 11601ab..29daf08 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -52,6 +52,7 @@
 
 static bool has_acpi_build = true;
 static bool rsdp_in_ram = true;
+static bool has_acpi_fw_cfg = true;
 static bool smbios_defaults = true;
 static bool smbios_legacy_mode;
 static bool smbios_uuid_encoded = true;
@@ -154,6 +155,7 @@ static void pc_q35_init(MachineState *machine)
     guest_info->has_acpi_build = has_acpi_build;
     guest_info->has_reserved_memory = has_reserved_memory;
     guest_info->rsdp_in_ram = rsdp_in_ram;
+    guest_info->has_acpi_fw_cfg = has_acpi_fw_cfg;
 
     /* Migration was not supported in 2.0 for Q35, so do not bother
      * with this hack (see hw/i386/acpi-build.c).
@@ -299,6 +301,7 @@ static void pc_compat_2_2(MachineState *machine)
 {
     pc_compat_2_3(machine);
     rsdp_in_ram = false;
+    has_acpi_fw_cfg = false;
     machine->suppress_vmdesc = true;
 }
 
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index fadcaa4..4896475 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -103,6 +103,7 @@ struct PcGuestInfo {
     bool has_acpi_build;
     bool has_reserved_memory;
     bool rsdp_in_ram;
+    bool has_acpi_fw_cfg;
 };
 
 /* parallel.c */



reply via email to

[Prev in Thread] Current Thread [Next in Thread]