summaryrefslogtreecommitdiffstats
path: root/import/chips
diff options
context:
space:
mode:
Diffstat (limited to 'import/chips')
-rw-r--r--import/chips/p9/common/pmlib/include/p9_stop_common.h23
-rw-r--r--import/chips/p9/procedures/hwp/lib/p9_hcode_image_defines.H4
-rw-r--r--import/chips/p9/procedures/ppe_closed/cme/p9_cme_irq.h10
-rw-r--r--import/chips/p9/procedures/ppe_closed/cme/p9_cme_main.c30
-rw-r--r--import/chips/p9/procedures/ppe_closed/cme/pk_app_cfg.h73
-rw-r--r--import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop.h33
-rw-r--r--import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_enter_marks.h13
-rwxr-xr-ximport/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_entry.c277
-rw-r--r--import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_exit.c338
-rw-r--r--import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_irq_handlers.c47
-rw-r--r--import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_hcd_core_arrayinit.c6
-rw-r--r--import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_hcd_core_chiplet_reset.c7
-rw-r--r--import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_hcd_core_scan0.c2
-rw-r--r--import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_hcd_core_startclocks.c3
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_arrayinit.c6
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_chiplet_l3_dcc_setup.C70
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_chiplet_reset.c148
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_dcc_skewadjust_setup.C141
-rwxr-xr-ximport/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_dpll_initf.C50
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_dpll_setup.c2
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_poweron.c7
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_scan0.c2
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_scominit.c32
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_sgpe_boot_cme.c14
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_main.C3
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop.h24
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_entry.c300
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_exit.c242
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_irq_handlers.c107
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/pk_app_cfg.h55
-rw-r--r--import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/topfiles.mk3
31 files changed, 1460 insertions, 612 deletions
diff --git a/import/chips/p9/common/pmlib/include/p9_stop_common.h b/import/chips/p9/common/pmlib/include/p9_stop_common.h
index 876ca7fa..f362e36e 100644
--- a/import/chips/p9/common/pmlib/include/p9_stop_common.h
+++ b/import/chips/p9/common/pmlib/include/p9_stop_common.h
@@ -28,8 +28,11 @@ enum P9_HCD_COMMON_CLK_CTRL_CONSTANTS
{
CLK_STOP_CMD = BIT64(0),
CLK_START_CMD = BIT64(1),
+ CLK_REGION_PERV = BIT64(4),
CLK_REGION_ANEP = BIT64(10),
CLK_REGION_DPLL = BIT64(14),
+ CLK_REGION_EX0_L2 = BIT64(8),
+ CLK_REGION_EX1_L2 = BIT64(9),
CLK_REGION_EX0_L2_L3_REFR = BIT64(6) | BIT64(8) | BIT64(12),
CLK_REGION_EX1_L2_L3_REFR = BIT64(7) | BIT64(9) | BIT64(13),
CLK_REGION_ALL_BUT_EX = BITS64(4, 2) | BITS64(10, 2) | BIT64(14),
@@ -37,9 +40,29 @@ enum P9_HCD_COMMON_CLK_CTRL_CONSTANTS
CLK_REGION_ALL_BUT_EX_ANEP_DPLL = BITS64(4, 2) | BIT64(11),
CLK_REGION_ALL_BUT_PLL = BITS64(4, 10),
CLK_REGION_ALL = BITS64(4, 11),
+ CLK_THOLD_SL = BIT64(48),
+ CLK_THOLD_NSL = BIT64(49),
+ CLK_THOLD_ARY = BIT64(50),
CLK_THOLD_ALL = BITS64(48, 3)
};
+// Scan Type Constants
+enum P9_HCD_COMMON_SCAN_TYPE_CONSTANTS
+{
+ SCAN_TYPE_FUNC = BIT64(48),
+ SCAN_TYPE_CFG = BIT64(49),
+ SCAN_TYPE_CCFG_GPTR = BIT64(50),
+ SCAN_TYPE_REGF = BIT64(51),
+ SCAN_TYPE_LBIST = BIT64(52),
+ SCAN_TYPE_ABIST = BIT64(53),
+ SCAN_TYPE_REPR = BIT64(54),
+ SCAN_TYPE_TIME = BIT64(55),
+ SCAN_TYPE_BNDY = BIT64(56),
+ SCAN_TYPE_FARR = BIT64(57),
+ SCAN_TYPE_CMSK = BIT64(58),
+ SCAN_TYPE_INEX = BIT64(59)
+};
+
// SCAN0 Constants
enum P9_HCD_COMMON_SCAN0_CONSTANTS
{
diff --git a/import/chips/p9/procedures/hwp/lib/p9_hcode_image_defines.H b/import/chips/p9/procedures/hwp/lib/p9_hcode_image_defines.H
index dd668679..aea5a525 100644
--- a/import/chips/p9/procedures/hwp/lib/p9_hcode_image_defines.H
+++ b/import/chips/p9/procedures/hwp/lib/p9_hcode_image_defines.H
@@ -320,7 +320,7 @@ enum
SGPE_IMG_HEADER = sizeof(sgpeHeader_t),
SGPE_DBG_PTR_AREA_SIZE = 64,
//SGPE_HCODE_SIZE = 32 * ONE_KB, // FIXME RTC 155018 Revisit after Hcode optimization
- SGPE_HCODE_SIZE = 42 * ONE_KB, // @todo RTC 158543 Reallocate space
+ SGPE_HCODE_SIZE = 45 * ONE_KB, // @todo RTC 158543 Reallocate space
SGPE_EXE_SIZE = (SGPE_HCODE_SIZE - ( SGPE_INT_VECT +
SGPE_IMG_HEADER + PK_DBG_PTR_AREA_SIZE )),
@@ -371,7 +371,7 @@ enum
CME_INT_VECTOR_SIZE = 384,
CME_IMG_HEADER_SIZE = 64,
CPMR_CME_HCODE_OFFSET = (CORE_SCOM_START + CORE_SCOM_RES_SIZE),
- CME_HCODE_SIZE = (27 * ONE_KB) + HALF_KB,
+ CME_HCODE_SIZE = (28 * ONE_KB) + HALF_KB,
//** Scan
CORE_COMMON_RING_SIZE = 3 * ONE_KB, // common ring( 2KB) + common overrides (1KB)
diff --git a/import/chips/p9/procedures/ppe_closed/cme/p9_cme_irq.h b/import/chips/p9/procedures/ppe_closed/cme/p9_cme_irq.h
index 45fc7a21..fc60c76b 100644
--- a/import/chips/p9/procedures/ppe_closed/cme/p9_cme_irq.h
+++ b/import/chips/p9/procedures/ppe_closed/cme/p9_cme_irq.h
@@ -80,12 +80,12 @@ extern const uint64_t ext_irq_vectors_cme[NUM_EXT_IRQ_PRTY_LEVELS][2];
// Group0: Non-task hi-prty IRQs
#define IRQ_VEC_PRTY0_CME (uint64_t)(0xFE00000000000000)
-// Group1: DB3
+// Group1: BCE+DB3
#define IRQ_VEC_PRTY1_CME (uint64_t)(0x0030000000000000)
-// Group2: DB2
-#define IRQ_VEC_PRTY2_CME (uint64_t)(0x0000300000000000)
-// Group3: WAKEUP + STOP
-#define IRQ_VEC_PRTY3_CME (uint64_t)(0x000FCC0000000000)
+// Group2: WAKE+DB2
+#define IRQ_VEC_PRTY2_CME (uint64_t)(0x000FF00000000000)
+// Group3: STOP
+#define IRQ_VEC_PRTY3_CME (uint64_t)(0x00000C0000000000)
// Group4: DB1
#define IRQ_VEC_PRTY4_CME (uint64_t)(0x0000000000C00000)
// Group5: DB0
diff --git a/import/chips/p9/procedures/ppe_closed/cme/p9_cme_main.c b/import/chips/p9/procedures/ppe_closed/cme/p9_cme_main.c
index 4b7559c7..3f9a9912 100644
--- a/import/chips/p9/procedures/ppe_closed/cme/p9_cme_main.c
+++ b/import/chips/p9/procedures/ppe_closed/cme/p9_cme_main.c
@@ -26,6 +26,7 @@
#include "pk.h"
#include "p9_cme_irq.h"
#include "p9_cme_flags.h"
+#include "p9_hcode_image_defines.H"
// CME Pstate Header and Structure
#include "p9_cme_pstate.h"
@@ -55,23 +56,23 @@ IRQ_HANDLER_DEFAULT //CMEHW_IRQ_BCE_BUSY_HIGH
IRQ_HANDLER_DEFAULT //CMEHW_IRQ_BCE_TIMEOUT
IRQ_HANDLER_DEFAULT //CMEHW_IRQ_DOORBELL3_C0
IRQ_HANDLER_DEFAULT //CMEHW_IRQ_DOORBELL3_C1
-IRQ_HANDLER(p9_cme_stop_event_handler, (void*) & (G_cme_stop_record.sem[1]))
+IRQ_HANDLER(p9_cme_stop_exit_handler, (void*) & (G_cme_stop_record.sem[1]))
//CMEHW_IRQ_PC_INTR_PENDING_C0
-IRQ_HANDLER(p9_cme_stop_event_handler, (void*) & (G_cme_stop_record.sem[1]))
+IRQ_HANDLER(p9_cme_stop_exit_handler, (void*) & (G_cme_stop_record.sem[1]))
//CMEHW_IRQ_PC_INTR_PENDING_C1
-IRQ_HANDLER(p9_cme_stop_event_handler, (void*) & (G_cme_stop_record.sem[1]))
+IRQ_HANDLER(p9_cme_stop_exit_handler, (void*) & (G_cme_stop_record.sem[1]))
//CMEHW_IRQ_REG_WAKEUP_C0
-IRQ_HANDLER(p9_cme_stop_event_handler, (void*) & (G_cme_stop_record.sem[1]))
+IRQ_HANDLER(p9_cme_stop_exit_handler, (void*) & (G_cme_stop_record.sem[1]))
//CMEHW_IRQ_REG_WAKEUP_C1
-IRQ_HANDLER(p9_cme_stop_event_handler, (void*) & (G_cme_stop_record.sem[1]))
+IRQ_HANDLER(p9_cme_stop_exit_handler, (void*) & (G_cme_stop_record.sem[1]))
//CMEHW_IRQ_SPECIAL_WAKEUP_C0
-IRQ_HANDLER(p9_cme_stop_event_handler, (void*) & (G_cme_stop_record.sem[1]))
+IRQ_HANDLER(p9_cme_stop_exit_handler, (void*) & (G_cme_stop_record.sem[1]))
//CMEHW_IRQ_SPECIAL_WAKEUP_C1
IRQ_HANDLER(p9_cme_stop_db2_handler, 0) //CMEHW_IRQ_DOORBELL2_C0
IRQ_HANDLER(p9_cme_stop_db2_handler, 0) //CMEHW_IRQ_DOORBELL2_C1
-IRQ_HANDLER(p9_cme_stop_event_handler, (void*) & (G_cme_stop_record.sem[0]))
+IRQ_HANDLER(p9_cme_stop_enter_handler, (void*) & (G_cme_stop_record.sem[0]))
//CMEHW_IRQ_PC_PM_STATE_ACTIVE_C0
-IRQ_HANDLER(p9_cme_stop_event_handler, (void*) & (G_cme_stop_record.sem[0]))
+IRQ_HANDLER(p9_cme_stop_enter_handler, (void*) & (G_cme_stop_record.sem[0]))
//CMEHW_IRQ_PC_PM_STATE_ACTIVE_C1
IRQ_HANDLER_DEFAULT //CMEHW_IRQ_L2_PURGE_DONE
IRQ_HANDLER_DEFAULT //CMEHW_IRQ_NCU_PURGE_DONE
@@ -168,6 +169,19 @@ main(int argc, char** argv)
PK_TRACE("Kernel init completed");
+ // reading header attributes and initialize the queued scom mode
+ cmeHeader_t* pCmeImgHdr = (cmeHeader_t*)(CME_SRAM_BASE + CME_HEADER_IMAGE_OFFSET);
+ G_cme_stop_record.header_flags = pCmeImgHdr->g_cme_mode_flags;
+
+ if (G_cme_stop_record.header_flags & QUEUED_SCAN_DISABLE)
+ {
+ out32(CME_LCL_LMCR_CLR, BITS32(8, 2));
+ }
+ else
+ {
+ out32(CME_LCL_LMCR_OR, BITS32(8, 2));
+ }
+
// Unified interrupt handler checks
if (IDX_PRTY_LVL_DISABLED != (NUM_EXT_IRQ_PRTY_LEVELS - 1))
{
diff --git a/import/chips/p9/procedures/ppe_closed/cme/pk_app_cfg.h b/import/chips/p9/procedures/ppe_closed/cme/pk_app_cfg.h
index 1a2b1433..4fd3cc7c 100644
--- a/import/chips/p9/procedures/ppe_closed/cme/pk_app_cfg.h
+++ b/import/chips/p9/procedures/ppe_closed/cme/pk_app_cfg.h
@@ -34,53 +34,68 @@
/// \brief Application specific overrides go here.
///
-#define HW386841_PLS_SRR1_DSL_STOP1_FIX 0
-#define BROADSIDE_SCAN0 0
-#define TEST_ONLY_BCE_IRR 0
+// @todo RTC 161182
+#define HW386841_DD1_PLS_SRR1_DSL_STOP1_FIX 0
+#define TEST_ONLY_BCE_IRR 0
+
+// --------------------
+
+#ifndef EPM_P9_TUNING
+ #define EPM_P9_TUNING 0
+#endif
#define STOP_PRIME 0
#define SKIP_ABORT 0
#define SKIP_L2_PURGE_ABORT 0
#define SKIP_ENTRY_CATCHUP 0
-#define ISTEP15_HACK 1
-
-#if !ISTEP15_HACK
- #define SKIP_EXIT_CATCHUP 0
- #define EPM_P9_TUNING 1
- #define SKIP_SCAN0 0
- #define SKIP_INITF 0
- #define SKIP_SELF_RESTORE 0
- #define SKIP_RAM_HRMOR 0
+#define SKIP_EXIT_CATCHUP 0
+#define SKIP_ARRAYINIT 0
+#define SKIP_SCAN0 0
+#define SKIP_INITF 0
+#define SKIP_SELF_RESTORE 0
+#define SKIP_RAM_HRMOR 0
+
+#if EPM_P9_TUNING
+ #define SPWU_AUTO 1
#define SKIP_BCE_SCAN_RING 1
#define SKIP_BCE_SCOM_RESTORE 1
- #define SPWU_AUTO 1
- #define SKIP_ARRAYINIT 0
+ #define EPM_BROADSIDE_SCAN0 0
#else
- #define SKIP_EXIT_CATCHUP 1
- #define EPM_P9_TUNING 0
- #define SKIP_SCAN0 0
- #define SKIP_INITF 0
- #define SKIP_SELF_RESTORE 0
- #define SKIP_RAM_HRMOR 0
+ #define SPWU_AUTO 0
#define SKIP_BCE_SCAN_RING 0
#define SKIP_BCE_SCOM_RESTORE 1
- #define SPWU_AUTO 0
- #define SKIP_ARRAYINIT 0
+ #define EPM_BROADSIDE_SCAN0 0
#endif
-
// --------------------
-#define SIMICS_TUNING 0
-#define USE_SIMICS_IO 0
-#define DEV_DEBUG 1
+#define PK_TRACE_LEVEL 2
+
+#if PK_TRACE_LEVEL == 0 /*No TRACEs*/
+ #define PK_TRACE_ENABLE 0
+ #define PK_KERNEL_TRACE_ENABLE 0
+#elif PK_TRACE_LEVEL == 1 /*only PK_TRACE_INF*/
+ #define PK_TRACE_ENABLE 1
+ #define PK_TRACE_CRIT_ENABLE 1
+ #define PK_TRACE_DBG_SUPPRESS 1
+ #define PK_KERNEL_TRACE_ENABLE 0
+#else /*All TRACEs*/
+ #define PK_TRACE_ENABLE 1
+ #define PK_TRACE_CRIT_ENABLE 1
+ #define PK_TRACE_DBG_SUPPRESS 0
+ #define PK_KERNEL_TRACE_ENABLE 1
+#endif
#if EPM_P9_TUNING
#define PK_TRACE_BUFFER_WRAP_MARKER 1
#endif
-#define PK_TRACE_TIMER_OUTPUT 0
-#define PK_TRACE_ENABLE 1
-#define PK_KERNEL_TRACE_ENABLE 1
+#define PK_TRACE_TIMER_OUTPUT 0
+
+// --------------------
+
+#define SIMICS_TUNING 0
+#define USE_SIMICS_IO 0
+#define DEV_DEBUG 1
// --------------------
diff --git a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop.h b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop.h
index 32ee95fd..247dec5e 100644
--- a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop.h
+++ b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop.h
@@ -138,7 +138,7 @@
(((uint64_t)pls) << SHIFT64(60)) | ((uint64_t)srr1_t3) | \
(BIT64(32) | BIT64(40) | BIT64(48) | BIT64(56)))
-#if HW386841_PLS_SRR1_DLS_STOP1_FIX
+#if HW386841_DD1_PLS_SRR1_DLS_STOP1_FIX
#define CME_STOP_UPDATE_DLS(dls, srr1) \
((((uint64_t)dls.threads.t0) << SHIFT64(36)) | (((uint64_t)srr1[0]) << SHIFT64(39)) | \
(((uint64_t)dls.threads.t1) << SHIFT64(44)) | (((uint64_t)srr1[1]) << SHIFT64(47)) | \
@@ -172,12 +172,22 @@ enum CME_STOP_IRQ_SHORT_NAME
enum CME_IRQ_VECTORS
{
+// if auto mask eimr.spwu else never mask eimr.spwu
+#if SPWU_AUTO
IRQ_VEC_WAKE_C0 = BIT64(12) | BIT64(14) | BIT64(16),
IRQ_VEC_WAKE_C1 = BIT64(13) | BIT64(15) | BIT64(17),
+#else
+ IRQ_VEC_WAKE_C0 = BIT64(12) | BIT64(16),
+ IRQ_VEC_WAKE_C1 = BIT64(13) | BIT64(17),
+#endif
IRQ_VEC_SGPE_C0 = BIT64(12) | BIT64(20),
IRQ_VEC_SGPE_C1 = BIT64(13) | BIT64(21),
IRQ_VEC_PCWU_C0 = BIT64(12),
IRQ_VEC_PCWU_C1 = BIT64(13),
+ IRQ_VEC_SPWU_C0 = BIT64(14),
+ IRQ_VEC_SPWU_C1 = BIT64(15),
+ IRQ_VEC_RGWU_C0 = BIT64(16),
+ IRQ_VEC_RGWU_C1 = BIT64(17),
IRQ_VEC_STOP_C0 = BIT64(20),
IRQ_VEC_STOP_C1 = BIT64(21)
};
@@ -195,6 +205,17 @@ enum CME_STOP_FLAGS
FLAG_PARTIAL_GOOD_C1 = BIT32(31)
};
+enum ATTR_CME_MODE_FLAGS
+{
+ MAP_3_TO_2 = BIT32(0),
+ MAP_4_TO_2 = BIT32(1),
+ MAP_5_TO_4 = BIT32(2),
+ MAP_8_TO_5 = BIT32(3),
+ MAP_11_TO_8 = BIT32(4),
+ QUEUED_SCAN_DISABLE = BIT32(30),
+ SKIP_CORE_POWEROFF = BIT32(31)
+};
+
enum CME_STOP_PIG_TYPES
{
PIG_TYPE2 = 2,
@@ -215,7 +236,7 @@ enum CME_STOP_SRR1
NO_STATE_LOSS = 1
};
-#if HW386841_PLS_SRR1_DLS_STOP1_FIX
+#if HW386841_DD1_PLS_SRR1_DLS_STOP1_FIX
typedef union
{
uint16_t vector;
@@ -274,6 +295,10 @@ typedef struct
uint32_t core_stopgpe;
// core in block wakeup mode
uint32_t core_blockwu;
+ // core in special wakeup
+ uint32_t core_in_spwu;
+ // cme header attributes
+ uint32_t header_flags;
PkSemaphore sem[2];
} CmeStopRecord;
@@ -284,7 +309,9 @@ void p9_cme_stop_exit_thread(void*);
int p9_cme_stop_entry();
int p9_cme_stop_exit();
-void p9_cme_stop_event_handler(void*, PkIrqId);
+void p9_cme_stop_enter_handler(void*, PkIrqId);
+void p9_cme_stop_exit_handler(void*, PkIrqId);
+void p9_cme_stop_spwu_handler(void*, PkIrqId);
void p9_cme_stop_db1_handler(void*, PkIrqId);
void p9_cme_stop_db2_handler(void*, PkIrqId);
diff --git a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_enter_marks.h b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_enter_marks.h
index 5ee4326a..4a049ea9 100644
--- a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_enter_marks.h
+++ b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_enter_marks.h
@@ -38,9 +38,10 @@ enum CME_SE_MARKS
{
BEGINSCOPE_STOP_ENTRY = 0x0,
ENDSCOPE_STOP_ENTRY = 0x8,
- STOP_EVENT_HANDLER = 0x10,
- STOP_DB1_HANDLER = 0x18,
- STOP_DB2_HANDLER = 0x20,
+ STOP_ENTER_HANDLER = 0x10,
+ STOP_EXIT_HANDLER = 0x18,
+ STOP_DB1_HANDLER = 0x20,
+ STOP_DB2_HANDLER = 0x28,
SE_QUIESCE_CORE_INTF = 0x68,
SE_STOP_CORE_CLKS = 0xe0,
SE_STOP_CORE_GRID = 0xe8,
@@ -67,7 +68,8 @@ const std::vector<CME_SE_MARKS> MARKS =
{
BEGINSCOPE_STOP_ENTRY,
ENDSCOPE_STOP_ENTRY,
- STOP_EVENT_HANDLER,
+ STOP_ENTER_HANDLER,
+ STOP_EXIT_HANDLER,
STOP_DB1_HANDLER,
STOP_DB2_HANDLER,
SE_QUIESCE_CORE_INTF,
@@ -92,7 +94,8 @@ const std::vector<CME_SE_MARKS> MARKS =
const std::map<CME_SE_MARKS, std::string> mMARKS = boost::assign::map_list_of
(BEGINSCOPE_STOP_ENTRY, "BEGINSCOPE_STOP_ENTRY")
(ENDSCOPE_STOP_ENTRY, "ENDSCOPE_STOP_ENTRY")
- (STOP_EVENT_HANDLER, "STOP_EVENT_HANDLER")
+ (STOP_ENTER_HANDLER, "STOP_ENTER_HANDLER")
+ (STOP_EXIT_HANDLER, "STOP_EXIT_HANDLER")
(STOP_DB1_HANDLER, "STOP_DB1_HANDLER")
(STOP_DB2_HANDLER, "STOP_DB2_HANDLER")
(SE_QUIESCE_CORE_INTF, "SE_QUIESCE_CORE_INTF")
diff --git a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_entry.c b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_entry.c
index 43e3f4fb..6ec1b08e 100755
--- a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_entry.c
+++ b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_entry.c
@@ -70,7 +70,7 @@ p9_cme_stop_entry()
ppm_pig_t pig;
//--------------------------------------------------------------------------
- // BEGIN OF STOP ENTRY
+ PK_TRACE_INF("+++++ +++++ BEGIN OF STOP ENTRY +++++ +++++");
//--------------------------------------------------------------------------
// First we need to determine which of the two STOP interrupts fired.
@@ -84,14 +84,13 @@ p9_cme_stop_entry()
core = core & G_cme_stop_record.core_enabled &
G_cme_stop_record.core_running;
- PK_TRACE("SE0: Core Select[%d] Enabled[%d] Running[%d]",
- core, G_cme_stop_record.core_enabled,
- G_cme_stop_record.core_running);
+ PK_TRACE_INF("Check: Core Select[%d] Enabled[%d] Running[%d]",
+ core, G_cme_stop_record.core_enabled,
+ G_cme_stop_record.core_running);
- // Return error if None of both fired
if (!core)
{
- PK_TRACE("Error: no pm_active fired");
+ PK_TRACE_INF("ERROR: No PM_ACTIVE Fired From a Running and Enabled Core. HALT CME!");
pk_halt();
}
@@ -102,10 +101,6 @@ p9_cme_stop_entry()
do // while(0) loop for stop flow control
{
- //----------------------------------------------------------------------
- // STOP LEVEL 1 (should be done by hardware)
- //----------------------------------------------------------------------
-
// Read SISR for pm_state_cX
pm_states = in32_sh(CME_LCL_SISR);
@@ -136,6 +131,31 @@ p9_cme_stop_entry()
G_cme_stop_record.act_level_c0 = STOP_LEVEL_1;
core_stop1 |= CME_MASK_C0;
}
+
+ if ((G_cme_stop_record.header_flags & MAP_11_TO_8) &&
+ (G_cme_stop_record.req_level_c0 == STOP_LEVEL_11))
+ {
+
+ G_cme_stop_record.req_level_c0 = STOP_LEVEL_8;
+ }
+
+ if ((G_cme_stop_record.header_flags & MAP_8_TO_5) &&
+ (G_cme_stop_record.req_level_c0 == STOP_LEVEL_8))
+ {
+ G_cme_stop_record.req_level_c0 = STOP_LEVEL_5;
+ }
+
+ if ((G_cme_stop_record.header_flags & MAP_5_TO_4) &&
+ (G_cme_stop_record.req_level_c0 == STOP_LEVEL_5))
+ {
+ G_cme_stop_record.req_level_c0 = STOP_LEVEL_4;
+ }
+
+ if ((G_cme_stop_record.header_flags & MAP_4_TO_2) &&
+ (G_cme_stop_record.req_level_c0 == STOP_LEVEL_4))
+ {
+ G_cme_stop_record.req_level_c0 = STOP_LEVEL_2;
+ }
}
if (core & CME_MASK_C1)
@@ -148,24 +168,56 @@ p9_cme_stop_entry()
G_cme_stop_record.act_level_c1 = STOP_LEVEL_1;
core_stop1 |= CME_MASK_C1;
}
+
+ if ((G_cme_stop_record.header_flags & MAP_11_TO_8) &&
+ (G_cme_stop_record.req_level_c1 == STOP_LEVEL_11))
+ {
+ G_cme_stop_record.req_level_c1 = STOP_LEVEL_8;
+ }
+
+ if ((G_cme_stop_record.header_flags & MAP_8_TO_5) &&
+ (G_cme_stop_record.req_level_c1 == STOP_LEVEL_8))
+ {
+ G_cme_stop_record.req_level_c1 = STOP_LEVEL_5;
+ }
+
+ if ((G_cme_stop_record.header_flags & MAP_5_TO_4) &&
+ (G_cme_stop_record.req_level_c1 == STOP_LEVEL_5))
+ {
+ G_cme_stop_record.req_level_c1 = STOP_LEVEL_4;
+ }
+
+ if ((G_cme_stop_record.header_flags & MAP_4_TO_2) &&
+ (G_cme_stop_record.req_level_c1 == STOP_LEVEL_4))
+ {
+ G_cme_stop_record.req_level_c1 = STOP_LEVEL_2;
+ }
}
- G_cme_stop_record.core_running &= ~core;
+ PK_TRACE_INF("Check: Stop Levels Request[%d %d] Actual[%d, %d]",
+ G_cme_stop_record.req_level_c0,
+ G_cme_stop_record.req_level_c1,
+ G_cme_stop_record.act_level_c0,
+ G_cme_stop_record.act_level_c1);
- PK_TRACE("SE1: Stop Levels Request[%d %d] Actual[%d, %d]",
- G_cme_stop_record.req_level_c0,
- G_cme_stop_record.req_level_c1,
- G_cme_stop_record.act_level_c0,
- G_cme_stop_record.act_level_c1);
+ // Mark core as to be stopped
+ G_cme_stop_record.core_running &= ~core;
- // Return error if target STOP level == 1(Nap)
if(core_stop1)
{
-#if HW386841_PLS_SRR1_DLS_STOP1_FIX
- // Acknowledge the STOP Entry to PC with a pulse
+ PK_TRACE_INF("Check: core[%d] core_stop1[%d]", core, core_stop1);
+
+#if HW386841_DD1_PLS_SRR1_DLS_STOP1_FIX
+
+ //----------------------------------------------------------------------
+ PK_TRACE_INF("+++++ +++++ STOP LEVEL 1 ENTRY +++++ +++++");
+ //----------------------------------------------------------------------
+
+ PK_TRACE("Pulse STOP entry acknowledgement to PC via SICR[0/1]");
out32(CME_LCL_SICR_OR, core_stop1 << SHIFT32(1));
out32(CME_LCL_SICR_CLR, core_stop1 << SHIFT32(1));
+ PK_TRACE("Update STOP history: in core stop level 1");
CME_STOP_UPDATE_HISTORY(core_stop1,
STOP_CORE_IS_GATED,
STOP_TRANS_COMPLETE,
@@ -182,25 +234,24 @@ p9_cme_stop_entry()
}
#else
- PK_TRACE("Error: stop 1 requested to hcode");
+
+ // Nap should be done by hardware when auto_stop1 is enabled
+ // Halt on error if target STOP level == 1(Nap)
+ PK_TRACE_INF("ERROR: Stop 1 Requested to CME When AUTO_STOP1 Enabled, HALT CME!");
pk_halt();
+
#endif
+
}
//----------------------------------------------------------------------
- // STOP LEVEL 2
+ PK_TRACE_INF("+++++ +++++ STOP LEVEL 2 ENTRY +++++ +++++");
//----------------------------------------------------------------------
- PK_TRACE("SE2.c");
- // Request PCB Mux
+ PK_TRACE("Request PCB mux via SICR[10/11]");
out32(CME_LCL_SICR_OR, core << SHIFT32(11));
- PK_TRACE("SE2.d");
- // Protect PPM Register Write
- CME_PUTSCOM(CPPM_CPMMR_OR, core, BIT64(0));
-
- PK_TRACE("SE2.g");
- // Acknowledge the STOP Entry to PC with a pulse
+ PK_TRACE("Pulse STOP entry acknowledgement to PC via SICR[0/1]");
out32(CME_LCL_SICR_OR, core << SHIFT32(1));
out32(CME_LCL_SICR_CLR, core << SHIFT32(1));
@@ -225,8 +276,7 @@ p9_cme_stop_entry()
}
}
- PK_TRACE("SE2.e");
- // Update STOP History: In Transition of Entry
+ PK_TRACE("Update STOP history: in transition of entry");
// Set req_level_level to target_level of either both or just one core
CME_STOP_UPDATE_HISTORY(core,
STOP_CORE_READY_RUN,
@@ -248,30 +298,31 @@ p9_cme_stop_entry()
STOP_ACT_DISABLE);
}
- PK_TRACE("SE2: core[%d], target_lv[%d], deeper_lv[%d], deeper_core[%d]",
- core, target_level, deeper_level, deeper_core);
+ PK_TRACE_INF("Check: core[%d] target_lv[%d] deeper_lv[%d] deeper_core[%d]",
+ core, target_level, deeper_level, deeper_core);
// Poll Infinitely for PCB Mux Grant
// MF: change watchdog timer in pk to ensure forward progress
while((core & (in32(CME_LCL_SISR) >> SHIFT32(11))) != core);
- PK_TRACE("SE2: PCB Mux Granted");
+ PK_TRACE_INF("SE2.A: PCB Mux Granted");
//=============================
MARK_TRAP(SE_QUIESCE_CORE_INTF)
//=============================
- /// Set LMCR bits 12/13, 14/15 (override disables)
+ PK_TRACE("Assert halt STOP override disable via LMCR[14/15]");
out32(CME_LCL_LMCR_OR, (core << SHIFT32(15)));
+
#if SPWU_AUTO
+ PK_TRACE("Assert auto special wakeup disable via LMCR[12/13]");
out32(CME_LCL_LMCR_OR, (core << SHIFT32(13)));
#endif
- PK_TRACE("SE2.h");
- // Raise Core-L2 + Core-CC Quiesces
+ PK_TRACE("Assert core-L2 + core-CC quiesces via SICR[6/7,8/9]");
out32(CME_LCL_SICR_OR, (core << SHIFT32(7)) | (core << SHIFT32(9)));
- PK_TRACE("SE2.i");
+ PK_TRACE("Poll for L2 interface quiesced via SISR[30/31]");
do
{
@@ -283,25 +334,24 @@ p9_cme_stop_entry()
// MF: verify generate FCB otherwise math is wrong.
PPE_WAIT_CORE_CYCLES(loop, 512)
+ PK_TRACE_INF("SE2.B: Interfaces Quiesced");
+
//==========================
MARK_TRAP(SE_STOP_CORE_CLKS)
//==========================
- PK_TRACE("SE2.j");
- // Raise Core Chiplet Fence
+ PK_TRACE("Assert core chiplet fence via NET_CTRL0[18]");
CME_PUTSCOM(CPPM_NC0INDIR_OR, core, BIT64(18));
- PK_TRACE("SE2.k");
- // Set all bits to zero prior stop core clocks
+ PK_TRACE("Clear SCAN_REGION_TYPE prior to stop core clocks");
CME_PUTSCOM(C_SCAN_REGION_TYPE, core, 0);
- PK_TRACE("SE2.l");
- // Stop Core Clocks
- CME_PUTSCOM(C_CLK_REGION, core, (CLK_STOP_CMD | CLK_REGION_ALL_BUT_PLL | CLK_THOLD_ALL));
+ PK_TRACE("Stop Core Clocks via CLK_REGION");
+ CME_PUTSCOM(C_CLK_REGION, core,
+ (CLK_STOP_CMD | CLK_REGION_ALL_BUT_PLL | CLK_THOLD_ALL));
- PK_TRACE("SE2.m");
+ PK_TRACE("Poll for core clocks stopped via CPLT_STAT0[8]");
- // Poll for core clocks stopped
do
{
CME_GETSCOM(C_CPLT_STAT0, core, CME_SCOM_AND, scom_data);
@@ -313,52 +363,51 @@ p9_cme_stop_entry()
if (((~scom_data) & CLK_REGION_ALL_BUT_PLL) != 0)
{
- PK_TRACE("Core clock stop failed");
+ PK_TRACE_INF("ERROR: Core Clock Stop Failed. HALT CME!");
pk_halt();
}
// MF: verify compiler generate single rlwmni
// MF: delay may be needed for stage latch to propagate thold
- PK_TRACE("SE2: Core Clock Stopped");
+ PK_TRACE_INF("SE2.C: Core Clock Stopped");
//==============================
MARK_TRAP(SE_STOP_CORE_GRID)
//==============================
- PK_TRACE("SE2.n");
- // Drop clock sync enable before switch to refclk
+ PK_TRACE("Drop clock sync enable before switch to refclk via CACCR[15]");
CME_PUTSCOM(CPPM_CACCR_CLR, core, BIT64(15));
- PK_TRACE("SE2.o");
+ PK_TRACE("Poll for clock sync done to drop via CACSR[13]");
- // Poll for clock sync done to drop
do
{
CME_GETSCOM(CPPM_CACSR, core, CME_SCOM_OR, scom_data);
}
while(scom_data & BIT64(13));
- PK_TRACE("SE2.p");
- // Switch glsmux to refclk to save clock grid power
+ PK_TRACE("Switch glsmux to refclk to save clock grid power via CGCR[3]");
CME_PUTSCOM(C_PPM_CGCR, core, 0);
- // Assert skew sense to skewadjust Fence
+ PK_TRACE("Assert skew sense to skewadjust fence via NET_CTRL0[22]");
CME_PUTSCOM(CPPM_NC0INDIR_OR, core, BIT64(22));
- // Assert Vital Fence
+
+ PK_TRACE("Assert vital fence via CPLT_CTRL1[3]");
CME_PUTSCOM(C_CPLT_CTRL1_OR, core, BIT64(3));
- // Assert Regional Fences
+
+ PK_TRACE("Assert regional fences via CPLT_CTRL1[4-13]");
CME_PUTSCOM(C_CPLT_CTRL1_OR, core, BITS64(4, 11));
- /// @todo add DD1 attribute control
- PK_TRACE("DD1 only: reset sdis_n(flushing LCBES condition workaround");
+
+ PK_TRACE("Drop sdis_n(flushing LCBES condition) via CPLT_CONF0[34]");
CME_PUTSCOM(C_CPLT_CONF0_CLEAR, core, BIT64(34));
+
/// @todo add VDM_ENABLE attribute control
PK_TRACE("Drop vdm enable via CPPM_VDMCR[0]");
CME_PUTSCOM(PPM_VDMCR_CLR, core, BIT64(0));
- PK_TRACE("SE2: Clock Sync Dropped");
+ PK_TRACE("Copy PECE CME sample to PPM Shadow via PECES");
- // Copy PECE CME sample to PPM Shadow
if (core & CME_MASK_C0)
{
scom_data = in64(CME_LCL_PECESR0);
@@ -373,12 +422,13 @@ p9_cme_stop_entry()
G_cme_stop_record.act_level_c1 = STOP_LEVEL_2;
}
+ PK_TRACE_INF("SE2.D: Clock Sync Dropped");
+
//===========================
MARK_TAG(SE_STOP2_DONE, core)
//===========================
- PK_TRACE("SE2.q");
- // Update Stop History: In Core Stop Level 2
+ PK_TRACE("Update STOP history: in core stop level 2");
// Check if STOP level 2 reaches the target for both or one core
entry_ongoing =
target_level == STOP_LEVEL_2 ?
@@ -472,8 +522,8 @@ p9_cme_stop_entry()
//========================
}
- PK_TRACE("core[%d] running[%d] core_catchup[%d] origin_core[%d]",
- core, G_cme_stop_record.core_running, core_catchup, origin_core);
+ PK_TRACE_INF("Catch: core[%d] running[%d] core_catchup[%d] origin_core[%d]",
+ core, G_cme_stop_record.core_running, core_catchup, origin_core);
#endif
@@ -492,6 +542,7 @@ p9_cme_stop_entry()
//===========================
MARK_TRAP(SE_IS0_BEGIN)
//===========================
+
#if !SKIP_ABORT
out32(CME_LCL_EIMR_CLR, (core << SHIFT32(13)) |
(core << SHIFT32(15)) |
@@ -501,6 +552,7 @@ p9_cme_stop_entry()
(core << SHIFT32(15)) |
(core << SHIFT32(17)));
#endif
+
//===================
MARK_TRAP(SE_IS0_END)
//===================
@@ -508,8 +560,8 @@ p9_cme_stop_entry()
core_aborted = core & G_cme_stop_record.core_running;
core = core & ~G_cme_stop_record.core_running;
- PK_TRACE("core[%d] running[%d] core_aborted[%d]",
- core, G_cme_stop_record.core_running, core_aborted);
+ PK_TRACE_INF("Abort: core[%d] running[%d] core_aborted[%d]",
+ core, G_cme_stop_record.core_running, core_aborted);
if (!core)
{
@@ -528,12 +580,11 @@ p9_cme_stop_entry()
deeper_core = 0;
}
- PK_TRACE("SE2+:core[%d],deeper_core[%d],\
- target_level[%d],deeper_level[%d]",
- core, deeper_core, target_level, deeper_level);
+ PK_TRACE_INF("Check: core[%d] deeper_core[%d] target_level[%d] deeper_level[%d]",
+ core, deeper_core, target_level, deeper_level);
//----------------------------------------------------------------------
- // STOP LEVEL 3
+ PK_TRACE_INF("+++++ +++++ STOP LEVEL 3 ENTRY +++++ +++++");
//----------------------------------------------------------------------
if (target_level == 3)
@@ -608,34 +659,34 @@ p9_cme_stop_entry()
}
//----------------------------------------------------------------------
- // STOP LEVEL 4
+ PK_TRACE_INF("+++++ +++++ STOP LEVEL 4 ENTRY +++++ +++++");
//----------------------------------------------------------------------
//===============================
MARK_TAG(SE_POWER_OFF_CORE, core)
//===============================
- // DD: Assert Cores Vital Thold/PCB Fence/Electrical Fence
- PK_TRACE("SE4.a");
+ PK_TRACE("Assert PCB fence via NET_CTRL0[25]");
CME_PUTSCOM(CPPM_NC0INDIR_OR, core, BIT64(25));
+
+ PK_TRACE("Assert electrical fence via NET_CTRL0[26]");
CME_PUTSCOM(CPPM_NC0INDIR_OR, core, BIT64(26));
+
+ PK_TRACE("Assert vital thold via NET_CTRL0[16]");
CME_PUTSCOM(CPPM_NC0INDIR_OR, core, BIT64(16));
#if !STOP_PRIME
- // Prepare PFET Controls
+ PK_TRACE("Drop vdd_pfet_val/sel_override/regulation_finger_en via PFCS[4,5,8]");
// vdd_pfet_val/sel_override = 0 (disbaled)
// vdd_pfet_regulation_finger_en = 0 (controled by FSM)
- PK_TRACE("SE4.c");
CME_PUTSCOM(PPM_PFCS_CLR, core, BIT64(4) | BIT64(5) | BIT64(8));
- // Power Off Core VDD
+ PK_TRACE("Power off core VDD via PFCS[0-1]");
// vdd_pfet_force_state = 01 (Force Voff)
- PK_TRACE("SE4.d");
CME_PUTSCOM(PPM_PFCS_OR, core, BIT64(1));
- // Poll for power gate sequencer state: 0x8 (FSM Idle)
- PK_TRACE("SE4.e");
+ PK_TRACE("Poll for power gate sequencer state: 0x8 (FSM Idle) via PFCS[42]");
do
{
@@ -643,15 +694,12 @@ p9_cme_stop_entry()
}
while(!(scom_data & BIT64(42)));
- // Turn Off Force Voff
+ PK_TRACE("Turn off force voff via PFCS[0-1]");
// vdd_pfet_force_state = 00 (Nop)
- PK_TRACE("SE4.g");
CME_PUTSCOM(PPM_PFCS_CLR, core, BITS64(0, 2));
#endif
- PK_TRACE("SE4: Core Powered Off");
-
if (core & CME_MASK_C0)
{
G_cme_stop_record.act_level_c0 = STOP_LEVEL_4;
@@ -662,12 +710,13 @@ p9_cme_stop_entry()
G_cme_stop_record.act_level_c1 = STOP_LEVEL_4;
}
+ PK_TRACE_INF("SE4.A: Core Powered Off");
+
//===========================
MARK_TAG(SE_STOP4_DONE, core)
//===========================
- PK_TRACE("SE4.h");
- // Update Stop History: In Core Stop Level 4
+ PK_TRACE("Update STOP history: in core stop level 4");
// Check if STOP level 4 reaches the target for both or one core
entry_ongoing =
target_level == STOP_LEVEL_4 ? STOP_TRANS_COMPLETE :
@@ -709,6 +758,7 @@ p9_cme_stop_entry()
//===========================
MARK_TRAP(SE_IS1_BEGIN)
//===========================
+
#if !SKIP_ABORT
out32(CME_LCL_EIMR_CLR, (core << SHIFT32(13)) |
(core << SHIFT32(15)) |
@@ -718,6 +768,7 @@ p9_cme_stop_entry()
(core << SHIFT32(15)) |
(core << SHIFT32(17)));
#endif
+
//===================
MARK_TRAP(SE_IS1_END)
//===================
@@ -725,8 +776,8 @@ p9_cme_stop_entry()
core_aborted = core & G_cme_stop_record.core_running;
core = core & ~G_cme_stop_record.core_running;
- PK_TRACE("core[%d] running[%d] core_aborted[%d]",
- core, G_cme_stop_record.core_running, core_aborted);
+ PK_TRACE_INF("Abort: core[%d] running[%d] core_aborted[%d]",
+ core, G_cme_stop_record.core_running, core_aborted);
if (!core)
{
@@ -742,15 +793,14 @@ p9_cme_stop_entry()
target_level = deeper_level;
}
- deeper_core = 0;
+ deeper_core = 0;
}
- PK_TRACE("SE4+:core[%d],deeper_core[%d],\
- target_level[%d],deeper_level[%d]",
- core, deeper_core, target_level, deeper_level);
+ PK_TRACE_INF("Check: core[%d] deeper_core[%d] target_level[%d] deeper_level[%d]",
+ core, deeper_core, target_level, deeper_level);
//----------------------------------------------------------------------
- // STOP LEVEL 5 (preparsion of STOP LEVEL 8 and above)
+ PK_TRACE_INF("+++++ +++++ STOP LEVEL 5-7 ENTRY +++++ +++++");
//----------------------------------------------------------------------
if ((G_cme_stop_record.req_level_c0 >= STOP_LEVEL_8) &&
@@ -761,21 +811,20 @@ p9_cme_stop_entry()
MARK_TAG(SE_PURGE_L2, CME_MASK_BC)
//================================
- // Assert L2+NCU Purge and NCU tlbie quiesce
- // (chtm purge will be done in SGPE),
+ PK_TRACE("Assert L2+NCU purge and NCU tlbie quiesce via SICR[18,21,22]");
// insert tlbie quiesce before ncu purge to avoid window condition
// of ncu traffic still happening when purging starts
- PK_TRACE("SE5.1a");
+ // Note: chtm purge will be done in SGPE
out32(CME_LCL_SICR_OR, BIT32(18) | BIT32(21));
out32(CME_LCL_SICR_OR, BIT32(22));
// todo: poll for tlbie quiesce done?
- // Poll for Purged Done
- PK_TRACE("SE5.1b");
+ PK_TRACE("Poll for purged done via EISR[22,23]");
do
{
+
#if !SKIP_L2_PURGE_ABORT
if (!core_aborted &&
@@ -793,27 +842,27 @@ p9_cme_stop_entry()
core_aborted |= CME_MASK_C1;
}
- PK_TRACE("L2 Purge aborted by core[%d]", core_aborted);
//=======================================
MARK_TAG(SE_PURGE_L2_ABORT, core_aborted)
//=======================================
- // abort L2+NCU purges
+
+ PK_TRACE_INF("Abort: L2+NCU purge aborted by core[%d]", core_aborted);
out32(CME_LCL_SICR_OR, BIT32(19) | BIT32(23));
}
#endif
+
}
while((in32(CME_LCL_EISR) & BITS32(22, 2)) != BITS32(22, 2));
- // Deassert L2+NCU Purges, their possible aborts
- PK_TRACE("SE5.1c");
+ PK_TRACE("Drop L2+NCU purges and their possible aborts via SICR[18,19,22,23]");
out32(CME_LCL_SICR_CLR, (BITS32(18, 2) | BITS32(22, 2)));
- PK_TRACE("SE5.1: L2/NCU/CHTM Purged");
+ PK_TRACE_INF("SE5.A: L2 and NCU Purged");
- //===============================================================
+ //===================================================================
MARK_TAG(SE_PURGE_L2_DONE, core_aborted ? core_aborted : CME_MASK_BC)
- //===============================================================
+ //===================================================================
// if core = 3 aborted = 1, core = 2(sgpe handoff) aborted (cme wakeup)
// if core = 1 aborted = 1, core = 0(break) aborted (cme wakeup)
@@ -832,8 +881,7 @@ p9_cme_stop_entry()
MARK_TAG(SE_SGPE_HANDOFF, core)
//=============================
- // Update Stop History: In Core Stop Level 5
- PK_TRACE("SE5.2a");
+ PK_TRACE("Update STOP history: in core stop level 5");
CME_STOP_UPDATE_HISTORY(core,
STOP_CORE_IS_GATED,
STOP_TRANS_CORE_PORTION,
@@ -842,8 +890,7 @@ p9_cme_stop_entry()
STOP_REQ_DISABLE,
STOP_ACT_ENABLE);
- // Send PCB Interrupt per core
- PK_TRACE("SE5.2b");
+ PK_TRACE("Send PCB interrupt per core via PIG, select irq type via CPMMR[10]");
if (core & CME_MASK_C0)
{
@@ -883,22 +930,18 @@ p9_cme_stop_entry()
G_cme_stop_record.act_level_c1 = STOP_LEVEL_5;
}
- // Change PPM Wakeup to STOPGPE
- PK_TRACE("SE5.2c");
+ PK_TRACE("Switch PPM wakeup to STOP-GPE via CPMMR[13]");
CME_PUTSCOM(CPPM_CPMMR_OR, core, BIT64(13));
- PK_TRACE("SE5.2: Handed off to SGPE");
+ PK_TRACE_INF("SE5.2B: Handed off to SGPE");
}
while(0);
//--------------------------------------------------------------------------
- // END OF STOP ENTRY
+ PK_TRACE_INF("+++++ +++++ END OF STOP ENTRY +++++ +++++");
//--------------------------------------------------------------------------
- // Release PPM Write Protection
- CME_PUTSCOM(CPPM_CPMMR_CLR, CME_MASK_BC, BIT64(0));
-
//============================
MARK_TRAP(ENDSCOPE_STOP_ENTRY)
//============================
diff --git a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_exit.c b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_exit.c
index a0115c85..9b73095f 100644
--- a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_exit.c
+++ b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_exit.c
@@ -28,8 +28,11 @@
#include "p9_cme_copy_scan_ring.h"
extern CmeStopRecord G_cme_stop_record;
-#if HW386841_PLS_SRR1_DLS_STOP1_FIX
+
+#if HW386841_DD1_PLS_SRR1_DLS_STOP1_FIX
+
CoreThreadsInfo G_dsl[MAX_CORES_PER_CME] = {0, 0};
+
#endif
int
@@ -51,29 +54,30 @@ p9_cme_stop_exit()
uint8_t catchup_level;
uint32_t core_catchup;
#endif
-#if HW386841_PLS_SRR1_DLS_STOP1_FIX
- uint32_t core_stop1 = 0;
+#if HW386841_DD1_PLS_SRR1_DLS_STOP1_FIX
uint8_t dsl;
uint8_t thread;
uint8_t G_srr1[MAX_CORES_PER_CME][MAX_THREADS_PER_CORE] = {{0, 0, 0, 0}, {0, 0, 0, 0}};
+ uint32_t core_stop1 = 0;
cme_scom_pscrs00_t pscrs;
#endif
ppm_sshsrc_t hist;
- uint64_t data64;
+ uint64_t scom_data;
//--------------------------------------------------------------------------
- // BEGIN OF STOP EXIT
+ PK_TRACE_INF("+++++ +++++ BEGIN OF STOP EXIT +++++ +++++");
//--------------------------------------------------------------------------
// extract wakeup signals, clear status, and mask wakeup interrupts
wakeup = (in32(CME_LCL_EISR) >> SHIFT32(17)) & 0x3F;
core = ((wakeup >> 4) | (wakeup >> 2) | wakeup) & CME_MASK_BC;
+ // ignore wakeup when it suppose to be handled by sgpe
if (core & CME_MASK_C0)
{
- CME_GETSCOM(CPPM_CPMMR, CME_MASK_C0, CME_SCOM_AND, data64);
+ CME_GETSCOM(CPPM_CPMMR, CME_MASK_C0, CME_SCOM_AND, scom_data);
- if (data64 & BIT64(13))
+ if (scom_data & BIT64(13))
{
core = core - CME_MASK_C0;
}
@@ -81,48 +85,55 @@ p9_cme_stop_exit()
if (core & CME_MASK_C1)
{
- CME_GETSCOM(CPPM_CPMMR, CME_MASK_C1, CME_SCOM_AND, data64);
+ CME_GETSCOM(CPPM_CPMMR, CME_MASK_C1, CME_SCOM_AND, scom_data);
- if (data64 & BIT64(13))
+ if (scom_data & BIT64(13))
{
core = core - CME_MASK_C1;
}
}
- // override with partial good core mask
- // also ignore wakeup to running cores
+ // override with partial good core mask, also ignore wakeup to running cores
core = core & G_cme_stop_record.core_enabled &
(~G_cme_stop_record.core_running);
- PK_TRACE("X0: Core Select[%d] Wakeup[%x] Actual Stop Levels[%d %d]",
- core, wakeup,
- G_cme_stop_record.act_level_c0,
- G_cme_stop_record.act_level_c1);
+ PK_TRACE_INF("Check: Core Select[%d] Wakeup[%x] Actual Stop Levels[%d %d]",
+ core, wakeup,
+ G_cme_stop_record.act_level_c0,
+ G_cme_stop_record.act_level_c1);
+
+
#if !SPWU_AUTO
+
+ // figure out who is already awake and who needs to exit
spwu_stop = (wakeup >> 2) & G_cme_stop_record.core_enabled;
spwu_wake = spwu_stop & G_cme_stop_record.core_running;
spwu_stop = spwu_stop & (~G_cme_stop_record.core_running);
if (spwu_wake)
{
- PK_TRACE("X0: setting spwu done");
+ PK_TRACE_INF("SX0.A: Assert Core[%d] Special Wakeup Done via SICR[16/17]", spwu_wake);
out32(CME_LCL_SICR_OR, spwu_wake << SHIFT32(17));
}
#endif
- // Code Error: function should never be entered without wakeup source active
if (!core)
{
+
#if !SPWU_AUTO
if (!spwu_wake)
{
+
#endif
- PK_TRACE("Error: no wakeup fired");
+
+ PK_TRACE_INF("ERROR: No Wakeup Fired to a Stopped and Enabled Core. HALT CME!");
pk_halt();
+
#if !SPWU_AUTO
+
}
else
{
@@ -130,14 +141,18 @@ p9_cme_stop_exit()
}
#endif
+
}
+
+
//==================================
MARK_TAG(BEGINSCOPE_STOP_EXIT, core)
//==================================
-#if HW386841_PLS_SRR1_DLS_STOP1_FIX
+#if HW386841_DD1_PLS_SRR1_DLS_STOP1_FIX
+ // figure out who needs stop1 exit
if ((core & CME_MASK_C0) && G_cme_stop_record.act_level_c0 == STOP_LEVEL_1)
{
core_stop1 |= CME_MASK_C0;
@@ -148,16 +163,24 @@ p9_cme_stop_exit()
core_stop1 |= CME_MASK_C1;
}
+ PK_TRACE_INF("SX0.B: Core[%d] Requested Stop1 Exit", core_stop1);
+
core = core & ~core_stop1;
-if (!core) goto STOP1_EXIT:
+ if (!core)
+ {
+ goto STOP1_EXIT;
+ }
+
#endif
- // set target_level to STOP level for c0
- // unless c1(also or only) wants to wakeup
- target_level = deeper_level =
- (core == CME_MASK_C0) ? G_cme_stop_record.act_level_c0 :
- G_cme_stop_record.act_level_c1;
+
+
+ // set target_level to STOP level for c0
+ // unless c1(also or only) wants to wakeup
+ target_level = deeper_level =
+ (core == CME_MASK_C0) ? G_cme_stop_record.act_level_c0 :
+ G_cme_stop_record.act_level_c1;
// If both cores want to wakeup but are in different STOP levels,
// set deeper_level to the deeper level targeted by deeper core
@@ -177,17 +200,20 @@ if (!core) goto STOP1_EXIT:
}
}
- PK_TRACE("X0: target_lv[%d], deeper_lv[%d], deeper_c[%d]",
- target_level, deeper_level, deeper_core);
+ PK_TRACE_INF("Check: core[%d] target_lv[%d], deeper_lv[%d], deeper_c[%d]",
+ core, target_level, deeper_level, deeper_core);
+
+
+ PK_TRACE("Ensure PCB mux by request anyway via SICR[10/11]");
// ensure PCB Mux grant is present for all cores that wants to wakeup
- // only stop 11 needs to request for new grant
+ // should only stop 11 need to request for new grant
out32(CME_LCL_SICR_OR, (core << SHIFT32(11)));
- // chtm purge done
+ PK_TRACE("Clear chtm purge done via ESIR[24/25]");
out32(CME_LCL_EISR_CLR, (core << SHIFT32(25)));
- PK_TRACE("X0: Update STOP History: In Transition of Exit");
+ PK_TRACE("Update STOP history: in transition of exit");
CME_STOP_UPDATE_HISTORY(core,
STOP_CORE_IS_GATED,
STOP_TRANS_EXIT,
@@ -196,16 +222,21 @@ if (!core) goto STOP1_EXIT:
STOP_REQ_DISABLE,
STOP_ACT_DISABLE);
- PK_TRACE("X0: Check and Request PCB Mux");
+ PK_TRACE("Check for PCB mux granted via SISR[10/11]");
while((core & (in32(CME_LCL_SISR) >> SHIFT32(11))) != core);
- //--------------------------------------------------------------------------
- // STOP LEVEL 2 - single core express
- //--------------------------------------------------------------------------
+ PK_TRACE_INF("SX0.C: PCB Mux Granted");
+
- if (deeper_core)
+
+ if (deeper_core && target_level == 2)
{
+
+ //--------------------------------------------------------------------------
+ PK_TRACE_INF("+++++ +++++ STOP LEVEL 2 EXIT EXPRESS +++++ +++++");
+ //--------------------------------------------------------------------------
+
core = CME_MASK_BC - deeper_core;
//============================
@@ -214,26 +245,28 @@ if (!core) goto STOP1_EXIT:
// do this again here for stop2 in addition to chiplet_reset
// Note IPL doesnt need to do this twice
- PK_TRACE("4S2: Set Core Glitchless Mux to DPLL");
+ PK_TRACE("Assert core glitchless mux to DPLL via CGCR[3]");
CME_PUTSCOM(C_PPM_CGCR, core, BIT64(3));
- PK_TRACE("X9: Start Core Clock");
+ PK_TRACE_INF("SX2.X: Start Core Clock on Core[%d]", core);
p9_hcd_core_startclocks(core);
- // Clear CPPM PECE Shadow
+ PK_TRACE("Clear CPPM PECE shadow via PECES");
CME_PUTSCOM(CPPM_PECES, core, 0);
core = deeper_core;
deeper_core = 0;
+
}
- //--------------------------------------------------------------------------
- // STOP LEVEL 4
- //--------------------------------------------------------------------------
+
if (deeper_level >= STOP_LEVEL_4)
{
- PK_TRACE("STOP Level 4+ Sequence");
+
+ //--------------------------------------------------------------------------
+ PK_TRACE_INF("+++++ +++++ STOP LEVEL 4 EXIT +++++ +++++");
+ //--------------------------------------------------------------------------
// if deeper_core is set, then core must be 0b11
if (deeper_core && target_level < STOP_LEVEL_4)
@@ -246,23 +279,25 @@ if (!core) goto STOP1_EXIT:
{
#if !SKIP_BCE_SCOM_RESTORE
- PK_TRACE("BCE Runtime Kickoff: copy scom restore");
+
+ PK_TRACE_INF("SX4.A: BCE Runtime Kickoff to Copy Scom Restore");
//right now a blocking call. Need to confirm this.
instance_scom_restore();
+
#endif
//========================
MARK_TAG(SX_POWERON, core)
//========================
- PK_TRACE("X1: Core Poweron");
+ PK_TRACE_INF("SX4.B: Core[%d] Poweron", core);
p9_hcd_core_poweron(core);
//=========================
MARK_TRAP(SX_CHIPLET_RESET)
//=========================
- PK_TRACE("X2: Core Chiplet Reset");
+ PK_TRACE_INF("SX4.C: Core[%d] Chiplet Reset", core);
p9_hcd_core_chiplet_reset(core);
#if !STOP_PRIME
@@ -283,9 +318,9 @@ if (!core) goto STOP1_EXIT:
if (core_catchup & CME_MASK_C0)
{
- CME_GETSCOM(CPPM_CPMMR, CME_MASK_C0, CME_SCOM_AND, data64);
+ CME_GETSCOM(CPPM_CPMMR, CME_MASK_C0, CME_SCOM_AND, scom_data);
- if (data64 & BIT64(13))
+ if (scom_data & BIT64(13))
{
core_catchup = core_catchup - CME_MASK_C0;
}
@@ -293,9 +328,9 @@ if (!core) goto STOP1_EXIT:
if (core_catchup & CME_MASK_C1)
{
- CME_GETSCOM(CPPM_CPMMR, CME_MASK_C1, CME_SCOM_AND, data64);
+ CME_GETSCOM(CPPM_CPMMR, CME_MASK_C1, CME_SCOM_AND, scom_data);
- if (data64 & BIT64(13))
+ if (scom_data & BIT64(13))
{
core_catchup = core_catchup - CME_MASK_C1;
}
@@ -324,9 +359,10 @@ if (!core) goto STOP1_EXIT:
G_cme_stop_record.act_level_c0 :
G_cme_stop_record.act_level_c1 ;
- PK_TRACE("core[%d] running[%d] core_catchup[%d] catchup_level[%d]",
- core, G_cme_stop_record.core_running,
- core_catchup, catchup_level);
+ PK_TRACE_INF("Catch: core[%d] running[%d] \
+ core_catchup[%d] catchup_level[%d]",
+ core, G_cme_stop_record.core_running,
+ core_catchup, catchup_level);
while((core_catchup & (in32(CME_LCL_SISR) >>
SHIFT32(11))) != core_catchup);
@@ -350,17 +386,22 @@ if (!core) goto STOP1_EXIT:
//==============================
MARK_TAG(SX_CHIPLET_INITS, core)
//==============================
+
#if !SKIP_INITF
- PK_TRACE("X3: Core GPTR Time Initf");
+
+ PK_TRACE_INF("SX4.D: Core[%d] GPTR Time Initf", core);
p9_hcd_core_gptr_time_initf(core);
+
#endif
- PK_TRACE("X5: Core Chiplet Init");
+ PK_TRACE_INF("SX4.E: Core[%d] Chiplet Init", core);
p9_hcd_core_chiplet_init(core);
#if !SKIP_INITF
- PK_TRACE("X6: Core Repair Initf");
+
+ PK_TRACE_INF("SX4.F: Core[%d] Repair Initf", core);
p9_hcd_core_repair_initf(core);
+
#endif
#if !SKIP_EXIT_CATCHUP
@@ -380,9 +421,9 @@ if (!core) goto STOP1_EXIT:
if (core_catchup & CME_MASK_C0)
{
- CME_GETSCOM(CPPM_CPMMR, CME_MASK_C0, CME_SCOM_AND, data64);
+ CME_GETSCOM(CPPM_CPMMR, CME_MASK_C0, CME_SCOM_AND, scom_data);
- if (data64 & BIT64(13))
+ if (scom_data & BIT64(13))
{
core_catchup = core_catchup - CME_MASK_C0;
}
@@ -390,9 +431,9 @@ if (!core) goto STOP1_EXIT:
if (core_catchup & CME_MASK_C1)
{
- CME_GETSCOM(CPPM_CPMMR, CME_MASK_C1, CME_SCOM_AND, data64);
+ CME_GETSCOM(CPPM_CPMMR, CME_MASK_C1, CME_SCOM_AND, scom_data);
- if (data64 & BIT64(13))
+ if (scom_data & BIT64(13))
{
core_catchup = core_catchup - CME_MASK_C1;
}
@@ -421,9 +462,10 @@ if (!core) goto STOP1_EXIT:
G_cme_stop_record.act_level_c0 :
G_cme_stop_record.act_level_c1 ;
- PK_TRACE("core[%d] running[%d] core_catchup[%d] catchup_level[%d]",
- core, G_cme_stop_record.core_running,
- core_catchup, catchup_level);
+ PK_TRACE_INF("Catch: core[%d] running[%d] \
+ core_catchup[%d] catchup_level[%d]",
+ core, G_cme_stop_record.core_running,
+ core_catchup, catchup_level);
while((core_catchup & (in32(CME_LCL_SISR) >>
SHIFT32(11))) != core_catchup);
@@ -447,17 +489,23 @@ if (!core) goto STOP1_EXIT:
//===========================
MARK_TAG(SX_ARRAY_INIT, core)
//===========================
+
#if !SKIP_ARRAYINIT
- PK_TRACE("X7: Core Array Init");
+
+ PK_TRACE_INF("SX4.G: Core[%d] Array Init", core);
p9_hcd_core_arrayinit(core);
+
#endif
//=====================
MARK_TRAP(SX_FUNC_INIT)
//=====================
+
#if !SKIP_INITF
- PK_TRACE("X8: Core Func Scan");
+
+ PK_TRACE_INF("SX4.H: Core[%d] Func Scan", core);
p9_hcd_core_initf(core);
+
#endif
#endif
@@ -470,23 +518,27 @@ if (!core) goto STOP1_EXIT:
}
}
- //--------------------------------------------------------------------------
- // STOP LEVEL 3
- //--------------------------------------------------------------------------
+
if (deeper_level == STOP_LEVEL_3 || target_level == STOP_LEVEL_3)
{
+
+ //--------------------------------------------------------------------------
+ PK_TRACE_INF("+++++ +++++ STOP LEVEL 3 EXIT +++++ +++++");
+ //--------------------------------------------------------------------------
+
//======================
MARK_TAG(SX_STOP3, core)
//======================
- PK_TRACE("STOP Level 3 Sequence");
//Return to full voltage
//disable ivrm?
}
+
+
//--------------------------------------------------------------------------
- // STOP LEVEL 2
+ PK_TRACE_INF("+++++ +++++ STOP LEVEL 2 EXIT +++++ +++++");
//--------------------------------------------------------------------------
//============================
@@ -495,22 +547,23 @@ if (!core) goto STOP1_EXIT:
// do this again here for stop2 in addition to chiplet_reset
// Note IPL doesnt need to do this twice
- PK_TRACE("4S2: Set Core Glitchless Mux to DPLL");
+ PK_TRACE("Assert core glitchless mux to DPLL via CGCR[3]");
CME_PUTSCOM(C_PPM_CGCR, core, BIT64(3));
- PK_TRACE("X9: Start Core Clock");
+ PK_TRACE_INF("SX2.A: Start Core[%d] Clock", core);
p9_hcd_core_startclocks(core);
- // Clear CPPM PECE Shadow
+ PK_TRACE("Clear CPPM PECE shadow via PECES");
CME_PUTSCOM(CPPM_PECES, core, 0);
- //--------------------------------------------------------------------------
- // STOP LEVEL 4
- //--------------------------------------------------------------------------
+
if (deeper_level >= STOP_LEVEL_4)
{
- PK_TRACE("STOP Level 4+ Sequence");
+
+ //--------------------------------------------------------------------------
+ PK_TRACE_INF("+++++ +++++ STOP LEVEL 4 EXIT CONTINUE +++++ +++++");
+ //--------------------------------------------------------------------------
if (d2u4_flag)
{
@@ -518,11 +571,12 @@ if (!core) goto STOP1_EXIT:
}
#if !STOP_PRIME
+
//===========================
MARK_TAG(SX_SCOM_INITS, core)
//===========================
- PK_TRACE("X10: Image Hardcoded Scoms");
+ PK_TRACE_INF("SX4.I: Image Hardcoded Scoms on Core[%d]", core);
p9_hcd_core_scominit(core);
//==========================
@@ -530,100 +584,118 @@ if (!core) goto STOP1_EXIT:
//==========================
#if !SKIP_BCE_SCOM_RESTORE
- PK_TRACE("BCE Runtime Check");
+
+ PK_TRACE_INF("SX4.J: BCE Runtime Check Scom Restore Copy Completed");
if( BLOCK_COPY_SUCCESS != isScanRingCopyDone() )
{
- PK_TRACE("BCE: Copy of scom restore failed");
+ PK_TRACE_INF("ERROR: BCE Scom Restore Copy Failed. HALT CME!");
pk_halt();
}
- PK_TRACE("X11: XIP Customized Scoms");
+ PK_TRACE_INF("SX4.K: XIP Customized Scoms on Core[%d]", core);
p9_hcd_core_scomcust(core);
+
#endif
//==============================
MARK_TAG(SX_RUNTIME_INITS, core)
//==============================
- // todo
- //PK_TRACE("X12: RAS Runtime Scom");
- //p9_hcd_core_ras_runtime_scom(core);
+ PK_TRACE_INF("SX4.L: RAS Runtime Scom on Core[%d]", core);
+ p9_hcd_core_ras_runtime_scom(core);
+
+ PK_TRACE_INF("SX4.M: OCC Runtime Scom on Core[%d]", core);
+ p9_hcd_core_occ_runtime_scom(core);
- // todo
- //PK_TRACE("X13: OCC Runtime Scom");
- //p9_hcd_core_occ_runtime_scom(core);
#endif
//=============================
MARK_TAG(SX_SELF_RESTORE, core)
//=============================
- PK_TRACE("X14: Core Self Restore");
+ PK_TRACE_INF("SX4.N: Core Self Restore");
#if !SKIP_SELF_RESTORE
- PK_TRACE("Raise block interrupt to PC");
+
+ PK_TRACE("Assert block interrupt to PC via SICR[2/3]");
out32(CME_LCL_SICR_OR, core << SHIFT32(3));
- PK_TRACE("Now Wakeup the Core(pm_exit=1)");
+ PK_TRACE("Waking up the core(pm_exit=1) via SICR[4/5]");
out32(CME_LCL_SICR_OR, core << SHIFT32(5));
- PK_TRACE("Polling for Core Wakeup(pm_active=0)");
+ PK_TRACE("Polling for core wakeup(pm_active=0) via EINR[20/21]");
while((in32(CME_LCL_EINR)) & (core << SHIFT32(21)));
+ PK_TRACE_INF("SX4.O: Core Wakes Up, Ramming HRMOR with HOMER address");
+
#if !SKIP_RAM_HRMOR
- PK_TRACE("Activate Thread0 for RAM");
+
+ PK_TRACE("Activate thread0 for RAM via THREAD_INFO[18]");
CME_PUTSCOM(THREAD_INFO, core, BIT64(18));
- PK_TRACE("Enable RAM mode");
+ PK_TRACE("Enable RAM mode via RAM_MODEREG[0]");
CME_PUTSCOM(RAM_MODEREG, core, BIT64(0));
- PK_TRACE("Set SPR mode to LT0-7");
+ PK_TRACE("Set SPR mode to LT0-7 via SPR_MODE[20-27]");
CME_PUTSCOM(SPR_MODE, core, BITS64(20, 8));
if (core & CME_MASK_C0)
{
- PK_TRACE("Set SPRC to Scratch0 for core0");
+ PK_TRACE("Set SPRC to scratch0 for core0 via SCOM_SPRC");
CME_PUTSCOM(SCOM_SPRC, CME_MASK_C0, 0);
- PK_TRACE("Load Scratch0 with HOMER+2MB");
+ PK_TRACE("Load SCRACTH0 with HOMER+2MB");
+
#if EPM_P9_TUNING
+
CME_PUTSCOM(SCRACTH0, CME_MASK_C0, 0x200000);
+
#else
+
CME_PUTSCOM(SCRACTH0, CME_MASK_C0, 0xA200000);
//CME_PUTSCOM(SCRACTH0, CME_MASK_C0, in64(SELF_RESTORE_ADDR_FETCH));
+
#endif
+
}
if (core & CME_MASK_C1)
{
- PK_TRACE("Set SPRC to Scratch1 for core1");
+ PK_TRACE("Set SPRC to scratch1 for core1 via SCOM_SPRC");
CME_PUTSCOM(SCOM_SPRC, CME_MASK_C1, BIT64(60));
- PK_TRACE("Load Scratch1 with HOMER+2MB");
+ PK_TRACE("Load SCRACTH1 with HOMER+2MB");
+
#if EPM_P9_TUNING
+
CME_PUTSCOM(SCRACTH1, CME_MASK_C1, 0x200000);
+
#else
+
CME_PUTSCOM(SCRACTH1, CME_MASK_C1, 0xA200000);
//CME_PUTSCOM(SCRACTH1, CME_MASK_C1, in64(SELF_RESTORE_ADDR_FETCH));
+
#endif
+
}
- PK_TRACE("RAM: mfspr sprd , gpr0");
+ PK_TRACE("RAM: mfspr sprd , gpr0 via RAM_CTRL");
CME_PUTSCOM(RAM_CTRL, core, RAM_MFSPR_SPRD_GPR0);
- PK_TRACE("RAM: mtspr hrmor, gpr0");
+ PK_TRACE("RAM: mtspr hrmor, gpr0 via RAM_CTRL");
CME_PUTSCOM(RAM_CTRL, core, RAM_MTSPR_HRMOR_GPR0);
- PK_TRACE("Disable Thread0 for RAM");
+ PK_TRACE("Disable thread0 for RAM via THREAD_INFO");
CME_PUTSCOM(THREAD_INFO, core, 0);
- PK_TRACE("Disable RAM mode");
+ PK_TRACE("Disable RAM mode via RAM_MODEREG");
CME_PUTSCOM(RAM_MODEREG, core, 0);
+
#endif
- PK_TRACE("S-Reset all threads");
+ PK_TRACE_INF("SX4.P: S-Reset All Core[%d] Threads to Run Self Restore Image", core);
CME_PUTSCOM(DIRECT_CONTROLS, core,
BIT64(4) | BIT64(12) | BIT64(20) | BIT64(28));
@@ -631,22 +703,25 @@ if (!core) goto STOP1_EXIT:
MARK_TRAP(SX_SRESET_THREADS)
//==========================
- PK_TRACE("Allow threads to run(pm_exit=0) core: %d data:0x%08x ", core, (core << SHIFT32(5)));
+ PK_TRACE("Allow threads to run(pm_exit=0)");
out32(CME_LCL_SICR_CLR, core << SHIFT32(5));
- PK_TRACE("Poll for Core stop again(pm_active=1)");
+ PK_TRACE("Poll for core stop again(pm_active=1)");
while((~(in32(CME_LCL_EINR))) & (core << SHIFT32(21)))
{
if (in32_sh(CME_LCL_SISR) & (core << SHIFT32(1)))
{
- PK_TRACE("Error: Core Special Attention Detected");
+ PK_TRACE("ERROR: Core Special Attention Detected. HALT CME!");
pk_halt();
}
}
- PK_TRACE("Drop block interrupt to PC");
+ PK_TRACE_INF("SX4.Q: Self Restore Completed, Core is Stopped Again");
+
+ PK_TRACE("Drop block interrupt to PC via SICR[2/3]");
out32(CME_LCL_SICR_CLR, core << SHIFT32(3));
+
#endif
if (d2u4_flag)
@@ -660,17 +735,15 @@ if (!core) goto STOP1_EXIT:
//=========================
//--------------------------------------------------------------------------
- // END OF STOP EXIT
+ PK_TRACE_INF("+++++ +++++ END OF STOP EXIT +++++ +++++");
//--------------------------------------------------------------------------
-#if HW386841_PLS_SRR1_CME_DLS_FIX
+#if HW386841_DD1_PLS_SRR1_DLS_STOP1_FIX
+
STOP1_EXIT:
- core = core | core_stop1;
-#endif
- PK_TRACE("Restore PSSCR.PLS+SRR1 back to actual level");
+ PK_TRACE_INF("SX0.D: Restore PSSCR.PLS+SRR1 back to actual level");
-#if HW386841_PLS_SRR1_CME_DLS_FIX
core = core | core_stop1;
if (core & CME_MASK_C0)
@@ -682,13 +755,13 @@ STOP1_EXIT:
pscrs.value = in32((CME_LCL_PSCRS00 + (thread << 2)));
dsl = (G_dsl[0].vector & BITS16((thread << 2), 4)) >>
SHIFT16((thread << 2) + 3);
- PK_TRACE("PSCRS1%d %x, old dsl %d", thread, pscrs.value, dsl);
+ PK_TRACE("C0: PSCRS1%d %x, old dsl %d", thread, pscrs.value, dsl);
dsl = MIN(pscrs.field.esl_a_n ? pscrs.fields.rl_a_n : 0,
MAX(hist.fields.act_stop_level, dsl));
G_dsl[0].vector = ((G_dsl[0].vector & ~BITS16((thread << 2), 4)) |
(dsl << SHIFT16((thread << 2) + 3)));
- PK_TRACE("new dsl %d", dsl);
+ PK_TRACE("C0: new dsl %d", dsl);
if (dsl >= STOP_LEVEL_8)
{
@@ -704,10 +777,10 @@ STOP1_EXIT:
}
CME_PUTSCOM(DIRECT_CONTROLS, CME_MASK_C0, CME_STOP_UPDATE_DLS(G_dsl[0], G_srr1[0]));
- PK_TRACE("DLS C0: %x %x %x %x",
+ PK_TRACE("C0 DLS : %x %x %x %x",
G_dsl[0].threads.t0, G_dsl[0].threads.t1,
G_dsl[0].threads.t2, G_dsl[0].threads.t3);
- PK_TRACE("SRR1 C0: %x %x %x %x",
+ PK_TRACE("C0 SRR1 : %x %x %x %x",
G_srr1[0][0], G_srr1[0][1], G_srr1[0][2], G_srr1[0][3]);
}
@@ -720,13 +793,13 @@ STOP1_EXIT:
pscrs.value = in32((CME_LCL_PSCRS10 + (thread << 2)));
dsl = (G_dsl[1].vector & BITS16((thread << 2), 4)) >>
SHIFT16((thread << 2) + 3);
- PK_TRACE("PSCRS1%d %x, old dsl %d", thread, pscrs.value, dsl);
+ PK_TRACE("C1 PSCRS1%d %x, old dsl %d", thread, pscrs.value, dsl);
dsl = MIN(pscrs.field.esl_a_n ? pscrs.fields.rl_a_n : 0,
MAX(hist.fields.act_stop_level, dsl));
G_dsl[1].vector = ((G_dsl[1].vector & ~BITS16((thread << 2), 4)) |
(dsl << SHIFT16((thread << 2) + 3)));
- PK_TRACE("new dsl %d", dsl);
+ PK_TRACE("C1 new dsl %d", dsl);
if (G_dsl[1][thread] >= STOP_LEVEL_8)
{
@@ -742,19 +815,23 @@ STOP1_EXIT:
}
CME_PUTSCOM(DIRECT_CONTROLS, CME_MASK_C1, CME_STOP_UPDATE_DLS(G_dsl[1], G_srr1[1]));
- PK_TRACE("DLS C1: %x %x %x %x",
+ PK_TRACE("C1 DLS : %x %x %x %x",
G_dsl[1].threads.t0, G_dsl[1].threads.t1,
G_dsl[1].threads.t2, G_dsl[1].threads.t3);
- PK_TRACE("SRR1 C0: %x %x %x %x",
+ PK_TRACE("C1 SRR1 : %x %x %x %x",
G_srr1[1][0], G_srr1[1][1], G_srr1[1][2], G_srr1[1][3]);
}
#else
+ PK_TRACE_INF("SX0.E: Restore PSSCR.PLS+SRR1 back to actual level");
+
if (core & CME_MASK_C0)
{
CME_GETSCOM(PPM_SSHSRC, CME_MASK_C0, CME_SCOM_AND, hist.value);
+ PK_TRACE("Set PLS+SRR1 for Core0");
+
if (hist.fields.act_stop_level >= STOP_LEVEL_8)
{
CME_PUTSCOM(DIRECT_CONTROLS, CME_MASK_C0, CME_STOP_UPDATE_PLS_SRR1(
@@ -790,6 +867,8 @@ STOP1_EXIT:
{
CME_GETSCOM(PPM_SSHSRC, CME_MASK_C1, CME_SCOM_AND, hist.value);
+ PK_TRACE("Set PLS+SRR1 for Core1");
+
if (hist.fields.act_stop_level >= STOP_LEVEL_8)
{
CME_PUTSCOM(DIRECT_CONTROLS, CME_MASK_C1, CME_STOP_UPDATE_PLS_SRR1(
@@ -823,19 +902,19 @@ STOP1_EXIT:
#endif
- PK_TRACE("XF: Now Wakeup the Core(pm_exit=1)");
+ PK_TRACE_INF("SX0.F: Now Wakeup the Core[%d] (pm_exit=1) via SICR[4/5]", core);
out32(CME_LCL_SICR_OR, core << SHIFT32(5));
- PK_TRACE("XF: Polling for Core Waking up(pm_active=0)");
+ PK_TRACE_INF("SX0.G: Polling for Core Waking up(pm_active=0) via EINR[20/21]");
while((in32(CME_LCL_EINR)) & (core << SHIFT32(21)));
- PK_TRACE("XF: Release PCB Mux back to Core");
+ PK_TRACE_INF("SX0.H: Release PCB Mux back to Core via SICR[10/11]");
out32(CME_LCL_SICR_CLR, core << SHIFT32(11));
while((core & ~(in32(CME_LCL_SISR) >> SHIFT32(11))) != core);
- PK_TRACE("XF: Update STOP History: STOP Exit Completed");
+ PK_TRACE("Update STOP history: STOP exit completed, core ready");
CME_STOP_UPDATE_HISTORY(core,
STOP_CORE_READY_RUN,
STOP_TRANS_COMPLETE,
@@ -859,31 +938,30 @@ STOP1_EXIT:
G_cme_stop_record.core_running |= core;
G_cme_stop_record.core_stopgpe &= ~core;
- // HALTED_STOP_OVERRIDE_DISABLE = 0
+ PK_TRACE("Drop halt STOP override disable via LMCR[14/15]");
out32(CME_LCL_LMCR_CLR, (core << SHIFT32(15)));
- PK_TRACE("XF: Drop pm_exit to allow core to run if spwu is not present");
#if SPWU_AUTO
- // clear auto spwu disable, enable auto spwu
+ PK_TRACE_INF("SX0.I: Drop auto spwu disable, enable auto spwu via LMCR[12/13]");
out32(CME_LCL_LMCR_CLR, core << SHIFT32(13));
- //clear pm_exit
+ PK_TRACE_INF("SX0.J: Drop pm_exit via SICR[4/5]");
out32(CME_LCL_SICR_CLR, core << SHIFT32(5));
#else
if (spwu_stop)
{
+ PK_TRACE_INF("SX0.K: Assert SPWU Done on Core[%d] via SICR[16/17]", spwu_stop);
// done = spwu + !pm_active + !core_chiplet_fence + !pcbmux_req + !pcbmux_grant
// chiplet fence forces pm_active to zero
- PK_TRACE("XF: setting spwu done");
out32(CME_LCL_SICR_OR, spwu_stop << SHIFT32(17));
}
if ((core = (core & (~spwu_stop))))
{
- PK_TRACE("XF: drop pm_exit for not spwu core");
+ PK_TRACE_INF("SX0.L: Drop PM_EXIT for NOT SPWU Core[%d] via SICR[4/5]", core);
out32(CME_LCL_SICR_CLR, core << SHIFT32(5));
}
diff --git a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_irq_handlers.c b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_irq_handlers.c
index 624e1513..fcd938ee 100644
--- a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_irq_handlers.c
+++ b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_cme_stop_irq_handlers.c
@@ -29,41 +29,22 @@
extern CmeStopRecord G_cme_stop_record;
-// Important: g_eimr_override at any time should mask wakeup interrupts of
-// running core(s), the override vector should change after each
-// entry and exit as core state is changed.
-// For Entry, mask the following interrupts via unified interrupt handler:
-// lower priority interrupts than pm_active, and both pm_active (catchup)
-// wakeup interrupts of the entering core(s) should still be masked
-// via g_eimr_override (abortion), stopped core can still exit any time
-// as their wakeup interrupts should be unmasked
-// After Entry, unmask the following interrupts via pk_irq_vec_restore:
-// priority group on stack, likely at least both pm_active unmasked
-// (stopped core cannot get extra pm_active, untouched core can enter)
-// here needs to use g_eimr_override to mask wakeup of running core(s)
-// wakeup of the stopped core(s) should be already unmasked by default
-// (when restored, previous masked wakeups are being unmasked as well)
-// For Exit, mask the following interrupts via unified interrupt handler:
-// lower priority interrupts than wakeup, including DB2+pm_active(catchup)
-// After Exit, unmask the following interrupts via pk_irq_vec_restore:
-// priority group on stack, likely at least wakeup and DB2 unmasked
-// here needs to use g_eimr_override to mask wakeup of exited core(s)
void
-p9_cme_stop_event_handler(void* arg, PkIrqId irq)
+p9_cme_stop_exit_handler(void* arg, PkIrqId irq)
{
- MARK_TRAP(STOP_EVENT_HANDLER)
- PK_TRACE("STOP-IRQ: %d", irq);
+ MARK_TRAP(STOP_EXIT_HANDLER)
+ PK_TRACE_INF("SX-IRQ: %d", irq);
+ out32(CME_LCL_EIMR_OR, BITS32(12, 6) | BITS32(20, 2));
+ pk_semaphore_post((PkSemaphore*)arg);
+}
- if (in32(CME_LCL_EISR) & BITS32(12, 6))
- {
- PK_TRACE("lanuch exit");
- pk_semaphore_post((PkSemaphore*)(&(G_cme_stop_record.sem[1])));
- }
- else if (in32(CME_LCL_EISR) & BITS32(20, 2))
- {
- PK_TRACE("lanuch entry");
- pk_semaphore_post((PkSemaphore*)(&(G_cme_stop_record.sem[0])));
- }
+void
+p9_cme_stop_enter_handler(void* arg, PkIrqId irq)
+{
+ MARK_TRAP(STOP_ENTER_HANDLER)
+ PK_TRACE_INF("SE-IRQ: %d", irq);
+ out32(CME_LCL_EIMR_OR, BITS32(12, 6) | BITS32(20, 2));
+ pk_semaphore_post((PkSemaphore*)arg);
}
void
@@ -71,7 +52,7 @@ p9_cme_stop_db1_handler(void* arg, PkIrqId irq)
{
PkMachineContext ctx;
MARK_TRAP(STOP_DB1_HANDLER)
- PK_TRACE("DB1-IRQ: %d", irq);
+ PK_TRACE_INF("DB1-IRQ: %d", irq);
pk_irq_vec_restore(&ctx);
}
diff --git a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_hcd_core_arrayinit.c b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_hcd_core_arrayinit.c
index 81a9e462..cae31546 100644
--- a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_hcd_core_arrayinit.c
+++ b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_hcd_core_arrayinit.c
@@ -32,8 +32,7 @@ p9_hcd_core_arrayinit(uint32_t core)
int rc = CME_STOP_SUCCESS;
uint64_t scom_data;
- /// @todo add DD1 attribute control
- PK_TRACE("DD1 only: set sdis_n(flushing LCBES condition workaround");
+ PK_TRACE("Assert sdis_n(flushing LCBES condition) via CPLT_CONF0[34]");
CME_PUTSCOM(C_CPLT_CONF0_OR, core, BIT64(34));
PK_TRACE("Drop vital fence (moved to arrayinit from sacn0 module)");
@@ -99,8 +98,7 @@ p9_hcd_core_arrayinit(uint32_t core)
p9_hcd_core_scan0(core, SCAN0_REGION_ALL_BUT_PLL, SCAN0_TYPE_ALL_BUT_GPTR_REPR_TIME);
#endif
- /// @todo add DD1 attribute control
- PK_TRACE("DD1 only: reset sdis_n(flushing LCBES condition workaround");
+ PK_TRACE("Drop sdis_n(flushing LCBES condition) via CPLT_CONF0[34]");
CME_PUTSCOM(C_CPLT_CONF0_CLEAR, core, BIT64(34));
return rc;
diff --git a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_hcd_core_chiplet_reset.c b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_hcd_core_chiplet_reset.c
index 1e118429..0162011c 100644
--- a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_hcd_core_chiplet_reset.c
+++ b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_hcd_core_chiplet_reset.c
@@ -97,5 +97,12 @@ p9_hcd_core_chiplet_reset(uint32_t core)
PK_TRACE("Assert vdm enable via CPPM_VDMCR[0]");
CME_PUTSCOM(PPM_VDMCR_OR, core, BIT64(0));
+ /// content of p9_hcd_core_dcc_skewadjust below:
+ PK_TRACE("Drop core DCC bypass via NET_CTRL[1]");
+ CME_PUTSCOM(CPPM_NC1INDIR_CLR, core, BIT64(1));
+
+ PK_TRACE("Drop core progdly bypass(skewadjust) via NET_CTRL1[2]");
+ CME_PUTSCOM(CPPM_NC1INDIR_CLR, core, BIT64(2));
+
return rc;
}
diff --git a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_hcd_core_scan0.c b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_hcd_core_scan0.c
index fc6a81a5..e734b603 100644
--- a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_hcd_core_scan0.c
+++ b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_hcd_core_scan0.c
@@ -30,7 +30,7 @@ int
p9_hcd_core_scan0(uint32_t core, uint64_t regions, uint64_t scan_type)
{
int rc = CME_STOP_SUCCESS;
-#if BROADSIDE_SCAN0
+#if EPM_BROADSIDE_SCAN0
// clean up the scan region
CME_PUTSCOM(PERV_SCAN_REGION_TYPE, core, 0);
diff --git a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_hcd_core_startclocks.c b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_hcd_core_startclocks.c
index 565f9fa7..7df59e00 100644
--- a/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_hcd_core_startclocks.c
+++ b/import/chips/p9/procedures/ppe_closed/cme/stop_cme/p9_hcd_core_startclocks.c
@@ -35,8 +35,7 @@ p9_hcd_core_startclocks(uint32_t core)
//FAPI_DBG("Set CPLT_CTRL0[AVP_MODE] for cache-contained execution");
//FAPI_TRY(putScom(i_target, C_CPLT_CTRL0_OR, MASK_SET(5)));
- /// @todo add DD1 attribute control
- PK_TRACE("DD1 only: set sdis_n(flushing LCBES condition workaround");
+ PK_TRACE("Assert sdis_n(flushing LCBES condition) via CPLT_CONF0[34]");
CME_PUTSCOM(C_CPLT_CONF0_OR, core, BIT64(34));
PK_TRACE("Set inop_align/wait/wait_cycles via OPCG_ALIGN[0-3,12-19,52-63]");
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_arrayinit.c b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_arrayinit.c
index 4ab1f196..32957704 100644
--- a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_arrayinit.c
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_arrayinit.c
@@ -32,8 +32,7 @@ p9_hcd_cache_arrayinit(uint32_t quad, uint32_t ex)
int rc = SGPE_STOP_SUCCESS;
uint64_t scom_data;
- /// @todo add DD1 attribute control
- PK_TRACE("DD1 only: set sdis_n(flushing LCBES condition workaround");
+ PK_TRACE("Assert sdis_n(flushing LCBES condition) via CPLT_CONF0[34]");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_CPLT_CONF0_OR, quad), BIT64(34));
PK_TRACE("Drop vital fence (moved to arrayinit from sacn0 module)");
@@ -114,8 +113,7 @@ p9_hcd_cache_arrayinit(uint32_t quad, uint32_t ex)
// all but anep dpll all but gptr repr time
#endif
- /// @todo add DD1 attribute control
- PK_TRACE("DD1 only: reset sdis_n(flushing LCBES condition workaround");
+ PK_TRACE("Drop sdis_n(flushing LCBES condition) via CPLT_CONF0[34]");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_CPLT_CONF0_CLEAR, quad), BIT64(34));
return rc;
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_chiplet_l3_dcc_setup.C b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_chiplet_l3_dcc_setup.C
new file mode 100644
index 00000000..22c858bc
--- /dev/null
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_chiplet_l3_dcc_setup.C
@@ -0,0 +1,70 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_chiplet_l3_dcc_setup.C $ */
+/* */
+/* OpenPOWER HCODE Project */
+/* */
+/* COPYRIGHT 2016,2017 */
+/* [+] International Business Machines Corp. */
+/* */
+/* */
+/* Licensed under the Apache License, Version 2.0 (the "License"); */
+/* you may not use this file except in compliance with the License. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
+//------------------------------------------------------------------------------
+/// @file p9_hcd_cache_chiplet_l3_dcc_setup.C
+///
+/// @brief Setup L3 DCC, Drop L3 DCC bypass
+//------------------------------------------------------------------------------
+// *HWP HW Owner : Anusha Reddy Rangareddygari <anusrang@in.ibm.com>
+// *HWP HW Backup Owner : Srinivas V Naga <srinivan@in.ibm.com>
+// *HWP FW Owner : Sunil Kumar <skumar8j@in.ibm.com>
+// *HWP Team : Perv
+// *HWP Level : 2
+// *HWP Consumed by : SBE
+//------------------------------------------------------------------------------
+
+
+#include "p9_sgpe_stop.h"
+#include "p9_sgpe_stop_exit_marks.h"
+#include "hw_access.H"
+#include "p9_ringid_sgpe.H"
+#include <fapi2.H>
+
+
+extern "C" int p9_hcd_cache_chiplet_l3_dcc_setup(uint32_t quad)
+{
+ int rc = SGPE_STOP_SUCCESS;
+ fapi2::Target<fapi2::TARGET_TYPE_EQ> l_eqTarget
+ (
+ fapi2::plat_getTargetHandleByChipletNumber((uint8_t)quad + EQ_CHIPLET_OFFSET)
+ );
+
+ FAPI_DBG(">>p9_hcd_cache_chiplet_l3_dcc_setup");
+
+ FAPI_DBG("Scan eq_ana_bndy_l3dcc_bucket_26 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget,
+ eq_ana_bndy_l3dcc_bucket_26, fapi2::RING_MODE_SET_PULSE_NSL));
+
+ FAPI_DBG("Drop L3 DCC bypass");
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_NET_CTRL1_WAND, quad), ~BIT64(1));
+
+ FAPI_DBG("Check if VDMs are to be enabled. If so, power them on");
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(PPM_VDMCR_OR, quad), BIT64(0));
+
+fapi_try_exit:
+
+ FAPI_DBG("<<p9_hcd_cache_chiplet_l3_dcc_setup");
+ return rc;
+}
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_chiplet_reset.c b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_chiplet_reset.c
index a8224000..519444e2 100644
--- a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_chiplet_reset.c
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_chiplet_reset.c
@@ -82,7 +82,11 @@ p9_hcd_cache_chiplet_reset(uint32_t quad, uint32_t ex)
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_PPM_CGCR, quad), (BIT64(0) | BIT64(3)));
PK_TRACE("Flip L2 glsmux to DPLL via QPPM_EXCGCR[34:35]");
+#if !HW388878_DD1_VCS_POWER_ON_IN_CHIPLET_RESET_FIX
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_QPPM_EXCGCR_OR, quad), BITS64(34, 2));
+#else
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_QPPM_EXCGCR_OR, quad), ((uint64_t)ex << SHIFT64(35)));
+#endif
PK_TRACE("Assert DPLL ff_bypass via QPPM_DPLL_CTRL[2]");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_QPPM_DPLL_CTRL_OR, quad), BIT64(2));
@@ -94,7 +98,11 @@ p9_hcd_cache_chiplet_reset(uint32_t quad, uint32_t ex)
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_PPM_CGCR, quad), BIT64(3));
PK_TRACE("Drop L2 glsmux reset via QPPM_EXCGCR[32:33]");
+#if !HW388878_DD1_VCS_POWER_ON_IN_CHIPLET_RESET_FIX
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_QPPM_EXCGCR_CLR, quad), BITS64(32, 2));
+#else
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_QPPM_EXCGCR_CLR, quad), ((uint64_t)ex << SHIFT64(33)));
+#endif
// 40 ref cycles
PPE_WAIT_CORE_CYCLES(loop, 1600);
@@ -119,6 +127,7 @@ p9_hcd_cache_chiplet_reset(uint32_t quad, uint32_t ex)
// Marker for scan0
MARK_TRAP(SX_CHIPLET_RESET_SCAN0)
#if !SKIP_SCAN0
+#if !HW388878_DD1_VCS_POWER_ON_IN_CHIPLET_RESET_FIX
uint64_t regions = SCAN0_REGION_ALL_BUT_EX;
if (ex & FST_EX_IN_QUAD)
@@ -132,16 +141,145 @@ p9_hcd_cache_chiplet_reset(uint32_t quad, uint32_t ex)
}
p9_hcd_cache_scan0(quad, regions, SCAN0_TYPE_GPTR_REPR_TIME);
+#else
+ PK_TRACE_INF("DD1 VCS workaround:");
+ uint32_t l_loop = 0;
+ uint64_t regions = SCAN0_REGION_ALL;
+ p9_hcd_cache_scan0(quad, regions, SCAN0_TYPE_GPTR_REPR_TIME);
+
+ //Eq_fure + Ex_l2_fure(ex0) + Ex_l2_fure(ex1)
+#define DD1_EQ_FURE_RING_LENGTH (46532+119192+119192)
+ uint64_t l_regions = CLK_REGION_PERV | CLK_REGION_EX0_L2 | CLK_REGION_EX1_L2;
+
+ // ----------------------------------------------------
+ // Scan1 initialize region:Perv/L20/L21 type:Fure rings
+ // Note: must also scan partial good "bad" L2 rings,
+ // and clock start&stop their latches, as well
+ // ----------------------------------------------------
+
+ PK_TRACE("Assert Vital clock regional fence via CPLT_CTRL1[3]");
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_CPLT_CTRL1_OR, quad), BIT64(3));
+
+ PK_TRACE("Assert regional fences of scanned regions via CPLT_CTRL1[4,8,9]");
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_CPLT_CTRL1_OR, quad), l_regions);
+
+ PK_TRACE("Clear clock region register via CLK_REGION");
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_CLK_REGION, quad), 0);
+
+ PK_TRACE("Setup scan select register via SCAN_REGION_TYPE[4,8,9,48,51]");
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_SCAN_REGION_TYPE, quad),
+ (l_regions | SCAN_TYPE_FUNC | SCAN_TYPE_REGF));
+
+ PK_TRACE("Write scan data register via 0x1003E040");
+
+ for (l_loop = 0; l_loop <= DD1_EQ_FURE_RING_LENGTH / 64; l_loop++)
+ {
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(0x1003E040, quad), BITS64(0, 64));
+ }
+
+ PK_TRACE("Final Scan Loop Count: %d", l_loop);
+
+ // -------------------------------
+ // Start Perv/L20/L21 clocks
+ // -------------------------------
+
+ PK_TRACE("Clear all SCAN_REGION_TYPE bits");
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_SCAN_REGION_TYPE, quad), 0);
+
+ PK_TRACE("Start cache clocks(perv/l20/l21) via CLK_REGION");
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_CLK_REGION, quad),
+ (CLK_START_CMD | CLK_THOLD_ARY | l_regions));
+
+ PK_TRACE("Poll for perv/l20/l21 clocks running via CPLT_STAT0[8]");
+
+ do
+ {
+ GPE_GETSCOM(GPE_SCOM_ADDR_QUAD(EQ_CPLT_STAT0, quad), scom_data);
+ }
+ while((~scom_data) & BIT64(8));
+
+ PK_TRACE("Check perv/l20/l21 clocks running");
+ GPE_GETSCOM(GPE_SCOM_ADDR_QUAD(EQ_CLOCK_STAT_ARY, quad), scom_data);
+
+ if (scom_data & l_regions)
+ {
+ PK_TRACE("Perv/l20/l21 clock start failed");
+ pk_halt();
+ }
+
+ PK_TRACE("Perv/l20/l21 clocks running now");
+
+ // -------------------------------
+ // Turn on power headers for VCS
+ // -------------------------------
+
+ // vcs_pfet_force_state = 11 (Force Von)
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(PPM_PFCS_OR, quad), BITS64(2, 2));
+
+ do
+ {
+ GPE_GETSCOM(GPE_SCOM_ADDR_QUAD(PPM_PFCS, quad), scom_data);
+ }
+ while(!(scom_data & BIT64(50)));
+
+ // vdd_pfet_force_state = 00 (Nop)
+ // vcs_pfet_force_state = 00 (Nop)
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(PPM_PFCS_CLR, quad), BITS64(0, 4));
+
+ PK_TRACE("Powered On VCS");
+
+ // -------------------------------
+ // Stop Perv/L20/L21 clocks
+ // -------------------------------
+
+ PK_TRACE("Clear all SCAN_REGION_TYPE bits");
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_SCAN_REGION_TYPE, quad), 0);
+
+ PK_TRACE("Stop perv/l20/l21 clocks via CLK_REGION");
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_CLK_REGION, quad),
+ (CLK_STOP_CMD | CLK_THOLD_ARY | l_regions));
+
+ PK_TRACE("Poll for perv/l20/l21 clocks stopped via CPLT_STAT0[8]");
+
+ do
+ {
+ GPE_GETSCOM(GPE_SCOM_ADDR_QUAD(EQ_CPLT_STAT0, quad), scom_data);
+ }
+ while((~scom_data) & BIT64(8));
+
+ PK_TRACE("Check perv/l20/l21 clocks stopped");
+ GPE_GETSCOM(GPE_SCOM_ADDR_QUAD(EQ_CLOCK_STAT_ARY, quad), scom_data);
+
+ if (((~scom_data) & l_regions) != 0)
+ {
+ PK_TRACE("Perv/l20/l21 clock stop failed");
+ pk_halt();
+ }
+
+ PK_TRACE("Perv/l20/l21 Clock Stopped");
+
+ // -------------------------------
+ // Clean up
+ // -------------------------------
+
+ PK_TRACE("Drop Vital clock regional fence via CPLT_CTRL1[3]");
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_CPLT_CTRL1_CLEAR, quad), BIT64(3));
+
+ PK_TRACE("Drop Perv/L20/L21 regional fences via CPLT_CTRL1[4,8,9]");
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_CPLT_CTRL1_CLEAR, quad), l_regions);
+
+#endif
+
p9_hcd_cache_scan0(quad, regions, SCAN0_TYPE_ALL_BUT_GPTR_REPR_TIME);
#endif
- /// content below from p9_hcd_cache_chiplet_l3_dcc_setup
+ /// content of p9_hcd_cache_chiplet_l3_dcc_setup below:
/// @todo scan_with_setpulse_module(l3 dcc)
- PK_TRACE("Drop L3 DCC bypass via NET_CTRL1[1]");
- GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_NET_CTRL1_WAND, quad), ~BIT64(1));
+ //PK_TRACE("Drop L3 DCC bypass via NET_CTRL1[1]");
+ //GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_NET_CTRL1_WAND, quad), ~BIT64(1));
/// @todo add VDM_ENABLE attribute control
- PK_TRACE("Assert vdm enable via CPPM_VDMCR[0]");
- GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(PPM_VDMCR_OR, quad), BIT64(0));
+ //PK_TRACE("Assert vdm enable via CPPM_VDMCR[0]");
+ //GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(PPM_VDMCR_OR, quad), BIT64(0));
return rc;
}
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_dcc_skewadjust_setup.C b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_dcc_skewadjust_setup.C
new file mode 100644
index 00000000..4cb35ecf
--- /dev/null
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_dcc_skewadjust_setup.C
@@ -0,0 +1,141 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_dcc_skewadjust_setup.C $ */
+/* */
+/* OpenPOWER HCODE Project */
+/* */
+/* COPYRIGHT 2016,2017 */
+/* [+] International Business Machines Corp. */
+/* */
+/* */
+/* Licensed under the Apache License, Version 2.0 (the "License"); */
+/* you may not use this file except in compliance with the License. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
+//------------------------------------------------------------------------------
+/// @file p9_hcd_cache_dcc_skewadjust_setup.C
+///
+/// @brief Drop DCCs reset and bypass, Drop skewadjust reset and bypass
+//------------------------------------------------------------------------------
+// *HWP HW Owner : Anusha Reddy Rangareddygari <anusrang@in.ibm.com>
+// *HWP HW Backup Owner : Srinivas V Naga <srinivan@in.ibm.com>
+// *HWP FW Owner : Sunil Kumar <skumar8j@in.ibm.com>
+// *HWP Team : Perv
+// *HWP Level : 2
+// *HWP Consumed by : SBE:SGPE
+//------------------------------------------------------------------------------
+
+#include "p9_sgpe_stop.h"
+#include "p9_sgpe_stop_exit_marks.h"
+#include "hw_access.H"
+#include "p9_ringid_sgpe.H"
+#include <fapi2.H>
+
+
+
+extern "C" int p9_hcd_cache_dcc_skewadjust_setup(uint32_t quad)
+{
+ int rc = SGPE_STOP_SUCCESS;
+ fapi2::Target<fapi2::TARGET_TYPE_EQ> l_eqTarget
+ (
+ fapi2::plat_getTargetHandleByChipletNumber((uint8_t)quad + EQ_CHIPLET_OFFSET)
+ );
+
+ FAPI_DBG(">>p9_hcd_cache_dcc_skewadjust_setup");
+
+ FAPI_DBG("Release L2-0, L2-1 DC Adjust reset");
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(PERV_NET_CTRL1_WAND, quad), ~BITS64(23, 2));
+
+ ocb_ccsr_t ccsr;
+
+ do
+ {
+ ccsr.value = in32(OCB_CCSR);
+ }
+ while (ccsr.fields.change_in_progress);
+
+ for(int core = 0; core < CORES_PER_QUAD; core++)
+ {
+ if (ccsr.value & BIT32(((quad << 2) + core)))
+ {
+ FAPI_DBG("Release CORE DC Adjust reset");
+ GPE_PUTSCOM(GPE_SCOM_ADDR_CORE(C_NET_CTRL0_WAND, ((quad << 2) + core)), ~BIT64(2));
+ }
+ }
+
+ FAPI_DBG("Scan eq_ana_bndy_bucket_0 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_0, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_1 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_1, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_2 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_2, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_3 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_3, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_4 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_4, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_5 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_5, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_6 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_6, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_7 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_7, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_8 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_8, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_9 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_9, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_10 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_10, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_11 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_11, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_12 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_12, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_13 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_13, fapi2::RING_MODE_SET_PULSE_NSL));
+
+ FAPI_DBG("Release DCC bypass");
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(PERV_NET_CTRL1_WAND, quad), ~BIT64(1));
+
+ FAPI_DBG("Scan eq_ana_bndy_bucket_14 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_14, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_15 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_15, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_16 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_16, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_17 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_17, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_18 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_18, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_19 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_19, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_20 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_20, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_21 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_21, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_22 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_22, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_23 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_23, fapi2::RING_MODE_SET_PULSE_NSL));
+
+ FAPI_DBG("Release Progdly bypass");
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(PERV_NET_CTRL1_WAND, quad), ~BIT64(2));
+
+ FAPI_DBG("Scan eq_ana_bndy_bucket_24 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_24, fapi2::RING_MODE_SET_PULSE_NSL));
+ FAPI_DBG("Scan eq_ana_bndy_bucket_25 ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_ana_bndy_bucket_25, fapi2::RING_MODE_SET_PULSE_NSL));
+
+fapi_try_exit:
+
+ FAPI_DBG("<<p9_hcd_cache_dcc_skewadjust_setup");
+ return rc;
+}
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_dpll_initf.C b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_dpll_initf.C
new file mode 100755
index 00000000..854aff03
--- /dev/null
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_dpll_initf.C
@@ -0,0 +1,50 @@
+/* IBM_PROLOG_BEGIN_TAG */
+/* This is an automatically generated prolog. */
+/* */
+/* $Source: import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_dpll_initf.C $ */
+/* */
+/* OpenPOWER HCODE Project */
+/* */
+/* COPYRIGHT 2015,2017 */
+/* [+] International Business Machines Corp. */
+/* */
+/* */
+/* Licensed under the Apache License, Version 2.0 (the "License"); */
+/* you may not use this file except in compliance with the License. */
+/* You may obtain a copy of the License at */
+/* */
+/* http://www.apache.org/licenses/LICENSE-2.0 */
+/* */
+/* Unless required by applicable law or agreed to in writing, software */
+/* distributed under the License is distributed on an "AS IS" BASIS, */
+/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or */
+/* implied. See the License for the specific language governing */
+/* permissions and limitations under the License. */
+/* */
+/* IBM_PROLOG_END_TAG */
+
+#include "p9_sgpe_stop.h"
+#include "p9_sgpe_stop_exit_marks.h"
+#include "hw_access.H"
+#include "p9_ringid_sgpe.H"
+#include <fapi2.H>
+
+extern "C" int p9_hcd_cache_dpll_initf(uint32_t quad)
+{
+ int rc = SGPE_STOP_SUCCESS;
+ fapi2::Target<fapi2::TARGET_TYPE_EQ> l_eqTarget
+ (
+ fapi2::plat_getTargetHandleByChipletNumber((uint8_t)quad + EQ_CHIPLET_OFFSET)
+ );
+
+ FAPI_INF(">>p9_hcd_cache_dpll_initf");
+
+ FAPI_DBG("Scan eq_dpll_func ring");
+ FAPI_TRY(fapi2::putRing(l_eqTarget, eq_dpll_func));
+
+ // Markers needed for cache ininf
+fapi_try_exit:
+ FAPI_INF("<<p9_hcd_cache_dpll_initf");
+
+ return rc;
+}
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_dpll_setup.c b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_dpll_setup.c
index 540e4dfc..91cc9242 100644
--- a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_dpll_setup.c
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_dpll_setup.c
@@ -35,7 +35,7 @@ p9_hcd_cache_dpll_setup(uint32_t quad)
// This is necessary to ensure that the DPLL is in Mode 1.
// If not, the lock times will go from ~30us to 3-5ms
PK_TRACE("Assert DPLL in mode 1,set slew rate via QPPM_DPLL_CTRL[2,6-15]");
- GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_QPPM_DPLL_CTRL_OR, quad), BIT64(2) | BIT64(8));
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_QPPM_DPLL_CTRL_OR, quad), BIT64(2) | BIT64(9));
PK_TRACE("Drop DPLL test mode and reset via NET_CTRL0[3,4]");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_NET_CTRL0_WAND, quad), ~BITS64(3, 2));
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_poweron.c b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_poweron.c
index 8322fbf0..889827b5 100644
--- a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_poweron.c
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_poweron.c
@@ -60,7 +60,7 @@ p9_hcd_cache_poweron(uint32_t quad)
BITS64(4, 4) | BIT64(8));
// vdd_pfet_force_state = 11 (Force Von)
- PK_TRACE("Power Off Cache VDD");
+ PK_TRACE("Power On Cache VDD");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(PPM_PFCS_OR, quad), BITS64(0, 2));
PK_TRACE("Poll for power gate sequencer state: 0x8 (FSM Idle)");
@@ -71,8 +71,9 @@ p9_hcd_cache_poweron(uint32_t quad)
}
while(!(scom_data & BIT64(42)));
+#if !HW388878_DD1_VCS_POWER_ON_IN_CHIPLET_RESET_FIX
// vcs_pfet_force_state = 11 (Force Von)
- PK_TRACE("Power Off Cache VCS");
+ PK_TRACE("Power On Cache VCS");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(PPM_PFCS_OR, quad), BITS64(2, 2));
PK_TRACE("Poll for power gate sequencer state: 0x8 (FSM Idle)");
@@ -87,7 +88,7 @@ p9_hcd_cache_poweron(uint32_t quad)
// vcs_pfet_force_state = 00 (Nop)
PK_TRACE("Turn Off Force Von");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(PPM_PFCS_CLR, quad), BITS64(0, 4));
-
+#endif
#endif
return rc;
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_scan0.c b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_scan0.c
index 972ca3c2..2bb2e2da 100644
--- a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_scan0.c
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_scan0.c
@@ -30,7 +30,7 @@ int
p9_hcd_cache_scan0(uint32_t quad, uint64_t regions, uint64_t scan_type)
{
int rc = SGPE_STOP_SUCCESS;
-#if BROADSIDE_SCAN0
+#if EPM_BROADSIDE_SCAN0
// clean up the scan region
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(PERV_SCAN_REGION_TYPE, quad), 0);
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_scominit.c b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_scominit.c
index 77c37459..681a2e2d 100644
--- a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_scominit.c
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_cache_scominit.c
@@ -26,11 +26,39 @@
#include "p9_sgpe_stop.h"
#include "p9_sgpe_stop_exit_marks.h"
+extern SgpeStopRecord G_sgpe_stop_record;
+
int
-p9_hcd_cache_scominit(uint32_t quad)
+p9_hcd_cache_scominit(uint32_t quad, uint32_t ex)
{
int rc = SGPE_STOP_SUCCESS;
- uint64_t scom_data;
+ uint64_t scom_data;
+ ocb_qcsr_t qcsr;
+
+ PK_TRACE("Set L3_LCO_TARGET_ID/VICTIMS via EX_L3_MODE_REG1[2-5,6-21]");
+
+ // read partial good exes
+ do
+ {
+ qcsr.value = in32(OCB_QCSR);
+ }
+ while (qcsr.fields.change_in_progress);
+
+ if (ex & FST_EX_IN_QUAD)
+ {
+ GPE_GETSCOM(GPE_SCOM_ADDR_EX(EX_L3_MODE_REG1, quad, 0), scom_data);
+ scom_data |= (quad << SHIFT32((5 - 1)));
+ scom_data |= ((qcsr.value & BITS32(0, 12)) >> 6);
+ GPE_PUTSCOM(GPE_SCOM_ADDR_EX(EX_L3_MODE_REG1, quad, 0), scom_data);
+ }
+
+ if (ex & SND_EX_IN_QUAD)
+ {
+ GPE_GETSCOM(GPE_SCOM_ADDR_EX(EX_L3_MODE_REG1, quad, 1), scom_data);
+ scom_data |= ((quad << SHIFT32((5 - 1))) + 1);
+ scom_data |= ((qcsr.value & BITS32(0, 12)) >> 6);
+ GPE_PUTSCOM(GPE_SCOM_ADDR_EX(EX_L3_MODE_REG1, quad, 1), scom_data);
+ }
PK_TRACE("Enable DTS sampling via THERM_MODE_REG[5]");
GPE_GETSCOM(GPE_SCOM_ADDR_QUAD(EQ_THERM_MODE_REG, quad), scom_data);
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_sgpe_boot_cme.c b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_sgpe_boot_cme.c
index d7d0399f..82d7795a 100644
--- a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_sgpe_boot_cme.c
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_hcd_sgpe_boot_cme.c
@@ -114,7 +114,6 @@ BootErrorCode_t boot_cme( uint16_t i_bootCme )
uint8_t l_cmeIndex = 0;
uint8_t activeCmeList[MAX_CME_PER_CHIP] = {ZERO};
uint8_t activeCmeCnt = 0;
- uint8_t cmeInitSuccessCnt = 0;
uint8_t quadId = 0;
uint32_t l_scomAddr = 0;
@@ -280,6 +279,10 @@ BootErrorCode_t boot_cme( uint16_t i_bootCme )
break;
}
+ uint32_t cmeBootedList = 0;
+
+ uint8_t cmeInitSuccessCnt = 0;
+
uint32_t l_copyStatus = 0;
while(cmeInitSuccessCnt != activeCmeCnt)
@@ -294,6 +297,14 @@ BootErrorCode_t boot_cme( uint16_t i_bootCme )
continue;
}
+ uint32_t l_cmeBootedBit = CHECK_BIT >> l_cmeIndex;
+
+ if( cmeBootedList & l_cmeBootedBit )
+ {
+ // CME Boot successful already
+ continue;
+ }
+
l_copyStatus = checkCmeBlockCopyStatus( l_cmeIndex, PLAT_SGPE );
if(BLOCK_COPY_IN_PROGRESS == l_copyStatus )
@@ -347,6 +358,7 @@ BootErrorCode_t boot_cme( uint16_t i_bootCme )
// Writing to XCR to resume PPE operation
PPE_PUTSCOM( l_scomAddr, RESUME_PPE_OPERATION );
cmeInitSuccessCnt++;
+ cmeBootedList = cmeBootedList | l_cmeBootedBit;
} //for ( l_cmeIndex = 0 ....)
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_main.C b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_main.C
index 873793d9..5ac8b6c5 100644
--- a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_main.C
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_main.C
@@ -98,7 +98,7 @@ EXTERNAL_IRQ_TABLE_END
#define KERNEL_STACK_SIZE 512
-#define SGPE_THREAD_STACK_SIZE_STOP_EXIT 512
+#define SGPE_THREAD_STACK_SIZE_STOP_EXIT 1024
#define SGPE_THREAD_STACK_SIZE_STOP_ENTRY 256
#define SGPE_THREAD_PRIORITY_STOP_EXIT 1
@@ -138,6 +138,7 @@ main(int argc, char** argv)
{
if (in32(OCB_OCCFLG) & BIT32(12))
{
+ PK_TRACE_INF("BREAK: Trap at SGPE Booted");
asm volatile ("trap");
}
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop.h b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop.h
index 818765df..82932c62 100644
--- a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop.h
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop.h
@@ -59,6 +59,7 @@ extern "C" {
#define EQ_SCAN_REGION_TYPE 0x10030005
#define EQ_CLK_REGION 0x10030006
#define EQ_CLOCK_STAT_SL 0x10030008
+#define EQ_CLOCK_STAT_ARY 0x1003000A
#define EQ_THERM_MODE_REG 0x1005000F
#define EQ_BIST 0x100F000B
@@ -66,6 +67,7 @@ extern "C" {
#define EQ_NET_CTRL0_WAND 0x100F0041
#define EQ_NET_CTRL0_WOR 0x100F0042
#define C_NET_CTRL0 0x200F0040
+#define C_NET_CTRL0_WAND 0x200F0041
#define C_NET_CTRL0_WOR 0x200F0042
#define EQ_NET_CTRL1_WAND 0x100F0045
#define EQ_NET_CTRL1_WOR 0x100F0046
@@ -93,6 +95,7 @@ extern "C" {
#define EQ_QPPM_QCCR_WOR 0x100F01BF
#define EX_NCU_STATUS_REG 0x1001100F
+#define EX_L3_MODE_REG1 0x1001180A
#define EX_DRAM_REF_REG 0x1001180F
#define EX_PM_PURGE_REG 0x10011813
#define EX_PM_LCO_DIS_REG 0x10011816
@@ -111,6 +114,7 @@ extern "C" {
#define PERV_OPCG_CAPT1 0x10030011
#define PERV_OPCG_CAPT2 0x10030012
#define PERV_CPLT_STAT0 0x10000100
+#define PERV_NET_CTRL1_WAND 0x000F0045
/// Macro to update STOP History
#define SGPE_STOP_UPDATE_HISTORY(id,base,gated,trans,req_l,act_l,req_e,act_e) \
@@ -175,7 +179,7 @@ enum SGPE_STOP_VECTOR_INDEX
VECTOR_CONFIG = 2
};
-#if HW386311_PBIE_RW_PTR_STOP11_FIX
+#if HW386311_DD1_PBIE_RW_PTR_STOP11_FIX
#define EXTRACT_RING_BITS(mask, ring, save) save = (ring) & (mask);
#define RESTORE_RING_BITS(mask, ring, save) ring = (((ring) & (~mask)) | (save));
#endif
@@ -196,12 +200,12 @@ typedef struct
typedef struct
{
- uint32_t core[3];
- uint32_t ex_l[3];
- uint32_t ex_r[3];
- uint32_t ex_b[3];
- uint32_t quad[3];
- uint32_t qswu[3];
+ uint32_t core[3]; // 24 bits
+ uint32_t ex_l[3]; // 6 bits
+ uint32_t ex_r[3]; // 6 bits
+ uint32_t ex_b[3]; // 12 bits
+ uint32_t quad[3]; // 6 bits
+ uint32_t qswu[3]; // 6 bits
} sgpe_group_t;
/// SGPE Stop Score Board Structure
@@ -228,14 +232,18 @@ int p9_sgpe_stop_exit();
int p9_hcd_cache_scan0(uint32_t, uint64_t, uint64_t);
int p9_hcd_cache_poweron(uint32_t);
int p9_hcd_cache_chiplet_reset(uint32_t, uint32_t);
+int p9_hcd_cache_chiplet_l3_dcc_setup(uint32_t);
int p9_hcd_cache_gptr_time_initf(uint32_t);
+int p9_hcd_cache_dpll_initf(uint32_t);
int p9_hcd_cache_dpll_setup(uint32_t);
+int p9_hcd_cache_dcc_skewadjust_setup(uint32_t);
int p9_hcd_cache_chiplet_init(uint32_t);
int p9_hcd_cache_repair_initf(uint32_t);
int p9_hcd_cache_arrayinit(uint32_t, uint32_t ex);
+int p9_hcd_cache_initf(uint32_t);
int p9_hcd_cache_startclocks(uint32_t, uint32_t);
int p9_hcd_cache_l2_startclocks(uint32_t, uint32_t, uint32_t);
-int p9_hcd_cache_scominit(uint32_t);
+int p9_hcd_cache_scominit(uint32_t, uint32_t);
int p9_hcd_cache_scomcust(uint32_t);
int p9_hcd_cache_ras_runtime_scom(uint32_t);
int p9_hcd_cache_occ_runtime_scom(uint32_t);
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_entry.c b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_entry.c
index d924d196..58bfaf67 100644
--- a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_entry.c
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_entry.c
@@ -27,7 +27,9 @@
#include "p9_sgpe_stop_enter_marks.h"
extern SgpeStopRecord G_sgpe_stop_record;
-#if HW386311_PBIE_RW_PTR_STOP11_FIX
+
+#if HW386311_DD1_PBIE_RW_PTR_STOP11_FIX
+
uint64_t G_ring_save[MAX_QUADS][8] =
{
{0, 0, 0, 0, 0, 0, 0, 0},
@@ -37,6 +39,7 @@ uint64_t G_ring_save[MAX_QUADS][8] =
{0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0}
};
+
uint64_t G_ring_spin[10][2] =
{
{0, 0},
@@ -50,6 +53,7 @@ uint64_t G_ring_spin[10][2] =
{6343, 0xC1E061FFED5F0000}, //29
{17871, 0} //128
};
+
#endif
int
@@ -67,10 +71,14 @@ p9_sgpe_stop_entry()
uint64_t scom_data;
uint64_t temp_data;
ppm_sshsrc_t hist;
-#if HW386311_PBIE_RW_PTR_STOP11_FIX
+#if HW386311_DD1_PBIE_RW_PTR_STOP11_FIX
int spin;
#endif
+ //--------------------------------------------------------------------------
+ PK_TRACE_INF("+++++ +++++ BEGIN OF STOP ENTRY +++++ +++++");
+ //--------------------------------------------------------------------------
+
//================================
MARK_TAG(BEGINSCOPE_STOP_ENTRY, 0)
//================================
@@ -130,21 +138,21 @@ p9_sgpe_stop_entry()
if (G_sgpe_stop_record.group.ex_b[VECTOR_ENTRY] ||
G_sgpe_stop_record.group.quad[VECTOR_ENTRY])
{
- PK_TRACE("clv[%d][%d][%d][%d]",
- G_sgpe_stop_record.level[qloop][0],
- G_sgpe_stop_record.level[qloop][1],
- G_sgpe_stop_record.level[qloop][2],
- G_sgpe_stop_record.level[qloop][3]);
+ PK_TRACE_INF("Actual: clv[%d][%d][%d][%d]",
+ G_sgpe_stop_record.level[qloop][0],
+ G_sgpe_stop_record.level[qloop][1],
+ G_sgpe_stop_record.level[qloop][2],
+ G_sgpe_stop_record.level[qloop][3]);
- PK_TRACE("act: qlv[%d]x0lv[%d]x1lv[%d]",
- G_sgpe_stop_record.state[qloop].act_state_q,
- G_sgpe_stop_record.state[qloop].act_state_x0,
- G_sgpe_stop_record.state[qloop].act_state_x1);
+ PK_TRACE_INF("Actual: qlv:[%d]x0lv[%d]x1lv[%d]",
+ G_sgpe_stop_record.state[qloop].act_state_q,
+ G_sgpe_stop_record.state[qloop].act_state_x0,
+ G_sgpe_stop_record.state[qloop].act_state_x1);
- PK_TRACE("req: qlv[%d]x0lv[%d]x1lv[%d]",
- G_sgpe_stop_record.state[qloop].req_state_q,
- G_sgpe_stop_record.state[qloop].req_state_x0,
- G_sgpe_stop_record.state[qloop].req_state_x1);
+ PK_TRACE_INF("Request: qlv[%d]x0lv[%d]x1lv[%d]",
+ G_sgpe_stop_record.state[qloop].req_state_q,
+ G_sgpe_stop_record.state[qloop].req_state_x0,
+ G_sgpe_stop_record.state[qloop].req_state_x1);
}
}
@@ -157,11 +165,11 @@ p9_sgpe_stop_entry()
G_sgpe_stop_record.group.quad[VECTOR_ENTRY] &=
G_sgpe_stop_record.group.quad[VECTOR_CONFIG];
- PK_TRACE("Core Entry Vectors: X[%x] X0[%x] X1[%x] Q[%x]",
- G_sgpe_stop_record.group.ex_b[VECTOR_ENTRY],
- G_sgpe_stop_record.group.ex_l[VECTOR_ENTRY],
- G_sgpe_stop_record.group.ex_r[VECTOR_ENTRY],
- G_sgpe_stop_record.group.quad[VECTOR_ENTRY]);
+ PK_TRACE_INF("Core Entry Vectors: X[%x] X0[%x] X1[%x] Q[%x]",
+ G_sgpe_stop_record.group.ex_b[VECTOR_ENTRY],
+ G_sgpe_stop_record.group.ex_l[VECTOR_ENTRY],
+ G_sgpe_stop_record.group.ex_r[VECTOR_ENTRY],
+ G_sgpe_stop_record.group.quad[VECTOR_ENTRY]);
//TODO: message pgpe to suspend Pstate only if stop level >= 8
if (G_sgpe_stop_record.group.quad[VECTOR_ENTRY])
@@ -178,9 +186,7 @@ p9_sgpe_stop_entry()
}
- // ------------------------------------------------------------------------
- // EX STOP ENTRY [LEVEL 8-10]
- // ------------------------------------------------------------------------
+
// only stop 8 sets x_in
for(xentry = G_sgpe_stop_record.group.ex_b[VECTOR_ENTRY], qloop = 0;
xentry > 0;
@@ -192,17 +198,29 @@ p9_sgpe_stop_entry()
continue;
}
- PK_TRACE("q[%d]exmask[%d] starts entry", qloop, ex);
+ // ------------------------------------------------------------------------
+ PK_TRACE_INF("+++++ +++++ EX STOP ENTRY [LEVEL 8-10] +++++ +++++");
+ // ------------------------------------------------------------------------
- // Update QSSR: stop_entry_ongoing
+ PK_TRACE_INF("Check: q[%d]ex[%d] start ex entry", qloop, ex);
+
+ PK_TRACE("Update QSSR: stop_entry_ongoing");
out32(OCB_QSSR_OR, BIT32(qloop + 20));
- // Update History for ongoing stop 8 entry
cloop = (ex & FST_EX_IN_QUAD) ? 0 : CORES_PER_EX;
climit = (ex & SND_EX_IN_QUAD) ? CORES_PER_QUAD : CORES_PER_EX;
for(; cloop < climit; cloop++)
{
+ // Check partial good core
+ if (!(G_sgpe_stop_record.group.core[VECTOR_CONFIG] &
+ BIT32(((qloop << 2) + cloop))))
+ {
+ continue;
+ }
+
+ PK_TRACE("Update STOP history on core[%d]: in transition of entry",
+ ((qloop << 2) + cloop));
SGPE_STOP_UPDATE_HISTORY(((qloop << 2) + cloop),
CORE_ADDR_BASE,
STOP_CORE_IS_GATED,
@@ -217,9 +235,8 @@ p9_sgpe_stop_entry()
MARK_TAG(SE_STOP_L2_CLKS, ((ex << 6) | (32 >> qloop)))
//====================================================
- PK_TRACE("SE8.a");
+ PK_TRACE("Drop L2 Snoop(quiesce L2-L3 interface) via EX_PM_L2_RCMD_DIS_REG[0]");
- // Disable L2 Snoop(quiesce L2-L3 interface, what about NCU?)
if (ex & FST_EX_IN_QUAD)
GPE_PUTSCOM(GPE_SCOM_ADDR_EX(EX_PM_L2_RCMD_DIS_REG, qloop, 0),
BIT64(0));
@@ -230,7 +247,7 @@ p9_sgpe_stop_entry()
PPE_WAIT_CORE_CYCLES(loop, 256)
- PK_TRACE("set partial bad l2/l3 and stopping/stoped l2 pscom masks");
+ PK_TRACE("Assert partial bad L2/L3 and stopping/stoped l2 pscom masks via RING_FENCE_MASK_LATCH");
scom_data = 0;
if (!(G_sgpe_stop_record.group.ex_l[VECTOR_CONFIG] & BIT32(qloop)))
@@ -255,18 +272,17 @@ p9_sgpe_stop_entry()
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_RING_FENCE_MASK_LATCH, qloop), scom_data);
- PK_TRACE("SE8.b");
- // Set all bits to zero prior stop cache clocks
+
+
+ PK_TRACE("Clear SCAN_REGION_TYPE prior to stop L2 clocks");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_SCAN_REGION_TYPE, qloop), 0);
- PK_TRACE("SE8.c");
- // Stop L2 Clocks
+ PK_TRACE("Stop L2 clocks via CLK_REGION[8/9]");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_CLK_REGION, qloop),
(CLK_STOP_CMD | CLK_THOLD_ALL |
((uint64_t)ex << SHIFT64(9))));
- PK_TRACE("SE8.d");
- // Poll for L2 clocks stopped
+ PK_TRACE("Poll for L2 clocks stopped via CPLT_STAT0[8]");
do
{
@@ -274,44 +290,40 @@ p9_sgpe_stop_entry()
}
while((~scom_data) & BIT64(8));
+ PK_TRACE("Check L2 clock is stopped via CLOCK_STAT_SL[4-13]");
GPE_GETSCOM(GPE_SCOM_ADDR_QUAD(EQ_CLOCK_STAT_SL, qloop), scom_data);
if (((~scom_data) & ((uint64_t)ex << SHIFT64(9))) != 0)
{
- PK_TRACE("L2 clock stop failed");
+ PK_TRACE("ERROR: L2 clock stop failed. HALT SGPE!");
pk_halt();
}
// MF: verify compiler generate single rlwmni
// MF: delay may be needed for stage latch to propagate thold
- PK_TRACE("SE8: L2 Clock Stopped");
+ PK_TRACE_INF("SE8.A: L2 Clock Stopped");
//========================
MARK_TRAP(SE_STOP_L2_GRID)
//========================
- PK_TRACE("SE8.e");
- // Drop clock sync enable before switch to refclk
+ PK_TRACE("Drop clock sync enable before switch to refclk via EXCGCR[36/37]");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_QPPM_EXCGCR_CLR, qloop),
((uint64_t)ex << SHIFT64(37)));
- PK_TRACE("SE8.f");
+ PK_TRACE("Poll for clock sync done to drop via QACSR[36/37]");
- // Poll for clock sync done to drop
do
{
GPE_GETSCOM(GPE_SCOM_ADDR_QUAD(QPPM_QACSR, qloop), scom_data);
}
while(((~scom_data >> SHIFT64(37)) & ex) != ex);
- PK_TRACE("SE8.g");
- // Switch glsmux to refclk to save clock grid power
+ PK_TRACE("Switch glsmux to refclk to save clock grid power via EXCGCR[34/35]");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_QPPM_EXCGCR_CLR, qloop),
((uint64_t)ex << SHIFT64(35)));
- PK_TRACE("SE8.h");
-
if (ex & FST_EX_IN_QUAD)
{
cloop = 0;
@@ -340,8 +352,17 @@ p9_sgpe_stop_entry()
for(; cloop < climit; cloop++)
{
+ // Check partial good core
+ if (!(G_sgpe_stop_record.group.core[VECTOR_CONFIG] &
+ BIT32(((qloop << 2) + cloop))))
+ {
+ continue;
+ }
+
// request levle already set by CME
// shift by 2 == times 4, which is cores per quad
+ PK_TRACE("Update STOP history on core[%d]: in stop level 8",
+ ((qloop << 2) + cloop));
SGPE_STOP_UPDATE_HISTORY(((qloop << 2) + cloop),
CORE_ADDR_BASE,
STOP_CORE_IS_GATED,
@@ -352,19 +373,19 @@ p9_sgpe_stop_entry()
STOP_ACT_ENABLE);
}
- // Update QSSR: l2_stopped, drop stop_entry_ongoing
+ PK_TRACE("Update QSSR: l2_stopped, drop stop_entry_ongoing");
out32(OCB_QSSR_CLR, BIT32(qloop + 20));
out32(OCB_QSSR_OR, (ex << SHIFT32((qloop << 1) + 1)));
+ PK_TRACE_INF("SE8.B: L2 Clock Sync Dropped");
+
//==================================================
MARK_TAG(SE_STOP8_DONE, ((ex << 6) | (32 >> qloop)))
//==================================================
};
- // ------------------------------------------------------------------------
- // QUAD STOP ENTRY [LEVEL 11-15]
- // ------------------------------------------------------------------------
+
for(qentry = G_sgpe_stop_record.group.quad[VECTOR_ENTRY], qloop = 0, ex = 0;
qentry > 0;
@@ -376,6 +397,10 @@ p9_sgpe_stop_entry()
continue;
}
+ // ------------------------------------------------------------------------
+ PK_TRACE("+++++ +++++ QUAD STOP ENTRY [LEVEL 11-15] +++++ +++++");
+ // ------------------------------------------------------------------------
+
if (G_sgpe_stop_record.group.ex_l[VECTOR_CONFIG] & BIT32(qloop))
{
ex |= FST_EX_IN_QUAD;
@@ -386,12 +411,12 @@ p9_sgpe_stop_entry()
ex |= SND_EX_IN_QUAD;
}
- PK_TRACE("q[%d]x[%d] starts quad entry", qloop, ex);
+ PK_TRACE_INF("Check: q[%d]ex[%d] starts quad entry", qloop, ex);
- // Update QSSR: stop_entry_ongoing
+ PK_TRACE("Update QSSR: stop_entry_ongoing");
out32(OCB_QSSR_OR, BIT32(qloop + 20));
- // Update Quad STOP History
+ PK_TRACE("Update STOP history on quad[%d]: update request stop level", qloop);
SGPE_STOP_UPDATE_HISTORY(qloop,
QUAD_ADDR_BASE,
STOP_CACHE_IS_GATED,
@@ -405,9 +430,8 @@ p9_sgpe_stop_entry()
MARK_TAG(SE_PURGE_L3, (32 >> qloop))
//==================================
- PK_TRACE("SE11.a");
+ PK_TRACE("Drop LCO prior to purge via EX_PM_LCO_DIS_REG[0]");
- // Disable LCO prior to purge
if(ex & FST_EX_IN_QUAD)
{
GPE_PUTSCOM(GPE_SCOM_ADDR_EX(EX_PM_LCO_DIS_REG, qloop, 0),
@@ -421,9 +445,9 @@ p9_sgpe_stop_entry()
}
#if !SKIP_L3_PURGE
- PK_TRACE("SE11.b");
- // Assert Purge L3
+ PK_TRACE("Assert purge L3 via EX_PM_PURGE_REG[0]");
+
if(ex & FST_EX_IN_QUAD)
{
GPE_PUTSCOM(GPE_SCOM_ADDR_EX(EX_PM_PURGE_REG, qloop, 0), BIT64(0));
@@ -436,21 +460,22 @@ p9_sgpe_stop_entry()
// todo: stop debug trace, attribute may be needed
- PK_TRACE("SE11.d");
+ PK_TRACE("Poll for L3 purge done via EX_PM_PURGE_REG[0]");
- // Poll for purge done on the same request bit thus no need to deassert
+ // Poll on the same request bit thus no need to deassert
do
{
+
#if !SKIP_L3_PURGE_ABORT
if (in32(OCB_OISR1) & (BITS32(15, 2) | BIT32(19)))
{
- PK_TRACE("SE: interrupt detected");
+ PK_TRACE_INF("Abort: interrupt detected");
if ((in32(OCB_OPITNPRA(2)) & BITS32((qloop << 2), 4)) ||
(in32(OCB_OPITNPRA(3)) & BITS32((qloop << 2), 4)))
{
- PK_TRACE("SE: core interrupt detected");
+ PK_TRACE_INF("Abort: core interrupt detected");
for(cloop = 0; cloop < CORES_PER_QUAD; cloop++)
{
@@ -459,7 +484,7 @@ p9_sgpe_stop_entry()
(in32(OCB_OPIT3CN(((qloop << 2) + cloop))) &
TYPE3_PAYLOAD_EXIT_EVENT))
{
- PK_TRACE("SE: core wakeup detected");
+ PK_TRACE_INF("Abort: core wakeup detected");
l3_purge_aborted = 1;
break;
}
@@ -469,7 +494,7 @@ p9_sgpe_stop_entry()
if ((in32(OCB_OPIT6PRB) & BIT32(qloop)) &&
(in32(OCB_OPIT6QN(qloop)) & TYPE6_PAYLOAD_EXIT_EVENT))
{
- PK_TRACE("SE: quad wakeup detected");
+ PK_TRACE_INF("Abort: quad wakeup detected");
l3_purge_aborted = 1;
}
@@ -480,7 +505,8 @@ p9_sgpe_stop_entry()
MARK_TAG(SE_PURGE_L3_ABORT, (32 >> qloop))
//========================================
- // Assert Purge L3 Abort
+ PK_TRACE_INF("Abort: assert purge L3 abort");
+
if (ex & FST_EX_IN_QUAD)
GPE_PUTSCOM(GPE_SCOM_ADDR_EX(EX_PM_PURGE_REG, qloop, 0),
BIT64(2));
@@ -489,7 +515,8 @@ p9_sgpe_stop_entry()
GPE_PUTSCOM(GPE_SCOM_ADDR_EX(EX_PM_PURGE_REG, qloop, 1),
BIT64(2));
- // Poll for Abort Done
+ PK_TRACE_INF("Abort: poll for abort done");
+
if(ex & FST_EX_IN_QUAD)
{
do
@@ -514,7 +541,8 @@ p9_sgpe_stop_entry()
MARK_TAG(SE_PURGE_L3_ABORT_DONE, (32 >> qloop))
//=============================================
- // Deassert LCO Disable
+ PK_TRACE_INF("Abort: Drop LCO Disable");
+
if (ex & FST_EX_IN_QUAD)
GPE_PUTSCOM(GPE_SCOM_ADDR_EX(EX_PM_LCO_DIS_REG,
qloop, 0), 0);
@@ -523,7 +551,7 @@ p9_sgpe_stop_entry()
GPE_PUTSCOM(GPE_SCOM_ADDR_EX(EX_PM_LCO_DIS_REG,
qloop, 1), 0);
- // Notify PGPE to resume
+ // TODO Notify PGPE to resume
}
}
@@ -547,44 +575,48 @@ p9_sgpe_stop_entry()
if (l3_purge_aborted)
{
+ PK_TRACE_INF("Abort: L3 Purge Aborted");
continue;
}
+ PK_TRACE_INF("SE11.A: L3 Purged");
+
#endif
//==================================
MARK_TAG(SE_PURGE_PB, (32 >> qloop))
//==================================
- PK_TRACE("SE11.g");
- // Assert PowerBus purge
+ PK_TRACE("Assert powerbus purge via QCCR[30]");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_QPPM_QCCR_WOR, qloop), BIT64(30));
- PK_TRACE("SE11.h");
+ PK_TRACE("Poll PowerBus purge done via QCCR[31]");
- // Poll PowerBus purge done
do
{
GPE_GETSCOM(GPE_SCOM_ADDR_QUAD(EQ_QPPM_QCCR, qloop), scom_data);
}
while(!(scom_data & BIT64(31)));
- PK_TRACE("SE11.i");
- // Deassert PowerBus purge
+ PK_TRACE("Drop powerbus purge via QCCR[30]");
// todo may need to move this to wakeup
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_QPPM_QCCR_WCLEAR, qloop), BIT64(30));
+ PK_TRACE_INF("SE11.B: PowerBus Purged");
+
//===========================================
MARK_TAG(SE_WAIT_PGPE_SUSPEND, (32 >> qloop))
//===========================================
+
// TODO: Poll PGPE Suspend Ack
//======================================
MARK_TAG(SE_QUIESCE_QUAD, (32 >> qloop))
//======================================
- // todo halt cme here
- PK_TRACE("SE11.j");
+ // TODO halt cme here
+
+ PK_TRACE("Assert refresh quiesce prior to L3 (refresh domain) stop clk via EX_DRAM_REF_REG[7]");
// Assert refresh quiesce prior to L3 (refresh domain) stop clk
// Edram quiesce is asserted by hardware when l3 thold is asserted in cc
@@ -602,7 +634,8 @@ p9_sgpe_stop_entry()
GPE_PUTSCOM(GPE_SCOM_ADDR_EX(EX_DRAM_REF_REG, qloop, 1), scom_data);
}
- // Check NCU_SATUS_REG[0:3] for all zeros
+ PK_TRACE("Check NCU_SATUS_REG[0:3] for all zeros");
+
if (ex & FST_EX_IN_QUAD)
{
do
@@ -623,29 +656,26 @@ p9_sgpe_stop_entry()
while((~scom_data & BITS64(0, 4)) != BITS64(0 , 4));
}
+ PK_TRACE_INF("SE11.C: NCU Status Clean");
+
//===========================
MARK_TRAP(SE_STOP_CACHE_CLKS)
//===========================
- PK_TRACE("SE11.k");
- // Raise Cache Logical fence
+ PK_TRACE("Assert cache chiplet fence via NET_CTRL0[18]");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_NET_CTRL0_WOR, qloop), BIT64(18));
- // clock off cache chiplet
- PK_TRACE("SE11.l");
- // Set all bits to zero prior stop core clocks
+ PK_TRACE("Clear SCAN_REGION prior to stop cache clocks");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_SCAN_REGION_TYPE, qloop), 0);
- PK_TRACE("SE11.m");
- // Stop Cache Clocks
+ PK_TRACE("Stop cache clocks via CLK_REGION");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_CLK_REGION, qloop),
(CLK_STOP_CMD | CLK_THOLD_ALL |
CLK_REGION_ALL_BUT_EX |
((uint64_t)ex << SHIFT64(7)) |
((uint64_t)ex << SHIFT64(13))));
- PK_TRACE("SE11.n");
- // Poll for Cache clocks stopped
+ PK_TRACE("Poll for cache clocks stopped via CPLT_STAT0[8]");
do
{
@@ -653,27 +683,27 @@ p9_sgpe_stop_entry()
}
while((~scom_data) & BIT64(8));
+ PK_TRACE("Check core clock is stopped via CLOCK_STAT_SL[4-13]");
GPE_GETSCOM(GPE_SCOM_ADDR_QUAD(EQ_CLOCK_STAT_SL, qloop), scom_data);
if (((~scom_data) & (CLK_REGION_ALL_BUT_EX |
((uint64_t)ex << SHIFT64(7)) |
((uint64_t)ex << SHIFT64(13)))) != 0)
{
- PK_TRACE("Cache clock stop failed");
+ PK_TRACE("ERROR: Cache clock stop failed. HALT SGPE!");
pk_halt();
}
// MF: verify compiler generate single rlwmni
// MF: delay may be needed for stage latch to propagate thold
- PK_TRACE("SE11: Cache Clock Stopped");
-
- PK_TRACE("SE11.o");
- // Switch glsmux to refclk to save clock grid power
+ PK_TRACE("Switch glsmux to refclk to save clock grid power via CGCR[3]");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_PPM_CGCR, qloop), 0);
- // Assert Vital Fence
+
+ PK_TRACE("Assert vital fence via CPLT_CTRL1[3]");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_CPLT_CTRL1_OR, qloop), BIT64(3));
- // Raise Partial Good Fences
+
+ PK_TRACE("Assert partial good regional fences via CPLT_CTRL1[4-14]");
// Must cover partial bad fences as well or powerbus error will raise
// Note: Stop11 will lose all the fences so here needs to assert them
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_CPLT_CTRL1_OR, qloop),
@@ -681,30 +711,36 @@ p9_sgpe_stop_entry()
((uint64_t)ex << SHIFT64(7)) |
((uint64_t)ex << SHIFT64(9)) |
((uint64_t)ex << SHIFT64(13))));
+
/// @todo add VDM_ENABLE attribute control
- PK_TRACE("Assert vdm enable via CPPM_VDMCR[0]");
+ PK_TRACE("Drop vdm enable via CPPM_VDMCR[0]");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(PPM_VDMCR_CLR, qloop), BIT64(0));
+ PK_TRACE_INF("SE11.D: Cache Clock Stopped");
+
//=========================================
MARK_TAG(SE_POWER_OFF_CACHE, (32 >> qloop))
//=========================================
-#if HW386311_PBIE_RW_PTR_STOP11_FIX
+#if HW386311_DD1_PBIE_RW_PTR_STOP11_FIX
+
+ PK_TRACE_INF("FCMS: Engage with PBIE Read/Write Pointer Scan Workaround");
+
// bit4,5,11 = perv/eqpb/pbieq, bit59 = inex
- PK_TRACE("SE: Setup scan register to select the ring");
+ PK_TRACE("FCMS: Setup scan register to select the ring");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(0x10030005, qloop), BITS64(4, 2) | BIT64(11) | BIT64(59));
- PK_TRACE("SE: checkword set");
+ PK_TRACE("FCMS: checkword set");
scom_data = 0xa5a5a5a5a5a5a5a5;
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(0x1003E000, qloop), scom_data);
for(spin = 1;; spin++)
{
- PK_TRACE("SE: spin ring loop%d", spin);
+ PK_TRACE("FCMS: spin ring loop%d", spin);
scom_data = (G_ring_spin[spin][0] - G_ring_spin[spin - 1][0]) << 32;
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(0x10039000, qloop), scom_data);
- PK_TRACE("SE: Poll OPCG done for ring spin");
+ PK_TRACE("FCMS: Poll OPCG done for ring spin");
do
{
@@ -714,47 +750,51 @@ p9_sgpe_stop_entry()
if (spin == 9)
{
- PK_TRACE("SE: checkword check");
+ PK_TRACE("FCMS: checkword check");
GPE_GETSCOM(GPE_SCOM_ADDR_QUAD(0x1003E000, qloop), scom_data);
if (scom_data != 0xa5a5a5a5a5a5a5a5)
{
- PK_TRACE("checkword[%x%x] failed", UPPER32(scom_data), LOWER32(scom_data));
+ PK_TRACE("ERROR: checkword[%x%x] failed. HALT SGPE!",
+ UPPER32(scom_data), LOWER32(scom_data));
pk_halt();
}
break;
}
- PK_TRACE("SE: save pbie read ptr");
+ PK_TRACE("FCMS: save pbie read ptr");
GPE_GETSCOM(GPE_SCOM_ADDR_QUAD(0x1003E000, qloop), scom_data);
EXTRACT_RING_BITS(G_ring_spin[spin][1], scom_data, G_ring_save[qloop][spin - 1]);
- PK_TRACE("SE: mask: %8x %8x",
+ PK_TRACE("FCMS: mask: %8x %8x",
UPPER32(G_ring_spin[spin][1]),
LOWER32(G_ring_spin[spin][1]));
- PK_TRACE("SE: ring: %8x %8x",
+ PK_TRACE("FCMS: ring: %8x %8x",
UPPER32(scom_data),
LOWER32(scom_data));
- PK_TRACE("SE: save: %8x %8x",
+ PK_TRACE("FCMS: save: %8x %8x",
UPPER32(G_ring_save[qloop][spin - 1]),
LOWER32(G_ring_save[qloop][spin - 1]));
}
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(0x10030005, qloop), 0);
+
#endif
- // DD: Assert Cache Vital Thold/PCB Fence/Electrical Fence
- PK_TRACE("SE11.q");
+ PK_TRACE("Assert PCB fence via NET_CTRL0[25]");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_NET_CTRL0_WOR, qloop), BIT64(25));
+
+ PK_TRACE("Assert electrical fence via NET_CTRL0[26]");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_NET_CTRL0_WOR, qloop), BIT64(26));
+
+ PK_TRACE("Assert vital thold via NET_CTRL0[16]");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_NET_CTRL0_WOR, qloop), BIT64(16));
- // L3 edram shutdown
+ PK_TRACE("Shutdown L3[%d] EDRAM via QCCR[0-3/4-7]", ex);
// QCCR[0/4] EDRAM_ENABLE_DC
// QCCR[1/5] EDRAM_VWL_ENABLE_DC
// QCCR[2/6] L3_EX0/1_EDRAM_VROW_VBLH_ENABLE_DC
// QCCR[3/7] EDRAM_VPP_ENABLE_DC
- PK_TRACE("SE11.r");
if (ex & SND_EX_IN_QUAD)
{
@@ -781,23 +821,20 @@ p9_sgpe_stop_entry()
}
#if !STOP_PRIME
- // todo needed?
- // Prepare PFET Controls
+
+ PK_TRACE("Drop vdd/vcs_pfet_val/sel_override/regulation_finger_en via PFCS[4-7,8]");
// vdd_pfet_val/sel_override = 0 (disbaled)
// vcs_pfet_val/sel_override = 0 (disbaled)
// vdd_pfet_regulation_finger_en = 0 (controled by FSM)
- PK_TRACE("SE11.t");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(PPM_PFCS_CLR, qloop),
BITS64(4, 4) | BIT64(8));
- // Power Off Cache VDS then VDD
+ PK_TRACE("Power off VCS via PFCS[2-3]");
// vcs_pfet_force_state = 01 (Force Voff)
- PK_TRACE("SE11.u");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(PPM_PFCS_OR, qloop), BIT64(3));
+ PK_TRACE("Poll for power gate sequencer state: 0x8 (FSM Idle) via PFCS[50]");
// todo: poll the sense line instead
- // Poll for power gate sequencer state: 0x8 (FSM Idle)
- PK_TRACE("SE11.v");
do
{
@@ -805,13 +842,12 @@ p9_sgpe_stop_entry()
}
while(!(scom_data & BIT64(50)));
+ PK_TRACE("Power off VDD via PFCS[0-1]");
// vdd_pfet_force_state = 01 (Force Voff)
- PK_TRACE("SE11.u");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(PPM_PFCS_OR, qloop), BIT64(1));
+ PK_TRACE("Poll for power gate sequencer state: 0x8 (FSM Idle) via PFCS[42]");
// todo: poll the sense line instead
- // Poll for power gate sequencer state: 0x8 (FSM Idle)
- PK_TRACE("SE11.v");
do
{
@@ -819,19 +855,31 @@ p9_sgpe_stop_entry()
}
while(!(scom_data & BIT64(42)));
- // Turn Off Force Voff
+ PK_TRACE("Turn off force voff via PFCS[0-3]");
// vdd_pfet_force_state = 00 (Nop)
// vcs_pfet_force_state = 00 (Nop)
- PK_TRACE("SE11.x");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(PPM_PFCS_CLR, qloop), BITS64(0, 4));
+ PK_TRACE_INF("SE11.E: Cache Powered Off");
+
#endif
- PK_TRACE("SE11.y");
+ PK_TRACE("Drop CME_INTERPPM_DPLL_ENABLE after DPLL is stopped via QPMMR[26]");
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(QPPM_QPMMR_CLR, qloop), BIT64(20) | BIT64(22) | BIT64(24) | BIT64(26));
+
G_sgpe_stop_record.state[qloop].act_state_q = STOP_LEVEL_11;
for(cloop = 0; cloop < CORES_PER_QUAD; cloop++)
{
+ // Check partial good core
+ if (!(G_sgpe_stop_record.group.core[VECTOR_CONFIG] &
+ BIT32(((qloop << 2) + cloop))))
+ {
+ continue;
+ }
+
+ PK_TRACE("Update STOP history on core[%d]: in stop level 11",
+ ((qloop << 2) + cloop));
SGPE_STOP_UPDATE_HISTORY(((qloop << 2) + cloop),
CORE_ADDR_BASE,
STOP_CORE_IS_GATED,
@@ -842,6 +890,7 @@ p9_sgpe_stop_entry()
STOP_ACT_ENABLE);
}
+ PK_TRACE("Update STOP history on quad[%d]: in stop level 11", qloop);
SGPE_STOP_UPDATE_HISTORY(qloop,
QUAD_ADDR_BASE,
STOP_CACHE_IS_GATED,
@@ -851,10 +900,10 @@ p9_sgpe_stop_entry()
STOP_REQ_DISABLE,
STOP_ACT_ENABLE);
- // Update QSSR: quad_stopped
+ PK_TRACE("Update QSSR: quad_stopped");
out32(OCB_QSSR_OR, BIT32(qloop + 14));
- // Update QSSR: drop stop_entry_ongoing
+ PK_TRACE("Update QSSR: drop stop_entry_ongoing");
out32(OCB_QSSR_CLR, BIT32(qloop + 20));
//=====================================
@@ -862,7 +911,11 @@ p9_sgpe_stop_entry()
//=====================================
}
- //loop quad to drop spwu done + clear qswu
+ //--------------------------------------------------------------------------
+ PK_TRACE_INF("+++++ +++++ END OF STOP ENTRY +++++ +++++");
+ //--------------------------------------------------------------------------
+
+ //loop quad to clear qswu record
for(qloop = 0; qloop < MAX_QUADS; qloop++)
{
if (G_sgpe_stop_record.group.qswu[VECTOR_ENTRY] & BIT32(qloop))
@@ -874,5 +927,6 @@ p9_sgpe_stop_entry()
//============================
MARK_TRAP(ENDSCOPE_STOP_ENTRY)
//============================
+
return SGPE_STOP_SUCCESS;
}
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_exit.c b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_exit.c
index 2b9c3b25..dea77fff 100644
--- a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_exit.c
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_exit.c
@@ -26,16 +26,21 @@
#include "p9_sgpe_stop.h"
#include "p9_sgpe_stop_exit_marks.h"
#include "p9_hcd_sgpe_boot_cme.h"
-#include "p9_hcd_cache_initf.h"
+//#include "p9_dd1_doorbell_wr.h"
extern SgpeStopRecord G_sgpe_stop_record;
-#if HW386311_PBIE_RW_PTR_STOP11_FIX
+
+#if HW386311_DD1_PBIE_RW_PTR_STOP11_FIX
+
extern uint64_t G_ring_save[MAX_QUADS][8];
extern uint64_t G_ring_spin[10][2];
+
#endif
#if FUSED_CORE_MODE_SCAN_FIX
+
uint32_t G_fcm_spin[4] = {0, 435, 1402, 2411};
+
#endif
int
@@ -53,23 +58,26 @@ p9_sgpe_stop_exit()
uint64_t cme_flags;
ppm_sshsrc_t hist;
ocb_ccsr_t ccsr;
-#if HW386311_PBIE_RW_PTR_STOP11_FIX
+#if HW386311_DD1_PBIE_RW_PTR_STOP11_FIX
int spin;
#endif
+
//===============================
MARK_TAG(BEGINSCOPE_STOP_EXIT, 0)
//===============================
- PK_TRACE("Core Exit Vectors: X[%x] X0[%x] X1[%x] Q[%x]",
- G_sgpe_stop_record.group.ex_b[VECTOR_EXIT],
- G_sgpe_stop_record.group.ex_l[VECTOR_EXIT],
- G_sgpe_stop_record.group.ex_r[VECTOR_EXIT],
- G_sgpe_stop_record.group.quad[VECTOR_EXIT]);
+ PK_TRACE_INF("Core Exit Vectors: X[%x] X0[%x] X1[%x] Q[%x]",
+ G_sgpe_stop_record.group.ex_b[VECTOR_EXIT],
+ G_sgpe_stop_record.group.ex_l[VECTOR_EXIT],
+ G_sgpe_stop_record.group.ex_r[VECTOR_EXIT],
+ G_sgpe_stop_record.group.quad[VECTOR_EXIT]);
+
+
for(cexit = G_sgpe_stop_record.group.core[VECTOR_EXIT],
qspwu = G_sgpe_stop_record.group.qswu[VECTOR_EXIT],
qloop = 0, m_l2 = 0, m_pg = 0;
- cexit > 0 || qspwu > 0;
+ (cexit > 0 || qspwu > 0) && (qloop < MAX_QUADS);
cexit = cexit << 4, qspwu = qspwu << 1, qloop++, m_l2 = 0, m_pg = 0)
{
@@ -78,6 +86,10 @@ p9_sgpe_stop_exit()
continue;
}
+ //--------------------------------------------------------------------------
+ PK_TRACE_INF("+++++ +++++ BEGIN OF STOP EXIT +++++ +++++");
+ //--------------------------------------------------------------------------
+
if (G_sgpe_stop_record.group.ex_l[VECTOR_CONFIG] & BIT32(qloop))
{
m_pg |= FST_EX_IN_QUAD;
@@ -102,9 +114,11 @@ p9_sgpe_stop_exit()
m_l2 = m_l2 & m_pg;
- PK_TRACE("quad[%d]m_l2[%d]m_pg[%d]", qloop, m_l2, m_pg);
+ PK_TRACE_INF("Check: quad[%d] m_l2[%d] m_pg[%d]", qloop, m_l2, m_pg);
- // Update QSSR: stop_exit_ongoing
+
+
+ PK_TRACE("Update QSSR: stop_exit_ongoing");
out32(OCB_QSSR_OR, BIT32(qloop + 26));
for(cloop = 0; cloop < CORES_PER_QUAD; cloop++)
@@ -114,6 +128,8 @@ p9_sgpe_stop_exit()
continue;
}
+ PK_TRACE("Update STOP history on core[%d]: in transition of exit",
+ ((qloop << 2) + cloop));
SGPE_STOP_UPDATE_HISTORY(((qloop << 2) + cloop),
CORE_ADDR_BASE,
STOP_CORE_IS_GATED,
@@ -124,8 +140,17 @@ p9_sgpe_stop_exit()
STOP_ACT_DISABLE);
}
+
+
if(m_l2 && G_sgpe_stop_record.state[qloop].act_state_q >= STOP_LEVEL_11)
{
+
+ //--------------------------------------------------------------------------
+ PK_TRACE_INF("+++++ +++++ QUAD STOP EXIT [LEVEL 11-15] +++++ +++++");
+ //--------------------------------------------------------------------------
+
+ PK_TRACE("Update STOP history on quad[%d]: in transition of exit",
+ qloop);
SGPE_STOP_UPDATE_HISTORY(qloop,
QUAD_ADDR_BASE,
STOP_CACHE_IS_GATED,
@@ -139,66 +164,110 @@ p9_sgpe_stop_exit()
MARK_TAG(SX_POWERON, (32 >> qloop))
//=================================
- PK_TRACE("Cache Poweron");
+ // NOTE: it is required to serialize power on quad PFETs to prevent droop
+ PK_TRACE_INF("SX11.A: Cache[%d] Poweron", qloop);
p9_hcd_cache_poweron(qloop);
//=========================
MARK_TRAP(SX_CHIPLET_RESET)
//=========================
- PK_TRACE("Cache Chiplet Reset m_pg[%d]", m_pg);
+ PK_TRACE_INF("SX11.B: Cache[%d] Chiplet Reset with PG[%d]", qloop, m_pg);
p9_hcd_cache_chiplet_reset(qloop, m_pg);
+#if !STOP_INITF
+
+ PK_TRACE_INF("SX11.C: Cache[%d] Chiplet L3 DCC Setup", qloop);
+ p9_hcd_cache_chiplet_l3_dcc_setup(qloop);
+
+#endif
+
+
#if !STOP_PRIME
- PK_TRACE("Cache Gptr Time Initf");
+#if !STOP_INITF
+
+ PK_TRACE_INF("SX11.D: Cache[%d] Gptr Time Initf", qloop);
p9_hcd_cache_gptr_time_initf(qloop);
+
#endif
//====================================
MARK_TAG(SX_DPLL_SETUP, (32 >> qloop))
//====================================
- ///@todo dpll_initf
+#if !STOP_INITF
+
+ PK_TRACE_INF("SX11.E: Cache[%d] Dpll Initf", qloop);
+ p9_hcd_cache_dpll_initf(qloop);
+
+#endif
- PK_TRACE("Cache Dpll Setup");
+ PK_TRACE_INF("SX11.F: Cache[%d] Dpll Setup", qloop);
p9_hcd_cache_dpll_setup(qloop);
-#if !STOP_PRIME
+#if !STOP_INITF
+
+ PK_TRACE_INF("SX11.G: Cache[%d] DCC Skewadjust Setup", qloop);
+ p9_hcd_cache_dcc_skewadjust_setup(qloop);
+
+#endif
+
+ // set 20, 22, 24 and 26 during Stop11 Exit after setting up the DPLL
+ scom_data = BIT64(20) | BIT64(22) | BIT64(24) | BIT64(26);
+
+ // set 21, 23, 25, and 27 if EX0 is bad (not partial good)
+ if ((~m_pg) & FST_EX_IN_QUAD)
+ {
+ scom_data |= BIT64(21) | BIT64(23) | BIT64(25) | BIT64(27);
+ }
+
+ PK_TRACE("Assert inter-ppm settings via QPMMR[22,24,26,EX0PB:21,23,25]");
+ GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(QPPM_QPMMR_OR, qloop), scom_data);
+
//=======================================
MARK_TAG(SX_CHIPLET_INITS, (32 >> qloop))
//=======================================
- PK_TRACE("Cache Chiplet Init");
+ PK_TRACE_INF("SX11.H: Cache[%d] Chiplet Init", qloop);
p9_hcd_cache_chiplet_init(qloop);
- PK_TRACE("Cache Repair Initf");
+#if !STOP_INITF
+
+ PK_TRACE_INF("SX11.I: Cache[%d] Repair Initf", qloop);
p9_hcd_cache_repair_initf(qloop);
+#endif
+
//====================================
MARK_TAG(SX_ARRAY_INIT, (32 >> qloop))
//====================================
+
#if !SKIP_ARRAYINIT
- PK_TRACE("Cache Arrayinit");
+ PK_TRACE_INF("SX11.J: Cache[%d] Arrayinit", qloop);
p9_hcd_cache_arrayinit(qloop, m_pg);
+
#endif
#if FUSED_CORE_MODE_SCAN_FIX
+
+ PK_TRACE_INF("FCMS: Engage with Fused Mode Scan Workaround");
+
// bit8/9 = l2-0/1, bit49 = cfg
- PK_TRACE("FC: Setup scan register to select the ring");
+ PK_TRACE("FCMS: Setup scan register to select the ring");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(0x10030005, qloop), BITS64(8, 2) | BIT64(49));
- PK_TRACE("FC: checkword set");
+ PK_TRACE("FCMS: checkword set");
scom_data = 0xa5a5a5a5a5a5a5a5;
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(0x1003E000, qloop), scom_data);
for(spin = 1;; spin++)
{
- PK_TRACE("FC: spin ring loop%d", spin);
+ PK_TRACE("FCMS: spin ring loop%d", spin);
scom_data = (G_fcm_spin[spin] - G_fcm_spin[spin - 1]) << 32;
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(0x10039000, qloop), scom_data);
- PK_TRACE("FC: Poll OPCG done for ring spin");
+ PK_TRACE("FCMS: Poll OPCG done for ring spin");
do
{
@@ -208,43 +277,48 @@ p9_sgpe_stop_exit()
if (spin == 3)
{
- PK_TRACE("FC: checkword check");
+ PK_TRACE("FCMS: checkword check");
GPE_GETSCOM(GPE_SCOM_ADDR_QUAD(0x1003E000, qloop), scom_data);
if (scom_data != 0xa5a5a5a5a5a5a5a5)
{
- PK_TRACE("FC: checkword[%x%x] failed", UPPER32(scom_data), LOWER32(scom_data));
+ PK_TRACE("ERROR: checkword[%x%x] failed. HALT SGPE!",
+ UPPER32(scom_data), LOWER32(scom_data));
pk_halt();
}
break;
}
- PK_TRACE("FC: restore fused core mode bit");
+ PK_TRACE("FCMS: restore fused core mode bit");
GPE_GETSCOM(GPE_SCOM_ADDR_QUAD(0x1003E000, qloop), scom_data);
RESTORE_RING_BITS(BIT64(0), scom_data, BIT64(0));
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(0x1003E000, qloop), scom_data);
}
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(0x10030005, qloop), 0);
+
#endif
-#if HW386311_PBIE_RW_PTR_STOP11_FIX
+#if HW386311_DD1_PBIE_RW_PTR_STOP11_FIX
+
+ PK_TRACE_INF("FCMS: Engage with PBIE Read/Write Pointer Scan Workaround");
+
// bit4,5,11 = perv/eqpb/pbieq, bit59 = inex
- PK_TRACE("SX: Setup scan register to select the ring");
+ PK_TRACE("PBRW: Setup scan register to select the ring");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(0x10030005, qloop), BITS64(4, 2) | BIT64(11) | BIT64(59));
- PK_TRACE("SX: checkword set");
+ PK_TRACE("PBRW: checkword set");
scom_data = 0xa5a5a5a5a5a5a5a5;
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(0x1003E000, qloop), scom_data);
for(spin = 1;; spin++)
{
- PK_TRACE("SX: spin ring loop%d", spin);
+ PK_TRACE("PBRW: spin ring loop%d", spin);
scom_data = (G_ring_spin[spin][0] - G_ring_spin[spin - 1][0]) << 32;
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(0x10039000, qloop), scom_data);
- PK_TRACE("SX: Poll OPCG done for ring spin");
+ PK_TRACE("PBRW: Poll OPCG done for ring spin");
do
{
@@ -254,38 +328,39 @@ p9_sgpe_stop_exit()
if (spin == 9)
{
- PK_TRACE("SX: checkword check");
+ PK_TRACE("PBRW: checkword check");
GPE_GETSCOM(GPE_SCOM_ADDR_QUAD(0x1003E000, qloop), scom_data);
if (scom_data != 0xa5a5a5a5a5a5a5a5)
{
- PK_TRACE("checkword[%x%x] failed", UPPER32(scom_data), LOWER32(scom_data));
+ PK_TRACE_INF("ERROR: checkword[%x%x] failed. HALT SGPE!",
+ UPPER32(scom_data), LOWER32(scom_data));
pk_halt();
}
break;
}
- PK_TRACE("SX: restore pbie read ptr");
+ PK_TRACE("PBRW: restore pbie read ptr");
GPE_GETSCOM(GPE_SCOM_ADDR_QUAD(0x1003E000, qloop), scom_data);
- PK_TRACE("SE: mask: %8x %8x",
+ PK_TRACE("PBRW: mask: %8x %8x",
UPPER32(G_ring_spin[spin][1]),
LOWER32(G_ring_spin[spin][1]));
- PK_TRACE("SE: ring: %8x %8x",
+ PK_TRACE("PBRW: ring: %8x %8x",
UPPER32(scom_data),
LOWER32(scom_data));
- PK_TRACE("SE: save: %8x %8x",
+ PK_TRACE("PBRW: save: %8x %8x",
UPPER32(G_ring_save[qloop][spin - 1]),
LOWER32(G_ring_save[qloop][spin - 1]));
RESTORE_RING_BITS(G_ring_spin[spin][1], scom_data, G_ring_save[qloop][spin - 1]);
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(0x1003E000, qloop), scom_data);
- PK_TRACE("SE: mask: %8x %8x",
+ PK_TRACE("PBRW: mask: %8x %8x",
UPPER32(G_ring_spin[spin][1]),
LOWER32(G_ring_spin[spin][1]));
- PK_TRACE("SE: ring: %8x %8x",
+ PK_TRACE("PBRW: ring: %8x %8x",
UPPER32(scom_data),
LOWER32(scom_data));
- PK_TRACE("SE: save: %8x %8x",
+ PK_TRACE("PBRW: save: %8x %8x",
UPPER32(G_ring_save[qloop][spin - 1]),
LOWER32(G_ring_save[qloop][spin - 1]));
@@ -298,42 +373,41 @@ p9_sgpe_stop_exit()
MARK_TRAP(SX_FUNC_INIT)
//=====================
- PK_TRACE("Cache Initf");
+#if !SKIP_INITF
+
+ PK_TRACE_INF("SX11.K: Cache[%d] Func Scan", qloop);
p9_hcd_cache_initf(qloop);
-#if !ISTEP15_HACK
- asm volatile ("nop");
-#else
- asm volatile ("tw 31, 0, 0");
-#endif
#endif
+#endif
//===========================================
MARK_TAG(SX_CACHE_STARTCLOCKS, (32 >> qloop))
//===========================================
- PK_TRACE("Cache Startclocks m_pg[%d]", m_pg);
+ PK_TRACE_INF("SX11.L: Cache[%d] Startclocks with PG[%d]", qloop, m_pg);
p9_hcd_cache_startclocks(qloop, m_pg);
}
if (m_l2)
{
+
+ //--------------------------------------------------------------------------
+ PK_TRACE_INF("+++++ +++++ EX STOP EXIT [LEVEL 8-10] +++++ +++++");
+ //--------------------------------------------------------------------------
+
//========================================================
MARK_TAG(SX_L2_STARTCLOCKS, ((m_l2 << 6) | (32 >> qloop)))
//========================================================
// do this again here for stop8 in addition to dpll_setup
- PK_TRACE("4S8: Switch L2 glsmux select to DPLL output");
+ PK_TRACE("Switch L2 glsmux select to DPLL output via EXCGCR[34,35]");
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(EQ_QPPM_EXCGCR_OR, qloop), BITS64(34, 2));
- PK_TRACE("Cache L2 Startclocks");
+ PK_TRACE_INF("SX8.A: Cache[%d] L2[%d] Startclocks with PG[%d]",
+ qloop, m_l2, m_pg);
p9_hcd_cache_l2_startclocks(qloop, m_l2, m_pg);
-#if !ISTEP15_HACK
- asm volatile ("nop");
-#else
- asm volatile ("tw 31, 0, 0");
-#endif
// reset ex actual state if ex is exited.
if (m_l2 & FST_EX_IN_QUAD)
@@ -346,14 +420,17 @@ p9_sgpe_stop_exit()
G_sgpe_stop_record.state[qloop].act_state_x1 = 0;
}
-
-
- // Update QSSR: drop l2_stopped,
+ PK_TRACE("Update QSSR: drop l2_stopped");
out32(OCB_QSSR_CLR, (m_l2 << SHIFT32((qloop << 1) + 1)));
}
if(m_l2 && G_sgpe_stop_record.state[qloop].act_state_q >= STOP_LEVEL_11)
{
+
+ //--------------------------------------------------------------------------
+ PK_TRACE_INF("+++++ +++++ QUAD STOP EXIT CONTINUE +++++ +++++");
+ //--------------------------------------------------------------------------
+
for(cme = 0; cme < EXES_PER_QUAD; cme += 2)
{
@@ -364,12 +441,14 @@ p9_sgpe_stop_exit()
continue;
}
- // Raise Core-L2 + Core-CC Quiesces
+ PK_TRACE("Assert core[%d]-L2/CC quiesces via SICR[6/7,8/9]", core);
GPE_PUTSCOM(GPE_SCOM_ADDR_CME(CME_SCOM_SICR_OR,
qloop, (cme >> 1)),
((uint64_t)core << SHIFT64(7) |
(uint64_t)core << SHIFT64(9)));
+ PK_TRACE("Poll for interface quiesced via CME[%d] SISR[30,31]", cme);
+
do
{
GPE_GETSCOM(GPE_SCOM_ADDR_CME(CME_SCOM_SISR,
@@ -379,14 +458,15 @@ p9_sgpe_stop_exit()
}
#if !STOP_PRIME
+
//====================================
MARK_TAG(SX_SCOM_INITS, (32 >> qloop))
//====================================
- PK_TRACE("Cache Scom Init");
- p9_hcd_cache_scominit(qloop);
+ PK_TRACE_INF("SX11.M: Cache[%d] Scom Init with PG[%d]", qloop, m_pg);
+ p9_hcd_cache_scominit(qloop, m_pg);
- PK_TRACE("Cache Scom Cust");
+ PK_TRACE_INF("SX11.N: Cache[%d] Scom Cust", qloop);
p9_hcd_cache_scomcust(qloop);
//==================================
@@ -401,11 +481,17 @@ p9_sgpe_stop_exit()
continue;
}
- PK_TRACE("Doorbell1 the CME %d", ((qloop << 2) + cloop));
+ PK_TRACE_INF("SX11.O: Core[%d] DB1 to CME", ((qloop << 2) + cloop));
GPE_PUTSCOM(GPE_SCOM_ADDR_CORE(CPPM_CMEMSG,
((qloop << 2) + cloop)), BIT64(0));
GPE_PUTSCOM(GPE_SCOM_ADDR_CORE(CPPM_CMEDB1_OR,
((qloop << 2) + cloop)), BIT64(7));
+ /*
+ p9_dd1_db_unicast_wr(GPE_SCOM_ADDR_CORE(CPPM_CMEMSG,
+ ((qloop << 2) + cloop)), BIT64(0));
+ p9_dd1_db_unicast_wr(GPE_SCOM_ADDR_CORE(CPPM_CMEDB1_OR,
+ ((qloop << 2) + cloop)), BIT64(7));
+ */
}
// Setting up cme_flags
@@ -481,31 +567,38 @@ p9_sgpe_stop_exit()
if (in32(OCB_OCCFLG) & BIT32(13))
{
+ PK_TRACE_INF("BREAK: Trap Before CME Boot");
asm volatile ("trap");
}
#if !SKIP_CME_BOOT_STOP11
+
uint16_t cmeBootList = (m_pg << SHIFT16(((qloop << 1) + 1)));
- PK_TRACE("Boot CME [%x]", cmeBootList);
+ PK_TRACE_INF("SX11.P: Boot CME[%x]", cmeBootList);
boot_cme( cmeBootList );
+
#endif
//=======================================
MARK_TAG(SX_RUNTIME_INITS, (32 >> qloop))
//=======================================
- PK_TRACE("Cache RAS Runtime Scom");
+ PK_TRACE_INF("SX11.Q: Cache[%d] RAS Runtime Scom", qloop);
p9_hcd_cache_ras_runtime_scom(qloop);
- PK_TRACE("Cache OCC Runtime Scom");
+ PK_TRACE_INF("SX11.R: Cache[%d] OCC Runtime Scom", qloop);
p9_hcd_cache_occ_runtime_scom(qloop);
//=========================
MARK_TRAP(SX_ENABLE_ANALOG)
//=========================
+
#endif
+
G_sgpe_stop_record.state[qloop].act_state_q = 0;
+ PK_TRACE("Update STOP history on quad[%d]: \
+ STOP exit completed, cache ready", qloop);
SGPE_STOP_UPDATE_HISTORY(qloop,
QUAD_ADDR_BASE,
STOP_CACHE_READY_RUN,
@@ -515,14 +608,19 @@ p9_sgpe_stop_exit()
STOP_REQ_DISABLE,
STOP_ACT_DISABLE);
- // Update QSSR: drop quad_stopped
- out32(OCB_QSSR_CLR, BIT32(qloop + 26));
+ PK_TRACE("Update QSSR: drop quad_stopped");
+ out32(OCB_QSSR_CLR, BIT32(qloop + 14));
}
- // assert quad special wakeup done
+ //--------------------------------------------------------------------------
+ PK_TRACE_INF("+++++ +++++ END OF STOP EXIT +++++ +++++");
+ //--------------------------------------------------------------------------
+
if (qspwu & BIT32(0))
{
+ PK_TRACE_INF("SX0.A: Assert Quad[%d] SPWU Done", qloop);
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(PPM_GPMMR_OR, qloop), BIT64(0));
+
G_sgpe_stop_record.group.qswu[VECTOR_CONFIG] |= BIT32(qloop);
G_sgpe_stop_record.group.qswu[VECTOR_EXIT] &= ~BIT32(qloop);
}
@@ -537,12 +635,14 @@ p9_sgpe_stop_exit()
// reset clevel to 0 if core is going to wake up
G_sgpe_stop_record.level[qloop][cloop] = 0;
- // Change PPM Wakeup to CME
+
+ PK_TRACE_INF("SX0.B: Switch Core[%d]PPM Wakeup back to CME via CPMMR[13]",
+ ((qloop << 2) + cloop));
GPE_PUTSCOM(GPE_SCOM_ADDR_CORE(CPPM_CPMMR_CLR,
((qloop << 2) + cloop)), BIT64(13));
}
- // Update QSSR: drop stop_exit_ongoing
+ PK_TRACE("Update QSSR: drop stop_exit_ongoing");
out32(OCB_QSSR_CLR, BIT32(qloop + 26));
}
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_irq_handlers.c b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_irq_handlers.c
index 721c7544..1bcf8f55 100644
--- a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_irq_handlers.c
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/p9_sgpe_stop_irq_handlers.c
@@ -26,7 +26,35 @@
#include "p9_sgpe_stop.h"
#include "p9_sgpe_stop_enter_marks.h"
-SgpeStopRecord G_sgpe_stop_record;
+SgpeStopRecord G_sgpe_stop_record =
+{
+ // core levels
+ { {0, 0, 0, 0},
+ {0, 0, 0, 0},
+ {0, 0, 0, 0},
+ {0, 0, 0, 0},
+ {0, 0, 0, 0},
+ {0, 0, 0, 0}
+ },
+ // quad states
+ { {0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0},
+ {0, 0, 0, 0, 0, 0, 0}
+ },
+ // group vectors
+ { {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0},
+ {0, 0, 0}
+ },
+ // semaphores
+ {{0, 0}}
+};
// PCB Interrupt Type2
// Payload
@@ -68,7 +96,7 @@ p9_sgpe_stop_pig_handler(void* arg, PkIrqId irq)
MARK_TRAP(STOP_PIG_HANDLER)
//=========================
- PK_TRACE("PIG-IRQ: %d", irq);
+ PK_TRACE_INF("PIG-IRQ: %d", irq);
// Disable type2/3/6 interrupt
out32(OCB_OIMR1_OR, (BITS32(15, 2) | BIT32(19)));
// Read type2/3/6 interrupt status
@@ -83,21 +111,21 @@ p9_sgpe_stop_pig_handler(void* arg, PkIrqId irq)
{
cpending_t2 = in32(OCB_OPITNPRA(2));
out32(OCB_OPITNPRA_CLR(2), cpending_t2);
- PK_TRACE("Type2: %x", cpending_t2);
+ PK_TRACE_INF("Type2: %x", cpending_t2);
}
if (cirq & BIT32(16))
{
cpending_t3 = in32(OCB_OPITNPRA(3));
out32(OCB_OPITNPRA_CLR(3), cpending_t3);
- PK_TRACE("Type3: %x", cpending_t3);
+ PK_TRACE_INF("Type3: %x", cpending_t3);
}
if (qirq)
{
qpending_t6 = in32(OCB_OPIT6PRB);
out32(OCB_OPIT6PRB_CLR, qpending_t6);
- PK_TRACE("Type6: %x", qpending_t6);
+ PK_TRACE_INF("Type6: %x", qpending_t6);
}
// clear group before analyzing input
@@ -121,15 +149,15 @@ p9_sgpe_stop_pig_handler(void* arg, PkIrqId irq)
// read payload on quad has interrupt pending
payload = in32(OCB_OPIT6QN(qloop));
- PK_TRACE("q[%d] payload [%x]", qloop, payload);
+ PK_TRACE_INF("Q[%d] Payload [%x]", qloop, payload);
if (payload & TYPE6_PAYLOAD_EXIT_EVENT)
{
- PK_TRACE("q[%d] request special wakeup", qloop);
+ PK_TRACE_INF("Q[%d] Request Special Wakeup", qloop);
if (G_sgpe_stop_record.group.qswu[VECTOR_CONFIG] & BIT32(qloop))
{
- PK_TRACE("q[%d] already in special wakeup", qloop);
+ PK_TRACE_INF("Q[%d] Already in Special Wakeup", qloop);
}
else
{
@@ -143,8 +171,9 @@ p9_sgpe_stop_pig_handler(void* arg, PkIrqId irq)
}
else
{
- PK_TRACE("q[%d] drop special wakeup, clearing done", qloop);
+ PK_TRACE_INF("Q[%d] Drop Special Wakeup, Clearing Done", qloop);
GPE_PUTSCOM(GPE_SCOM_ADDR_QUAD(PPM_GPMMR_CLR, qloop), BIT64(0));
+
G_sgpe_stop_record.group.qswu[VECTOR_ENTRY] |= BIT32(qloop);
G_sgpe_stop_record.group.qswu[VECTOR_CONFIG] &= ~BIT32(qloop);
}
@@ -157,12 +186,12 @@ p9_sgpe_stop_pig_handler(void* arg, PkIrqId irq)
continue;
}
- PK_TRACE("q[%d] has core request:", qloop);
- PK_TRACE("now clv[%d][%d][%d][%d]",
- G_sgpe_stop_record.level[qloop][0],
- G_sgpe_stop_record.level[qloop][1],
- G_sgpe_stop_record.level[qloop][2],
- G_sgpe_stop_record.level[qloop][3]);
+ PK_TRACE_INF("Q[%d] Has Core Request:", qloop);
+ PK_TRACE_INF("Now clv[%d][%d][%d][%d]",
+ G_sgpe_stop_record.level[qloop][0],
+ G_sgpe_stop_record.level[qloop][1],
+ G_sgpe_stop_record.level[qloop][2],
+ G_sgpe_stop_record.level[qloop][3]);
// then loop all cores in the quad
for(cloop = 0; cloop < CORES_PER_QUAD; cloop++)
@@ -182,12 +211,12 @@ p9_sgpe_stop_pig_handler(void* arg, PkIrqId irq)
payload = in32(OCB_OPIT3CN(((qloop << 2) + cloop)));
}
- PK_TRACE("c[%d] payload [%x]", cloop, payload);
+ PK_TRACE_INF("C[%d] Payload [%x]", cloop, payload);
// check if exit request
if (payload & TYPE2_PAYLOAD_EXIT_EVENT)
{
- PK_TRACE("c[%d] request exit", cloop);
+ PK_TRACE_INF("C[%d] Request Exit", cloop);
// Due to some wakeup signal sources can be "fake"
// as they are triggered regardless of the state of the core,
@@ -199,21 +228,21 @@ p9_sgpe_stop_pig_handler(void* arg, PkIrqId irq)
if (scom_data & BIT64(18))
{
- PK_TRACE("c[%d] confirmed stopped", cloop);
+ PK_TRACE_INF("C[%d] Considered Stopped, Will Wakeup", cloop);
if (cloop < CORES_PER_EX)
{
G_sgpe_stop_record.group.ex_l[VECTOR_EXIT] |=
BIT32(qloop);
G_sgpe_stop_record.group.ex_b[VECTOR_EXIT] |=
- BIT32(qloop << 1);
+ BIT32((qloop << 1));
}
else
{
G_sgpe_stop_record.group.ex_r[VECTOR_EXIT] |=
BIT32(qloop);
G_sgpe_stop_record.group.ex_b[VECTOR_EXIT] |=
- BIT32((qloop << 1) + 1);
+ BIT32(((qloop << 1) + 1));
}
G_sgpe_stop_record.group.quad[VECTOR_EXIT] |=
@@ -221,12 +250,16 @@ p9_sgpe_stop_pig_handler(void* arg, PkIrqId irq)
G_sgpe_stop_record.group.core[VECTOR_EXIT] |=
BIT32(((qloop << 2) + cloop));
}
+ else
+ {
+ PK_TRACE_INF("C[%d] is Considered Running, Ignore Wakeup", cloop);
+ }
}
// otherwise it is entry request with stop level in payload
else
{
- PK_TRACE("c[%d] request enter to lv[%d]", cloop,
- (payload & TYPE2_PAYLOAD_STOP_LEVEL));
+ PK_TRACE_INF("C[%d] Request Enter to lv[%d]", cloop,
+ (payload & TYPE2_PAYLOAD_STOP_LEVEL));
// read stop level on core asking to enter
G_sgpe_stop_record.level[qloop][cloop] =
@@ -236,11 +269,11 @@ p9_sgpe_stop_pig_handler(void* arg, PkIrqId irq)
}
}
- PK_TRACE("new clv[%d][%d][%d][%d]",
- G_sgpe_stop_record.level[qloop][0],
- G_sgpe_stop_record.level[qloop][1],
- G_sgpe_stop_record.level[qloop][2],
- G_sgpe_stop_record.level[qloop][3]);
+ PK_TRACE_INF("New clv[%d][%d][%d][%d]",
+ G_sgpe_stop_record.level[qloop][0],
+ G_sgpe_stop_record.level[qloop][1],
+ G_sgpe_stop_record.level[qloop][2],
+ G_sgpe_stop_record.level[qloop][3]);
}
G_sgpe_stop_record.group.ex_b[VECTOR_EXIT] &=
@@ -250,19 +283,19 @@ p9_sgpe_stop_pig_handler(void* arg, PkIrqId irq)
G_sgpe_stop_record.group.ex_r[VECTOR_EXIT] &=
G_sgpe_stop_record.group.ex_r[VECTOR_CONFIG];
- PK_TRACE("Quad Special Wakeup: Raise[%x], Drop[%x]",
- G_sgpe_stop_record.group.qswu[VECTOR_EXIT],
- G_sgpe_stop_record.group.qswu[VECTOR_ENTRY]);
- PK_TRACE("Core Request Stop: Entry[%x], Exit[%x]",
- G_sgpe_stop_record.group.core[VECTOR_ENTRY],
- G_sgpe_stop_record.group.core[VECTOR_EXIT]);
+ PK_TRACE_INF("Quad Special Wakeup: Raise[%x], Drop[%x]",
+ G_sgpe_stop_record.group.qswu[VECTOR_EXIT],
+ G_sgpe_stop_record.group.qswu[VECTOR_ENTRY]);
+ PK_TRACE_INF("Core Request Stop: Entry[%x], Exit[%x]",
+ G_sgpe_stop_record.group.core[VECTOR_ENTRY],
+ G_sgpe_stop_record.group.core[VECTOR_EXIT]);
if ((!G_sgpe_stop_record.group.core[VECTOR_EXIT]) &&
(!G_sgpe_stop_record.group.core[VECTOR_ENTRY]) &&
(!G_sgpe_stop_record.group.qswu[VECTOR_EXIT]) &&
(!G_sgpe_stop_record.group.qswu[VECTOR_ENTRY]))
{
- PK_TRACE("Nothing to do, clear masks");
+ PK_TRACE_INF("Nothing to do, Clear Masks");
out32(OCB_OIMR1_CLR, (BITS32(15, 2) | BIT32(19)));
}
else
@@ -270,17 +303,17 @@ p9_sgpe_stop_pig_handler(void* arg, PkIrqId irq)
if (G_sgpe_stop_record.group.core[VECTOR_EXIT] ||
G_sgpe_stop_record.group.qswu[VECTOR_EXIT])
{
- PK_TRACE("unblock exit");
+ PK_TRACE_INF("Unblock Exit");
pk_semaphore_post(&(G_sgpe_stop_record.sem[1]));
}
if (G_sgpe_stop_record.group.core[VECTOR_ENTRY] ||
G_sgpe_stop_record.group.qswu[VECTOR_ENTRY])
{
- PK_TRACE("unblock entry");
+ PK_TRACE_INF("Unblock Entry");
pk_semaphore_post(&(G_sgpe_stop_record.sem[0]));
}
- PK_TRACE("RFI");
+ PK_TRACE_INF("RFI");
}
}
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/pk_app_cfg.h b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/pk_app_cfg.h
index 4064e663..287c4bb1 100644
--- a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/pk_app_cfg.h
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/pk_app_cfg.h
@@ -34,14 +34,7 @@
/// \brief Application specific overrides go here.
///
-// @todo RTC 161182
-#define HW386311_PBIE_RW_PTR_STOP11_FIX 1
-#define BROADSIDE_SCAN0 0
-#define FUSED_CORE_MODE_SCAN_FIX 0
-
-#define SIMICS_TUNING 0
-#define USE_SIMICS_IO 0
-#define DEV_DEBUG 1
+// --------------------
#ifndef EPM_P9_TUNING
#define EPM_P9_TUNING 0
@@ -50,28 +43,58 @@
#define STOP_PRIME 0
#define SKIP_L3_PURGE 0
#define SKIP_L3_PURGE_ABORT 0
-#define ISTEP15_HACK 0
+#define SKIP_ARRAYINIT 0
+#define SKIP_SCAN0 0
+#define SKIP_INITF 0
#if EPM_P9_TUNING
+ // @todo RTC 161182
+ #define HW386311_DD1_PBIE_RW_PTR_STOP11_FIX 0
+ #define HW388878_DD1_VCS_POWER_ON_IN_CHIPLET_RESET_FIX 0
+ #define FUSED_CORE_MODE_SCAN_FIX 0
+
#define SKIP_CME_BOOT_STOP11 1
#define SKIP_CME_BOOT_IPL_HB 1
- #define SKIP_ARRAYINIT 0
- #define SKIP_SCAN0 0
+ #define EPM_BROADSIDE_SCAN0 0
#else
+ #define HW386311_DD1_PBIE_RW_PTR_STOP11_FIX 1
+ #define HW388878_DD1_VCS_POWER_ON_IN_CHIPLET_RESET_FIX 1
+ #define FUSED_CORE_MODE_SCAN_FIX 0
+
#define SKIP_CME_BOOT_STOP11 0
#define SKIP_CME_BOOT_IPL_HB 1
- #define SKIP_ARRAYINIT 0
- #define SKIP_SCAN0 0
+ #define EPM_BROADSIDE_SCAN0 0
#endif
-#define SKIP_INITF 0
// --------------------
+#define PK_TRACE_LEVEL 2
+
+#if PK_TRACE_LEVEL == 0 /*No TRACEs*/
+ #define PK_TRACE_ENABLE 0
+ #define PK_KERNEL_TRACE_ENABLE 0
+#elif PK_TRACE_LEVEL == 1 /*only PK_TRACE_INF*/
+ #define PK_TRACE_ENABLE 1
+ #define PK_TRACE_CRIT_ENABLE 1
+ #define PK_TRACE_DBG_SUPPRESS 1
+ #define PK_KERNEL_TRACE_ENABLE 0
+#else /*All TRACEs*/
+ #define PK_TRACE_ENABLE 1
+ #define PK_TRACE_CRIT_ENABLE 1
+ #define PK_TRACE_DBG_SUPPRESS 0
+ #define PK_KERNEL_TRACE_ENABLE 1
+#endif
+
#if EPM_P9_TUNING
#define PK_TRACE_BUFFER_WRAP_MARKER 1
#endif
-#define PK_TRACE_TIMER_OUTPUT 0
-#define PK_TRACE_ENABLE 1
+#define PK_TRACE_TIMER_OUTPUT 0
+
+// --------------------
+
+#define SIMICS_TUNING 0
+#define USE_SIMICS_IO 0
+#define DEV_DEBUG 1
// --------------------
diff --git a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/topfiles.mk b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/topfiles.mk
index 621e1842..61eded4b 100644
--- a/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/topfiles.mk
+++ b/import/chips/p9/procedures/ppe_closed/sgpe/stop_gpe/topfiles.mk
@@ -50,6 +50,9 @@ TOP-S-SOURCES = p9_sgpe_image_header.S
TOP-CPP-SOURCES = p9_sgpe_main.C
TOP-CPP-SOURCES += p9_hcd_cache_initf.C
+TOP-CPP-SOURCES += p9_hcd_cache_dpll_initf.C
+TOP-CPP-SOURCES += p9_hcd_cache_chiplet_l3_dcc_setup.C
+TOP-CPP-SOURCES += p9_hcd_cache_dcc_skewadjust_setup.C
UTILS_OBJECTS = $(UTILS-SRC:.C=.o)
TOP_OBJECTS = $(TOP-C-SOURCES:.c=.o) $(TOP-S-SOURCES:.S=.o) $(TOP-CPP-SOURCES:.C=.o)
OpenPOWER on IntegriCloud