pciexp_device: Join pciexp_find_(next_)extended_cap() APIs

Move the `offset` parameter into pciexp_find_extended_cap(). If it's
called with `0`, we start a new search. If it's an existing offset,
we continue the search.

This makes it easier to search for multiple occurences of a capa-
bility in a single loop.

Change-Id: I80115372a82523b90460d97f0fd0fa565c3f56cb
Signed-off-by: Nico Huber <nico.h@gmx.de>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/66453
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
This commit is contained in:
Nico Huber
2022-08-05 12:58:18 +02:00
committed by Felix Held
parent d5ab24cd48
commit 5ffc2c8a3f
4 changed files with 27 additions and 16 deletions

View File

@@ -313,7 +313,7 @@ struct msix_entry *pci_msix_get_table(struct device *dev)
static unsigned int get_rebar_offset(const struct device *dev, unsigned long index) static unsigned int get_rebar_offset(const struct device *dev, unsigned long index)
{ {
uint32_t offset = pciexp_find_extended_cap(dev, PCIE_EXT_CAP_RESIZABLE_BAR); uint32_t offset = pciexp_find_extended_cap(dev, PCIE_EXT_CAP_RESIZABLE_BAR, 0);
if (!offset) if (!offset)
return 0; return 0;

View File

@@ -32,17 +32,29 @@ static unsigned int pciexp_get_ext_cap_offset(const struct device *dev, unsigned
return 0; return 0;
} }
unsigned int pciexp_find_next_extended_cap(const struct device *dev, unsigned int cap, /*
unsigned int pos) * Search for an extended capability with the ID `cap`.
*
* Returns the offset of the first matching extended
* capability if found, or 0 otherwise.
*
* A new search is started with `offset == 0`.
* To continue a search, the prior return value
* should be passed as `offset`.
*/
unsigned int pciexp_find_extended_cap(const struct device *dev, unsigned int cap,
unsigned int offset)
{ {
const unsigned int next_cap_offset = pci_read_config32(dev, pos) >> 20; unsigned int next_cap_offset;
if (offset)
next_cap_offset = pci_read_config32(dev, offset) >> 20;
else
next_cap_offset = PCIE_EXT_CAP_OFFSET;
return pciexp_get_ext_cap_offset(dev, cap, next_cap_offset); return pciexp_get_ext_cap_offset(dev, cap, next_cap_offset);
} }
unsigned int pciexp_find_extended_cap(const struct device *dev, unsigned int cap)
{
return pciexp_get_ext_cap_offset(dev, cap, PCIE_EXT_CAP_OFFSET);
}
/* /*
* Re-train a PCIe link * Re-train a PCIe link
@@ -215,7 +227,7 @@ static void pciexp_configure_ltr(struct device *parent, unsigned int parent_cap,
if (!_pciexp_enable_ltr(parent, parent_cap, dev, cap)) if (!_pciexp_enable_ltr(parent, parent_cap, dev, cap))
return; return;
const unsigned int ltr_cap = pciexp_find_extended_cap(dev, PCIE_EXT_CAP_LTR_ID); const unsigned int ltr_cap = pciexp_find_extended_cap(dev, PCIE_EXT_CAP_LTR_ID, 0);
if (!ltr_cap) if (!ltr_cap)
return; return;
@@ -340,13 +352,13 @@ static void pciexp_config_L1_sub_state(struct device *root, struct device *dev)
if (dev->path.pci.devfn & 0x7) if (dev->path.pci.devfn & 0x7)
return; return;
root_cap = pciexp_find_extended_cap(root, PCIE_EXT_CAP_L1SS_ID); root_cap = pciexp_find_extended_cap(root, PCIE_EXT_CAP_L1SS_ID, 0);
if (!root_cap) if (!root_cap)
return; return;
end_cap = pciexp_find_extended_cap(dev, PCIE_EXT_CAP_L1SS_ID); end_cap = pciexp_find_extended_cap(dev, PCIE_EXT_CAP_L1SS_ID, 0);
if (!end_cap) { if (!end_cap) {
end_cap = pciexp_find_extended_cap(dev, 0xcafe); end_cap = pciexp_find_extended_cap(dev, 0xcafe, 0);
if (!end_cap) if (!end_cap)
return; return;
} }

View File

@@ -23,7 +23,7 @@ static void lv2_enable_ltr(struct device *dev)
if (!pciexp_get_ltr_max_latencies(dev, &max_snoop, &max_nosnoop)) if (!pciexp_get_ltr_max_latencies(dev, &max_snoop, &max_nosnoop))
return; return;
const unsigned int ltr_cap = pciexp_find_extended_cap(dev, PCIE_EXT_CAP_LTR_ID); const unsigned int ltr_cap = pciexp_find_extended_cap(dev, PCIE_EXT_CAP_LTR_ID, 0);
if (!ltr_cap) if (!ltr_cap)
return; return;

View File

@@ -32,8 +32,7 @@ void pciexp_hotplug_scan_bridge(struct device *dev);
extern struct device_operations default_pciexp_hotplug_ops_bus; extern struct device_operations default_pciexp_hotplug_ops_bus;
unsigned int pciexp_find_extended_cap(const struct device *dev, unsigned int cap); unsigned int pciexp_find_extended_cap(const struct device *dev, unsigned int cap,
unsigned int pciexp_find_next_extended_cap(const struct device *dev, unsigned int cap,
unsigned int offset); unsigned int offset);
static inline bool pciexp_is_downstream_port(int type) static inline bool pciexp_is_downstream_port(int type)