Commit d2adba3f authored by Aneesh Kumar K.V's avatar Aneesh Kumar K.V Committed by Michael Ellerman

powerpc/mm: Abstraction for switch_mmu_context()

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: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent d9225ad9
...@@ -33,16 +33,23 @@ extern long mm_iommu_ua_to_hpa(struct mm_iommu_table_group_mem_t *mem, ...@@ -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 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); extern void mm_iommu_mapped_dec(struct mm_iommu_table_group_mem_t *mem);
#endif #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 switch_slb(struct task_struct *tsk, struct mm_struct *mm);
extern void set_context(unsigned long id, pgd_t *pgd); extern void set_context(unsigned long id, pgd_t *pgd);
#ifdef CONFIG_PPC_BOOK3S_64 #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 int __init_new_context(void);
extern void __destroy_context(int context_id); extern void __destroy_context(int context_id);
static inline void mmu_context_init(void) { } static inline void mmu_context_init(void) { }
#else #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 unsigned long __init_new_context(void);
extern void __destroy_context(unsigned long context_id); extern void __destroy_context(unsigned long context_id);
extern void mmu_context_init(void); extern void mmu_context_init(void);
...@@ -88,17 +95,11 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, ...@@ -88,17 +95,11 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next,
if (cpu_has_feature(CPU_FTR_ALTIVEC)) if (cpu_has_feature(CPU_FTR_ALTIVEC))
asm volatile ("dssall"); asm volatile ("dssall");
#endif /* CONFIG_ALTIVEC */ #endif /* CONFIG_ALTIVEC */
/*
/* The actual HW switching method differs between the various * The actual HW switching method differs between the various
* sub architectures. * sub architectures. Out of line for now
*/ */
#ifdef CONFIG_PPC_STD_MMU_64 switch_mmu_context(prev, next, tsk);
switch_slb(tsk, next);
#else
/* Out of line for now */
switch_mmu_context(prev, next);
#endif
} }
#define deactivate_mm(tsk,mm) do { } while (0) #define deactivate_mm(tsk,mm) do { } while (0)
......
...@@ -31,6 +31,6 @@ void save_processor_state(void) ...@@ -31,6 +31,6 @@ void save_processor_state(void)
void restore_processor_state(void) void restore_processor_state(void)
{ {
#ifdef CONFIG_PPC32 #ifdef CONFIG_PPC32
switch_mmu_context(current->active_mm, current->active_mm); switch_mmu_context(current->active_mm, current->active_mm, NULL);
#endif #endif
} }
...@@ -226,7 +226,8 @@ static void context_check_map(void) ...@@ -226,7 +226,8 @@ static void context_check_map(void)
static void context_check_map(void) { } static void context_check_map(void) { }
#endif #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 int i, id, cpu = smp_processor_id();
unsigned long *map; unsigned long *map;
......
...@@ -298,7 +298,7 @@ static int pmu_set_cpu_speed(int low_speed) ...@@ -298,7 +298,7 @@ static int pmu_set_cpu_speed(int low_speed)
_set_L3CR(save_l3cr); _set_L3CR(save_l3cr);
/* Restore userland MMU context */ /* Restore userland MMU context */
switch_mmu_context(NULL, current->active_mm); switch_mmu_context(NULL, current->active_mm, NULL);
#ifdef DEBUG_FREQ #ifdef DEBUG_FREQ
printk(KERN_DEBUG "HID1, after: %x\n", mfspr(SPRN_HID1)); printk(KERN_DEBUG "HID1, after: %x\n", mfspr(SPRN_HID1));
......
...@@ -1851,7 +1851,7 @@ static int powerbook_sleep_grackle(void) ...@@ -1851,7 +1851,7 @@ static int powerbook_sleep_grackle(void)
_set_L2CR(save_l2cr); _set_L2CR(save_l2cr);
/* Restore userland MMU context */ /* Restore userland MMU context */
switch_mmu_context(NULL, current->active_mm); switch_mmu_context(NULL, current->active_mm, NULL);
/* Power things up */ /* Power things up */
pmu_unlock(); pmu_unlock();
...@@ -1940,7 +1940,7 @@ powerbook_sleep_Core99(void) ...@@ -1940,7 +1940,7 @@ powerbook_sleep_Core99(void)
_set_L3CR(save_l3cr); _set_L3CR(save_l3cr);
/* Restore userland MMU context */ /* Restore userland MMU context */
switch_mmu_context(NULL, current->active_mm); switch_mmu_context(NULL, current->active_mm, NULL);
/* Tell PMU we are ready */ /* Tell PMU we are ready */
pmu_unlock(); pmu_unlock();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment