aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Piggin <npiggin@gmail.com>2019-04-12 14:05:29 +1000
committerStewart Smith <stewart@linux.ibm.com>2019-04-17 15:56:34 +1000
commit53ef0db6e2efbf9678699db4a57df26cdd89e462 (patch)
tree926c52210c2b53aeb73e910b7c0cb145e7d15ab0
parentac226d2c98ad95db44e1f2c27775c1b557af876b (diff)
downloadskiboot-53ef0db6e2efbf9678699db4a57df26cdd89e462.zip
skiboot-53ef0db6e2efbf9678699db4a57df26cdd89e462.tar.gz
skiboot-53ef0db6e2efbf9678699db4a57df26cdd89e462.tar.bz2
asm/head.S: set POWER9 radix HID bit at entry
When running in virtual memory mode, the radix MMU hid bit should not be changed, so set this in the initial boot SPR setup. As a side effect, fast reboot also has HID0:RADIX bit set by the shared spr init, so no need for an explicit call. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
-rw-r--r--asm/head.S3
-rw-r--r--core/cpu.c18
-rw-r--r--core/init.c3
-rw-r--r--include/cpu.h1
4 files changed, 5 insertions, 20 deletions
diff --git a/asm/head.S b/asm/head.S
index 0ed1acd..916b22c 100644
--- a/asm/head.S
+++ b/asm/head.S
@@ -766,9 +766,12 @@ init_shared_sprs:
mtspr SPR_TSCR, %r3
/* HID0: Clear bit 5 (enable core recovery)
* Clear bit 4 (HILE)
+ * Set bit 8 (radix)
*/
mfspr %r3,SPR_HID0
li %r0,1
+ sldi %r4,%r0,(63-8)
+ or %r3,%r3,%r4
sldi %r4,%r0,(63-5)
sldi %r5,%r0,(63-4)
or %r0,%r4,%r5
diff --git a/core/cpu.c b/core/cpu.c
index d9d4713..62c0201 100644
--- a/core/cpu.c
+++ b/core/cpu.c
@@ -1433,20 +1433,6 @@ static int64_t cpu_change_all_hid0(struct hid0_change_req *req)
return OPAL_SUCCESS;
}
-void cpu_set_radix_mode(void)
-{
- struct hid0_change_req req;
-
- if (!radix_supported)
- return;
-
- req.clr_bits = 0;
- req.set_bits = SPR_HID0_POWER9_RADIX;
- cleanup_global_tlb();
- current_radix_mode = true;
- cpu_change_all_hid0(&req);
-}
-
static void cpu_cleanup_one(void *param __unused)
{
mtspr(SPR_AMR, 0);
@@ -1488,8 +1474,8 @@ void cpu_fast_reboot_complete(void)
/* Fast reboot will have cleared HID0:HILE */
current_hile_mode = false;
- /* On P9, restore radix mode */
- cpu_set_radix_mode();
+ /* and set HID0:RADIX */
+ current_radix_mode = true;
}
static int64_t opal_reinit_cpus(uint64_t flags)
diff --git a/core/init.c b/core/init.c
index eeee2d9..0fe6c16 100644
--- a/core/init.c
+++ b/core/init.c
@@ -1282,9 +1282,6 @@ void __noreturn __nomcount main_cpu_entry(const void *fdt)
prd_register_reserved_memory();
- /* On P9, switch to radix mode by default */
- cpu_set_radix_mode();
-
checksum_romem();
load_and_boot_kernel(false);
diff --git a/include/cpu.h b/include/cpu.h
index 39071a1..011b12b 100644
--- a/include/cpu.h
+++ b/include/cpu.h
@@ -313,7 +313,6 @@ extern unsigned long __attrconst cpu_emergency_stack_top(unsigned int pir);
extern void cpu_idle_job(void);
extern void cpu_idle_delay(unsigned long delay);
-extern void cpu_set_radix_mode(void);
extern void cpu_fast_reboot_complete(void);
int dctl_set_special_wakeup(struct cpu_thread *t);