On Mon, Aug 23, 2010 at 10:50:49AM +0100, stefano.stabellini@xxxxxxxxxxxxx
wrote:
> From: Anthony PERARD <anthony.perard@xxxxxxxxxx>
>
> This patch introduces Xen specific call in piix_pci.
>
> The specific part for Xen is in write_config, set_irq and get_pirq.
>
> Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>
> Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> ---
> hw/piix_pci.c | 19 ++++++++++++++++---
> hw/xen.h | 3 +++
> xen-all.c | 25 +++++++++++++++++++++++++
> xen-stub.c | 9 +++++++++
> 4 files changed, 53 insertions(+), 3 deletions(-)
>
> diff --git a/hw/piix_pci.c b/hw/piix_pci.c
> index f152a0f..994057f 100644
> --- a/hw/piix_pci.c
> +++ b/hw/piix_pci.c
> @@ -28,6 +28,7 @@
> #include "pci_host.h"
> #include "isa.h"
> #include "sysbus.h"
> +#include "xen.h"
>
> /*
> * I440FX chipset data sheet.
> @@ -61,9 +62,13 @@ static void piix3_set_irq(void *opaque, int irq_num, int
> level);
> mapping. */
> static int pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num)
> {
> - int slot_addend;
> - slot_addend = (pci_dev->devfn >> 3) - 1;
> - return (irq_num + slot_addend) & 3;
> + if (!xen_enabled()) {
> + int slot_addend;
> + slot_addend = (pci_dev->devfn >> 3) - 1;
> + return (irq_num + slot_addend) & 3;
> + } else {
> + return irq_num + ((pci_dev->devfn >> 3) << 2);
> + }
> }
>
> static void update_pam(PCII440FXState *d, uint32_t start, uint32_t end, int
> r)
pci_slot_get_pirq() is passed to pci_bus_irqs() in i440fx_init().
It would be better to pass xen specific function to pci_bus_irqs() instead of
dynamic check.
> @@ -142,6 +147,9 @@ static void i440fx_write_config(PCIDevice *dev,
> {
> PCII440FXState *d = DO_UPCAST(PCII440FXState, dev, dev);
>
> + if (xen_enabled())
> + xen_piix_pci_write_config_client(address, val, len);
> +
> /* XXX: implement SMRAM.D_LOCK */
> pci_default_write_config(dev, address, val, len);
> if (ranges_overlap(address, len, I440FX_PAM, I440FX_PAM_SIZE) ||
Maybe do we want another PCIDeviceInfo whose difference is .write_config?
I'm not sure which is better, though.
> @@ -255,6 +263,11 @@ static void piix3_set_irq(void *opaque, int irq_num, int
> level)
> int i, pic_irq, pic_level;
> PIIX3State *piix3 = opaque;
>
> + if (xen_enabled()) {
> + xen_piix3_set_irq(irq_num, level);
> + return;
> + }
> +
> piix3->pci_irq_levels[irq_num] = level;
Ditto. Pass xen_piix3_set_irq() to pci_bus_irqs()?
thanks,
>
> /* now we change the pic irq level according to the piix irq mappings */
> diff --git a/hw/xen.h b/hw/xen.h
> index f1d01d3..77012c2 100644
> --- a/hw/xen.h
> +++ b/hw/xen.h
> @@ -26,4 +26,7 @@ extern int xen_allowed;
> #define xen_enabled() (0)
> #endif
>
> +void xen_piix3_set_irq(int irq_num, int level);
> +void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int
> len);
> +
> #endif /* QEMU_HW_XEN_H */
> diff --git a/xen-all.c b/xen-all.c
> index e69de29..2d789ad 100644
> --- a/xen-all.c
> +++ b/xen-all.c
> @@ -0,0 +1,25 @@
> +#include "config.h"
> +
> +#include "hw/xen.h"
> +#include "hw/xen_backend.h"
> +
> +void xen_piix3_set_irq(int irq_num, int level)
> +{
> + xc_hvm_set_pci_intx_level(xen_xc, xen_domid, 0, 0, irq_num >> 2,
> + irq_num & 3, level);
> +}
> +
> +void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int
> len)
> +{
> + int i;
> +
> + /* Scan for updates to PCI link routes (0x60-0x63). */
> + for (i = 0; i < len; i++) {
> + uint8_t v = (val >> (8*i)) & 0xff;
> + if (v & 0x80)
> + v = 0;
> + v &= 0xf;
> + if (((address+i) >= 0x60) && ((address+i) <= 0x63))
> + xc_hvm_set_pci_link_route(xen_xc, xen_domid, address + i - 0x60,
> v);
> + }
> +}
> diff --git a/xen-stub.c b/xen-stub.c
> index e69de29..38c64cf 100644
> --- a/xen-stub.c
> +++ b/xen-stub.c
> @@ -0,0 +1,9 @@
> +#include "hw/xen.h"
> +
> +void xen_piix3_set_irq(int irq_num, int level)
> +{
> +}
> +
> +void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, int
> len)
> +{
> +}
> --
> 1.7.0.4
>
>
--
yamahata
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|