diff options
author | MAULIK V VAGHELA <maulik.v.vaghela@intel.com> | 2022-02-14 22:04:03 +0530 |
---|---|---|
committer | Nico Huber <nico.h@gmx.de> | 2022-02-25 18:59:51 +0000 |
commit | d9c5b14f1efe82a902a7a4ed543015948364f296 (patch) | |
tree | d6acce03807daa5fad6eba3e2f8a253b80743a56 /src/soc/intel/common/block/pcie | |
parent | 811aab358647c2c26f40071bda25e5ac3a214f50 (diff) | |
download | coreboot-d9c5b14f1efe82a902a7a4ed543015948364f296.tar.gz coreboot-d9c5b14f1efe82a902a7a4ed543015948364f296.tar.bz2 coreboot-d9c5b14f1efe82a902a7a4ed543015948364f296.zip |
intelblocks/pcie: Correct mapping between LCAP port and coreboot index
coreboot uses port index which is 0 based for all PCIe root ports.
In case of PCIe remapping logic, coreboot reads LCAP register from PCIe
configuration space which contains port number (mostly 1 based). This
assumption might not be true for all the ports in coreboot.
TBT's LCAP registers are returning port index which are based on 2.
coreboot's PCIe remapping logic returns port index based on index 1.
This patch adds variable to pcie_rp_config to pass lcap_port_base to the
pcie remapping function, so coreboot can map any n-based LCAP encoding
to 0-based indexing scheme.
This patch updates correct lcap_port_base variable for all PCIe root
ports for all SOCs, so that function returns correct 0-based index from
LCAP port number.
BUG=b:210933428
BRANCH=None
TEST=Check if code compiles for all ADL boards
Change-Id: I7f9c3c8e753b982e2ede1a41bf87d6355b82da0f
Signed-off-by: MAULIK V VAGHELA <maulik.v.vaghela@intel.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/61936
Reviewed-by: Subrata Banik <subratabanik@google.com>
Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
Reviewed-by: EricR Lai <ericr_lai@compal.corp-partner.google.com>
Reviewed-by: Nico Huber <nico.h@gmx.de>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/soc/intel/common/block/pcie')
-rw-r--r-- | src/soc/intel/common/block/pcie/pcie_rp.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/src/soc/intel/common/block/pcie/pcie_rp.c b/src/soc/intel/common/block/pcie/pcie_rp.c index 221ee03a9423..145159f6eb66 100644 --- a/src/soc/intel/common/block/pcie/pcie_rp.c +++ b/src/soc/intel/common/block/pcie/pcie_rp.c @@ -31,20 +31,25 @@ static int pcie_rp_original_idx( } const uint32_t lcap = pci_s_read_config32(dev, clist + PCI_EXP_LNKCAP); - /* Read 1-based absolute port number. This reflects the numbering - scheme that Intel uses in their documentation and what we use - as index (0-based, though) in our mapping. */ + + /* Read n-based absolute port number from LCAP register. + This reflects the numbering scheme that Intel uses in their + documentation and what we use as index (0-based, though) in + our mapping. */ const unsigned int port_num = (lcap & PCI_EXP_LNKCAP_PORT) >> 24; - /* `port_num` is 1-based, `offset` is 0-based. */ - if (port_num <= offset || port_num > offset + group->count) { + /* Subtract lcap_port_base from port_num to get 0-based index */ + const unsigned int port_idx = port_num - group->lcap_port_base; + + /* Check if port_idx (0-based) is out of bounds */ + if (port_idx < offset || port_idx >= offset + group->count) { printk(BIOS_WARNING, "%s: Unexpected root-port number '%u'" " at PCI: 00:%02x.%x, ignoring.\n", __func__, port_num, group->slot, PCI_FUNC(PCI_DEV2DEVFN(dev))); return -1; } - return port_num - 1; + return port_idx; } /* Scan actual PCI config space to reconstruct current mapping */ |