From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jeremy Fitzhardinge Subject: Re: [PATCH] [pv-ops] fix dom0 S3 when MSI is used. Date: Thu, 18 Mar 2010 18:03:15 -0700 Message-ID: <4BA2CD53.5090109@goop.org> References: <4FA716B1526C7C4DB0375C6DADBC4EA342A7A7E951@LONPMAILBOX01.citrite.net> <4FA716B1526C7C4DB0375C6DADBC4EA342A7A7E95E@LONPMAILBOX01.citrite.net> <4B182D87.6030901@goop.org> <4B187513.80003@goop.org> <4B200727.8040000@goop.org> <1260436078.23698.45463.camel@zakaz.uk.xensource.com> <4B2135CC.6000004@goop.org> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: "Cui, Dexuan" Cc: "xen-devel@lists.xensource.com" List-Id: xen-devel@lists.xenproject.org On 03/17/2010 01:46 AM, Cui, Dexuan wrote: > The old commit a234848f works only when the device supports D3hot; when the > device only supports D3cold, the device doesn't work properly after resuming > from Dom0 S3. > What branches should I apply this to? Both 2.6.31 and .32, or just .32? > A better workaround is invoking the PHYSDEVOP_restore_msi hypercall. > The patch reverts the old commit and invokes the hypercall. > Is this a new hypercall? Aside from that, it looks fine as a stopgap until we do MSI properly. Thanks, J > Signed-off-by: Dexuan Cui > > diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c > index b40c6d0..c6bffe2 100644 > --- a/drivers/pci/msi.c > +++ b/drivers/pci/msi.c > @@ -20,6 +20,7 @@ > #include > #include > > +#include > #include > > #include "pci.h" > @@ -271,8 +272,7 @@ void write_msi_msg(unsigned int irq, struct msi_msg *msg) > { > struct irq_desc *desc = irq_to_desc(irq); > > - if (!xen_initial_domain()) > - write_msi_msg_desc(desc, msg); > + write_msi_msg_desc(desc, msg); > } > > static int msi_free_irqs(struct pci_dev* dev); > @@ -347,6 +347,20 @@ static void __pci_restore_msix_state(struct pci_dev *dev) > > void pci_restore_msi_state(struct pci_dev *dev) > { > + if (xen_initial_domain()) { > + struct physdev_restore_msi physdev; > + > + if (!dev->msi_enabled&& !dev->msix_enabled) > + return; > + > + pci_intx_for_msi(dev, 0); > + > + physdev.bus = dev->bus->number; > + physdev.devfn = dev->devfn; > + HYPERVISOR_physdev_op(PHYSDEVOP_restore_msi,&physdev); > + > + return; > + } > __pci_restore_msi_state(dev); > __pci_restore_msix_state(dev); > } > diff --git a/include/xen/interface/physdev.h b/include/xen/interface/physdev.h > index ac5de37..516d2b4 100644 > --- a/include/xen/interface/physdev.h > +++ b/include/xen/interface/physdev.h > @@ -144,6 +144,13 @@ struct physdev_manage_pci { > uint8_t devfn; > }; > > +#define PHYSDEVOP_restore_msi 19 > +struct physdev_restore_msi { > + /* IN */ > + uint8_t bus; > + uint8_t devfn; > +}; > + > #define PHYSDEVOP_manage_pci_add_ext 20 > struct physdev_manage_pci_ext { > /* IN */ >