aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/device-tree/opencapi.rst10
-rw-r--r--hdata/spira.c1
-rw-r--r--hw/npu2-common.c13
-rw-r--r--hw/npu2-opencapi.c13
-rw-r--r--hw/npu2.c20
-rw-r--r--include/npu2.h2
-rw-r--r--platforms/astbmc/zaius.c3
7 files changed, 46 insertions, 16 deletions
diff --git a/doc/device-tree/opencapi.rst b/doc/device-tree/opencapi.rst
index b24b29c..80ff996 100644
--- a/doc/device-tree/opencapi.rst
+++ b/doc/device-tree/opencapi.rst
@@ -10,8 +10,8 @@ NPU bindings
The NPU nodes are similar to those in :doc:`nvlink`.
We distinguish between OpenCAPI and NVLink links using the
-`ibm.npu-link-opencapi` compatible string. NPUs with a mixture of
-OpenCAPI and NVLink links are currently unsupported.
+`ibm.npu-link-type` property. NPUs with a mixture of OpenCAPI and
+NVLink links are currently unsupported.
.. code-block:: dts
@@ -25,7 +25,8 @@ OpenCAPI and NVLink links are currently unsupported.
ibm,npu-links = <0x2>; /* Number of links wired up to this npu. */
link@2 {
- compatible = "ibm,npu-link-opencapi";
+ compatible = "ibm,npu-link";
+ ibm,npu-link-type = "opencapi";
ibm,npu-group-id = <0x1>;
ibm,npu-lane-mask = <0xf1e000>; /* Mask specifying which IBM PHY lanes
* are used for this link. 24-bit,
@@ -38,7 +39,8 @@ OpenCAPI and NVLink links are currently unsupported.
};
link@3 {
- compatible = "ibm,npu-link-opencapi";
+ compatible = "ibm,npu-link";
+ ibm,npu-link-type = "opencapi";
ibm,npu-group-id = <0x2>;
ibm,npu-lane-mask = <0x78f>;
ibm,npu-phy = <0x80000000 0x9010c3f>;
diff --git a/hdata/spira.c b/hdata/spira.c
index 189584d..c820c4d 100644
--- a/hdata/spira.c
+++ b/hdata/spira.c
@@ -1490,6 +1490,7 @@ static void add_npu(struct dt_node *xscom, const struct HDIF_array_hdr *links,
}
dt_add_property_string(node, "compatible", "ibm,npu-link");
+ dt_add_property_string(node, "ibm,npu-link-type", "nvlink");
dt_add_property_cells(node, "reg", link_count);
dt_add_property_cells(node, "ibm,npu-link-index", link_count);
dt_add_property_cells(node, "ibm,workbook-link-id", link_id);
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;
}
diff --git a/include/npu2.h b/include/npu2.h
index eb4af5e..4c2e20e 100644
--- a/include/npu2.h
+++ b/include/npu2.h
@@ -81,6 +81,7 @@ struct npu2_pcie_bar {
};
enum npu2_dev_type {
+ NPU2_DEV_TYPE_UNKNOWN,
NPU2_DEV_TYPE_NVLINK,
NPU2_DEV_TYPE_OPENCAPI,
};
@@ -191,6 +192,7 @@ static inline struct phb *npu2_dev_to_phb(struct npu2_dev *ndev)
}
}
+enum npu2_dev_type npu2_dt_link_dev_type(struct dt_node *link);
void npu2_write_4b(struct npu2 *p, uint64_t reg, uint32_t val);
uint32_t npu2_read_4b(struct npu2 *p, uint64_t reg);
void npu2_write(struct npu2 *p, uint64_t reg, uint64_t val);
diff --git a/platforms/astbmc/zaius.c b/platforms/astbmc/zaius.c
index 36e66fa..2f296c3 100644
--- a/platforms/astbmc/zaius.c
+++ b/platforms/astbmc/zaius.c
@@ -50,7 +50,8 @@ static void create_link(struct dt_node *npu, int group, int index)
snprintf(namebuf, sizeof(namebuf), "link@%x", index);
link = dt_new(npu, namebuf);
- dt_add_property_string(link, "compatible", "ibm,npu-link-opencapi");
+ dt_add_property_string(link, "compatible", "ibm,npu-link");
+ dt_add_property_string(link, "ibm,npu-link-type", "opencapi");
dt_add_property_cells(link, "ibm,npu-link-index", index);
switch (index) {