powerpc: Rename slb0_limit() to safe_stack_limit() and add Book3E support
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Tue, 3 May 2011 14:07:01 +0000 (14:07 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Fri, 6 May 2011 03:32:24 +0000 (13:32 +1000)
slb0_limit() wasn't a very descriptive name. This changes it along with
a comment explaining what it's used for, and provides a 64-bit BookE
implementation.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/include/asm/mmu-book3e.h
arch/powerpc/kernel/setup_64.c

index ec61e7b..3ea0f9a 100644 (file)
@@ -245,6 +245,10 @@ extern struct mmu_psize_def mmu_psize_defs[MMU_PAGE_COUNT];
 extern int mmu_linear_psize;
 extern int mmu_vmemmap_psize;
 
+#ifdef CONFIG_PPC64
+extern unsigned long linear_map_top;
+#endif
+
 #endif /* !__ASSEMBLY__ */
 
 #endif /* _ASM_POWERPC_MMU_BOOK3E_H_ */
index 959c63c..c2ec0a1 100644 (file)
@@ -434,17 +434,30 @@ void __init setup_system(void)
        DBG(" <- setup_system()\n");
 }
 
-static u64 slb0_limit(void)
+/* This returns the limit below which memory accesses to the linear
+ * mapping are guarnateed not to cause a TLB or SLB miss. This is
+ * used to allocate interrupt or emergency stacks for which our
+ * exception entry path doesn't deal with being interrupted.
+ */
+static u64 safe_stack_limit(void)
 {
-       if (mmu_has_feature(MMU_FTR_1T_SEGMENT)) {
+#ifdef CONFIG_PPC_BOOK3E
+       /* Freescale BookE bolts the entire linear mapping */
+       if (mmu_has_feature(MMU_FTR_TYPE_FSL_E))
+               return linear_map_top;
+       /* Other BookE, we assume the first GB is bolted */
+       return 1ul << 30;
+#else
+       /* BookS, the first segment is bolted */
+       if (mmu_has_feature(MMU_FTR_1T_SEGMENT))
                return 1UL << SID_SHIFT_1T;
-       }
        return 1UL << SID_SHIFT;
+#endif
 }
 
 static void __init irqstack_early_init(void)
 {
-       u64 limit = slb0_limit();
+       u64 limit = safe_stack_limit();
        unsigned int i;
 
        /*
@@ -497,7 +510,7 @@ static void __init emergency_stack_init(void)
         * bringup, we need to get at them in real mode. This means they
         * must also be within the RMO region.
         */
-       limit = min(slb0_limit(), ppc64_rma_size);
+       limit = min(safe_stack_limit(), ppc64_rma_size);
 
        for_each_possible_cpu(i) {
                unsigned long sp;