From: Alexey Gerasimenko <x1917x@gmail.com>
To: xen-devel@lists.xenproject.org
Cc: Anthony Perard <anthony.perard@citrix.com>,
Stefano Stabellini <sstabellini@kernel.org>,
Alexey Gerasimenko <x1917x@gmail.com>,
qemu-devel@nongnu.org
Subject: [RFC PATCH 18/30] xen/pt: XenHostPCIDevice: provide functions for PCI Capabilities and PCIe Extended Capabilities enumeration
Date: Tue, 13 Mar 2018 04:34:03 +1000 [thread overview]
Message-ID: <ed61d0ef5ff1326c045a585e49e492e5776a6d96.1520867956.git.x1917x@gmail.com> (raw)
In-Reply-To: <cover.1520867740.git.x1917x@gmail.com>
In-Reply-To: <cover.1520867740.git.x1917x@gmail.com>
This patch introduces 2 new functions,
- xen_host_pci_find_next_ext_cap (actually a reworked
xen_host_pci_find_ext_cap_offset function which is unused)
- xen_host_pci_find_next_cap
These functions allow to search for PCI/PCIe capabilities in a uniform
way. Both functions allow to search either a specific capability or any
encountered next (by specifying CAP_ID_ANY as a capability ID) -- this may
be useful when we merely need to traverse the capability list one-by-one.
In both functions the 'pos' argument allows to continue searching from
last position (0 means to start from beginning).
In order not to probe PCIe Extended Capabilities existence every time,
xen_host_pci_find_next_ext_cap makes use of the new 'has_pcie_ext_caps'
field in XenHostPCIDevice structure which is filled only once (in
xen_host_pci_device_get).
Signed-off-by: Alexey Gerasimenko <x1917x@gmail.com>
---
hw/xen/xen-host-pci-device.c | 95 +++++++++++++++++++++++++++++++++++++-------
hw/xen/xen-host-pci-device.h | 5 ++-
2 files changed, 85 insertions(+), 15 deletions(-)
diff --git a/hw/xen/xen-host-pci-device.c b/hw/xen/xen-host-pci-device.c
index eed8cc88e3..9d76b199af 100644
--- a/hw/xen/xen-host-pci-device.c
+++ b/hw/xen/xen-host-pci-device.c
@@ -14,6 +14,7 @@
#define XEN_HOST_PCI_MAX_EXT_CAP \
((PCIE_CONFIG_SPACE_SIZE - PCI_CONFIG_SPACE_SIZE) / (PCI_CAP_SIZEOF + 4))
+#define XEN_HOST_PCI_CAP_MAX 48
#ifdef XEN_HOST_PCI_DEVICE_DEBUG
# define XEN_HOST_PCI_LOG(f, a...) fprintf(stderr, "%s: " f, __func__, ##a)
@@ -199,6 +200,19 @@ static bool xen_host_pci_dev_is_virtfn(XenHostPCIDevice *d)
return !stat(path, &buf);
}
+static bool xen_host_pci_dev_has_pcie_ext_caps(XenHostPCIDevice *d)
+{
+ uint32_t header;
+
+ if (xen_host_pci_get_long(d, PCI_CONFIG_SPACE_SIZE, &header))
+ return false;
+
+ if (header == 0 || header == ~0U)
+ return false;
+
+ return true;
+}
+
static void xen_host_pci_config_open(XenHostPCIDevice *d, Error **errp)
{
char path[PATH_MAX];
@@ -297,37 +311,89 @@ int xen_host_pci_set_block(XenHostPCIDevice *d, int pos, uint8_t *buf, int len)
return xen_host_pci_config_write(d, pos, buf, len);
}
-int xen_host_pci_find_ext_cap_offset(XenHostPCIDevice *d, uint32_t cap)
+int xen_host_pci_find_next_ext_cap(XenHostPCIDevice *d, int pos, uint32_t cap)
{
uint32_t header = 0;
int max_cap = XEN_HOST_PCI_MAX_EXT_CAP;
- int pos = PCI_CONFIG_SPACE_SIZE;
+
+ if (!d->has_pcie_ext_caps)
+ return 0;
+
+ if (!pos) {
+ pos = PCI_CONFIG_SPACE_SIZE;
+ } else {
+ if (xen_host_pci_get_long(d, pos, &header))
+ return 0;
+
+ pos = PCI_EXT_CAP_NEXT(header);
+ }
do {
- if (xen_host_pci_get_long(d, pos, &header)) {
+ if (!pos || pos < PCI_CONFIG_SPACE_SIZE)
+ break;
+
+ if (xen_host_pci_get_long(d, pos, &header))
break;
- }
/*
* If we have no capabilities, this is indicated by cap ID,
* cap version and next pointer all being 0.
+ * Also check for all F's returned (which means PCIe ext conf space
+ * is unreadable for some reason)
*/
- if (header == 0) {
+ if (header == 0 || header == ~0U)
break;
- }
- if (PCI_EXT_CAP_ID(header) == cap) {
+ if (cap == CAP_ID_ANY)
+ return pos;
+ else if (PCI_EXT_CAP_ID(header) == cap)
return pos;
- }
pos = PCI_EXT_CAP_NEXT(header);
- if (pos < PCI_CONFIG_SPACE_SIZE) {
+ } while (--max_cap);
+
+ return 0;
+}
+
+int xen_host_pci_find_next_cap(XenHostPCIDevice *d, int pos, uint32_t cap)
+{
+ uint8_t id;
+ unsigned max_cap = XEN_HOST_PCI_CAP_MAX;
+ uint8_t status = 0;
+ uint8_t curpos;
+
+ if (xen_host_pci_get_byte(d, PCI_STATUS, &status))
+ return 0;
+
+ if ((status & PCI_STATUS_CAP_LIST) == 0)
+ return 0;
+
+ if (pos < PCI_CAPABILITY_LIST) {
+ curpos = PCI_CAPABILITY_LIST;
+ } else {
+ curpos = (uint8_t) pos;
+ }
+
+ while (max_cap--) {
+ if (xen_host_pci_get_byte(d, curpos, &curpos))
+ break;
+ if (!curpos)
break;
- }
- max_cap--;
- } while (max_cap > 0);
+ if (cap == CAP_ID_ANY)
+ return curpos;
- return -1;
+ if (xen_host_pci_get_byte(d, curpos + PCI_CAP_LIST_ID, &id))
+ break;
+
+ if (id == 0xff)
+ break;
+ else if (id == cap)
+ return curpos;
+
+ curpos += PCI_CAP_LIST_NEXT;
+ }
+
+ return 0;
}
void xen_host_pci_device_get(XenHostPCIDevice *d, uint16_t domain,
@@ -377,7 +443,8 @@ void xen_host_pci_device_get(XenHostPCIDevice *d, uint16_t domain,
}
d->class_code = v;
- d->is_virtfn = xen_host_pci_dev_is_virtfn(d);
+ d->is_virtfn = xen_host_pci_dev_is_virtfn(d);
+ d->has_pcie_ext_caps = xen_host_pci_dev_has_pcie_ext_caps(d);
return;
diff --git a/hw/xen/xen-host-pci-device.h b/hw/xen/xen-host-pci-device.h
index 4d8d34ecb0..37c5614a24 100644
--- a/hw/xen/xen-host-pci-device.h
+++ b/hw/xen/xen-host-pci-device.h
@@ -32,6 +32,7 @@ typedef struct XenHostPCIDevice {
XenHostPCIIORegion rom;
bool is_virtfn;
+ bool has_pcie_ext_caps;
int config_fd;
} XenHostPCIDevice;
@@ -53,6 +54,8 @@ int xen_host_pci_set_long(XenHostPCIDevice *d, int pos, uint32_t data);
int xen_host_pci_set_block(XenHostPCIDevice *d, int pos, uint8_t *buf,
int len);
-int xen_host_pci_find_ext_cap_offset(XenHostPCIDevice *s, uint32_t cap);
+#define CAP_ID_ANY (~0U)
+int xen_host_pci_find_next_cap(XenHostPCIDevice *s, int pos, uint32_t cap);
+int xen_host_pci_find_next_ext_cap(XenHostPCIDevice *d, int pos, uint32_t cap);
#endif /* XEN_HOST_PCI_DEVICE_H */
--
2.11.0
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel
next prev parent reply other threads:[~2018-03-12 18:35 UTC|newest]
Thread overview: 155+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-12 18:33 [RFC PATCH 00/30] Xen Q35 Bringup patches + support for PCIe Extended Capabilities for passed through devices Alexey Gerasimenko
2018-03-12 18:33 ` [RFC PATCH 01/12] libacpi: new DSDT ACPI table for Q35 Alexey Gerasimenko
2018-03-12 19:38 ` Konrad Rzeszutek Wilk
2018-03-12 20:10 ` Alexey G
2018-03-12 20:32 ` Konrad Rzeszutek Wilk
2018-03-12 21:19 ` Alexey G
2018-03-13 2:41 ` Tian, Kevin
2018-03-19 12:43 ` Roger Pau Monné
2018-03-19 13:57 ` Alexey G
2018-03-12 18:33 ` [RFC PATCH 02/12] Makefile: build and use new DSDT " Alexey Gerasimenko
2018-03-19 12:46 ` Roger Pau Monné
2018-03-19 14:18 ` Alexey G
2018-03-19 13:07 ` Jan Beulich
2018-03-19 14:10 ` Alexey G
2018-03-12 18:33 ` [RFC PATCH 03/12] hvmloader: add function to query an emulated machine type (i440/Q35) Alexey Gerasimenko
2018-03-13 17:26 ` Wei Liu
2018-03-13 17:58 ` Alexey G
2018-03-13 18:04 ` Wei Liu
2018-03-19 12:56 ` Roger Pau Monné
2018-03-19 16:26 ` Alexey G
2018-03-12 18:33 ` [RFC PATCH 04/12] hvmloader: add ACPI enabling for Q35 Alexey Gerasimenko
2018-03-13 17:26 ` Wei Liu
2018-03-19 13:01 ` Roger Pau Monné
2018-03-19 23:59 ` Alexey G
2018-03-12 18:33 ` [RFC PATCH 05/12] hvmloader: add Q35 DSDT table loading Alexey Gerasimenko
2018-03-19 14:45 ` Roger Pau Monné
2018-03-20 0:15 ` Alexey G
2018-03-12 18:33 ` [RFC PATCH 06/12] hvmloader: add basic Q35 support Alexey Gerasimenko
2018-03-19 15:30 ` Roger Pau Monné
2018-03-19 23:44 ` Alexey G
2018-03-20 9:20 ` Roger Pau Monné
2018-03-20 21:23 ` Alexey G
2018-03-12 18:33 ` [RFC PATCH 07/12] hvmloader: allocate MMCONFIG area in the MMIO hole + minor code refactoring Alexey Gerasimenko
2018-03-19 15:58 ` Roger Pau Monné
2018-03-19 19:49 ` Alexey G
2018-03-20 8:50 ` Roger Pau Monné
2018-03-20 9:25 ` Paul Durrant
2018-03-21 0:58 ` Alexey G
2018-03-21 9:09 ` Roger Pau Monné
2018-03-21 9:36 ` Paul Durrant
2018-03-21 14:35 ` Alexey G
2018-03-21 14:58 ` Paul Durrant
2018-03-21 14:25 ` Alexey G
2018-03-21 14:54 ` Paul Durrant
2018-03-21 17:41 ` Alexey G
2018-03-21 15:20 ` Roger Pau Monné
2018-03-21 16:56 ` Alexey G
2018-03-21 17:06 ` Paul Durrant
2018-03-22 0:31 ` Alexey G
2018-03-22 9:04 ` Jan Beulich
2018-03-22 9:55 ` Alexey G
2018-03-22 10:06 ` Paul Durrant
2018-03-22 11:56 ` Alexey G
2018-03-22 12:09 ` Jan Beulich
2018-03-22 13:05 ` Alexey G
2018-03-22 13:20 ` Jan Beulich
2018-03-22 14:34 ` Alexey G
2018-03-22 14:42 ` Jan Beulich
2018-03-22 15:08 ` Alexey G
2018-03-23 13:57 ` Paul Durrant
2018-03-23 22:32 ` Alexey G
2018-03-26 9:24 ` Roger Pau Monné
2018-03-26 19:42 ` Alexey G
2018-03-27 8:45 ` Roger Pau Monné
2018-03-27 15:37 ` Alexey G
2018-03-28 9:30 ` Roger Pau Monné
2018-03-28 11:42 ` Alexey G
2018-03-28 12:05 ` Paul Durrant
2018-03-28 10:03 ` Paul Durrant
2018-03-28 14:14 ` Alexey G
2018-03-21 17:15 ` Roger Pau Monné
2018-03-21 22:49 ` Alexey G
2018-03-22 9:29 ` Paul Durrant
2018-03-22 10:05 ` Roger Pau Monné
2018-03-22 10:09 ` Paul Durrant
2018-03-22 11:36 ` Alexey G
2018-03-22 10:50 ` Alexey G
2018-03-22 9:57 ` Roger Pau Monné
2018-03-22 12:29 ` Alexey G
2018-03-22 12:44 ` Roger Pau Monné
2018-03-22 15:31 ` Alexey G
2018-03-23 10:29 ` Paul Durrant
2018-03-23 11:38 ` Jan Beulich
2018-03-23 13:52 ` Paul Durrant
2018-05-29 14:23 ` Jan Beulich
2018-05-29 17:56 ` Alexey G
2018-05-29 18:47 ` Alexey G
2018-05-30 4:32 ` Alexey G
2018-05-30 8:13 ` Jan Beulich
2018-05-31 4:25 ` Alexey G
2018-05-30 8:12 ` Jan Beulich
2018-05-31 5:15 ` Alexey G
2018-06-01 5:30 ` Jan Beulich
2018-06-01 15:53 ` Alexey G
2018-03-12 18:33 ` [RFC PATCH 08/12] libxl: Q35 support (new option device_model_machine) Alexey Gerasimenko
2018-03-13 17:25 ` Wei Liu
2018-03-13 17:32 ` Anthony PERARD
2018-03-19 17:01 ` Roger Pau Monné
2018-03-19 22:11 ` Alexey G
2018-03-20 9:11 ` Roger Pau Monné
2018-03-21 16:27 ` Wei Liu
2018-03-21 17:03 ` Anthony PERARD
2018-03-21 16:25 ` Wei Liu
2018-03-12 18:33 ` [RFC PATCH 09/12] libxl: Xen Platform device support for Q35 Alexey Gerasimenko
2018-03-19 15:05 ` Alexey G
2018-03-21 16:32 ` Wei Liu
2018-03-12 18:33 ` [RFC PATCH 10/12] libacpi: build ACPI MCFG table if requested Alexey Gerasimenko
2018-03-19 17:33 ` Roger Pau Monné
2018-03-19 21:46 ` Alexey G
2018-03-20 9:03 ` Roger Pau Monné
2018-03-20 21:06 ` Alexey G
2018-05-29 14:36 ` Jan Beulich
2018-05-29 18:20 ` Alexey G
2018-03-12 18:33 ` [RFC PATCH 11/12] hvmloader: use libacpi to build MCFG table Alexey Gerasimenko
2018-03-14 17:48 ` Alexey G
2018-03-19 17:49 ` Roger Pau Monné
2018-03-19 21:20 ` Alexey G
2018-03-20 8:58 ` Roger Pau Monné
2018-03-20 9:36 ` Jan Beulich
2018-03-20 20:53 ` Alexey G
2018-03-21 7:36 ` Jan Beulich
2018-05-29 14:46 ` Jan Beulich
2018-05-29 17:26 ` Alexey G
2018-03-12 18:33 ` [RFC PATCH 12/12] docs: provide description for device_model_machine option Alexey Gerasimenko
2018-03-12 18:33 ` [RFC PATCH 13/30] pc/xen: Xen Q35 support: provide IRQ handling for PCI devices Alexey Gerasimenko
2018-03-14 10:48 ` Paolo Bonzini
[not found] ` <406abf99-4311-f08d-9f61-df72a9a3ef05@redhat.com>
2018-03-14 11:28 ` Alexey G
2018-03-12 18:33 ` [RFC PATCH 14/30] pc/q35: Apply PCI bus BSEL property for Xen PCI device hotplug Alexey Gerasimenko
2018-03-12 18:34 ` [RFC PATCH 15/30] q35/acpi/xen: Provide ACPI PCI hotplug interface for Xen on Q35 Alexey Gerasimenko
2018-03-12 18:34 ` [RFC PATCH 16/30] q35/xen: Add Xen platform device support for Q35 Alexey Gerasimenko
2018-03-12 19:44 ` Eduardo Habkost
[not found] ` <20180312194406.GX3417@localhost.localdomain>
2018-03-12 20:56 ` Alexey G
2018-03-12 21:44 ` Eduardo Habkost
[not found] ` <20180312214402.GY3417@localhost.localdomain>
2018-03-13 23:49 ` Alexey G
2018-03-13 9:24 ` [Qemu-devel] " Daniel P. Berrangé
2018-03-12 18:34 ` [RFC PATCH 17/30] q35: Fix incorrect values for PCIEXBAR masks Alexey Gerasimenko
2018-03-12 18:34 ` Alexey Gerasimenko [this message]
2018-03-12 18:34 ` [RFC PATCH 19/30] xen/pt: avoid reading PCIe device type and cap version multiple times Alexey Gerasimenko
2018-03-12 18:34 ` [RFC PATCH 20/30] xen/pt: determine the legacy/PCIe mode for a passed through device Alexey Gerasimenko
2018-03-12 18:34 ` [RFC PATCH 21/30] xen/pt: Xen PCIe passthrough support for Q35: bypass PCIe topology check Alexey Gerasimenko
2018-03-12 18:34 ` [RFC PATCH 22/30] xen/pt: add support for PCIe Extended Capabilities and larger config space Alexey Gerasimenko
2018-03-12 18:34 ` [RFC PATCH 23/30] xen/pt: handle PCIe Extended Capabilities Next register Alexey Gerasimenko
2018-03-12 18:34 ` [RFC PATCH 24/30] xen/pt: allow to hide PCIe Extended Capabilities Alexey Gerasimenko
2018-03-12 18:34 ` [RFC PATCH 25/30] xen/pt: add Vendor-specific PCIe Extended Capability descriptor and sizing Alexey Gerasimenko
2018-03-12 18:34 ` [RFC PATCH 26/30] xen/pt: add fixed-size PCIe Extended Capabilities descriptors Alexey Gerasimenko
2018-03-12 18:34 ` [RFC PATCH 27/30] xen/pt: add AER PCIe Extended Capability descriptor and sizing Alexey Gerasimenko
2018-03-12 18:34 ` [RFC PATCH 28/30] xen/pt: add descriptors and size calculation for RCLD/ACS/PMUX/DPA/MCAST/TPH/DPC PCIe Extended Capabilities Alexey Gerasimenko
2018-03-12 18:34 ` [RFC PATCH 29/30] xen/pt: add Resizable BAR PCIe Extended Capability descriptor and sizing Alexey Gerasimenko
2018-03-12 18:34 ` [RFC PATCH 30/30] xen/pt: add VC/VC9/MFVC PCIe Extended Capabilities descriptors " Alexey Gerasimenko
2018-03-13 9:21 ` [Qemu-devel] [RFC PATCH 00/30] Xen Q35 Bringup patches + support for PCIe Extended Capabilities for passed through devices Daniel P. Berrangé
2018-03-13 11:37 ` Alexey G
2018-03-13 11:44 ` Daniel P. Berrangé
2018-03-16 17:34 ` Alexey G
2018-03-16 18:26 ` Stefano Stabellini
2018-03-16 18:36 ` Roger Pau Monné
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=ed61d0ef5ff1326c045a585e49e492e5776a6d96.1520867956.git.x1917x@gmail.com \
--to=x1917x@gmail.com \
--cc=anthony.perard@citrix.com \
--cc=qemu-devel@nongnu.org \
--cc=sstabellini@kernel.org \
--cc=xen-devel@lists.xenproject.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).