From mboxrd@z Thu Jan 1 00:00:00 1970 From: Blue Swirl Subject: Re: [Qemu-devel] [PATCH RFC V3 05/12] piix_pci: Introduces Xen specific call for irq. Date: Fri, 17 Sep 2010 18:10:03 +0000 Message-ID: References: <1284722107-28550-1-git-send-email-anthony.perard@citrix.com> <1284722107-28550-6-git-send-email-anthony.perard@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Return-path: In-Reply-To: <1284722107-28550-6-git-send-email-anthony.perard@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: anthony.perard@citrix.com Cc: xen-devel@lists.xensource.com, qemu-devel@nongnu.org, Stefano Stabellini List-Id: xen-devel@lists.xenproject.org On Fri, Sep 17, 2010 at 11:15 AM, wrote: > From: Anthony PERARD > > 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 > Signed-off-by: Stefano Stabellini > --- > =C2=A0hw/piix_pci.c | =C2=A0 10 +++++++++- > =C2=A0hw/xen.h =C2=A0 =C2=A0 =C2=A0| =C2=A0 =C2=A06 ++++++ > =C2=A0xen-all.c =C2=A0 =C2=A0 | =C2=A0 29 +++++++++++++++++++++++++++++ > =C2=A0xen-stub.c =C2=A0 =C2=A0| =C2=A0 13 +++++++++++++ > =C2=A04 files changed, 57 insertions(+), 1 deletions(-) > > diff --git a/hw/piix_pci.c b/hw/piix_pci.c > index f152a0f..41a342f 100644 > --- a/hw/piix_pci.c > +++ b/hw/piix_pci.c > @@ -28,6 +28,7 @@ > =C2=A0#include "pci_host.h" > =C2=A0#include "isa.h" > =C2=A0#include "sysbus.h" > +#include "xen.h" > > =C2=A0/* > =C2=A0* I440FX chipset data sheet. > @@ -142,6 +143,9 @@ static void i440fx_write_config(PCIDevice *dev, > =C2=A0{ > =C2=A0 =C2=A0 PCII440FXState *d =3D DO_UPCAST(PCII440FXState, dev, dev); > > + =C2=A0 =C2=A0if (xen_enabled()) braces > + =C2=A0 =C2=A0 =C2=A0 =C2=A0xen_piix_pci_write_config_client(address, va= l, len); > + > =C2=A0 =C2=A0 /* XXX: implement SMRAM.D_LOCK */ > =C2=A0 =C2=A0 pci_default_write_config(dev, address, val, len); > =C2=A0 =C2=A0 if (ranges_overlap(address, len, I440FX_PAM, I440FX_PAM_SIZ= E) || > @@ -235,7 +239,11 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state, = int *piix3_devfn, qemu_irq * > =C2=A0 =C2=A0 piix3 =3D DO_UPCAST(PIIX3State, dev, > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 pci_create_simple_multifunction(b, -1, true, "PIIX3")); > =C2=A0 =C2=A0 piix3->pic =3D pic; > - =C2=A0 =C2=A0pci_bus_irqs(b, piix3_set_irq, pci_slot_get_pirq, piix3, 4= ); > + =C2=A0 =C2=A0if (xen_enabled()) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0pci_bus_irqs(b, xen_piix3_set_irq, xen_pci_s= lot_get_pirq, piix3, 4); > + =C2=A0 =C2=A0} else { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0pci_bus_irqs(b, piix3_set_irq, pci_slot_get_= pirq, piix3, 4); > + =C2=A0 =C2=A0} > =C2=A0 =C2=A0 (*pi440fx_state)->piix3 =3D piix3; > > =C2=A0 =C2=A0 *piix3_devfn =3D piix3->dev.devfn; > diff --git a/hw/xen.h b/hw/xen.h > index 14bbb6e..c5189b1 100644 > --- a/hw/xen.h > +++ b/hw/xen.h > @@ -8,6 +8,8 @@ > =C2=A0*/ > =C2=A0#include > > +#include "qemu-common.h" > + > =C2=A0/* xen-machine.c */ > =C2=A0enum xen_mode { > =C2=A0 =C2=A0 XEN_EMULATE =3D 0, =C2=A0// xen emulation, using xenner (de= fault) > @@ -26,6 +28,10 @@ extern int xen_allowed; > =C2=A0#define xen_enabled() (0) > =C2=A0#endif > > +int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num); > +void xen_piix3_set_irq(void *opaque, int irq_num, int level); > +void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, in= t len); > + > =C2=A0int xen_init(int smp_cpus); > > =C2=A0#endif /* QEMU_HW_XEN_H */ > diff --git a/xen-all.c b/xen-all.c > index f505563..948e439 100644 > --- a/xen-all.c > +++ b/xen-all.c > @@ -8,9 +8,38 @@ > > =C2=A0#include "config.h" > > +#include "hw/pci.h" > =C2=A0#include "hw/xen_common.h" > =C2=A0#include "hw/xen_backend.h" > > +/* Xen specific function for piix pci */ > + > +int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num) > +{ > + =C2=A0 =C2=A0return irq_num + ((pci_dev->devfn >> 3) << 2); > +} > + > +void xen_piix3_set_irq(void *opaque, int irq_num, int level) > +{ > + =C2=A0 =C2=A0xc_hvm_set_pci_intx_level(xen_xc, xen_domid, 0, 0, irq_num= >> 2, > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0irq_num & 3, level); > +} > + > +void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, in= t len) address should be target_phys_addr_t. > +{ > + =C2=A0 =C2=A0int i; > + > + =C2=A0 =C2=A0/* Scan for updates to PCI link routes (0x60-0x63). */ > + =C2=A0 =C2=A0for (i =3D 0; i < len; i++) { > + =C2=A0 =C2=A0 =C2=A0 =C2=A0uint8_t v =3D (val >> (8*i)) & 0xff; Please add spaces around '*'. > + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (v & 0x80) braces > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0v =3D 0; > + =C2=A0 =C2=A0 =C2=A0 =C2=A0v &=3D 0xf; > + =C2=A0 =C2=A0 =C2=A0 =C2=A0if (((address+i) >=3D 0x60) && ((address+i) = <=3D 0x63)) Braces and spaces around '+'. > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0xc_hvm_set_pci_link_route(xen_= xc, xen_domid, address + i - 0x60, v); > + =C2=A0 =C2=A0} > +} > + > =C2=A0/* Initialise Xen */ > > =C2=A0int xen_init(int smp_cpus) > diff --git a/xen-stub.c b/xen-stub.c > index 0fa9c51..07e64bc 100644 > --- a/xen-stub.c > +++ b/xen-stub.c > @@ -11,6 +11,19 @@ > =C2=A0#include "qemu-common.h" > =C2=A0#include "hw/xen.h" > > +int xen_pci_slot_get_pirq(PCIDevice *pci_dev, int irq_num) > +{ > + =C2=A0 =C2=A0return -1; > +} > + > +void xen_piix3_set_irq(void *opaque, int irq_num, int level) > +{ > +} > + > +void xen_piix_pci_write_config_client(uint32_t address, uint32_t val, in= t len) Also here the address should be target_phys_addr_t.