qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Gerd Hoffmann <kraxel@redhat.com>,
	qemu-stable@nongnu.org,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Marcel Apfelbaum <marcel@redhat.com>
Subject: [Qemu-devel] [PULL 01/41] pcie: fix link active status bit migration
Date: Fri, 29 Jul 2016 06:14:58 +0300	[thread overview]
Message-ID: <1469762011-7902-2-git-send-email-mst@redhat.com> (raw)
In-Reply-To: <1469762011-7902-1-git-send-email-mst@redhat.com>

We changed link status register in pci express endpoint capability
over time. Specifically,

commit b2101eae63ea57b571cee4a9075a4287d24ba4a4 ("pcie: Set the "link
active" in the link status register") set data link layer link active
bit in this register without adding compatibility to old machine types.

When migrating from qemu 2.3 and older this affects xhci devices which
under machine type 2.0 and older have a pci express endpoint capability
even if they are on a pci bus.

Add compatibility flags to make this bit value match what it was under
2.3.

Additionally, to avoid breaking migration from qemu 2.3 and up,
suppress checking link status during migration: this seems sane
since hardware can change link status at any time.

https://bugzilla.redhat.com/show_bug.cgi?id=1352860

Reported-by: Gerd Hoffmann <kraxel@redhat.com>
Fixes: b2101eae63ea57b571cee4a9075a4287d24ba4a4
    ("pcie: Set the "link active" in the link status register")
Cc: qemu-stable@nongnu.org
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/hw/compat.h  |  4 ++++
 include/hw/pci/pci.h |  3 +++
 hw/pci/pci.c         |  2 ++
 hw/pci/pcie.c        | 24 ++++++++++++++++++------
 4 files changed, 27 insertions(+), 6 deletions(-)

diff --git a/include/hw/compat.h b/include/hw/compat.h
index 9914e7a..e5113dc 100644
--- a/include/hw/compat.h
+++ b/include/hw/compat.h
@@ -80,6 +80,10 @@
         .driver   = "virtio-rng-pci",\
         .property = "any_layout",\
         .value    = "off",\
+    },{\
+        .driver   = TYPE_PCI_DEVICE,\
+        .property = "x-pcie-lnksta-dllla",\
+        .value    = "off",\
     },
 
 #define HW_COMPAT_2_2 \
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
index 74d797d..929ec2f 100644
--- a/include/hw/pci/pci.h
+++ b/include/hw/pci/pci.h
@@ -174,6 +174,9 @@ enum {
     /* PCI Express capability - Power Controller Present */
 #define QEMU_PCIE_SLTCAP_PCP_BITNR 7
     QEMU_PCIE_SLTCAP_PCP = (1 << QEMU_PCIE_SLTCAP_PCP_BITNR),
+    /* Link active status in endpoint capability is always set */
+#define QEMU_PCIE_LNKSTA_DLLLA_BITNR 8
+    QEMU_PCIE_LNKSTA_DLLLA = (1 << QEMU_PCIE_LNKSTA_DLLLA_BITNR),
 };
 
 #define TYPE_PCI_DEVICE "pci-device"
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index 728c6d4..24fae16 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -62,6 +62,8 @@ static Property pci_props[] = {
                     QEMU_PCI_CAP_MULTIFUNCTION_BITNR, false),
     DEFINE_PROP_BIT("command_serr_enable", PCIDevice, cap_present,
                     QEMU_PCI_CAP_SERR_BITNR, true),
+    DEFINE_PROP_BIT("x-pcie-lnksta-dllla", PCIDevice, cap_present,
+                    QEMU_PCIE_LNKSTA_DLLLA_BITNR, true),
     DEFINE_PROP_END_OF_LIST()
 };
 
diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c
index 9599fde..99cfb45 100644
--- a/hw/pci/pcie.c
+++ b/hw/pci/pcie.c
@@ -45,8 +45,11 @@
  */
 
 static void
-pcie_cap_v1_fill(uint8_t *exp_cap, uint8_t port, uint8_t type, uint8_t version)
+pcie_cap_v1_fill(PCIDevice *dev, uint8_t port, uint8_t type, uint8_t version)
 {
+    uint8_t *exp_cap = dev->config + dev->exp.exp_cap;
+    uint8_t *cmask = dev->cmask + dev->exp.exp_cap;
+
     /* capability register
     interrupt message number defaults to 0 */
     pci_set_word(exp_cap + PCI_EXP_FLAGS,
@@ -69,7 +72,18 @@ pcie_cap_v1_fill(uint8_t *exp_cap, uint8_t port, uint8_t type, uint8_t version)
                  PCI_EXP_LNK_LS_25);
 
     pci_set_word(exp_cap + PCI_EXP_LNKSTA,
-                 PCI_EXP_LNK_MLW_1 | PCI_EXP_LNK_LS_25 |PCI_EXP_LNKSTA_DLLLA);
+                 PCI_EXP_LNK_MLW_1 | PCI_EXP_LNK_LS_25);
+
+    if (dev->cap_present & QEMU_PCIE_LNKSTA_DLLLA) {
+        pci_word_test_and_set_mask(exp_cap + PCI_EXP_LNKSTA,
+                                   PCI_EXP_LNKSTA_DLLLA);
+    }
+
+    /* We changed link status bits over time, and changing them across
+     * migrations is generally fine as hardware changes them too.
+     * Let's not bother checking.
+     */
+    pci_set_word(cmask + PCI_EXP_LNKSTA, 0);
 }
 
 int pcie_cap_init(PCIDevice *dev, uint8_t offset, uint8_t type, uint8_t port)
@@ -88,7 +102,7 @@ int pcie_cap_init(PCIDevice *dev, uint8_t offset, uint8_t type, uint8_t port)
     exp_cap = dev->config + pos;
 
     /* Filling values common with v1 */
-    pcie_cap_v1_fill(exp_cap, port, type, PCI_EXP_FLAGS_VER2);
+    pcie_cap_v1_fill(dev, port, type, PCI_EXP_FLAGS_VER2);
 
     /* Filling v2 specific values */
     pci_set_long(exp_cap + PCI_EXP_DEVCAP2,
@@ -103,7 +117,6 @@ int pcie_cap_v1_init(PCIDevice *dev, uint8_t offset, uint8_t type,
 {
     /* PCIe cap v1 init */
     int pos;
-    uint8_t *exp_cap;
 
     assert(pci_is_express(dev));
 
@@ -112,9 +125,8 @@ int pcie_cap_v1_init(PCIDevice *dev, uint8_t offset, uint8_t type,
         return pos;
     }
     dev->exp.exp_cap = pos;
-    exp_cap = dev->config + pos;
 
-    pcie_cap_v1_fill(exp_cap, port, type, PCI_EXP_FLAGS_VER1);
+    pcie_cap_v1_fill(dev, port, type, PCI_EXP_FLAGS_VER1);
 
     return pos;
 }
-- 
MST

  reply	other threads:[~2016-07-29  3:15 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-29  3:14 [Qemu-devel] [PULL 00/41] pc, pci, virtio: cleanups, fixes Michael S. Tsirkin
2016-07-29  3:14 ` Michael S. Tsirkin [this message]
2016-07-29  3:15 ` [Qemu-devel] [PULL 02/41] hw/pcie-root-port: Fix PCIe root port initialization Michael S. Tsirkin
2016-07-29  3:15 ` [Qemu-devel] [PULL 03/41] hw/pxb: declare pxb devices as not hot-pluggable Michael S. Tsirkin
2016-07-29  3:15 ` [Qemu-devel] [PULL 04/41] hw/acpi: fix a DSDT table issue when a pxb is present Michael S. Tsirkin
2016-07-29  3:15 ` [Qemu-devel] [PULL 05/41] acpi: refactor pxb crs computation Michael S. Tsirkin
2016-07-29  3:15 ` [Qemu-devel] [PULL 06/41] hw/apci: handle 64-bit MMIO regions correctly Michael S. Tsirkin
2016-07-29  3:15 ` [Qemu-devel] [PULL 07/41] hw/pci-bridge: Convert pxb initialization functions to Error Michael S. Tsirkin
2016-07-29  3:15 ` [Qemu-devel] [PULL 08/41] apb: convert init to realize Michael S. Tsirkin
2016-07-29  3:15 ` [Qemu-devel] [PULL 09/41] hw/virtio-pci: fix virtio behaviour Michael S. Tsirkin
2016-07-29  3:15 ` [Qemu-devel] [PULL 10/41] virtio: check vring descriptor buffer length Michael S. Tsirkin
2016-07-29  3:15 ` [Qemu-devel] [PULL 11/41] misc: indentation Michael S. Tsirkin
2016-07-29  3:15 ` [Qemu-devel] [PULL 12/41] vhost-user: minor simplification Michael S. Tsirkin
2016-07-29  3:15 ` [Qemu-devel] [PULL 13/41] vhost-user: disconnect on HUP Michael S. Tsirkin
2016-07-29  3:15 ` [Qemu-devel] [PULL 14/41] vhost: don't assume opaque is a fd, use backend cleanup Michael S. Tsirkin
2016-07-29  3:15 ` [Qemu-devel] [PULL 15/41] vhost: make vhost_log_put() idempotent Michael S. Tsirkin
2016-07-29  3:16 ` [Qemu-devel] [PULL 16/41] vhost: assert the log was cleaned up Michael S. Tsirkin
2016-07-29  3:16 ` [Qemu-devel] [PULL 17/41] vhost: fix cleanup on not fully initialized device Michael S. Tsirkin
2016-07-29  3:16 ` [Qemu-devel] [PULL 18/41] vhost: make vhost_dev_cleanup() idempotent Michael S. Tsirkin
2016-07-29  3:16 ` [Qemu-devel] [PULL 19/41] vhost-net: always call vhost_dev_cleanup() on failure Michael S. Tsirkin
2016-07-29  3:16 ` [Qemu-devel] [PULL 20/41] vhost: fix calling vhost_dev_cleanup() after vhost_dev_init() Michael S. Tsirkin
2016-07-29  3:16 ` [Qemu-devel] [PULL 21/41] vhost: do not assert() on vhost_ops failure Michael S. Tsirkin
2016-07-29  3:16 ` [Qemu-devel] [PULL 22/41] vhost: add missing VHOST_OPS_DEBUG Michael S. Tsirkin
2016-07-29  3:16 ` [Qemu-devel] [PULL 23/41] vhost: use error_report() instead of fprintf(stderr, ...) Michael S. Tsirkin
2016-07-29  3:16 ` [Qemu-devel] [PULL 24/41] qemu-char: fix qemu_chr_fe_set_msgfds() crash when disconnected Michael S. Tsirkin
2016-07-29  3:16 ` [Qemu-devel] [PULL 25/41] vhost-user: call set_msgfds unconditionally Michael S. Tsirkin
2016-07-29  3:16 ` [Qemu-devel] [PULL 26/41] vhost-user: check qemu_chr_fe_set_msgfds() return value Michael S. Tsirkin
2016-07-29  3:16 ` [Qemu-devel] [PULL 27/41] vhost-user: check vhost_user_{read, write}() " Michael S. Tsirkin
2016-07-29  3:16 ` [Qemu-devel] [PULL 28/41] vhost-user: keep vhost_net after a disconnection Michael S. Tsirkin
2016-07-29  3:16 ` [Qemu-devel] [PULL 29/41] vhost-user: add get_vhost_net() assertions Michael S. Tsirkin
2016-07-29  3:16 ` [Qemu-devel] [PULL 30/41] Revert "vhost-net: do not crash if backend is not present" Michael S. Tsirkin
2016-07-29  3:16 ` [Qemu-devel] [PULL 31/41] vhost-net: vhost_migration_done is vhost-user specific Michael S. Tsirkin
2016-07-29  3:16 ` [Qemu-devel] [PULL 32/41] vhost: add assert() to check runtime behaviour Michael S. Tsirkin
2016-07-29  3:17 ` [Qemu-devel] [PULL 33/41] char: add chr_wait_connected callback Michael S. Tsirkin
2016-07-29  3:17 ` [Qemu-devel] [PULL 34/41] char: add and use tcp_chr_wait_connected Michael S. Tsirkin
2016-07-29  3:17 ` [Qemu-devel] [PULL 35/41] vhost-user: wait until backend init is completed Michael S. Tsirkin
2016-07-29  3:17 ` [Qemu-devel] [PULL 36/41] tests: plug some leaks in virtio-net-test Michael S. Tsirkin
2016-07-29  3:17 ` [Qemu-devel] [PULL 37/41] tests: fix vhost-user-test leak Michael S. Tsirkin
2016-07-29  3:17 ` [Qemu-devel] [PULL 38/41] vhost-user: add error report in vhost_user_write() Michael S. Tsirkin
2016-07-29  3:17 ` [Qemu-devel] [PULL 39/41] vhost: add vhost_net_set_backend() Michael S. Tsirkin
2016-07-29  3:17 ` [Qemu-devel] [PULL 40/41] vhost: do not update last avail idx on get_vring_base() failure Michael S. Tsirkin
2016-07-29  3:17 ` [Qemu-devel] [PULL 41/41] mptsas: Fix a migration compatible issue Michael S. Tsirkin
2016-07-29 11:36 ` [Qemu-devel] [PULL 00/41] pc, pci, virtio: cleanups, fixes Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1469762011-7902-2-git-send-email-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=benh@kernel.crashing.org \
    --cc=kraxel@redhat.com \
    --cc=marcel@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-stable@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).