aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorRyan Grimm <grimm@linux.vnet.ibm.com>2020-08-04 23:02:13 +0530
committerOliver O'Halloran <oohall@gmail.com>2020-08-07 16:00:20 +1000
commit2d065e249f78e11ddeca0c84920b28a7ca4f8ee1 (patch)
tree0dcbaee1a6b13760e63b911cb58e61061d47e440 /include
parent043725d49d3b2c0b6ea3c37395aa5d6e38d5e73a (diff)
downloadskiboot-2d065e249f78e11ddeca0c84920b28a7ca4f8ee1.zip
skiboot-2d065e249f78e11ddeca0c84920b28a7ca4f8ee1.tar.gz
skiboot-2d065e249f78e11ddeca0c84920b28a7ca4f8ee1.tar.bz2
Add basic P9 fused core support
P9 cores can be configured into fused core mode where two core chiplets function as an 8-threaded, single core. So, bump four to eight in boot_entry when in fused core mode and cpu_thread_count in init_boot_cpu. The HID, AMOR, TSCR, RPR require the first active thread on that core chiplet to load the copy for that core chiplet. So, send thread 1 of a fused core to init_shared_sprs in boot_entry. The code checks for fused core mode in the core thead state register and puts a field in struct cpu_thread. This flag is checked when updating the HID and in XIVE code when setting the special bar. For XSCOM, the core ID is the non-fused EX. So, create macros to arrange the bits. It's fairly verbose but somewhat readable. This was tested on a P9 ZZ with 16 fused cores and ran HTX for over 24 hours. Signed-off-by: Ryan Grimm <grimm@linux.vnet.ibm.com> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Michael Neuling <mikey@neuling.org> Signed-off-by: Vaidyanathan Srinivasan <svaidy@linux.ibm.com> Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
Diffstat (limited to 'include')
-rw-r--r--include/chip.h31
-rw-r--r--include/cpu.h6
-rw-r--r--include/xscom.h3
3 files changed, 40 insertions, 0 deletions
diff --git a/include/chip.h b/include/chip.h
index b79b63e..38fafcf 100644
--- a/include/chip.h
+++ b/include/chip.h
@@ -56,6 +56,26 @@
* thus we have a 6-bit core number.
*
* Note: XIVE Only supports 4-bit chip numbers ...
+ *
+ * Upper PIR Bits
+ * --------------
+ *
+ * Normal-Core Mode:
+ * 57:61 CoreID
+ * 62:63 ThreadID
+ *
+ * Fused-Core Mode:
+ * 57:59 FusedQuadID
+ * 60 FusedCoreID
+ * 61:63 FusedThreadID
+ *
+ * FusedCoreID 0 contains normal-core chiplet 0 and 1
+ * FusedCoreID 1 contains normal-core chiplet 2 and 3
+ *
+ * Fused cores have interleaved threads:
+ * core chiplet 0/2 = t0, t2, t4, t6
+ * core chiplet 1/3 = t1, t3, t5, t7
+ *
*/
#define P9_PIR2GCID(pir) (((pir) >> 8) & 0x7f)
@@ -67,6 +87,17 @@
#define P9_GCID2CHIPID(gcid) ((gcid) & 0x7)
+#define P9_PIR2FUSEDQUADID(pir) (((pir) >> 4) & 0x7)
+
+#define P9_PIR2FUSEDCOREID(pir) (((pir) >> 3) & 0x1)
+
+#define P9_PIR2FUSEDTHREADID(pir) ((pir) & 0x7)
+
+#define P9_PIRFUSED2NORMALCOREID(pir) \
+ (P9_PIR2FUSEDQUADID(pir) << 2) | \
+ (P9_PIR2FUSEDCOREID(pir) << 1) | \
+ (P9_PIR2FUSEDTHREADID(pir) & 1)
+
/* P9 specific ones mostly used by XIVE */
#define P9_PIR2LOCALCPU(pir) ((pir) & 0xff)
#define P9_PIRFROMLOCALCPU(chip, cpu) (((chip) << 8) | (cpu))
diff --git a/include/cpu.h b/include/cpu.h
index c90b961..1863d6a 100644
--- a/include/cpu.h
+++ b/include/cpu.h
@@ -42,6 +42,7 @@ struct cpu_thread {
uint32_t server_no;
uint32_t chip_id;
bool is_secondary;
+ bool is_fused_core;
struct cpu_thread *primary;
enum cpu_thread_state state;
struct dt_node *node;
@@ -244,6 +245,11 @@ static inline bool cpu_is_thread0(struct cpu_thread *cpu)
return cpu->primary == cpu;
}
+static inline bool cpu_is_core_chiplet_primary(struct cpu_thread *cpu)
+{
+ return cpu->is_fused_core & (cpu_get_thread_index(cpu) == 1);
+}
+
static inline bool cpu_is_sibling(struct cpu_thread *cpu1,
struct cpu_thread *cpu2)
{
diff --git a/include/xscom.h b/include/xscom.h
index bd8bb89..db6d3fc 100644
--- a/include/xscom.h
+++ b/include/xscom.h
@@ -110,6 +110,9 @@
/*
* Additional useful definitions for P9
+ *
+ * Note: In all of these, the core numbering is the
+ * *normal* (small) core number.
*/
/*