aboutsummaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorAndrew Donnellan <andrew.donnellan@au1.ibm.com>2018-06-29 12:57:09 +1000
committerStewart Smith <stewart@linux.ibm.com>2018-07-03 01:25:36 -0500
commita36b40799055d0ff070f87376a486caed5c3a475 (patch)
tree1b768346509295956d43875a5c770335ed19a70e /hw
parent6ede024c810ffeb64814a8d6c4c338f12d357458 (diff)
downloadskiboot-a36b40799055d0ff070f87376a486caed5c3a475.zip
skiboot-a36b40799055d0ff070f87376a486caed5c3a475.tar.gz
skiboot-a36b40799055d0ff070f87376a486caed5c3a475.tar.bz2
npu2: Use same compatible string for NVLink and OpenCAPI link nodes in device tree
Currently, we distinguish between NPU links for NVLink devices and OpenCAPI devices through the use of two different compatible strings - ibm,npu-link and ibm,npu-link-opencapi. As we move towards supporting configurations with both NVLink and OpenCAPI devices behind a single NPU, we need to detect the device type as part of presence detection, which can't happen until well after the point where the HDAT or platform code has created the NPU device tree nodes. Changing a node's compatible string after it's been created is a bit ugly, so instead we should move the device type to a new property which we can add to the node later on. Get rid of the ibm,npu-link-opencapi compatible string, add a new ibm,npu-link-type property, and a helper function to check the link type. Add an "unknown" device type in preparation for later patches to detect device type dynamically. These device tree bindings are entirely internal to skiboot and are not consumed directly by Linux, so this shouldn't break anything (other than internal BML lab environments). Signed-off-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com> Reviewed-by: Frederic Barrat <fbarrat@linux.vnet.ibm.com> Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
Diffstat (limited to 'hw')
-rw-r--r--hw/npu2-common.c13
-rw-r--r--hw/npu2-opencapi.c13
-rw-r--r--hw/npu2.c20
3 files changed, 35 insertions, 11 deletions
diff --git a/hw/npu2-common.c b/hw/npu2-common.c
index 71440f6..d076b49 100644
--- a/hw/npu2-common.c
+++ b/hw/npu2-common.c
@@ -21,6 +21,19 @@
#include <npu2-regs.h>
#include <bitutils.h>
+enum npu2_dev_type npu2_dt_link_dev_type(struct dt_node *link)
+{
+ const char *link_type = dt_prop_get(link, "ibm,npu-link-type") ?:
+ "unknown";
+ if (streq(link_type, "nvlink")) {
+ return NPU2_DEV_TYPE_NVLINK;
+ } else if (streq(link_type, "opencapi")) {
+ return NPU2_DEV_TYPE_OPENCAPI;
+ } else {
+ return NPU2_DEV_TYPE_UNKNOWN;
+ }
+}
+
/*
* We use the indirect method because it uses the same addresses as
* the MMIO offsets (NPU RING)
diff --git a/hw/npu2-opencapi.c b/hw/npu2-opencapi.c
index d085cd1..f82e656 100644
--- a/hw/npu2-opencapi.c
+++ b/hw/npu2-opencapi.c
@@ -1701,9 +1701,12 @@ static void npu2_opencapi_probe(struct dt_node *dn)
/* Don't try to init when we have an NVLink link */
dt_for_each_compatible(dn, link, "ibm,npu-link") {
- prlog(PR_DEBUG, "OCAPI: NPU%d: NVLink link found, skipping\n",
- index);
- return;
+ if (npu2_dt_link_dev_type(link) != NPU2_DEV_TYPE_OPENCAPI) {
+ prlog(PR_DEBUG,
+ "OCAPI: NPU%d: Non-OpenCAPI link found, skipping OpenCAPI init\n",
+ index);
+ return;
+ }
}
path = dt_get_path(dn);
@@ -1728,7 +1731,7 @@ static void npu2_opencapi_probe(struct dt_node *dn)
n->regs = (void *)reg[0];
n->dt_node = dn;
- dt_for_each_compatible(dn, link, "ibm,npu-link-opencapi") {
+ dt_for_each_compatible(dn, link, "ibm,npu-link") {
dev_index = dt_prop_get_u32(link, "ibm,npu-link-index");
prlog(PR_INFO, "OCAPI: Configuring link index %lld\n",
dev_index);
@@ -1748,7 +1751,7 @@ static void npu2_opencapi_probe(struct dt_node *dn)
if (rc)
goto failed;
- dt_for_each_compatible(dn, link, "ibm,npu-link-opencapi") {
+ dt_for_each_compatible(dn, link, "ibm,npu-link") {
npu2_opencapi_setup_device(link, n, &n->devices[i]);
i++;
}
diff --git a/hw/npu2.c b/hw/npu2.c
index c351404..8e2f6fe 100644
--- a/hw/npu2.c
+++ b/hw/npu2.c
@@ -1345,17 +1345,25 @@ static void assign_mmio_bars(uint64_t gcid, uint32_t scom, uint64_t reg[2], uint
static void npu2_probe_phb(struct dt_node *dn)
{
struct proc_chip *proc_chip;
- struct dt_node *np;
+ struct dt_node *np, *link;
+ bool ocapi_detected = false, nvlink_detected = false;
uint32_t gcid, scom, index, phb_index, links;
uint64_t reg[2], mm_win[2], val;
char *path;
/* Abort if any OpenCAPI links detected */
- if (dt_find_compatible_node(dn, NULL, "ibm,npu-link-opencapi")) {
- /* Die if there's also an NVLink link */
- assert(!dt_find_compatible_node(dn, NULL, "ibm,npu-link"));
- prlog(PR_INFO, "NPU: OpenCAPI link configuration detected, "
- "not initialising NVLink\n");
+ dt_for_each_compatible(dn, link, "ibm,npu-link") {
+ if (npu2_dt_link_dev_type(link) == NPU2_DEV_TYPE_OPENCAPI)
+ ocapi_detected = true;
+ else
+ nvlink_detected = true;
+ }
+
+ if (ocapi_detected && nvlink_detected) {
+ prlog(PR_ERR, "NPU: NVLink and OpenCAPI devices on same chip not supported\n");
+ assert(false);
+ } else if (ocapi_detected) {
+ prlog(PR_INFO, "NPU: OpenCAPI link configuration detected, not initialising NVLink\n");
return;
}