aboutsummaryrefslogtreecommitdiff
path: root/platforms
diff options
context:
space:
mode:
Diffstat (limited to 'platforms')
-rw-r--r--platforms/astbmc/witherspoon.c272
1 files changed, 272 insertions, 0 deletions
diff --git a/platforms/astbmc/witherspoon.c b/platforms/astbmc/witherspoon.c
index 4604986..6a77306 100644
--- a/platforms/astbmc/witherspoon.c
+++ b/platforms/astbmc/witherspoon.c
@@ -30,6 +30,273 @@
#include "astbmc.h"
+static const struct slot_table_entry witherspoon_gpu0[] = {
+ {
+ .etype = st_pluggable_slot,
+ .location = ST_LOC_DEVFN(0x80,0),
+ .name = "GPU0",
+ },
+ { .etype = st_end },
+};
+
+static const struct slot_table_entry witherspoon_gpu1[] = {
+ {
+ .etype = st_pluggable_slot,
+ .location = ST_LOC_DEVFN(0xa0,0),
+ .name = "GPU1",
+ },
+ { .etype = st_end },
+};
+
+static const struct slot_table_entry witherspoon_gpu2[] = {
+ {
+ .etype = st_pluggable_slot,
+ .location = ST_LOC_DEVFN(0xc0,0),
+ .name = "GPU2",
+ },
+ { .etype = st_end },
+};
+
+static const struct slot_table_entry witherspoon_gpu3[] = {
+ {
+ .etype = st_pluggable_slot,
+ .location = ST_LOC_DEVFN(0x60,0),
+ .name = "GPU3",
+ },
+ { .etype = st_end },
+};
+
+static const struct slot_table_entry witherspoon_gpu4[] = {
+ {
+ .etype = st_pluggable_slot,
+ .location = ST_LOC_DEVFN(0x80,0),
+ .name = "GPU4",
+ },
+ { .etype = st_end },
+};
+
+static const struct slot_table_entry witherspoon_gpu5[] = {
+ {
+ .etype = st_pluggable_slot,
+ .location = ST_LOC_DEVFN(0xa0,0),
+ .name = "GPU5",
+ },
+ { .etype = st_end },
+};
+
+static const struct slot_table_entry witherspoon_plx0_down[] = {
+ {
+ .etype = st_builtin_dev,
+ .location = ST_LOC_DEVFN(0x4a,0),
+ .children = witherspoon_gpu0,
+ .name = "GPU0 down",
+ },
+ {
+ .etype = st_builtin_dev,
+ .location = ST_LOC_DEVFN(0x4b,0),
+ .children = witherspoon_gpu1,
+ .name = "GPU1 down",
+ },
+ {
+ .etype = st_builtin_dev,
+ .location = ST_LOC_DEVFN(0x4c,0),
+ .children = witherspoon_gpu2,
+ .name = "GPU2 down",
+ },
+ { .etype = st_end },
+};
+
+static const struct slot_table_entry witherspoon_plx1_down[] = {
+ {
+ .etype = st_builtin_dev,
+ .location = ST_LOC_DEVFN(0x44,0),
+ .children = witherspoon_gpu3,
+ .name = "GPU3 down",
+ },
+ {
+ .etype = st_builtin_dev,
+ .location = ST_LOC_DEVFN(0x45,0),
+ .children = witherspoon_gpu4,
+ .name = "GPU4 down",
+ },
+ {
+ .etype = st_builtin_dev,
+ .location = ST_LOC_DEVFN(0x4d,0),
+ .children = witherspoon_gpu5,
+ .name = "GPU5 down",
+ },
+ { .etype = st_end },
+};
+
+static const struct slot_table_entry witherspoon_plx0_up[] = {
+ {
+ .etype = st_builtin_dev,
+ .location = ST_LOC_DEVFN(0x20,0),
+ .children = witherspoon_plx0_down,
+ },
+ { .etype = st_end },
+};
+
+static const struct slot_table_entry witherspoon_plx1_up[] = {
+ {
+ .etype = st_builtin_dev,
+ .location = ST_LOC_DEVFN(0x20,0),
+ .children = witherspoon_plx1_down,
+ },
+ { .etype = st_end },
+};
+
+static const struct slot_table_entry witherspoon_phb0_4_slot[] = {
+ {
+ .etype = st_builtin_dev,
+ .location = ST_LOC_DEVFN(0,0),
+ .children = witherspoon_plx0_up,
+ },
+ { .etype = st_end },
+};
+
+static const struct slot_table_entry witherspoon_phb8_5_slot[] = {
+ {
+ .etype = st_builtin_dev,
+ .location = ST_LOC_DEVFN(0,0),
+ .children = witherspoon_plx1_up,
+ },
+ { .etype = st_end },
+};
+
+static const struct slot_table_entry witherspoon_npu0_slots[] = {
+ {
+ .etype = st_npu_slot,
+ .location = ST_LOC_NPU_GROUP(0),
+ .name = "GPU0",
+ },
+ {
+ .etype = st_npu_slot,
+ .location = ST_LOC_NPU_GROUP(1),
+ .name = "GPU1",
+ },
+ {
+ .etype = st_npu_slot,
+ .location = ST_LOC_NPU_GROUP(2),
+ .name = "GPU2",
+ },
+ { .etype = st_end },
+};
+
+static const struct slot_table_entry witherspoon_npu8_slots[] = {
+ {
+ .etype = st_npu_slot,
+ .location = ST_LOC_NPU_GROUP(0),
+ .name = "GPU3",
+ },
+ {
+ .etype = st_npu_slot,
+ .location = ST_LOC_NPU_GROUP(1),
+ .name = "GPU4",
+ },
+ {
+ .etype = st_npu_slot,
+ .location = ST_LOC_NPU_GROUP(2),
+ .name = "GPU5",
+ },
+ { .etype = st_end },
+};
+
+static const struct slot_table_entry witherspoon_phb_table[] = {
+ {
+ .etype = st_phb,
+ .location = ST_LOC_PHB(0,4),
+ .children = witherspoon_phb0_4_slot,
+ },
+ {
+ .etype = st_phb,
+ .location = ST_LOC_PHB(0,7),
+ .children = witherspoon_npu0_slots,
+ },
+ {
+ .etype = st_phb,
+ .location = ST_LOC_PHB(8,5),
+ .children = witherspoon_phb8_5_slot,
+ },
+ {
+ .etype = st_phb,
+ .location = ST_LOC_PHB(8,8),
+ .children = witherspoon_npu8_slots,
+ },
+ { .etype = st_end },
+};
+
+#define NPU_BASE 0x5011000
+#define NPU_SIZE 0x2c
+#define NPU_INDIRECT0 0x8000000009010c3f
+#define NPU_INDIRECT1 0x800000000c010c3f
+
+static void create_link(struct dt_node *npu, int group, int index)
+{
+ struct dt_node *link;
+ uint32_t lane_mask;
+ uint64_t phy;
+ char namebuf[32];
+
+ snprintf(namebuf, sizeof(namebuf), "link@%x", index);
+ link = dt_new(npu, namebuf);
+
+ dt_add_property_string(link, "compatible", "ibm,npu-link");
+ dt_add_property_cells(link, "ibm,npu-link-index", index);
+
+ if (!(index / 3))
+ phy = NPU_INDIRECT0;
+ else
+ phy = NPU_INDIRECT1;
+
+ switch (index % 3) {
+ case 0:
+ lane_mask = 0xf1e000;
+ break;
+
+ case 1:
+ lane_mask = 0x0e1870;
+ break;
+
+ case 2:
+ lane_mask = 0x00078f;
+ break;
+
+ default:
+ assert(0);
+ }
+
+ dt_add_property_u64s(link, "ibm,npu-phy", phy);
+ dt_add_property_cells(link, "ibm,npu-lane-mask", lane_mask);
+ dt_add_property_cells(link, "ibm,npu-group-id", group);
+}
+
+static void dt_create_npu2(void)
+{
+ struct dt_node *xscom, *npu;
+ char namebuf[32];
+ int phb_index = 7;
+ int npu_index = 0;
+
+ dt_for_each_compatible(dt_root, xscom, "ibm,xscom") {
+ snprintf(namebuf, sizeof(namebuf), "npu@%x", NPU_BASE);
+ npu = dt_new(xscom, namebuf);
+ dt_add_property_cells(npu, "reg", NPU_BASE, NPU_SIZE);
+ dt_add_property_strings(npu, "compatible", "ibm,power9-npu");
+
+ dt_add_property_cells(npu, "ibm,phb-index", phb_index++);
+ dt_add_property_cells(npu, "ibm,npu-index", npu_index++);
+ dt_add_property_cells(npu, "ibm,npu-links", 6);
+
+ create_link(npu, 0, 0);
+ create_link(npu, 0, 1);
+ create_link(npu, 1, 2);
+ create_link(npu, 1, 3);
+ create_link(npu, 2, 4);
+ create_link(npu, 2, 5);
+ }
+}
+
#define PHB4_SHARED_SLOT_IDX_WITHERSPOON 3
static bool witherspoon_probe(void)
@@ -43,6 +310,11 @@ static bool witherspoon_probe(void)
/* Setup UART for use by OPAL (Linux hvc) */
uart_set_console_policy(UART_CONSOLE_OPAL);
+ /* Add NPU2 bindings */
+ dt_create_npu2();
+
+ slot_table_init(witherspoon_phb_table);
+
return true;
}