svn commit: r346143 - in head/sys/powerpc: include powerpc
Justin Hibbits
jhibbits at FreeBSD.org
Fri Apr 12 00:44:35 UTC 2019
Author: jhibbits
Date: Fri Apr 12 00:44:33 2019
New Revision: 346143
URL: https://svnweb.freebsd.org/changeset/base/346143
Log:
powerpc64: Increase the nap level on power9 idling
The POWER9 documentation specifies that levels 0-3 are the 'lightest' sleep
level, meaning lowest latency and with no state loss. However, state 3 is
not implemented, and is instead reserved for future chips. This now
properly configures the PSSCR, specifying state 2 as the lowest level to
enter, but request level 0 for quickest sleep level. If the OCC determines
that the CPU can enter states 1 or 2 it will trigger the transition to those
states on demand.
MFC after: 1 week
Modified:
head/sys/powerpc/include/spr.h
head/sys/powerpc/powerpc/cpu.c
Modified: head/sys/powerpc/include/spr.h
==============================================================================
--- head/sys/powerpc/include/spr.h Fri Apr 12 00:31:22 2019 (r346142)
+++ head/sys/powerpc/include/spr.h Fri Apr 12 00:44:33 2019 (r346143)
@@ -412,6 +412,19 @@
#define SPR_MD_RAM0 0x339 /* ..8 IMMU RAM entry read reg 0 */
#define SPR_MD_RAM1 0x33a /* ..8 IMMU RAM entry read reg 1 */
#define SPR_PSSCR 0x357 /* Processor Stop Status and Control Register (ISA 3.0) */
+#define PSSCR_PLS_S 60
+#define PSSCR_PLS_M (0xf << PSSCR_PLS_S)
+#define PSSCR_SD (1 << 22)
+#define PSSCR_ESL (1 << 21)
+#define PSSCR_EC (1 << 20)
+#define PSSCR_PSLL_S 16
+#define PSSCR_PSLL_M (0xf << PSSCR_PSLL_S)
+#define PSSCR_TR_S 8
+#define PSSCR_TR_M (0x3 << PSSCR_TR_S)
+#define PSSCR_MTL_S 4
+#define PSSCR_MTL_M (0xf << PSSCR_MTL_S)
+#define PSSCR_RL_S 0
+#define PSSCR_RL_M (0xf << PSSCR_RL_S)
#define SPR_PMCR 0x374 /* Processor Management Control Register */
#define SPR_UMMCR2 0x3a0 /* .6. User Monitor Mode Control Register 2 */
#define SPR_UMMCR0 0x3a8 /* .6. User Monitor Mode Control Register 0 */
Modified: head/sys/powerpc/powerpc/cpu.c
==============================================================================
--- head/sys/powerpc/powerpc/cpu.c Fri Apr 12 00:31:22 2019 (r346142)
+++ head/sys/powerpc/powerpc/cpu.c Fri Apr 12 00:44:33 2019 (r346143)
@@ -787,7 +787,6 @@ cpu_idle_booke(sbintime_t sbt)
static void
cpu_idle_powerx(sbintime_t sbt)
{
-
/* Sleeping when running on one cpu gives no advantages - avoid it */
if (smp_started == 0)
return;
@@ -816,7 +815,8 @@ cpu_idle_power9(sbintime_t sbt)
/* Suspend external interrupts until stop instruction completes. */
mtmsr(msr & ~PSL_EE);
/* Set the stop state to lowest latency, wake up to next instruction */
- mtspr(SPR_PSSCR, 0);
+ /* Set maximum transition level to 2, for deepest lossless sleep. */
+ mtspr(SPR_PSSCR, (2 << PSSCR_MTL_S) | (0 << PSSCR_RL_S));
/* "stop" instruction (PowerISA 3.0) */
__asm __volatile (".long 0x4c0002e4");
/*
More information about the svn-src-head
mailing list