From: Isaku Yamahata <yamahata@valinux.co.jp>
To: Blue Swirl <blauwirbel@gmail.com>,
Gerd Hoffmann <kraxel@redhat.com>,
Anthony Liguori <aliguori@linux.vnet.ibm.com>
Cc: qemu-devel <qemu-devel@nongnu.org>
Subject: Re: [Qemu-devel] [PATCH 2/2] acpi: remove static gpe and pci0_status variables
Date: Tue, 11 May 2010 20:27:59 +0900 [thread overview]
Message-ID: <20100511112759.GD13338@valinux.co.jp> (raw)
In-Reply-To: <y2kf43fc5581005101351lf6da3f7ds243105c79d2a9910@mail.gmail.com>
Hi Blue.
I send out very similar patches before and got acked-by from Gerd.
But they haven't been merged yet. Please look at them.
Instead of reinventing similar patches, those patches should be merged.
If necessary, I'm willing to rebase them and resend them.
As for code iteself, the hotplug callback argument was DeviceState
instead of PCIDevice as Gerd suggested.
[Qemu-devel] [PATCH V12 00/27] split out piix specific part from pc emulator and some clean ups
[Qemu-devel] [PATCH V12 21/27] acpi_piix4: qdevfy.
[Qemu-devel] [PATCH V12 22/27] pci hotplug: add argument to pci hot plug
[Qemu-devel] [PATCH V12 23/27] pci hotadd, acpi_piix4: remove global var
http://lists.nongnu.org/archive/html/qemu-devel/2010-01/msg00282.html
http://lists.nongnu.org/archive/html/qemu-devel/2010-01/msg00297.html
http://lists.nongnu.org/archive/html/qemu-devel/2010-01/msg00293.html
http://lists.nongnu.org/archive/html/qemu-devel/2010-01/msg00285.html
On Mon, May 10, 2010 at 11:51:22PM +0300, Blue Swirl wrote:
> Make gpe and pci0_status fields in PIIX4PMState.
>
> Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
> ---
> hw/acpi.c | 93 +++++++++++++++++++++++++++++++++---------------------------
> hw/pc.c | 1 -
> hw/pc.h | 1 -
> hw/pci.c | 12 +++++--
> hw/pci.h | 6 ++-
> 5 files changed, 63 insertions(+), 50 deletions(-)
>
> diff --git a/hw/acpi.c b/hw/acpi.c
> index bb2974e..6db1a12 100644
> --- a/hw/acpi.c
> +++ b/hw/acpi.c
> @@ -30,6 +30,20 @@
>
> #define ACPI_DBG_IO_ADDR 0xb044
>
> +#define GPE_BASE 0xafe0
> +#define PCI_BASE 0xae00
> +#define PCI_EJ_BASE 0xae08
> +
> +struct gpe_regs {
> + uint16_t sts; /* status */
> + uint16_t en; /* enabled */
> +};
> +
> +struct pci_status {
> + uint32_t up;
> + uint32_t down;
> +};
> +
> typedef struct PIIX4PMState {
> PCIDevice dev;
> uint16_t pmsts;
> @@ -52,6 +66,8 @@ typedef struct PIIX4PMState {
> qemu_irq cmos_s3;
> qemu_irq smi_irq;
> int kvm_enabled;
> + struct gpe_regs gpe;
> + struct pci_status pci0_status;
> } PIIX4PMState;
>
> #define RSM_STS (1 << 15)
> @@ -497,16 +513,19 @@ static void piix4_powerdown(void *opaque, int
> irq, int power_failing)
> }
> }
>
> +static void piix4_acpi_system_hot_add_init(PCIBus *bus, PCIDevice
> *hotplug_dev);
> +
> i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
> qemu_irq sci_irq, qemu_irq cmos_s3, qemu_irq smi_irq,
> int kvm_enabled)
> {
> PIIX4PMState *s;
> + PCIDevice *d;
> uint8_t *pci_conf;
>
> - s = (PIIX4PMState *)pci_register_device(bus,
> - "PM", sizeof(PIIX4PMState),
> - devfn, NULL, pm_write_config);
> + d = pci_register_device(bus, "PM", sizeof(PIIX4PMState), devfn, NULL,
> + pm_write_config);
> + s = container_of(d, PIIX4PMState, dev);
> pci_conf = s->dev.config;
> pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_INTEL);
> pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_INTEL_82371AB_3);
> @@ -557,26 +576,11 @@ i2c_bus *piix4_pm_init(PCIBus *bus, int devfn,
> uint32_t smb_io_base,
> s->smi_irq = smi_irq;
> qemu_register_reset(piix4_reset, s);
>
> + piix4_acpi_system_hot_add_init(bus, d);
> +
> return s->smbus;
> }
>
> -#define GPE_BASE 0xafe0
> -#define PCI_BASE 0xae00
> -#define PCI_EJ_BASE 0xae08
> -
> -struct gpe_regs {
> - uint16_t sts; /* status */
> - uint16_t en; /* enabled */
> -};
> -
> -struct pci_status {
> - uint32_t up;
> - uint32_t down;
> -};
> -
> -static struct gpe_regs gpe;
> -static struct pci_status pci0_status;
> -
> static uint32_t gpe_read_val(uint16_t val, uint32_t addr)
> {
> if (addr & 1)
> @@ -714,46 +718,51 @@ static void pciej_write(void *opaque, uint32_t
> addr, uint32_t val)
> #endif
> }
>
> -static int piix4_device_hotplug(PCIDevice *dev, int state);
> +static int piix4_device_hotplug(PCIDevice *hotplug_dev, PCIDevice *dev,
> + int state);
>
> -void piix4_acpi_system_hot_add_init(PCIBus *bus)
> +static void piix4_acpi_system_hot_add_init(PCIBus *bus, PCIDevice *hotplug_dev)
> {
> - register_ioport_write(GPE_BASE, 4, 1, gpe_writeb, &gpe);
> - register_ioport_read(GPE_BASE, 4, 1, gpe_readb, &gpe);
> + PIIX4PMState *s = container_of(hotplug_dev, PIIX4PMState, dev);
>
> - register_ioport_write(PCI_BASE, 8, 4, pcihotplug_write, &pci0_status);
> - register_ioport_read(PCI_BASE, 8, 4, pcihotplug_read, &pci0_status);
> + register_ioport_write(GPE_BASE, 4, 1, gpe_writeb, s);
> + register_ioport_read(GPE_BASE, 4, 1, gpe_readb, s);
> +
> + register_ioport_write(PCI_BASE, 8, 4, pcihotplug_write, s);
> + register_ioport_read(PCI_BASE, 8, 4, pcihotplug_read, s);
>
> register_ioport_write(PCI_EJ_BASE, 4, 4, pciej_write, bus);
> register_ioport_read(PCI_EJ_BASE, 4, 4, pciej_read, bus);
>
> - pci_bus_hotplug(bus, piix4_device_hotplug);
> + pci_bus_hotplug(bus, piix4_device_hotplug, hotplug_dev);
> }
>
> -static void enable_device(struct pci_status *p, struct gpe_regs *g, int slot)
> +static void enable_device(PIIX4PMState *s, int slot)
> {
> - g->sts |= 2;
> - p->up |= (1 << slot);
> + s->gpe.sts |= 2;
> + s->pci0_status.up |= (1 << slot);
> }
>
> -static void disable_device(struct pci_status *p, struct gpe_regs *g, int slot)
> +static void disable_device(PIIX4PMState *s, int slot)
> {
> - g->sts |= 2;
> - p->down |= (1 << slot);
> + s->gpe.sts |= 2;
> + s->pci0_status.down |= (1 << slot);
> }
>
> -static int piix4_device_hotplug(PCIDevice *dev, int state)
> +static int piix4_device_hotplug(PCIDevice *hotplug_dev, PCIDevice *dev,
> + int state)
> {
> - PIIX4PMState *s = container_of(dev, PIIX4PMState, dev);
> + PIIX4PMState *s = container_of(hotplug_dev, PIIX4PMState, dev);
> int slot = PCI_SLOT(dev->devfn);
>
> - pci0_status.up = 0;
> - pci0_status.down = 0;
> - if (state)
> - enable_device(&pci0_status, &gpe, slot);
> - else
> - disable_device(&pci0_status, &gpe, slot);
> - if (gpe.en & 2) {
> + s->pci0_status.up = 0;
> + s->pci0_status.down = 0;
> + if (state) {
> + enable_device(s, slot);
> + } else {
> + disable_device(s, slot);
> + }
> + if (s->gpe.en & 2) {
> qemu_set_irq(s->irq, 1);
> qemu_set_irq(s->irq, 0);
> }
> diff --git a/hw/pc.c b/hw/pc.c
> index db2b9a2..e41db68 100644
> --- a/hw/pc.c
> +++ b/hw/pc.c
> @@ -1046,7 +1046,6 @@ static void pc_init1(ram_addr_t ram_size,
> qdev_prop_set_ptr(eeprom, "data", eeprom_buf + (i * 256));
> qdev_init_nofail(eeprom);
> }
> - piix4_acpi_system_hot_add_init(pci_bus);
> }
>
> if (i440fx_state) {
> diff --git a/hw/pc.h b/hw/pc.h
> index d11a576..088937a 100644
> --- a/hw/pc.h
> +++ b/hw/pc.h
> @@ -94,7 +94,6 @@ i2c_bus *piix4_pm_init(PCIBus *bus, int devfn,
> uint32_t smb_io_base,
> qemu_irq sci_irq, qemu_irq cmos_s3, qemu_irq smi_irq,
> int kvm_enabled);
> void piix4_smbus_register_device(SMBusDevice *dev, uint8_t addr);
> -void piix4_acpi_system_hot_add_init(PCIBus *bus);
>
> /* hpet.c */
> extern int no_hpet;
> diff --git a/hw/pci.c b/hw/pci.c
> index f167436..9d19cb8 100644
> --- a/hw/pci.c
> +++ b/hw/pci.c
> @@ -42,6 +42,7 @@ struct PCIBus {
> pci_set_irq_fn set_irq;
> pci_map_irq_fn map_irq;
> pci_hotplug_fn hotplug;
> + PCIDevice *hotplug_dev;
> void *irq_opaque;
> PCIDevice *devices[256];
> PCIDevice *parent_dev;
> @@ -233,10 +234,12 @@ void pci_bus_irqs(PCIBus *bus, pci_set_irq_fn
> set_irq, pci_map_irq_fn map_irq,
> bus->irq_count = qemu_mallocz(nirq * sizeof(bus->irq_count[0]));
> }
>
> -void pci_bus_hotplug(PCIBus *bus, pci_hotplug_fn hotplug)
> +void pci_bus_hotplug(PCIBus *bus, pci_hotplug_fn hotplug,
> + PCIDevice *hotplug_dev)
> {
> bus->qbus.allow_hotplug = 1;
> bus->hotplug = hotplug;
> + bus->hotplug_dev = hotplug_dev;
> }
>
> void pci_bus_set_mem_base(PCIBus *bus, target_phys_addr_t base)
> @@ -1660,8 +1663,9 @@ static int pci_qdev_init(DeviceState *qdev,
> DeviceInfo *base)
> pci_dev->romfile = qemu_strdup(info->romfile);
> pci_add_option_rom(pci_dev);
>
> - if (qdev->hotplugged)
> - bus->hotplug(pci_dev, 1);
> + if (qdev->hotplugged) {
> + bus->hotplug(bus->hotplug_dev, pci_dev, 1);
> + }
> return 0;
> }
>
> @@ -1669,7 +1673,7 @@ static int pci_unplug_device(DeviceState *qdev)
> {
> PCIDevice *dev = DO_UPCAST(PCIDevice, qdev, qdev);
>
> - dev->bus->hotplug(dev, 0);
> + dev->bus->hotplug(dev->bus->hotplug_dev, dev, 0);
> return 0;
> }
>
> diff --git a/hw/pci.h b/hw/pci.h
> index 625188c..31e0438 100644
> --- a/hw/pci.h
> +++ b/hw/pci.h
> @@ -209,13 +209,15 @@ int pci_device_load(PCIDevice *s, QEMUFile *f);
>
> typedef void (*pci_set_irq_fn)(void *opaque, int irq_num, int level);
> typedef int (*pci_map_irq_fn)(PCIDevice *pci_dev, int irq_num);
> -typedef int (*pci_hotplug_fn)(PCIDevice *pci_dev, int state);
> +typedef int (*pci_hotplug_fn)(PCIDevice *hotplug_dev, PCIDevice *pci_dev,
> + int state);
> void pci_bus_new_inplace(PCIBus *bus, DeviceState *parent,
> const char *name, int devfn_min);
> PCIBus *pci_bus_new(DeviceState *parent, const char *name, int devfn_min);
> void pci_bus_irqs(PCIBus *bus, pci_set_irq_fn set_irq, pci_map_irq_fn map_irq,
> void *irq_opaque, int nirq);
> -void pci_bus_hotplug(PCIBus *bus, pci_hotplug_fn hotplug);
> +void pci_bus_hotplug(PCIBus *bus, pci_hotplug_fn hotplug,
> + PCIDevice *hotplug_dev);
> PCIBus *pci_register_bus(DeviceState *parent, const char *name,
> pci_set_irq_fn set_irq, pci_map_irq_fn map_irq,
> void *irq_opaque, int devfn_min, int nirq);
> --
> 1.6.2.4
>
--
yamahata
next prev parent reply other threads:[~2010-05-11 11:31 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-10 20:51 [Qemu-devel] [PATCH 2/2] acpi: remove static gpe and pci0_status variables Blue Swirl
2010-05-11 11:27 ` Isaku Yamahata [this message]
2010-05-11 20:48 ` Blue Swirl
2010-05-12 2:37 ` Isaku Yamahata
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=20100511112759.GD13338@valinux.co.jp \
--to=yamahata@valinux.co.jp \
--cc=aliguori@linux.vnet.ibm.com \
--cc=blauwirbel@gmail.com \
--cc=kraxel@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).