All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ani Sinha <ani@anisinha.ca>
To: Julia Suvorova <jusual@redhat.com>
Cc: Ani Sinha <ani@anisinha.ca>, Igor Mammedov <imammedo@redhat.com>,
	qemu-devel@nongnu.org, "Michael S. Tsirkin" <mst@redhat.com>
Subject: Re: [RFC PATCH v3 4/7] hw/acpi/ich9: Enable ACPI PCI hot-plug
Date: Thu, 24 Sep 2020 16:58:00 +0530 (IST)	[thread overview]
Message-ID: <alpine.DEB.2.21.2009241644060.17687@ani-ubuntu> (raw)
In-Reply-To: <20200924070013.165026-5-jusual@redhat.com>



On Thu, 24 Sep 2020, Julia Suvorova wrote:

> Add acpi_pcihp to ich9_pm as part of
> 'acpi-pci-hotplug-with-bridge-support' option. Set default to false.
>
> Signed-off-by: Julia Suvorova <jusual@redhat.com>
> ---
> hw/i386/acpi-build.h   |  1 +
> include/hw/acpi/ich9.h |  3 ++
> hw/acpi/ich9.c         | 67 ++++++++++++++++++++++++++++++++++++++++++
> hw/acpi/pcihp.c        |  5 +++-
> hw/i386/acpi-build.c   |  2 +-
> 5 files changed, 76 insertions(+), 2 deletions(-)
>
> diff --git a/hw/i386/acpi-build.h b/hw/i386/acpi-build.h
> index 4c5bfb3d0b..39f143830a 100644
> --- a/hw/i386/acpi-build.h
> +++ b/hw/i386/acpi-build.h
> @@ -10,6 +10,7 @@ extern const struct AcpiGenericAddress x86_nvdimm_acpi_dsmio;
> #define ACPI_PCIHP_BNMR_BASE 0x10
>
> void acpi_setup(void);
> +Object *acpi_get_i386_pci_host(void);
>
> Object *object_resolve_type_unambiguous(const char *typename);
>
> diff --git a/include/hw/acpi/ich9.h b/include/hw/acpi/ich9.h
> index 4d19571ed7..833e62fefe 100644
> --- a/include/hw/acpi/ich9.h
> +++ b/include/hw/acpi/ich9.h
> @@ -24,6 +24,7 @@
> #include "hw/acpi/acpi.h"
> #include "hw/acpi/cpu_hotplug.h"
> #include "hw/acpi/cpu.h"
> +#include "hw/acpi/pcihp.h"
> #include "hw/acpi/memory_hotplug.h"
> #include "hw/acpi/acpi_dev_interface.h"
> #include "hw/acpi/tco.h"
> @@ -55,6 +56,8 @@ typedef struct ICH9LPCPMRegs {
>     AcpiCpuHotplug gpe_cpu;
>     CPUHotplugState cpuhp_state;
>
> +    bool use_acpi_hotplug_bridge;
> +    AcpiPciHpState acpi_pci_hotplug;
>     MemHotplugState acpi_memory_hotplug;
>
>     uint8_t disable_s3;
> diff --git a/hw/acpi/ich9.c b/hw/acpi/ich9.c
> index 6a19070cec..987f23e388 100644
> --- a/hw/acpi/ich9.c
> +++ b/hw/acpi/ich9.c
> @@ -218,6 +218,26 @@ static const VMStateDescription vmstate_cpuhp_state = {
>     }
> };
>
> +static bool vmstate_test_use_pcihp(void *opaque)
> +{
> +    ICH9LPCPMRegs *s = opaque;
> +
> +    return s->use_acpi_hotplug_bridge;
> +}
> +
> +static const VMStateDescription vmstate_pcihp_state = {
> +    .name = "ich9_pm/pcihp",
> +    .version_id = 1,
> +    .minimum_version_id = 1,
> +    .needed = vmstate_test_use_pcihp,
> +    .fields      = (VMStateField[]) {
> +        VMSTATE_PCI_HOTPLUG(acpi_pci_hotplug,
> +                            ICH9LPCPMRegs,
> +                            NULL),
> +        VMSTATE_END_OF_LIST()
> +    }
> +};
> +
> const VMStateDescription vmstate_ich9_pm = {
>     .name = "ich9_pm",
>     .version_id = 1,
> @@ -239,6 +259,7 @@ const VMStateDescription vmstate_ich9_pm = {
>         &vmstate_memhp_state,
>         &vmstate_tco_io_state,
>         &vmstate_cpuhp_state,
> +        &vmstate_pcihp_state,
>         NULL
>     }
> };
> @@ -260,6 +281,7 @@ static void pm_reset(void *opaque)
>     }
>     pm->smi_en_wmask = ~0;
>
> +    acpi_pcihp_reset(&pm->acpi_pci_hotplug, true);

Maybe add a comment here that acpi based hotplug is disabled both for 
PCIE.0 and for the bridges.


>     acpi_update_sci(&pm->acpi_regs, pm->irq);
> }
>
> @@ -298,6 +320,18 @@ void ich9_pm_init(PCIDevice *lpc_pci, ICH9LPCPMRegs *pm,
>     pm->enable_tco = true;
>     acpi_pm_tco_init(&pm->tco_regs, &pm->io);
>
> +    if (pm->use_acpi_hotplug_bridge) {
> +        acpi_pcihp_init(OBJECT(lpc_pci),
> +                        &pm->acpi_pci_hotplug,
> +                        pci_get_bus(lpc_pci),
> +                        pci_address_space_io(lpc_pci),
> +                        true,
> +                        ACPI_PCIHP_ADDR_ICH9);
> +
> +        qbus_set_hotplug_handler(BUS(pci_get_bus(lpc_pci)),
> +                                 OBJECT(lpc_pci));
> +    }
> +
>     pm->irq = sci_irq;
>     qemu_register_reset(pm_reset, pm);
>     pm->powerdown_notifier.notify = pm_powerdown_req;
> @@ -369,6 +403,20 @@ static void ich9_pm_set_enable_tco(Object *obj, bool value, Error **errp)
>     s->pm.enable_tco = value;
> }
>
> +static bool ich9_pm_get_acpi_pci_hotplug(Object *obj, Error **errp)
> +{
> +    ICH9LPCState *s = ICH9_LPC_DEVICE(obj);
> +
> +    return s->pm.use_acpi_hotplug_bridge;
> +}
> +
> +static void ich9_pm_set_acpi_pci_hotplug(Object *obj, bool value,
> +                                               Error **errp)
> +{
> +    ICH9LPCState *s = ICH9_LPC_DEVICE(obj);
> +
> +    s->pm.use_acpi_hotplug_bridge = value;
> +}
> void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm)
> {
>     static const uint32_t gpe0_len = ICH9_PMIO_GPE0_LEN;
> @@ -377,6 +425,7 @@ void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm)
>     pm->disable_s3 = 0;
>     pm->disable_s4 = 0;
>     pm->s4_val = 2;
> +    pm->use_acpi_hotplug_bridge = false;

Ditto regarding the comment as above.

>
>     object_property_add_uint32_ptr(obj, ACPI_PM_PROP_PM_IO_BASE,
>                                    &pm->pm_io_base, OBJ_PROP_FLAG_READ);
> @@ -400,6 +449,9 @@ void ich9_pm_add_properties(Object *obj, ICH9LPCPMRegs *pm)
>     object_property_add_bool(obj, ACPI_PM_PROP_TCO_ENABLED,
>                              ich9_pm_get_enable_tco,
>                              ich9_pm_set_enable_tco);
> +    object_property_add_bool(obj, "acpi-pci-hotplug-with-bridge-support",
> +                             ich9_pm_get_acpi_pci_hotplug,
> +                             ich9_pm_set_acpi_pci_hotplug);
> }
>
> void ich9_pm_device_pre_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
> @@ -407,6 +459,11 @@ void ich9_pm_device_pre_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
> {
>     ICH9LPCState *lpc = ICH9_LPC_DEVICE(hotplug_dev);
>
> +    if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
> +        acpi_pcihp_device_pre_plug_cb(hotplug_dev, dev, errp);
> +        return;
> +    }
> +
>     if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM) &&
>         !lpc->pm.acpi_memory_hotplug.is_enabled)
>         error_setg(errp,
> @@ -432,6 +489,9 @@ void ich9_pm_device_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
>         } else {
>             acpi_cpu_plug_cb(hotplug_dev, &lpc->pm.cpuhp_state, dev, errp);
>         }
> +    } else if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
> +        acpi_pcihp_device_plug_cb(hotplug_dev, &lpc->pm.acpi_pci_hotplug,
> +                                  dev, errp);
>     } else {
>         error_setg(errp, "acpi: device plug request for not supported device"
>                    " type: %s", object_get_typename(OBJECT(dev)));
> @@ -452,6 +512,10 @@ void ich9_pm_device_unplug_request_cb(HotplugHandler *hotplug_dev,
>                !lpc->pm.cpu_hotplug_legacy) {
>         acpi_cpu_unplug_request_cb(hotplug_dev, &lpc->pm.cpuhp_state,
>                                    dev, errp);
> +    } else if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
> +        acpi_pcihp_device_unplug_request_cb(hotplug_dev,
> +                                            &lpc->pm.acpi_pci_hotplug,
> +                                            dev, errp);
>     } else {
>         error_setg(errp, "acpi: device unplug request for not supported device"
>                    " type: %s", object_get_typename(OBJECT(dev)));
> @@ -469,6 +533,9 @@ void ich9_pm_device_unplug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
>     } else if (object_dynamic_cast(OBJECT(dev), TYPE_CPU) &&
>                !lpc->pm.cpu_hotplug_legacy) {
>         acpi_cpu_unplug_cb(&lpc->pm.cpuhp_state, dev, errp);
> +    } else if (object_dynamic_cast(OBJECT(dev), TYPE_PCI_DEVICE)) {
> +        acpi_pcihp_device_unplug_cb(hotplug_dev, &lpc->pm.acpi_pci_hotplug,
> +                                    dev, errp);
>     } else {
>         error_setg(errp, "acpi: device unplug for not supported device"
>                    " type: %s", object_get_typename(OBJECT(dev)));
> diff --git a/hw/acpi/pcihp.c b/hw/acpi/pcihp.c
> index bb457bc279..8ab65502ce 100644
> --- a/hw/acpi/pcihp.c
> +++ b/hw/acpi/pcihp.c
> @@ -30,6 +30,8 @@
> #include "hw/pci-host/i440fx.h"
> #include "hw/pci/pci.h"
> #include "hw/pci/pci_bridge.h"
> +#include "hw/pci/pci_host.h"
> +#include "hw/i386/acpi-build.h"
> #include "hw/acpi/acpi.h"
> #include "exec/address-spaces.h"
> #include "hw/pci/pci_bus.h"
> @@ -88,6 +90,7 @@ static void *acpi_set_bsel(PCIBus *bus, void *opaque)
> static void acpi_set_pci_info(void)
> {
>     static bool bsel_is_set;
> +    Object *host = acpi_get_i386_pci_host();
>     PCIBus *bus;
>     unsigned bsel_alloc = ACPI_PCIHP_BSEL_DEFAULT;
>
> @@ -96,7 +99,7 @@ static void acpi_set_pci_info(void)
>     }
>     bsel_is_set = true;
>
> -    bus = find_i440fx(); /* TODO: Q35 support */
> +    bus = PCI_HOST_BRIDGE(host)->bus;

Isn't this part of a differnet patch?

>     if (bus) {
>         /* Scan all PCI buses. Set property to enable acpi based hotplug. */
>         pci_for_each_bus_depth_first(bus, acpi_set_bsel, NULL, &bsel_alloc);
> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> index b7811a8912..8787b6fb33 100644
> --- a/hw/i386/acpi-build.c
> +++ b/hw/i386/acpi-build.c
> @@ -270,7 +270,7 @@ static void acpi_get_misc_info(AcpiMiscInfo *info)
>  * Because of the PXB hosts we cannot simply query TYPE_PCI_HOST_BRIDGE.
>  * On i386 arch we only have two pci hosts, so we can look only for them.
>  */
> -static Object *acpi_get_i386_pci_host(void)
> +Object *acpi_get_i386_pci_host(void)
> {
>     PCIHostState *host;
>

This is also part of the above change, so part of a diffent patch.

> -- 
> 2.25.4
>
>


  parent reply	other threads:[~2020-09-24 11:36 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-24  7:00 [RFC PATCH v3 0/7] Use ACPI PCI hot-plug for Q35 Julia Suvorova
2020-09-24  7:00 ` [RFC PATCH v3 1/7] hw/acpi/pcihp: Enhance acpi_pcihp_disable_root_bus() to support Q35 Julia Suvorova
2020-09-24 10:53   ` Igor Mammedov
2020-09-24 10:54   ` Ani Sinha
2020-09-24  7:00 ` [RFC PATCH v3 2/7] hw/i386/acpi-build: Add ACPI PCI hot-plug methods to Q35 Julia Suvorova
2020-09-24 11:04   ` Igor Mammedov
2020-09-25  8:20     ` Gerd Hoffmann
2020-09-24 13:15   ` Ani Sinha
2020-09-24 13:58     ` Julia Suvorova
2020-09-24  7:00 ` [RFC PATCH v3 3/7] hw/pci/pcie: Do not initialize slot capability if acpihp is used Julia Suvorova
2020-09-24  7:36   ` Michael S. Tsirkin
2020-09-24  8:23     ` Julia Suvorova
2020-09-24  9:02       ` Michael S. Tsirkin
2020-09-24 11:54       ` Ani Sinha
2020-09-24 11:14   ` Igor Mammedov
2020-09-24 11:37     ` Ani Sinha
2020-09-24  7:00 ` [RFC PATCH v3 4/7] hw/acpi/ich9: Enable ACPI PCI hot-plug Julia Suvorova
2020-09-24  7:37   ` Michael S. Tsirkin
2020-09-24 11:28   ` Ani Sinha [this message]
2020-09-24 14:27     ` Julia Suvorova
2020-09-24  7:00 ` [RFC PATCH v3 5/7] bios-tables-test: Allow changes in DSDT ACPI tables Julia Suvorova
2020-09-24 10:57   ` Ani Sinha
2020-09-24  7:00 ` [RFC PATCH v3 6/7] hw/acpi/ich9: Set ACPI PCI hot-plug as default Julia Suvorova
2020-09-24  9:33   ` Igor Mammedov
2020-09-24  9:41     ` Michael S. Tsirkin
2020-09-24 10:36   ` Daniel P. Berrangé
2020-09-24 14:24     ` Julia Suvorova
2020-09-24  7:00 ` [RFC PATCH v3 7/7] bios-tables-test: Update golden binaries Julia Suvorova
2020-09-24  8:57 ` [RFC PATCH v3 0/7] Use ACPI PCI hot-plug for Q35 no-reply
2020-09-24  9:03 ` no-reply
2020-09-24  9:20 ` Michael S. Tsirkin
2020-10-01  8:55   ` Julia Suvorova
2020-10-01 11:40     ` Michael S. Tsirkin
2020-10-01 13:01       ` Ani Sinha
2020-10-01 15:25         ` Julia Suvorova
2020-10-01 15:54       ` Julia Suvorova
2020-10-01 16:11         ` Ani Sinha
2020-10-06  6:44         ` Michael S. Tsirkin
2020-09-24  9:30 ` Igor Mammedov
2020-09-24  9:39   ` Michael S. Tsirkin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=alpine.DEB.2.21.2009241644060.17687@ani-ubuntu \
    --to=ani@anisinha.ca \
    --cc=imammedo@redhat.com \
    --cc=jusual@redhat.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.