All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 1/1] xhci PCIe endpoint migration compatibility fix
@ 2014-09-09 10:19 Dr. David Alan Gilbert (git)
  2014-09-09 13:14 ` Michael S. Tsirkin
  0 siblings, 1 reply; 2+ messages in thread
From: Dr. David Alan Gilbert (git) @ 2014-09-09 10:19 UTC (permalink / raw)
  To: qemu-devel; +Cc: amit.shah, mst, kraxel, quintela

From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>

Add back the PCIe config capabilities on XHCI cards in non-PCIe slots,
but only for machine types before 2.1.

This fixes a migration incompatibility in the XHCI PCI devices
caused by:
   058fdcf52cdbf57b67e7 - xhci: add endpoint cap on express bus only

Note that in fixing it for compatibility with older QEMUs, it breaks
compatibility with existing QEMU 2.1's on older machine types.

The status before this patch was (if it used an XHCI adapter):
   machine type | source qemu
     any           pre-2.1     - FAIL
     any           2.1...      - PASS

With this patch:
   machine type | source qemu
     any           pre-2.1    - PASS
     pre-2.1       2.1...     - FAIL
     2.1           2.1...     - PASS

A test to trigger it is to add '-device nec-usb-xhci,id=xhci,addr=0x12'
to the command line.

Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
---
 hw/usb/hcd-xhci.c    | 6 +++++-
 include/hw/i386/pc.h | 5 +++++
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
index bbe4c5f..73ced1f 100644
--- a/hw/usb/hcd-xhci.c
+++ b/hw/usb/hcd-xhci.c
@@ -499,6 +499,7 @@ enum xhci_flags {
     XHCI_FLAG_USE_MSI = 1,
     XHCI_FLAG_USE_MSI_X,
     XHCI_FLAG_SS_FIRST,
+    XHCI_FLAG_FORCE_PCIE_ENDCAP,
 };
 
 static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid,
@@ -3626,7 +3627,8 @@ static int usb_xhci_initfn(struct PCIDevice *dev)
                      PCI_BASE_ADDRESS_SPACE_MEMORY|PCI_BASE_ADDRESS_MEM_TYPE_64,
                      &xhci->mem);
 
-    if (pci_bus_is_express(dev->bus)) {
+    if (pci_bus_is_express(dev->bus) ||
+        xhci_get_flag(xhci, XHCI_FLAG_FORCE_PCIE_ENDCAP)) {
         ret = pcie_endpoint_cap_init(dev, 0xa0);
         assert(ret >= 0);
     }
@@ -3855,6 +3857,8 @@ static Property xhci_properties[] = {
     DEFINE_PROP_BIT("msix",     XHCIState, flags, XHCI_FLAG_USE_MSI_X, true),
     DEFINE_PROP_BIT("superspeed-ports-first",
                     XHCIState, flags, XHCI_FLAG_SS_FIRST, true),
+    DEFINE_PROP_BIT("force-pcie-endcap", XHCIState, flags,
+                    XHCI_FLAG_FORCE_PCIE_ENDCAP, false),
     DEFINE_PROP_UINT32("intrs", XHCIState, numintrs, MAXINTRS),
     DEFINE_PROP_UINT32("slots", XHCIState, numslots, MAXSLOTS),
     DEFINE_PROP_UINT32("p2",    XHCIState, numports_2, 4),
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index a39cb42..77316d5 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -330,6 +330,11 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
             .value    = "off",\
         },\
         {\
+            .driver   = "nec-usb-xhci",\
+            .property = "force-pcie-endcap",\
+            .value    = "on",\
+        },\
+        {\
             .driver   = "pci-serial",\
             .property = "prog_if",\
             .value    = stringify(0),\
-- 
1.9.3

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [Qemu-devel] [PATCH 1/1] xhci PCIe endpoint migration compatibility fix
  2014-09-09 10:19 [Qemu-devel] [PATCH 1/1] xhci PCIe endpoint migration compatibility fix Dr. David Alan Gilbert (git)
@ 2014-09-09 13:14 ` Michael S. Tsirkin
  0 siblings, 0 replies; 2+ messages in thread
From: Michael S. Tsirkin @ 2014-09-09 13:14 UTC (permalink / raw)
  To: Dr. David Alan Gilbert (git)
  Cc: amit.shah, qemu-stable, quintela, qemu-devel, kraxel

On Tue, Sep 09, 2014 at 11:19:43AM +0100, Dr. David Alan Gilbert (git) wrote:
> From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
> 
> Add back the PCIe config capabilities on XHCI cards in non-PCIe slots,
> but only for machine types before 2.1.

You can clear cmask for these bits to at least
make it work one way.

> This fixes a migration incompatibility in the XHCI PCI devices
> caused by:
>    058fdcf52cdbf57b67e7 - xhci: add endpoint cap on express bus only
> 
> Note that in fixing it for compatibility with older QEMUs, it breaks
> compatibility with existing QEMU 2.1's on older machine types.
> 
> The status before this patch was (if it used an XHCI adapter):
>    machine type | source qemu
>      any           pre-2.1     - FAIL
>      any           2.1...      - PASS
> 
> With this patch:
>    machine type | source qemu
>      any           pre-2.1    - PASS
>      pre-2.1       2.1...     - FAIL
>      2.1           2.1...     - PASS
> 
> A test to trigger it is to add '-device nec-usb-xhci,id=xhci,addr=0x12'
> to the command line.
>
> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>

Cc: qemu-stable@nongnu.org
Acked-by: Michael S. Tsirkin <mst@redhat.com>

> ---
>  hw/usb/hcd-xhci.c    | 6 +++++-
>  include/hw/i386/pc.h | 5 +++++
>  2 files changed, 10 insertions(+), 1 deletion(-)
> 
> diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
> index bbe4c5f..73ced1f 100644
> --- a/hw/usb/hcd-xhci.c
> +++ b/hw/usb/hcd-xhci.c
> @@ -499,6 +499,7 @@ enum xhci_flags {
>      XHCI_FLAG_USE_MSI = 1,
>      XHCI_FLAG_USE_MSI_X,
>      XHCI_FLAG_SS_FIRST,
> +    XHCI_FLAG_FORCE_PCIE_ENDCAP,
>  };
>  
>  static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid,
> @@ -3626,7 +3627,8 @@ static int usb_xhci_initfn(struct PCIDevice *dev)
>                       PCI_BASE_ADDRESS_SPACE_MEMORY|PCI_BASE_ADDRESS_MEM_TYPE_64,
>                       &xhci->mem);
>  
> -    if (pci_bus_is_express(dev->bus)) {
> +    if (pci_bus_is_express(dev->bus) ||
> +        xhci_get_flag(xhci, XHCI_FLAG_FORCE_PCIE_ENDCAP)) {
>          ret = pcie_endpoint_cap_init(dev, 0xa0);
>          assert(ret >= 0);
>      }
> @@ -3855,6 +3857,8 @@ static Property xhci_properties[] = {
>      DEFINE_PROP_BIT("msix",     XHCIState, flags, XHCI_FLAG_USE_MSI_X, true),
>      DEFINE_PROP_BIT("superspeed-ports-first",
>                      XHCIState, flags, XHCI_FLAG_SS_FIRST, true),
> +    DEFINE_PROP_BIT("force-pcie-endcap", XHCIState, flags,
> +                    XHCI_FLAG_FORCE_PCIE_ENDCAP, false),
>      DEFINE_PROP_UINT32("intrs", XHCIState, numintrs, MAXINTRS),
>      DEFINE_PROP_UINT32("slots", XHCIState, numslots, MAXSLOTS),
>      DEFINE_PROP_UINT32("p2",    XHCIState, numports_2, 4),
> diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
> index a39cb42..77316d5 100644
> --- a/include/hw/i386/pc.h
> +++ b/include/hw/i386/pc.h
> @@ -330,6 +330,11 @@ bool e820_get_entry(int, uint32_t, uint64_t *, uint64_t *);
>              .value    = "off",\
>          },\
>          {\
> +            .driver   = "nec-usb-xhci",\
> +            .property = "force-pcie-endcap",\
> +            .value    = "on",\
> +        },\
> +        {\
>              .driver   = "pci-serial",\
>              .property = "prog_if",\
>              .value    = stringify(0),\
> -- 
> 1.9.3

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2014-09-09 13:11 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-09-09 10:19 [Qemu-devel] [PATCH 1/1] xhci PCIe endpoint migration compatibility fix Dr. David Alan Gilbert (git)
2014-09-09 13:14 ` Michael S. Tsirkin

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.