diff options
-rw-r--r-- | doc/device-tree/opencapi.rst | 10 | ||||
-rw-r--r-- | hdata/spira.c | 1 | ||||
-rw-r--r-- | hw/npu2-common.c | 13 | ||||
-rw-r--r-- | hw/npu2-opencapi.c | 13 | ||||
-rw-r--r-- | hw/npu2.c | 20 | ||||
-rw-r--r-- | include/npu2.h | 2 | ||||
-rw-r--r-- | platforms/astbmc/zaius.c | 3 |
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++; } @@ -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) { |