Skip to content

Commit

Permalink
ibm-fsp/lxvpd: check for upstream port on slot labeling
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Klaus Heinrich Kiwi authored and oohal committed Feb 12, 2020
1 parent c53e339 commit 99ce1be
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 4 deletions.
12 changes: 8 additions & 4 deletions platforms/ibm-fsp/lxvpd.c
Expand Up @@ -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",
Expand Down Expand Up @@ -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;
Expand All @@ -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);
}
}

Expand Down
1 change: 1 addition & 0 deletions platforms/ibm-fsp/lxvpd.h
Expand Up @@ -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;
Expand Down

0 comments on commit 99ce1be

Please sign in to comment.