[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 2/2] ioemu: Enable guest OS to program D0-D3hot states of an assigned device



On Fri, 6 Feb 2009 16:20:55 +0000
Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> wrote:

> Yuji Shimada writes ("[Xen-devel] [PATCH 2/2] ioemu: Enable guest OS to 
> program D0-D3hot states of an assigned device"):
> > This patch enables guest OS to program D0-D3hot states of assigned
> > device.
> 
> I applied this patch but unfortunately it broke the automatic test
> (and thus the staging propagation) because our automatic test system
> has a very old version of libpci.  I have applied a band-aid - see
> below - but would you please review it and consider whether a
> different fix would be correct ?  For example, we might copy the
> definitions of PCI_ERR_* from the libpci headers into pass-through.h
> protected by an #ifdef, or something.

I think coping the definitions of PCI_ERR_* is better, because AER
registers should be saved and restored. The reason is BIOS might
configure AER registers to achieve system-specific requirement.

Actually, the same issue occurred with other registers. We have fixed the
issue, coping the definition from libpci to pass-through.h into
#ifndef/#endif section.

This is a example.

#ifndef PCI_MSI_FLAGS_MASK_BIT
/* interrupt masking & reporting supported */
#define PCI_MSI_FLAGS_MASK_BIT  0x0100
#endif

> Also, this logic is very very strange:
> 
> > +    int aer_size = 0x2c;
> > +
> > +    for (i=0; i < aer_size; i+=4)
> > +    {
> > +        switch (i) {
> > +        /* after reset, following register values should be restored.
> > +         * So, save them.
> > +         */
> > +        case PCI_ERR_UNCOR_MASK:
> > +        case PCI_ERR_UNCOR_SEVER:
> > +        case PCI_ERR_COR_MASK:
> > +        case PCI_ERR_CAP:
> > +            *(uint32_t*)(d->config + (aer_base + i))
> > +                 = pci_read_long(ptdev->pci_dev, (aer_base + i));
> > +            break;
> > +        default:
> > +            break;
> > +        }
> > +    }
> 
> What purpose does the loop serve ?  Is there an ordering constraint ?
> There are two copies of this construct, too - one in the save and one
> in the restore.  That duplication is rather unfortunate.

There is no ordering constraint. The purpose is only
saving/restoring the registers. Is there any good way to cleanup them?

Thanks,
--
Yuji Shimada

> Thanks,
> Ian.
> 
> commit b80fc65b715099ee28465f6571eb5242588ef246
> Author: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
> Date:   Fri Feb 6 16:16:06 2009 +0000
> 
>     hw/pass-through.c: workaround for old libpci
>     
>     Old versions of libpci (including the ones on the automatic tests
>     which control Xen staging propagation) do not define
>     PCI_LIB_VERSION or the PCI_ERR_{UNCOR_MASK,...} constants.
>     
>     This means that change 8c771eb6294afc5b3754a9e3de51568d4e5986c2 breaks
>     the build.  In this changeset I apply what is intended to be a
>     workaround for this problem but it may not be completely correct; this
>     is therefore perhaps an interim fix.
>     
>     The potential problem is that the save/restore of some PCI passthrough
>     error handling registers (across suspend/resume) may not work properly
>     with old versions of libpci.  However non-passthrough and non-suspect
>     use cases should now be fine.
>     
>     Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
> 
> diff --git a/hw/pass-through.c b/hw/pass-through.c
> index 8dfae3c..29714c7 100644
> --- a/hw/pass-through.c
> +++ b/hw/pass-through.c
> @@ -1503,7 +1503,7 @@ exit:
>  
>  static void pt_libpci_fixup(struct pci_dev *dev)
>  {
> -#if PCI_LIB_VERSION < 0x030100
> +#if !defined(PCI_LIB_VERSION) || PCI_LIB_VERSION < 0x030100
>      int i;
>      FILE *fp;
>      char path[PATH_MAX], buf[256];
> @@ -1850,6 +1850,7 @@ static void pt_aer_reg_save(struct pt_dev *ptdev)
>      /* Root Port and Root Complex Event Collector need size expansion */
>      int aer_size = 0x2c;
>  
> +#ifdef PCI_ERR_UNCOR_MASK
>      for (i=0; i < aer_size; i+=4)
>      {
>          switch (i) {
> @@ -1867,6 +1868,7 @@ static void pt_aer_reg_save(struct pt_dev *ptdev)
>              break;
>          }
>      }
> +#endif
>  }
>  
>  /* restore AER register */
> @@ -1879,6 +1881,7 @@ static void pt_aer_reg_restore(struct pt_dev *ptdev)
>      /* Root Port and Root Complex Event Collector need size expansion */
>      int aer_size = 0x2c;
>  
> +#ifdef PCI_ERR_UNCOR_MASK
>      for (i=0; i < aer_size; i+=4)
>      {
>          switch (i) {
> @@ -1899,6 +1902,7 @@ static void pt_aer_reg_restore(struct pt_dev *ptdev)
>              break;
>          }
>      }
> +#endif
>  }
>  
>  /* reset Interrupt and I/O resource  */

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.