diff options
author | David S. Miller <davem@davemloft.net> | 2006-03-22 03:49:59 -0500 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-03-22 04:15:14 -0500 |
commit | dcc1e8dd88d4bc55e32a26dad7633d20ffe606d2 (patch) | |
tree | a47592213d94f918867d3dd81bb91dac3e727dea /include | |
parent | 14778d9072e53d2171f66ffd9657daff41acfaed (diff) |
[SPARC64]: Add a secondary TSB for hugepage mappings.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include')
-rw-r--r-- | include/asm-sparc64/cpudata.h | 5 | ||||
-rw-r--r-- | include/asm-sparc64/mmu.h | 29 | ||||
-rw-r--r-- | include/asm-sparc64/mmu_context.h | 21 | ||||
-rw-r--r-- | include/asm-sparc64/page.h | 34 | ||||
-rw-r--r-- | include/asm-sparc64/pgtable.h | 2 |
5 files changed, 61 insertions, 30 deletions
diff --git a/include/asm-sparc64/cpudata.h b/include/asm-sparc64/cpudata.h index c66a81bbc84d..9d6a6dbaf126 100644 --- a/include/asm-sparc64/cpudata.h +++ b/include/asm-sparc64/cpudata.h | |||
@@ -71,7 +71,8 @@ struct trap_per_cpu { | |||
71 | /* Dcache line 7: Physical addresses of CPU send mondo block and CPU list. */ | 71 | /* Dcache line 7: Physical addresses of CPU send mondo block and CPU list. */ |
72 | unsigned long cpu_mondo_block_pa; | 72 | unsigned long cpu_mondo_block_pa; |
73 | unsigned long cpu_list_pa; | 73 | unsigned long cpu_list_pa; |
74 | unsigned long __pad1[2]; | 74 | unsigned long tsb_huge; |
75 | unsigned long tsb_huge_temp; | ||
75 | 76 | ||
76 | /* Dcache line 8: Unused, needed to keep trap_block a power-of-2 in size. */ | 77 | /* Dcache line 8: Unused, needed to keep trap_block a power-of-2 in size. */ |
77 | unsigned long __pad2[4]; | 78 | unsigned long __pad2[4]; |
@@ -116,6 +117,8 @@ extern struct sun4v_2insn_patch_entry __sun4v_2insn_patch, | |||
116 | #define TRAP_PER_CPU_FAULT_INFO 0x40 | 117 | #define TRAP_PER_CPU_FAULT_INFO 0x40 |
117 | #define TRAP_PER_CPU_CPU_MONDO_BLOCK_PA 0xc0 | 118 | #define TRAP_PER_CPU_CPU_MONDO_BLOCK_PA 0xc0 |
118 | #define TRAP_PER_CPU_CPU_LIST_PA 0xc8 | 119 | #define TRAP_PER_CPU_CPU_LIST_PA 0xc8 |
120 | #define TRAP_PER_CPU_TSB_HUGE 0xd0 | ||
121 | #define TRAP_PER_CPU_TSB_HUGE_TEMP 0xd8 | ||
119 | 122 | ||
120 | #define TRAP_BLOCK_SZ_SHIFT 8 | 123 | #define TRAP_BLOCK_SZ_SHIFT 8 |
121 | 124 | ||
diff --git a/include/asm-sparc64/mmu.h b/include/asm-sparc64/mmu.h index 230ba678d3b0..2d4f2ea9568a 100644 --- a/include/asm-sparc64/mmu.h +++ b/include/asm-sparc64/mmu.h | |||
@@ -90,18 +90,39 @@ extern void __tsb_insert(unsigned long ent, unsigned long tag, unsigned long pte | |||
90 | extern void tsb_flush(unsigned long ent, unsigned long tag); | 90 | extern void tsb_flush(unsigned long ent, unsigned long tag); |
91 | extern void tsb_init(struct tsb *tsb, unsigned long size); | 91 | extern void tsb_init(struct tsb *tsb, unsigned long size); |
92 | 92 | ||
93 | typedef struct { | 93 | struct tsb_config { |
94 | spinlock_t lock; | ||
95 | unsigned long sparc64_ctx_val; | ||
96 | struct tsb *tsb; | 94 | struct tsb *tsb; |
97 | unsigned long tsb_rss_limit; | 95 | unsigned long tsb_rss_limit; |
98 | unsigned long tsb_nentries; | 96 | unsigned long tsb_nentries; |
99 | unsigned long tsb_reg_val; | 97 | unsigned long tsb_reg_val; |
100 | unsigned long tsb_map_vaddr; | 98 | unsigned long tsb_map_vaddr; |
101 | unsigned long tsb_map_pte; | 99 | unsigned long tsb_map_pte; |
102 | struct hv_tsb_descr tsb_descr; | 100 | }; |
101 | |||
102 | #define MM_TSB_BASE 0 | ||
103 | |||
104 | #ifdef CONFIG_HUGETLB_PAGE | ||
105 | #define MM_TSB_HUGE 1 | ||
106 | #define MM_NUM_TSBS 2 | ||
107 | #else | ||
108 | #define MM_NUM_TSBS 1 | ||
109 | #endif | ||
110 | |||
111 | typedef struct { | ||
112 | spinlock_t lock; | ||
113 | unsigned long sparc64_ctx_val; | ||
114 | unsigned long huge_pte_count; | ||
115 | struct tsb_config tsb_block[MM_NUM_TSBS]; | ||
116 | struct hv_tsb_descr tsb_descr[MM_NUM_TSBS]; | ||
103 | } mm_context_t; | 117 | } mm_context_t; |
104 | 118 | ||
105 | #endif /* !__ASSEMBLY__ */ | 119 | #endif /* !__ASSEMBLY__ */ |
106 | 120 | ||
121 | #define TSB_CONFIG_TSB 0x00 | ||
122 | #define TSB_CONFIG_RSS_LIMIT 0x08 | ||
123 | #define TSB_CONFIG_NENTRIES 0x10 | ||
124 | #define TSB_CONFIG_REG_VAL 0x18 | ||
125 | #define TSB_CONFIG_MAP_VADDR 0x20 | ||
126 | #define TSB_CONFIG_MAP_PTE 0x28 | ||
127 | |||
107 | #endif /* __MMU_H */ | 128 | #endif /* __MMU_H */ |
diff --git a/include/asm-sparc64/mmu_context.h b/include/asm-sparc64/mmu_context.h index e7974321d052..2337eb487719 100644 --- a/include/asm-sparc64/mmu_context.h +++ b/include/asm-sparc64/mmu_context.h | |||
@@ -29,20 +29,25 @@ extern int init_new_context(struct task_struct *tsk, struct mm_struct *mm); | |||
29 | extern void destroy_context(struct mm_struct *mm); | 29 | extern void destroy_context(struct mm_struct *mm); |
30 | 30 | ||
31 | extern void __tsb_context_switch(unsigned long pgd_pa, | 31 | extern void __tsb_context_switch(unsigned long pgd_pa, |
32 | unsigned long tsb_reg, | 32 | struct tsb_config *tsb_base, |
33 | unsigned long tsb_vaddr, | 33 | struct tsb_config *tsb_huge, |
34 | unsigned long tsb_pte, | ||
35 | unsigned long tsb_descr_pa); | 34 | unsigned long tsb_descr_pa); |
36 | 35 | ||
37 | static inline void tsb_context_switch(struct mm_struct *mm) | 36 | static inline void tsb_context_switch(struct mm_struct *mm) |
38 | { | 37 | { |
39 | __tsb_context_switch(__pa(mm->pgd), mm->context.tsb_reg_val, | 38 | __tsb_context_switch(__pa(mm->pgd), |
40 | mm->context.tsb_map_vaddr, | 39 | &mm->context.tsb_block[0], |
41 | mm->context.tsb_map_pte, | 40 | #ifdef CONFIG_HUGETLB_PAGE |
42 | __pa(&mm->context.tsb_descr)); | 41 | (mm->context.tsb_block[1].tsb ? |
42 | &mm->context.tsb_block[1] : | ||
43 | NULL) | ||
44 | #else | ||
45 | NULL | ||
46 | #endif | ||
47 | , __pa(&mm->context.tsb_descr[0])); | ||
43 | } | 48 | } |
44 | 49 | ||
45 | extern void tsb_grow(struct mm_struct *mm, unsigned long mm_rss); | 50 | extern void tsb_grow(struct mm_struct *mm, unsigned long tsb_index, unsigned long mm_rss); |
46 | #ifdef CONFIG_SMP | 51 | #ifdef CONFIG_SMP |
47 | extern void smp_tsb_sync(struct mm_struct *mm); | 52 | extern void smp_tsb_sync(struct mm_struct *mm); |
48 | #else | 53 | #else |
diff --git a/include/asm-sparc64/page.h b/include/asm-sparc64/page.h index fcb2812265f4..66fe4ac59fd6 100644 --- a/include/asm-sparc64/page.h +++ b/include/asm-sparc64/page.h | |||
@@ -30,6 +30,23 @@ | |||
30 | 30 | ||
31 | #ifdef __KERNEL__ | 31 | #ifdef __KERNEL__ |
32 | 32 | ||
33 | #if defined(CONFIG_HUGETLB_PAGE_SIZE_4MB) | ||
34 | #define HPAGE_SHIFT 22 | ||
35 | #elif defined(CONFIG_HUGETLB_PAGE_SIZE_512K) | ||
36 | #define HPAGE_SHIFT 19 | ||
37 | #elif defined(CONFIG_HUGETLB_PAGE_SIZE_64K) | ||
38 | #define HPAGE_SHIFT 16 | ||
39 | #endif | ||
40 | |||
41 | #ifdef CONFIG_HUGETLB_PAGE | ||
42 | #define HPAGE_SIZE (_AC(1,UL) << HPAGE_SHIFT) | ||
43 | #define HPAGE_MASK (~(HPAGE_SIZE - 1UL)) | ||
44 | #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) | ||
45 | #define ARCH_HAS_SETCLEAR_HUGE_PTE | ||
46 | #define ARCH_HAS_HUGETLB_PREFAULT_HOOK | ||
47 | #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA | ||
48 | #endif | ||
49 | |||
33 | #ifndef __ASSEMBLY__ | 50 | #ifndef __ASSEMBLY__ |
34 | 51 | ||
35 | extern void _clear_page(void *page); | 52 | extern void _clear_page(void *page); |
@@ -90,23 +107,6 @@ typedef unsigned long pgprot_t; | |||
90 | 107 | ||
91 | #endif /* (STRICT_MM_TYPECHECKS) */ | 108 | #endif /* (STRICT_MM_TYPECHECKS) */ |
92 | 109 | ||
93 | #if defined(CONFIG_HUGETLB_PAGE_SIZE_4MB) | ||
94 | #define HPAGE_SHIFT 22 | ||
95 | #elif defined(CONFIG_HUGETLB_PAGE_SIZE_512K) | ||
96 | #define HPAGE_SHIFT 19 | ||
97 | #elif defined(CONFIG_HUGETLB_PAGE_SIZE_64K) | ||
98 | #define HPAGE_SHIFT 16 | ||
99 | #endif | ||
100 | |||
101 | #ifdef CONFIG_HUGETLB_PAGE | ||
102 | #define HPAGE_SIZE (_AC(1,UL) << HPAGE_SHIFT) | ||
103 | #define HPAGE_MASK (~(HPAGE_SIZE - 1UL)) | ||
104 | #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) | ||
105 | #define ARCH_HAS_SETCLEAR_HUGE_PTE | ||
106 | #define ARCH_HAS_HUGETLB_PREFAULT_HOOK | ||
107 | #define HAVE_ARCH_HUGETLB_UNMAPPED_AREA | ||
108 | #endif | ||
109 | |||
110 | #define TASK_UNMAPPED_BASE (test_thread_flag(TIF_32BIT) ? \ | 110 | #define TASK_UNMAPPED_BASE (test_thread_flag(TIF_32BIT) ? \ |
111 | (_AC(0x0000000070000000,UL)) : \ | 111 | (_AC(0x0000000070000000,UL)) : \ |
112 | (_AC(0xfffff80000000000,UL) + (1UL << 32UL))) | 112 | (_AC(0xfffff80000000000,UL) + (1UL << 32UL))) |
diff --git a/include/asm-sparc64/pgtable.h b/include/asm-sparc64/pgtable.h index ed4124edf837..c44e7466534e 100644 --- a/include/asm-sparc64/pgtable.h +++ b/include/asm-sparc64/pgtable.h | |||
@@ -105,6 +105,7 @@ | |||
105 | #define _PAGE_RES1_4U _AC(0x0002000000000000,UL) /* Reserved */ | 105 | #define _PAGE_RES1_4U _AC(0x0002000000000000,UL) /* Reserved */ |
106 | #define _PAGE_SZ32MB_4U _AC(0x0001000000000000,UL) /* (Panther) 32MB page */ | 106 | #define _PAGE_SZ32MB_4U _AC(0x0001000000000000,UL) /* (Panther) 32MB page */ |
107 | #define _PAGE_SZ256MB_4U _AC(0x2001000000000000,UL) /* (Panther) 256MB page */ | 107 | #define _PAGE_SZ256MB_4U _AC(0x2001000000000000,UL) /* (Panther) 256MB page */ |
108 | #define _PAGE_SZALL_4U _AC(0x6001000000000000,UL) /* All pgsz bits */ | ||
108 | #define _PAGE_SN_4U _AC(0x0000800000000000,UL) /* (Cheetah) Snoop */ | 109 | #define _PAGE_SN_4U _AC(0x0000800000000000,UL) /* (Cheetah) Snoop */ |
109 | #define _PAGE_RES2_4U _AC(0x0000780000000000,UL) /* Reserved */ | 110 | #define _PAGE_RES2_4U _AC(0x0000780000000000,UL) /* Reserved */ |
110 | #define _PAGE_PADDR_4U _AC(0x000007FFFFFFE000,UL) /* (Cheetah) pa[42:13] */ | 111 | #define _PAGE_PADDR_4U _AC(0x000007FFFFFFE000,UL) /* (Cheetah) pa[42:13] */ |
@@ -150,6 +151,7 @@ | |||
150 | #define _PAGE_SZ512K_4V _AC(0x0000000000000002,UL) /* 512K Page */ | 151 | #define _PAGE_SZ512K_4V _AC(0x0000000000000002,UL) /* 512K Page */ |
151 | #define _PAGE_SZ64K_4V _AC(0x0000000000000001,UL) /* 64K Page */ | 152 | #define _PAGE_SZ64K_4V _AC(0x0000000000000001,UL) /* 64K Page */ |
152 | #define _PAGE_SZ8K_4V _AC(0x0000000000000000,UL) /* 8K Page */ | 153 | #define _PAGE_SZ8K_4V _AC(0x0000000000000000,UL) /* 8K Page */ |
154 | #define _PAGE_SZALL_4V _AC(0x0000000000000007,UL) /* All pgsz bits */ | ||
153 | 155 | ||
154 | #if PAGE_SHIFT == 13 | 156 | #if PAGE_SHIFT == 13 |
155 | #define _PAGE_SZBITS_4U _PAGE_SZ8K_4U | 157 | #define _PAGE_SZBITS_4U _PAGE_SZ8K_4U |