[Skiboot] [PATCH v2 1/2] astbmc: Add NPU slot type and use it in Garrison

Russell Currey ruscur at russell.cc
Tue Jun 21 18:04:47 AEST 2016


NPU links are grouped into pairs, signifying that they both correlate to
the same physical GPU.  These pairs are presented in the Garrison slot
table as typical PCI devices, creating what are essentially redundant
entries.  Add a new slot type specifically for NPUs, and subsequently
perform bdfn correlation using it.

Signed-off-by: Russell Currey <ruscur at russell.cc>
---
V2: New change to facilitate bdfn allocation without using pbcq
---
 platforms/astbmc/astbmc.h   |  2 ++
 platforms/astbmc/garrison.c | 36 ++++++++----------------------------
 platforms/astbmc/slots.c    |  7 +++++++
 3 files changed, 17 insertions(+), 28 deletions(-)

diff --git a/platforms/astbmc/astbmc.h b/platforms/astbmc/astbmc.h
index 23c31c7..0cf2ac1 100644
--- a/platforms/astbmc/astbmc.h
+++ b/platforms/astbmc/astbmc.h
@@ -20,6 +20,7 @@
 
 #define ST_LOC_PHB(chip_id, phb_idx)    ((chip_id) << 16 | (phb_idx))
 #define ST_LOC_DEVFN(dev, fn)	        ((dev) << 3 | (fn))
+#define ST_LOC_NPU_GROUP(group_id)	(group_id)
 
 struct slot_table_entry {
 	enum slot_table_etype {
@@ -27,6 +28,7 @@ struct slot_table_entry {
 		st_phb,
 		st_pluggable_slot,
 		st_builtin_dev,
+		st_npu_slot
 	} etype;
 	uint32_t location;
 	const char *name;
diff --git a/platforms/astbmc/garrison.c b/platforms/astbmc/garrison.c
index 3ff84a3..fb006db 100644
--- a/platforms/astbmc/garrison.c
+++ b/platforms/astbmc/garrison.c
@@ -63,23 +63,13 @@ static const struct slot_table_entry garrison_phb0_3_slot[] = {
 
 static const struct slot_table_entry garrison_npu0_slots[] = {
 	{
-		.etype = st_pluggable_slot,
-		.location = ST_LOC_DEVFN(0,0),
-		.name = "GPU2",
-	},
-	{
-		.etype = st_pluggable_slot,
-		.location = ST_LOC_DEVFN(0,1),
+		.etype = st_npu_slot,
+		.location = ST_LOC_NPU_GROUP(0),
 		.name = "GPU2",
 	},
 	{
-		.etype = st_pluggable_slot,
-		.location = ST_LOC_DEVFN(1,0),
-		.name = "GPU1",
-	},
-	{
-		.etype = st_pluggable_slot,
-		.location = ST_LOC_DEVFN(1,1),
+		.etype = st_npu_slot,
+		.location = ST_LOC_NPU_GROUP(1),
 		.name = "GPU1",
 	},
 	{ .etype = st_end },
@@ -152,23 +142,13 @@ static const struct slot_table_entry garrison_phb1_3_slot[] = {
 
 static const struct slot_table_entry garrison_npu1_slots[] = {
 	{
-		.etype = st_pluggable_slot,
-		.location = ST_LOC_DEVFN(0,0),
-		.name = "GPU4",
-	},
-	{
-		.etype = st_pluggable_slot,
-		.location = ST_LOC_DEVFN(0,1),
+		.etype = st_npu_slot,
+		.location = ST_LOC_NPU_GROUP(0),
 		.name = "GPU4",
 	},
 	{
-		.etype = st_pluggable_slot,
-		.location = ST_LOC_DEVFN(1,0),
-		.name = "GPU3",
-	},
-	{
-		.etype = st_pluggable_slot,
-		.location = ST_LOC_DEVFN(1,1),
+		.etype = st_npu_slot,
+		.location = ST_LOC_NPU_GROUP(1),
 		.name = "GPU3",
 	},
 	{ .etype = st_end },
diff --git a/platforms/astbmc/slots.c b/platforms/astbmc/slots.c
index 36547e1..992f68b 100644
--- a/platforms/astbmc/slots.c
+++ b/platforms/astbmc/slots.c
@@ -70,6 +70,13 @@ static const struct slot_table_entry *match_slot_dev_entry(struct phb *phb,
 			prerror("SLOT: Bad PHB entry type in table !\n");
 			continue;
 		}
+
+		if (ent->etype == st_npu_slot) {
+			/* NPU groups are at device level, so ignore function */
+			if (ent->location == ((pd->bdfn & 0xff) >> 3))
+				return ent;
+		}
+
 		if (ent->location == (pd->bdfn & 0xff))
 			return ent;
 	}
-- 
2.9.0



More information about the Skiboot mailing list