[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v5 32/43] pci/pcie_port: Add pci_find_port_by_pn()
From: |
Jonathan Cameron |
Subject: |
[PATCH v5 32/43] pci/pcie_port: Add pci_find_port_by_pn() |
Date: |
Wed, 2 Feb 2022 14:10:26 +0000 |
From: Jonathan Cameron <jonathan.cameron@huawei.com>
Simple function to search a PCIBus to find a port by
it's port number.
CXL interleave decoding uses the port number as a target
so it is necessary to locate the port when doing interleave
decoding.
Signed-off-by: Jonathan Cameron <jonathan.cameron@huawei.com>
---
hw/pci/pcie_port.c | 25 +++++++++++++++++++++++++
include/hw/pci/pcie_port.h | 2 ++
2 files changed, 27 insertions(+)
diff --git a/hw/pci/pcie_port.c b/hw/pci/pcie_port.c
index e95c1e5519..687e4e763a 100644
--- a/hw/pci/pcie_port.c
+++ b/hw/pci/pcie_port.c
@@ -136,6 +136,31 @@ static void pcie_port_class_init(ObjectClass *oc, void
*data)
device_class_set_props(dc, pcie_port_props);
}
+PCIDevice *pcie_find_port_by_pn(PCIBus *bus, uint8_t pn)
+{
+ int devfn;
+
+ for (devfn = 0; devfn < ARRAY_SIZE(bus->devices); devfn++) {
+ PCIDevice *d = bus->devices[devfn];
+ PCIEPort *port;
+
+ if (!d || !pci_is_express(d) || !d->exp.exp_cap) {
+ continue;
+ }
+
+ if (!object_dynamic_cast(OBJECT(d), TYPE_PCIE_PORT)) {
+ continue;
+ }
+
+ port = PCIE_PORT(d);
+ if (port->port == pn) {
+ return d;
+ }
+ }
+
+ return NULL;
+}
+
static const TypeInfo pcie_port_type_info = {
.name = TYPE_PCIE_PORT,
.parent = TYPE_PCI_BRIDGE,
diff --git a/include/hw/pci/pcie_port.h b/include/hw/pci/pcie_port.h
index e25b289ce8..7b8193061a 100644
--- a/include/hw/pci/pcie_port.h
+++ b/include/hw/pci/pcie_port.h
@@ -39,6 +39,8 @@ struct PCIEPort {
void pcie_port_init_reg(PCIDevice *d);
+PCIDevice *pcie_find_port_by_pn(PCIBus *bus, uint8_t pn);
+
#define TYPE_PCIE_SLOT "pcie-slot"
OBJECT_DECLARE_SIMPLE_TYPE(PCIESlot, PCIE_SLOT)
--
2.32.0
- [PATCH v5 22/43] acpi/cxl: Add _OSC implementation (9.14.2), (continued)
- [PATCH v5 22/43] acpi/cxl: Add _OSC implementation (9.14.2), Jonathan Cameron, 2022/02/02
- [PATCH v5 23/43] tests/acpi: allow CEDT table addition, Jonathan Cameron, 2022/02/02
- [PATCH v5 24/43] acpi/cxl: Create the CEDT (9.14.1), Jonathan Cameron, 2022/02/02
- [PATCH v5 25/43] hw/cxl/device: Add some trivial commands, Jonathan Cameron, 2022/02/02
- [PATCH v5 26/43] hw/cxl/device: Plumb real Label Storage Area (LSA) sizing, Jonathan Cameron, 2022/02/02
- [PATCH v5 27/43] hw/cxl/device: Implement get/set Label Storage Area (LSA), Jonathan Cameron, 2022/02/02
- [PATCH v5 28/43] hw/cxl/component: Add utils for interleave parameter encoding/decoding, Jonathan Cameron, 2022/02/02
- [PATCH v5 29/43] hw/cxl/host: Add support for CXL Fixed Memory Windows., Jonathan Cameron, 2022/02/02
- [PATCH v5 30/43] acpi/cxl: Introduce CFMWS structures in CEDT, Jonathan Cameron, 2022/02/02
- [PATCH v5 31/43] hw/pci-host/gpex-acpi: Add support for dsdt construction for pxb-cxl, Jonathan Cameron, 2022/02/02
- [PATCH v5 32/43] pci/pcie_port: Add pci_find_port_by_pn(),
Jonathan Cameron <=
- [PATCH v5 33/43] CXL/cxl_component: Add cxl_get_hb_cstate(), Jonathan Cameron, 2022/02/02
- [PATCH v5 34/43] mem/cxl_type3: Add read and write functions for associated hostmem., Jonathan Cameron, 2022/02/02
- [PATCH v5 35/43] cxl/cxl-host: Add memops for CFMWS region., Jonathan Cameron, 2022/02/02
- [PATCH v5 36/43] arm/virt: Allow virt/CEDT creation, Jonathan Cameron, 2022/02/02
- [PATCH v5 37/43] hw/arm/virt: Basic CXL enablement on pci_expander_bridge instances pxb-cxl, Jonathan Cameron, 2022/02/02
- [PATCH v5 38/43] RFC: softmmu/memory: Add ops to memory_region_ram_init_from_file, Jonathan Cameron, 2022/02/02
- [PATCH v5 39/43] hw/cxl/component Add a dumb HDM decoder handler, Jonathan Cameron, 2022/02/02
- [PATCH v5 40/43] i386/pc: Enable CXL fixed memory windows, Jonathan Cameron, 2022/02/02
- [PATCH v5 41/43] qtest/acpi: Add reference CEDT tables., Jonathan Cameron, 2022/02/02
- [PATCH v5 42/43] qtest/cxl: Add very basic sanity tests, Jonathan Cameron, 2022/02/02