aboutsummaryrefslogtreecommitdiff
path: root/platforms
diff options
context:
space:
mode:
authorKlaus Heinrich Kiwi <klaus@linux.vnet.ibm.com>2020-02-08 22:48:42 -0300
committerOliver O'Halloran <oohall@gmail.com>2020-02-12 15:54:09 +1100
commit99ce1bef50fc1f7a361e897e261a6eb8f6b36d97 (patch)
tree70617f3b36b3e308413305f7fa122edf4bbdfdc0 /platforms
parentc53e33947cd73c490d49fd06b2c6741d4f7562f9 (diff)
downloadskiboot-99ce1bef50fc1f7a361e897e261a6eb8f6b36d97.zip
skiboot-99ce1bef50fc1f7a361e897e261a6eb8f6b36d97.tar.gz
skiboot-99ce1bef50fc1f7a361e897e261a6eb8f6b36d97.tar.bz2
ibm-fsp/lxvpd: check for upstream port on slot labeling
Certain FSP configurations include PCIe switches that can have LXVPD slot map entries using the same switch-id and dev-id, even if they are referring to different upstream and downstream ports of the same link. The slot matching function (lxvpd_get_slot()) will match the first occurence, that can be the upstream port with, and ignore the downstream port. The main symptom for the above is an incorrect label for those slots, but I believe other slot attributes could be incorrect as well (as we are associating a slot with an upstream port). This patch picks-up an existing "upstream port" attribute from the 1005 version of the LXVPD slot map to prevent matching upstream ports on the slot matching function. Signed-off-by: Klaus Heinrich Kiwi <klaus@linux.vnet.ibm.com> [oliver: 80cols compliance] Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
Diffstat (limited to 'platforms')
-rw-r--r--platforms/ibm-fsp/lxvpd.c12
-rw-r--r--platforms/ibm-fsp/lxvpd.h1
2 files changed, 9 insertions, 4 deletions
diff --git a/platforms/ibm-fsp/lxvpd.c b/platforms/ibm-fsp/lxvpd.c
index 81cb612..a40308b 100644
--- a/platforms/ibm-fsp/lxvpd.c
+++ b/platforms/ibm-fsp/lxvpd.c
@@ -111,8 +111,9 @@ void *lxvpd_get_slot(struct pci_slot *slot)
return s;
}
- /* Match switch port with switch_id != 0 */
- if (!is_phb && s->switch_id != 0 && s->dev_id == slot_num) {
+ /* Match downstream switch port with switch_id != 0 */
+ if (!is_phb && s->switch_id != 0 && !s->upstream_port &&
+ s->dev_id == slot_num) {
slot->data = s;
s->pci_slot = slot;
prlog(PR_DEBUG, "Found [%s] for slot %016llx\n",
@@ -251,6 +252,7 @@ static void lxvpd_parse_1005_map(struct phb *phb,
s->dev_id = entry->switch_device_id;
s->pluggable = (entry->p0.pluggable == 0);
s->power_ctl = entry->p0.power_ctl;
+ s->upstream_port = entry->p0.upstream_port;
s->bus_clock = entry->p2.bus_clock;
s->connector_type = entry->p2.connector_type;
s->card_desc = entry->p3.byte >> 6;
@@ -261,8 +263,10 @@ static void lxvpd_parse_1005_map(struct phb *phb,
if (s->wired_lanes > PCI_SLOT_WIRED_LANES_PCIE_X32)
s->wired_lanes = PCI_SLOT_WIRED_LANES_UNKNOWN;
- prlog(PR_DEBUG, "1005 Platform data [%s] %02x %02x on PHB%04x\n",
- s->label, s->switch_id, s->dev_id, phb->opal_id);
+ prlog(PR_DEBUG, "1005 Platform data [%s] %02x %02x %s on PHB%04x\n",
+ s->label, s->switch_id, s->dev_id,
+ s->upstream_port ? "upstream" : "downstream",
+ phb->opal_id);
}
}
diff --git a/platforms/ibm-fsp/lxvpd.h b/platforms/ibm-fsp/lxvpd.h
index 46acf67..d0fddd2 100644
--- a/platforms/ibm-fsp/lxvpd.h
+++ b/platforms/ibm-fsp/lxvpd.h
@@ -142,6 +142,7 @@ struct lxvpd_pci_slot {
char label[9];
bool pluggable;
bool power_ctl;
+ bool upstream_port;
uint8_t wired_lanes;
uint8_t bus_clock;
uint8_t connector_type;