[Qemu-devel] [PATCH v2 00/13] piix_pci cleanup

From:

Juan Quintela

Subject:

[Qemu-devel] [PATCH v2 00/13] piix_pci cleanup

Date:

Mon, 24 Aug 2009 16:16:45 +0200

Hi
v2:
- bit the bullet, change irq_opaque to void *, instead of qemu_irq *
that allows us to pass anything there.
- Rearrange piix_pci to be able to add piix3_dev to the irq_state
- Once rearrangmente is fixed, make sane SaveVM *_load/_save() functions.
We can still load old state, but we only write the sane one.
mips_malta can do a similar cleanup, it is not difficult to do. But I can't
test it.
About irq_state in i440fx_init(). It would have been easier, if there were a
way to create i440FX-pcihost giving it the already allocated variable.
Basically:
pci_bus = pci_register_bus() -> needs irq_state
i440fx = pci_create_simple(pci_bus, ..) -> needs pci_bus
piix3 = pci_create_simple (pci_bus, ...) -> needs pci_bus
irq_state -> needs piix3
We have a nice circular dependency here. to fix it, I just create an empty
irq_state, passed it to pci_register_bus() and fill it later.
It would have been a bit cleaner if there were a finction like
i440fx = pci_create_simple_here(..., &i440fx).
Later, Juan.
v1:
- split piix4 from piix_pci. The only shared code where piix_save/load, i.e.
almost nothing. Once there, compile piix4.o only for mips (it was not used
anywhere else).
- Move global variables to PCII440FXState. Nice and clean until....
- pci_irq_levels: This is great:
* it is saved/loaded from i440fx
* it is cleaned during reset in piix3
* it is used in piix3_set_irq, that don't receive neither i440fx nor
piix state, it needs to be a global variable. (created a global link
until a better solution appear).
I looked where to "hide" pci_irq_levels and piix3_dev (both needed in
piix3_set_irq), and didn't found where to pass them, out of:
- hack i8259 to hide it into PicState2 (that one got passed through the pic)
ugly for words, but will work
- try to add <something> at setup_irq time, but at that point we have:
* opaque -> pci_dev of device that we are working with
* from there we can get to the bus that the device is attached to,
but no way to go from there to the Host bridge (that is what we wanted
in the 1st place)
Later, Juan.
*** BLURB HERE ***
Juan Quintela (13):
piix4 don't use pci_irq_levels at all
Split piix4 support from piix_pci.c
low_set_irq is not used anywhere
Use PCII440FXState instead of generic PCIDevice
Move smm_enabled and isa_memory_mappings to PCII440FXState
We want the argument pass to set_irq to be opaque
Create PIIX3State instead of using PCIDevice for PIIX3
Introduce PIIX3IrqState for piix3 irq's state
Fold piix3_init() intto i440fx_init
We can add piix3_dev now to PIIX3IrqState
Save irq_state into PCII440FXState
pci_irq_levels[] belong to PIIX3State
Update SaveVM versions
Makefile.target | 2 +-
hw/apb_pci.c | 4 +-
hw/grackle_pci.c | 4 +-
hw/gt64xxx.c | 3 +-
hw/pc.c | 5 +-
hw/pc.h | 11 ++-
hw/pci.c | 8 +-
hw/pci.h | 6 +-
hw/piix4.c | 127 +++++++++++++++++++++++++++
hw/piix_pci.c | 246 +++++++++++++++++++++-------------------------------
hw/ppc4xx_pci.c | 4 +-
hw/ppce500_pci.c | 4 +-
hw/prep_pci.c | 4 +-
hw/r2d.c | 4 +-
hw/sh_pci.c | 4 +-
hw/unin_pci.c | 4 +-
hw/versatile_pci.c | 4 +-
17 files changed, 270 insertions(+), 174 deletions(-)
create mode 100644 hw/piix4.c