powerpc/mm: Abstraction for switch_mmu_context()
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Fri, 29 Apr 2016 13:26:01 +0000 (23:26 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Sun, 1 May 2016 08:33:04 +0000 (18:33 +1000)
How we switch MMU context differs between hash and radix. For hash we
need to switch the SLB details and for radix we need to switch the PID
SPR.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/mmu_context.h
arch/powerpc/kernel/swsusp.c
arch/powerpc/mm/mmu_context_nohash.c
drivers/cpufreq/pmac32-cpufreq.c
drivers/macintosh/via-pmu.c

index 4eaab40e3ade3663b13dcd155ed9258d276534a0..4e2a29443384e7e6f7f5b36e04f2034548a7ea51 100644 (file)
@@ -33,16 +33,23 @@ extern long mm_iommu_ua_to_hpa(struct mm_iommu_table_group_mem_t *mem,
 extern long mm_iommu_mapped_inc(struct mm_iommu_table_group_mem_t *mem);
 extern void mm_iommu_mapped_dec(struct mm_iommu_table_group_mem_t *mem);
 #endif
-
-extern void switch_mmu_context(struct mm_struct *prev, struct mm_struct *next);
 extern void switch_slb(struct task_struct *tsk, struct mm_struct *mm);
 extern void set_context(unsigned long id, pgd_t *pgd);
 
 #ifdef CONFIG_PPC_BOOK3S_64
+static inline void switch_mmu_context(struct mm_struct *prev,
+                                     struct mm_struct *next,
+                                     struct task_struct *tsk)
+{
+       return switch_slb(tsk, next);
+}
+
 extern int __init_new_context(void);
 extern void __destroy_context(int context_id);
 static inline void mmu_context_init(void) { }
 #else
+extern void switch_mmu_context(struct mm_struct *prev, struct mm_struct *next,
+                              struct task_struct *tsk);
 extern unsigned long __init_new_context(void);
 extern void __destroy_context(unsigned long context_id);
 extern void mmu_context_init(void);
@@ -88,17 +95,11 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
        if (cpu_has_feature(CPU_FTR_ALTIVEC))
                asm volatile ("dssall");
 #endif /* CONFIG_ALTIVEC */
-
-       /* The actual HW switching method differs between the various
-        * sub architectures.
+       /*
+        * The actual HW switching method differs between the various
+        * sub architectures. Out of line for now
         */
-#ifdef CONFIG_PPC_STD_MMU_64
-       switch_slb(tsk, next);
-#else
-       /* Out of line for now */
-       switch_mmu_context(prev, next);
-#endif
-
+       switch_mmu_context(prev, next, tsk);
 }
 
 #define deactivate_mm(tsk,mm)  do { } while (0)
index 6669b17525129f8c39ab7b9de8b89fb38adb4354..6ae9bd5086a4a44bdb4f058f63264af2714068bc 100644 (file)
@@ -31,6 +31,6 @@ void save_processor_state(void)
 void restore_processor_state(void)
 {
 #ifdef CONFIG_PPC32
-       switch_mmu_context(current->active_mm, current->active_mm);
+       switch_mmu_context(current->active_mm, current->active_mm, NULL);
 #endif
 }
index 986afbc22c76b2188f8104030e7197bd7eae57ba..a36c43a2789362fc2fbe180c5c707eec99259f24 100644 (file)
@@ -226,7 +226,8 @@ static void context_check_map(void)
 static void context_check_map(void) { }
 #endif
 
-void switch_mmu_context(struct mm_struct *prev, struct mm_struct *next)
+void switch_mmu_context(struct mm_struct *prev, struct mm_struct *next,
+                       struct task_struct *tsk)
 {
        unsigned int i, id, cpu = smp_processor_id();
        unsigned long *map;
index 1f49d97a70ea164737570c3480a2dcac30265788..bde503c66945dec987af3d882cf9180744b2970b 100644 (file)
@@ -298,7 +298,7 @@ static int pmu_set_cpu_speed(int low_speed)
                _set_L3CR(save_l3cr);
 
        /* Restore userland MMU context */
-       switch_mmu_context(NULL, current->active_mm);
+       switch_mmu_context(NULL, current->active_mm, NULL);
 
 #ifdef DEBUG_FREQ
        printk(KERN_DEBUG "HID1, after: %x\n", mfspr(SPRN_HID1));
index 01ee736fe0efc820f980f1e2acf1e20a453e26b2..f8b6d1403c160b12f1011df82dd32a6ed8b21290 100644 (file)
@@ -1851,7 +1851,7 @@ static int powerbook_sleep_grackle(void)
                _set_L2CR(save_l2cr);
        
        /* Restore userland MMU context */
-       switch_mmu_context(NULL, current->active_mm);
+       switch_mmu_context(NULL, current->active_mm, NULL);
 
        /* Power things up */
        pmu_unlock();
@@ -1940,7 +1940,7 @@ powerbook_sleep_Core99(void)
                _set_L3CR(save_l3cr);
        
        /* Restore userland MMU context */
-       switch_mmu_context(NULL, current->active_mm);
+       switch_mmu_context(NULL, current->active_mm, NULL);
 
        /* Tell PMU we are ready */
        pmu_unlock();