diff options
| -rw-r--r-- | arch/tile/include/arch/interrupts_32.h | 9 | ||||
| -rw-r--r-- | arch/tile/include/asm/irqflags.h | 18 | ||||
| -rw-r--r-- | arch/tile/kernel/head_32.S | 11 |
3 files changed, 29 insertions, 9 deletions
diff --git a/arch/tile/include/arch/interrupts_32.h b/arch/tile/include/arch/interrupts_32.h index 9d0bfa7e59be..96b5710505b6 100644 --- a/arch/tile/include/arch/interrupts_32.h +++ b/arch/tile/include/arch/interrupts_32.h | |||
| @@ -16,10 +16,11 @@ | |||
| 16 | #define __ARCH_INTERRUPTS_H__ | 16 | #define __ARCH_INTERRUPTS_H__ |
| 17 | 17 | ||
| 18 | /** Mask for an interrupt. */ | 18 | /** Mask for an interrupt. */ |
| 19 | #ifdef __ASSEMBLER__ | ||
| 20 | /* Note: must handle breaking interrupts into high and low words manually. */ | 19 | /* Note: must handle breaking interrupts into high and low words manually. */ |
| 21 | #define INT_MASK(intno) (1 << (intno)) | 20 | #define INT_MASK_LO(intno) (1 << (intno)) |
| 22 | #else | 21 | #define INT_MASK_HI(intno) (1 << ((intno) - 32)) |
| 22 | |||
| 23 | #ifndef __ASSEMBLER__ | ||
| 23 | #define INT_MASK(intno) (1ULL << (intno)) | 24 | #define INT_MASK(intno) (1ULL << (intno)) |
| 24 | #endif | 25 | #endif |
| 25 | 26 | ||
| @@ -89,6 +90,7 @@ | |||
| 89 | 90 | ||
| 90 | #define NUM_INTERRUPTS 49 | 91 | #define NUM_INTERRUPTS 49 |
| 91 | 92 | ||
| 93 | #ifndef __ASSEMBLER__ | ||
| 92 | #define QUEUED_INTERRUPTS ( \ | 94 | #define QUEUED_INTERRUPTS ( \ |
| 93 | INT_MASK(INT_MEM_ERROR) | \ | 95 | INT_MASK(INT_MEM_ERROR) | \ |
| 94 | INT_MASK(INT_DMATLB_MISS) | \ | 96 | INT_MASK(INT_DMATLB_MISS) | \ |
| @@ -301,4 +303,5 @@ | |||
| 301 | INT_MASK(INT_DOUBLE_FAULT) | \ | 303 | INT_MASK(INT_DOUBLE_FAULT) | \ |
| 302 | INT_MASK(INT_AUX_PERF_COUNT) | \ | 304 | INT_MASK(INT_AUX_PERF_COUNT) | \ |
| 303 | 0) | 305 | 0) |
| 306 | #endif /* !__ASSEMBLER__ */ | ||
| 304 | #endif /* !__ARCH_INTERRUPTS_H__ */ | 307 | #endif /* !__ARCH_INTERRUPTS_H__ */ |
diff --git a/arch/tile/include/asm/irqflags.h b/arch/tile/include/asm/irqflags.h index 641e4ff3d805..5db0ce54284d 100644 --- a/arch/tile/include/asm/irqflags.h +++ b/arch/tile/include/asm/irqflags.h | |||
| @@ -18,6 +18,8 @@ | |||
| 18 | #include <arch/interrupts.h> | 18 | #include <arch/interrupts.h> |
| 19 | #include <arch/chip.h> | 19 | #include <arch/chip.h> |
| 20 | 20 | ||
| 21 | #if !defined(__tilegx__) && defined(__ASSEMBLY__) | ||
| 22 | |||
| 21 | /* | 23 | /* |
| 22 | * The set of interrupts we want to allow when interrupts are nominally | 24 | * The set of interrupts we want to allow when interrupts are nominally |
| 23 | * disabled. The remainder are effectively "NMI" interrupts from | 25 | * disabled. The remainder are effectively "NMI" interrupts from |
| @@ -25,6 +27,16 @@ | |||
| 25 | * interrupts (aka "non-queued") are not blocked by the mask in any case. | 27 | * interrupts (aka "non-queued") are not blocked by the mask in any case. |
| 26 | */ | 28 | */ |
| 27 | #if CHIP_HAS_AUX_PERF_COUNTERS() | 29 | #if CHIP_HAS_AUX_PERF_COUNTERS() |
| 30 | #define LINUX_MASKABLE_INTERRUPTS_HI \ | ||
| 31 | (~(INT_MASK_HI(INT_PERF_COUNT) | INT_MASK_HI(INT_AUX_PERF_COUNT))) | ||
| 32 | #else | ||
| 33 | #define LINUX_MASKABLE_INTERRUPTS_HI \ | ||
| 34 | (~(INT_MASK_HI(INT_PERF_COUNT))) | ||
| 35 | #endif | ||
| 36 | |||
| 37 | #else | ||
| 38 | |||
| 39 | #if CHIP_HAS_AUX_PERF_COUNTERS() | ||
| 28 | #define LINUX_MASKABLE_INTERRUPTS \ | 40 | #define LINUX_MASKABLE_INTERRUPTS \ |
| 29 | (~(INT_MASK(INT_PERF_COUNT) | INT_MASK(INT_AUX_PERF_COUNT))) | 41 | (~(INT_MASK(INT_PERF_COUNT) | INT_MASK(INT_AUX_PERF_COUNT))) |
| 30 | #else | 42 | #else |
| @@ -32,6 +44,8 @@ | |||
| 32 | (~(INT_MASK(INT_PERF_COUNT))) | 44 | (~(INT_MASK(INT_PERF_COUNT))) |
| 33 | #endif | 45 | #endif |
| 34 | 46 | ||
| 47 | #endif | ||
| 48 | |||
| 35 | #ifndef __ASSEMBLY__ | 49 | #ifndef __ASSEMBLY__ |
| 36 | 50 | ||
| 37 | /* NOTE: we can't include <linux/percpu.h> due to #include dependencies. */ | 51 | /* NOTE: we can't include <linux/percpu.h> due to #include dependencies. */ |
| @@ -224,11 +238,11 @@ DECLARE_PER_CPU(unsigned long long, interrupts_enabled_mask); | |||
| 224 | #define IRQ_DISABLE(tmp0, tmp1) \ | 238 | #define IRQ_DISABLE(tmp0, tmp1) \ |
| 225 | { \ | 239 | { \ |
| 226 | movei tmp0, -1; \ | 240 | movei tmp0, -1; \ |
| 227 | moveli tmp1, lo16(LINUX_MASKABLE_INTERRUPTS) \ | 241 | moveli tmp1, lo16(LINUX_MASKABLE_INTERRUPTS_HI) \ |
| 228 | }; \ | 242 | }; \ |
| 229 | { \ | 243 | { \ |
| 230 | mtspr SPR_INTERRUPT_MASK_SET_K_0, tmp0; \ | 244 | mtspr SPR_INTERRUPT_MASK_SET_K_0, tmp0; \ |
| 231 | auli tmp1, tmp1, ha16(LINUX_MASKABLE_INTERRUPTS) \ | 245 | auli tmp1, tmp1, ha16(LINUX_MASKABLE_INTERRUPTS_HI) \ |
| 232 | }; \ | 246 | }; \ |
| 233 | mtspr SPR_INTERRUPT_MASK_SET_K_1, tmp1 | 247 | mtspr SPR_INTERRUPT_MASK_SET_K_1, tmp1 |
| 234 | 248 | ||
diff --git a/arch/tile/kernel/head_32.S b/arch/tile/kernel/head_32.S index 05b5f4d54d91..1a39b7c1c87e 100644 --- a/arch/tile/kernel/head_32.S +++ b/arch/tile/kernel/head_32.S | |||
| @@ -145,7 +145,7 @@ ENTRY(empty_zero_page) | |||
| 145 | .endif | 145 | .endif |
| 146 | .word HV_PTE_PAGE | HV_PTE_DIRTY | HV_PTE_PRESENT | HV_PTE_ACCESSED | \ | 146 | .word HV_PTE_PAGE | HV_PTE_DIRTY | HV_PTE_PRESENT | HV_PTE_ACCESSED | \ |
| 147 | (HV_PTE_MODE_CACHE_NO_L3 << HV_PTE_INDEX_MODE) | 147 | (HV_PTE_MODE_CACHE_NO_L3 << HV_PTE_INDEX_MODE) |
| 148 | .word (\bits1) | (HV_CPA_TO_PFN(\cpa) << HV_PTE_INDEX_PFN) | 148 | .word (\bits1) | (HV_CPA_TO_PFN(\cpa) << (HV_PTE_INDEX_PFN - 32)) |
| 149 | .endm | 149 | .endm |
| 150 | 150 | ||
| 151 | __PAGE_ALIGNED_DATA | 151 | __PAGE_ALIGNED_DATA |
| @@ -158,12 +158,14 @@ ENTRY(swapper_pg_dir) | |||
| 158 | */ | 158 | */ |
| 159 | .set addr, 0 | 159 | .set addr, 0 |
| 160 | .rept (MEM_USER_INTRPT - PAGE_OFFSET) >> PGDIR_SHIFT | 160 | .rept (MEM_USER_INTRPT - PAGE_OFFSET) >> PGDIR_SHIFT |
| 161 | PTE addr + PAGE_OFFSET, addr, HV_PTE_READABLE | HV_PTE_WRITABLE | 161 | PTE addr + PAGE_OFFSET, addr, (1 << (HV_PTE_INDEX_READABLE - 32)) | \ |
| 162 | (1 << (HV_PTE_INDEX_WRITABLE - 32)) | ||
| 162 | .set addr, addr + PGDIR_SIZE | 163 | .set addr, addr + PGDIR_SIZE |
| 163 | .endr | 164 | .endr |
| 164 | 165 | ||
| 165 | /* The true text VAs are mapped as VA = PA + MEM_SV_INTRPT */ | 166 | /* The true text VAs are mapped as VA = PA + MEM_SV_INTRPT */ |
| 166 | PTE MEM_SV_INTRPT, 0, HV_PTE_READABLE | HV_PTE_EXECUTABLE | 167 | PTE MEM_SV_INTRPT, 0, (1 << (HV_PTE_INDEX_READABLE - 32)) | \ |
| 168 | (1 << (HV_PTE_INDEX_EXECUTABLE - 32)) | ||
| 167 | .org swapper_pg_dir + HV_L1_SIZE | 169 | .org swapper_pg_dir + HV_L1_SIZE |
| 168 | END(swapper_pg_dir) | 170 | END(swapper_pg_dir) |
| 169 | 171 | ||
| @@ -176,6 +178,7 @@ ENTRY(swapper_pg_dir) | |||
| 176 | __INITDATA | 178 | __INITDATA |
| 177 | .align CHIP_L2_LINE_SIZE() | 179 | .align CHIP_L2_LINE_SIZE() |
| 178 | ENTRY(swapper_pgprot) | 180 | ENTRY(swapper_pgprot) |
| 179 | PTE 0, 0, HV_PTE_READABLE | HV_PTE_WRITABLE, 1 | 181 | PTE 0, 0, (1 << (HV_PTE_INDEX_READABLE - 32)) | \ |
| 182 | (1 << (HV_PTE_INDEX_WRITABLE - 32)), 1 | ||
| 180 | .align CHIP_L2_LINE_SIZE() | 183 | .align CHIP_L2_LINE_SIZE() |
| 181 | END(swapper_pgprot) | 184 | END(swapper_pgprot) |
