diff options
Diffstat (limited to 'include/asm-sparc64')
| -rw-r--r-- | include/asm-sparc64/atomic.h | 10 | ||||
| -rw-r--r-- | include/asm-sparc64/cache.h | 2 | ||||
| -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/percpu.h | 7 | ||||
| -rw-r--r-- | include/asm-sparc64/pgtable.h | 2 |
8 files changed, 74 insertions, 36 deletions
diff --git a/include/asm-sparc64/atomic.h b/include/asm-sparc64/atomic.h index 25256bdc8aae..468eb48d8142 100644 --- a/include/asm-sparc64/atomic.h +++ b/include/asm-sparc64/atomic.h | |||
| @@ -78,9 +78,15 @@ extern int atomic64_sub_ret(int, atomic64_t *); | |||
| 78 | ({ \ | 78 | ({ \ |
| 79 | int c, old; \ | 79 | int c, old; \ |
| 80 | c = atomic_read(v); \ | 80 | c = atomic_read(v); \ |
| 81 | while (c != (u) && (old = atomic_cmpxchg((v), c, c + (a))) != c) \ | 81 | for (;;) { \ |
| 82 | if (unlikely(c == (u))) \ | ||
| 83 | break; \ | ||
| 84 | old = atomic_cmpxchg((v), c, c + (a)); \ | ||
| 85 | if (likely(old == c)) \ | ||
| 86 | break; \ | ||
| 82 | c = old; \ | 87 | c = old; \ |
| 83 | c != (u); \ | 88 | } \ |
| 89 | likely(c != (u)); \ | ||
| 84 | }) | 90 | }) |
| 85 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) | 91 | #define atomic_inc_not_zero(v) atomic_add_unless((v), 1, 0) |
| 86 | 92 | ||
diff --git a/include/asm-sparc64/cache.h b/include/asm-sparc64/cache.h index f7d35a2ae9b8..e9df17acedde 100644 --- a/include/asm-sparc64/cache.h +++ b/include/asm-sparc64/cache.h | |||
| @@ -13,4 +13,6 @@ | |||
| 13 | #define SMP_CACHE_BYTES_SHIFT 6 | 13 | #define SMP_CACHE_BYTES_SHIFT 6 |
| 14 | #define SMP_CACHE_BYTES (1 << SMP_CACHE_BYTES_SHIFT) /* L2 cache line size. */ | 14 | #define SMP_CACHE_BYTES (1 << SMP_CACHE_BYTES_SHIFT) /* L2 cache line size. */ |
| 15 | 15 | ||
| 16 | #define __read_mostly __attribute__((__section__(".data.read_mostly"))) | ||
| 17 | |||
| 16 | #endif | 18 | #endif |
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/percpu.h b/include/asm-sparc64/percpu.h index aea4e51e7cd1..82032e159a76 100644 --- a/include/asm-sparc64/percpu.h +++ b/include/asm-sparc64/percpu.h | |||
| @@ -26,10 +26,9 @@ register unsigned long __local_per_cpu_offset asm("g5"); | |||
| 26 | #define percpu_modcopy(pcpudst, src, size) \ | 26 | #define percpu_modcopy(pcpudst, src, size) \ |
| 27 | do { \ | 27 | do { \ |
| 28 | unsigned int __i; \ | 28 | unsigned int __i; \ |
| 29 | for (__i = 0; __i < NR_CPUS; __i++) \ | 29 | for_each_cpu(__i) \ |
| 30 | if (cpu_possible(__i)) \ | 30 | memcpy((pcpudst)+__per_cpu_offset(__i), \ |
| 31 | memcpy((pcpudst)+__per_cpu_offset(__i), \ | 31 | (src), (size)); \ |
| 32 | (src), (size)); \ | ||
| 33 | } while (0) | 32 | } while (0) |
| 34 | #else /* ! SMP */ | 33 | #else /* ! SMP */ |
| 35 | 34 | ||
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 |
