Skip to content

Commit

Permalink
npu2-opencapi: Allow platforms to identify physical slots
Browse files Browse the repository at this point in the history
This patch lets each platform define the name of the opencapi
slots. It makes it easier to identify which physical card is
generating errors or messages in the linux or skiboot log files.

The patch provides slot names for mihawk and witherspoon. If the
platform doesn't define any, then we default to 'OPENCAPI-xxxx'

There are various ways to find out about the slot names:
  skiboot log
  lspci command (if the PCI hotplug driver pnv-php is loaded)
  lshw
  checking the device tree
  and probably others....

Signed-off-by: Frederic Barrat <fbarrat@linux.ibm.com>
Reviewed-by: Andrew Donnellan <ajd@linux.ibm.com>
Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
  • Loading branch information
fbarrat authored and oohal committed Feb 12, 2020
1 parent 5340844 commit 9de4f22
Show file tree
Hide file tree
Showing 5 changed files with 74 additions and 3 deletions.
16 changes: 13 additions & 3 deletions hw/npu2-opencapi.c
Original file line number Diff line number Diff line change
Expand Up @@ -1342,7 +1342,9 @@ static int64_t npu2_opencapi_hreset(struct pci_slot *slot __unused)

static void make_slot_hotpluggable(struct pci_slot *slot, struct phb *phb)
{
char label[40];
struct npu2_dev *dev = phb_to_npu2_dev_ocapi(phb);
char name[40];
const char *label = NULL;

/*
* Add a few definitions to the DT so that the linux PCI
Expand All @@ -1353,8 +1355,16 @@ static void make_slot_hotpluggable(struct pci_slot *slot, struct phb *phb)
*/
slot->pluggable = 1;
pci_slot_add_dt_properties(slot, phb->dt_node);
snprintf(label, sizeof(label), "OPENCAPI-%04x",
(int)PCI_SLOT_PHB_INDEX(slot->id));

if (platform.ocapi->ocapi_slot_label)
label = platform.ocapi->ocapi_slot_label(dev->npu->chip_id,
dev->brick_index);

if (!label) {
snprintf(name, sizeof(name), "OPENCAPI-%04x",
(int)PCI_SLOT_PHB_INDEX(slot->id));
label = name;
}
dt_add_property_string(phb->dt_node, "ibm,slot-label", label);
}

Expand Down
1 change: 1 addition & 0 deletions include/platform.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ struct platform_ocapi {
uint8_t i2c_presence_brick5; /* I2C pin to read for presence on brick 5 */
bool odl_phy_swap; /* Swap ODL1 to use brick 2 rather than
* brick 1 lanes */
const char *(*ocapi_slot_label)(uint32_t chip_id, uint32_t brick_index);
};

struct dt_node;
Expand Down
20 changes: 20 additions & 0 deletions platforms/astbmc/mihawk.c
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,25 @@ static void mihawk_get_slot_info(struct phb *phb, struct pci_device *pd)
slot_table_get_slot_info(phb, pd);
}

static const char *mihawk_ocapi_slot_label(uint32_t chip_id,
uint32_t brick_index)
{
const char *name = NULL;

if (chip_id == 0) {
if (brick_index == 2)
name = "JP90NVB1";
else
name = "JP90NVT1";
} else {
if (brick_index == 2)
name = "JP91NVB1";
else
name = "JP91NVT1";
}
return name;
}

static const struct platform_ocapi mihawk_ocapi = {
.i2c_engine = 1,
.i2c_port = 4,
Expand All @@ -69,6 +88,7 @@ static const struct platform_ocapi mihawk_ocapi = {
.i2c_presence_brick4 = 0, /* unused */
.i2c_presence_brick5 = 0, /* unused */
.odl_phy_swap = true,
.ocapi_slot_label = mihawk_ocapi_slot_label,
};

static const struct slot_table_entry P1E1A_x8_PLX8748_down[] = {
Expand Down
20 changes: 20 additions & 0 deletions platforms/astbmc/witherspoon.c
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,25 @@ static void witherspoon_npu2_device_detect(struct npu2 *npu)
return;
}

static const char *witherspoon_ocapi_slot_label(uint32_t chip_id,
uint32_t brick_index)
{
const char *name = NULL;

if (chip_id == 0) {
if (brick_index == 3)
name = "OPENCAPI-GPU0";
else if (brick_index == 4)
name = "OPENCAPI-GPU1";
} else {
if (brick_index == 3)
name = "OPENCAPI-GPU3";
else if (brick_index == 4)
name = "OPENCAPI-GPU4";
}
return name;
}

static const struct platform_ocapi witherspoon_ocapi = {
.i2c_engine = 1,
.i2c_port = 4,
Expand All @@ -348,6 +367,7 @@ static const struct platform_ocapi witherspoon_ocapi = {
.i2c_presence_brick3 = 0,
.i2c_presence_brick4 = 0,
.i2c_presence_brick5 = 0,
.ocapi_slot_label = witherspoon_ocapi_slot_label,
};

static int gpu_slot_to_num(const char *slot)
Expand Down
20 changes: 20 additions & 0 deletions platforms/ibm-fsp/zz.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,25 @@
#include "ibm-fsp.h"
#include "lxvpd.h"

static const char *zz_ocapi_slot_label(uint32_t chip_id,
uint32_t brick_index)
{
const char *name = NULL;

if (chip_id == 0) {
if (brick_index == 2)
name = "P1-T5";
else
name = "P1-T6";
} else {
if (brick_index == 2)
name = "P1-T7";
else
name = "P1-T8";
}
return name;
}

/* We don't yet create NPU device nodes on ZZ, but these values are correct */
static const struct platform_ocapi zz_ocapi = {
.i2c_engine = 1,
Expand All @@ -30,6 +49,7 @@ static const struct platform_ocapi zz_ocapi = {
.i2c_presence_brick4 = 0, /* unused */
.i2c_presence_brick5 = 0, /* unused */
.odl_phy_swap = true,
.ocapi_slot_label = zz_ocapi_slot_label,
};

#define NPU_BASE 0x5011000
Expand Down

0 comments on commit 9de4f22

Please sign in to comment.