diff options
| -rw-r--r-- | arch/arm64/crypto/Makefile | 2 | ||||
| -rw-r--r-- | arch/arm64/include/asm/assembler.h | 5 | ||||
| -rw-r--r-- | arch/arm64/include/asm/cpuidle.h | 2 | ||||
| -rw-r--r-- | arch/arm64/include/asm/insn.h | 6 | ||||
| -rw-r--r-- | arch/arm64/include/asm/pgtable.h | 2 | ||||
| -rw-r--r-- | arch/arm64/include/asm/processor.h | 3 | ||||
| -rw-r--r-- | arch/arm64/include/asm/tlbflush.h | 5 | ||||
| -rw-r--r-- | arch/arm64/kernel/Makefile | 5 | ||||
| -rw-r--r-- | arch/arm64/kernel/ftrace.c | 2 | ||||
| -rw-r--r-- | arch/arm64/kernel/insn.c | 4 | ||||
| -rw-r--r-- | arch/arm64/kernel/psci-call.S | 28 | ||||
| -rw-r--r-- | arch/arm64/kernel/psci.c | 37 | ||||
| -rw-r--r-- | arch/arm64/kernel/signal32.c | 5 | ||||
| -rw-r--r-- | arch/arm64/kernel/vdso/gettimeofday.S | 3 | ||||
| -rw-r--r-- | arch/arm64/mm/dma-mapping.c | 16 | ||||
| -rw-r--r-- | arch/arm64/mm/init.c | 14 |
16 files changed, 68 insertions, 71 deletions
diff --git a/arch/arm64/crypto/Makefile b/arch/arm64/crypto/Makefile index 5720608c50b1..abb79b3cfcfe 100644 --- a/arch/arm64/crypto/Makefile +++ b/arch/arm64/crypto/Makefile | |||
| @@ -29,7 +29,7 @@ aes-ce-blk-y := aes-glue-ce.o aes-ce.o | |||
| 29 | obj-$(CONFIG_CRYPTO_AES_ARM64_NEON_BLK) += aes-neon-blk.o | 29 | obj-$(CONFIG_CRYPTO_AES_ARM64_NEON_BLK) += aes-neon-blk.o |
| 30 | aes-neon-blk-y := aes-glue-neon.o aes-neon.o | 30 | aes-neon-blk-y := aes-glue-neon.o aes-neon.o |
| 31 | 31 | ||
| 32 | AFLAGS_aes-ce.o := -DINTERLEAVE=2 -DINTERLEAVE_INLINE | 32 | AFLAGS_aes-ce.o := -DINTERLEAVE=4 |
| 33 | AFLAGS_aes-neon.o := -DINTERLEAVE=4 | 33 | AFLAGS_aes-neon.o := -DINTERLEAVE=4 |
| 34 | 34 | ||
| 35 | CFLAGS_aes-glue-ce.o := -DUSE_V8_CRYPTO_EXTENSIONS | 35 | CFLAGS_aes-glue-ce.o := -DUSE_V8_CRYPTO_EXTENSIONS |
diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h index 5901480bfdca..750bac4e637e 100644 --- a/arch/arm64/include/asm/assembler.h +++ b/arch/arm64/include/asm/assembler.h | |||
| @@ -20,6 +20,9 @@ | |||
| 20 | #error "Only include this from assembly code" | 20 | #error "Only include this from assembly code" |
| 21 | #endif | 21 | #endif |
| 22 | 22 | ||
| 23 | #ifndef __ASM_ASSEMBLER_H | ||
| 24 | #define __ASM_ASSEMBLER_H | ||
| 25 | |||
| 23 | #include <asm/ptrace.h> | 26 | #include <asm/ptrace.h> |
| 24 | #include <asm/thread_info.h> | 27 | #include <asm/thread_info.h> |
| 25 | 28 | ||
| @@ -155,3 +158,5 @@ lr .req x30 // link register | |||
| 155 | #endif | 158 | #endif |
| 156 | orr \rd, \lbits, \hbits, lsl #32 | 159 | orr \rd, \lbits, \hbits, lsl #32 |
| 157 | .endm | 160 | .endm |
| 161 | |||
| 162 | #endif /* __ASM_ASSEMBLER_H */ | ||
diff --git a/arch/arm64/include/asm/cpuidle.h b/arch/arm64/include/asm/cpuidle.h index 0710654631e7..c60643f14cda 100644 --- a/arch/arm64/include/asm/cpuidle.h +++ b/arch/arm64/include/asm/cpuidle.h | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | #ifndef __ASM_CPUIDLE_H | 1 | #ifndef __ASM_CPUIDLE_H |
| 2 | #define __ASM_CPUIDLE_H | 2 | #define __ASM_CPUIDLE_H |
| 3 | 3 | ||
| 4 | #include <asm/proc-fns.h> | ||
| 5 | |||
| 4 | #ifdef CONFIG_CPU_IDLE | 6 | #ifdef CONFIG_CPU_IDLE |
| 5 | extern int cpu_init_idle(unsigned int cpu); | 7 | extern int cpu_init_idle(unsigned int cpu); |
| 6 | extern int cpu_suspend(unsigned long arg); | 8 | extern int cpu_suspend(unsigned long arg); |
diff --git a/arch/arm64/include/asm/insn.h b/arch/arm64/include/asm/insn.h index e2ff32a93b5c..d2f49423c5dc 100644 --- a/arch/arm64/include/asm/insn.h +++ b/arch/arm64/include/asm/insn.h | |||
| @@ -264,8 +264,10 @@ __AARCH64_INSN_FUNCS(ands, 0x7F200000, 0x6A000000) | |||
| 264 | __AARCH64_INSN_FUNCS(bics, 0x7F200000, 0x6A200000) | 264 | __AARCH64_INSN_FUNCS(bics, 0x7F200000, 0x6A200000) |
| 265 | __AARCH64_INSN_FUNCS(b, 0xFC000000, 0x14000000) | 265 | __AARCH64_INSN_FUNCS(b, 0xFC000000, 0x14000000) |
| 266 | __AARCH64_INSN_FUNCS(bl, 0xFC000000, 0x94000000) | 266 | __AARCH64_INSN_FUNCS(bl, 0xFC000000, 0x94000000) |
| 267 | __AARCH64_INSN_FUNCS(cbz, 0xFE000000, 0x34000000) | 267 | __AARCH64_INSN_FUNCS(cbz, 0x7F000000, 0x34000000) |
| 268 | __AARCH64_INSN_FUNCS(cbnz, 0xFE000000, 0x35000000) | 268 | __AARCH64_INSN_FUNCS(cbnz, 0x7F000000, 0x35000000) |
| 269 | __AARCH64_INSN_FUNCS(tbz, 0x7F000000, 0x36000000) | ||
| 270 | __AARCH64_INSN_FUNCS(tbnz, 0x7F000000, 0x37000000) | ||
| 269 | __AARCH64_INSN_FUNCS(bcond, 0xFF000010, 0x54000000) | 271 | __AARCH64_INSN_FUNCS(bcond, 0xFF000010, 0x54000000) |
| 270 | __AARCH64_INSN_FUNCS(svc, 0xFFE0001F, 0xD4000001) | 272 | __AARCH64_INSN_FUNCS(svc, 0xFFE0001F, 0xD4000001) |
| 271 | __AARCH64_INSN_FUNCS(hvc, 0xFFE0001F, 0xD4000002) | 273 | __AARCH64_INSN_FUNCS(hvc, 0xFFE0001F, 0xD4000002) |
diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index 16449c535e50..800ec0e87ed9 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h | |||
| @@ -460,7 +460,7 @@ static inline pud_t *pud_offset(pgd_t *pgd, unsigned long addr) | |||
| 460 | static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) | 460 | static inline pte_t pte_modify(pte_t pte, pgprot_t newprot) |
| 461 | { | 461 | { |
| 462 | const pteval_t mask = PTE_USER | PTE_PXN | PTE_UXN | PTE_RDONLY | | 462 | const pteval_t mask = PTE_USER | PTE_PXN | PTE_UXN | PTE_RDONLY | |
| 463 | PTE_PROT_NONE | PTE_VALID | PTE_WRITE; | 463 | PTE_PROT_NONE | PTE_WRITE | PTE_TYPE_MASK; |
| 464 | pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask); | 464 | pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask); |
| 465 | return pte; | 465 | return pte; |
| 466 | } | 466 | } |
diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h index f9be30ea1cbd..20e9591a60cf 100644 --- a/arch/arm64/include/asm/processor.h +++ b/arch/arm64/include/asm/processor.h | |||
| @@ -45,7 +45,8 @@ | |||
| 45 | #define STACK_TOP STACK_TOP_MAX | 45 | #define STACK_TOP STACK_TOP_MAX |
| 46 | #endif /* CONFIG_COMPAT */ | 46 | #endif /* CONFIG_COMPAT */ |
| 47 | 47 | ||
| 48 | #define ARCH_LOW_ADDRESS_LIMIT PHYS_MASK | 48 | extern phys_addr_t arm64_dma_phys_limit; |
| 49 | #define ARCH_LOW_ADDRESS_LIMIT (arm64_dma_phys_limit - 1) | ||
| 49 | #endif /* __KERNEL__ */ | 50 | #endif /* __KERNEL__ */ |
| 50 | 51 | ||
| 51 | struct debug_info { | 52 | struct debug_info { |
diff --git a/arch/arm64/include/asm/tlbflush.h b/arch/arm64/include/asm/tlbflush.h index 73f0ce570fb3..4abe9b945f77 100644 --- a/arch/arm64/include/asm/tlbflush.h +++ b/arch/arm64/include/asm/tlbflush.h | |||
| @@ -24,11 +24,6 @@ | |||
| 24 | #include <linux/sched.h> | 24 | #include <linux/sched.h> |
| 25 | #include <asm/cputype.h> | 25 | #include <asm/cputype.h> |
| 26 | 26 | ||
| 27 | extern void __cpu_flush_user_tlb_range(unsigned long, unsigned long, struct vm_area_struct *); | ||
| 28 | extern void __cpu_flush_kern_tlb_range(unsigned long, unsigned long); | ||
| 29 | |||
| 30 | extern struct cpu_tlb_fns cpu_tlb; | ||
| 31 | |||
| 32 | /* | 27 | /* |
| 33 | * TLB Management | 28 | * TLB Management |
| 34 | * ============== | 29 | * ============== |
diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index bef04afd6031..5ee07eee80c2 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile | |||
| @@ -15,8 +15,9 @@ CFLAGS_REMOVE_return_address.o = -pg | |||
| 15 | arm64-obj-y := cputable.o debug-monitors.o entry.o irq.o fpsimd.o \ | 15 | arm64-obj-y := cputable.o debug-monitors.o entry.o irq.o fpsimd.o \ |
| 16 | entry-fpsimd.o process.o ptrace.o setup.o signal.o \ | 16 | entry-fpsimd.o process.o ptrace.o setup.o signal.o \ |
| 17 | sys.o stacktrace.o time.o traps.o io.o vdso.o \ | 17 | sys.o stacktrace.o time.o traps.o io.o vdso.o \ |
| 18 | hyp-stub.o psci.o cpu_ops.o insn.o return_address.o \ | 18 | hyp-stub.o psci.o psci-call.o cpu_ops.o insn.o \ |
| 19 | cpuinfo.o cpu_errata.o alternative.o cacheinfo.o | 19 | return_address.o cpuinfo.o cpu_errata.o \ |
| 20 | alternative.o cacheinfo.o | ||
| 20 | 21 | ||
| 21 | arm64-obj-$(CONFIG_COMPAT) += sys32.o kuser32.o signal32.o \ | 22 | arm64-obj-$(CONFIG_COMPAT) += sys32.o kuser32.o signal32.o \ |
| 22 | sys_compat.o entry32.o \ | 23 | sys_compat.o entry32.o \ |
diff --git a/arch/arm64/kernel/ftrace.c b/arch/arm64/kernel/ftrace.c index cf8556ae09d0..c851be795080 100644 --- a/arch/arm64/kernel/ftrace.c +++ b/arch/arm64/kernel/ftrace.c | |||
| @@ -156,7 +156,7 @@ static int ftrace_modify_graph_caller(bool enable) | |||
| 156 | 156 | ||
| 157 | branch = aarch64_insn_gen_branch_imm(pc, | 157 | branch = aarch64_insn_gen_branch_imm(pc, |
| 158 | (unsigned long)ftrace_graph_caller, | 158 | (unsigned long)ftrace_graph_caller, |
| 159 | AARCH64_INSN_BRANCH_LINK); | 159 | AARCH64_INSN_BRANCH_NOLINK); |
| 160 | nop = aarch64_insn_gen_nop(); | 160 | nop = aarch64_insn_gen_nop(); |
| 161 | 161 | ||
| 162 | if (enable) | 162 | if (enable) |
diff --git a/arch/arm64/kernel/insn.c b/arch/arm64/kernel/insn.c index 27d4864577e5..c8eca88f12e6 100644 --- a/arch/arm64/kernel/insn.c +++ b/arch/arm64/kernel/insn.c | |||
| @@ -87,8 +87,10 @@ static void __kprobes *patch_map(void *addr, int fixmap) | |||
| 87 | 87 | ||
| 88 | if (module && IS_ENABLED(CONFIG_DEBUG_SET_MODULE_RONX)) | 88 | if (module && IS_ENABLED(CONFIG_DEBUG_SET_MODULE_RONX)) |
| 89 | page = vmalloc_to_page(addr); | 89 | page = vmalloc_to_page(addr); |
| 90 | else | 90 | else if (!module && IS_ENABLED(CONFIG_DEBUG_RODATA)) |
| 91 | page = virt_to_page(addr); | 91 | page = virt_to_page(addr); |
| 92 | else | ||
| 93 | return addr; | ||
| 92 | 94 | ||
| 93 | BUG_ON(!page); | 95 | BUG_ON(!page); |
| 94 | set_fixmap(fixmap, page_to_phys(page)); | 96 | set_fixmap(fixmap, page_to_phys(page)); |
diff --git a/arch/arm64/kernel/psci-call.S b/arch/arm64/kernel/psci-call.S new file mode 100644 index 000000000000..cf83e61cd3b5 --- /dev/null +++ b/arch/arm64/kernel/psci-call.S | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | /* | ||
| 2 | * This program is free software; you can redistribute it and/or modify | ||
| 3 | * it under the terms of the GNU General Public License version 2 as | ||
| 4 | * published by the Free Software Foundation. | ||
| 5 | * | ||
| 6 | * This program is distributed in the hope that it will be useful, | ||
| 7 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 8 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 9 | * GNU General Public License for more details. | ||
| 10 | * | ||
| 11 | * Copyright (C) 2015 ARM Limited | ||
| 12 | * | ||
| 13 | * Author: Will Deacon <will.deacon@arm.com> | ||
| 14 | */ | ||
| 15 | |||
| 16 | #include <linux/linkage.h> | ||
| 17 | |||
| 18 | /* int __invoke_psci_fn_hvc(u64 function_id, u64 arg0, u64 arg1, u64 arg2) */ | ||
| 19 | ENTRY(__invoke_psci_fn_hvc) | ||
| 20 | hvc #0 | ||
| 21 | ret | ||
| 22 | ENDPROC(__invoke_psci_fn_hvc) | ||
| 23 | |||
| 24 | /* int __invoke_psci_fn_smc(u64 function_id, u64 arg0, u64 arg1, u64 arg2) */ | ||
| 25 | ENTRY(__invoke_psci_fn_smc) | ||
| 26 | smc #0 | ||
| 27 | ret | ||
| 28 | ENDPROC(__invoke_psci_fn_smc) | ||
diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c index 3425f311c49e..9b8a70ae64a1 100644 --- a/arch/arm64/kernel/psci.c +++ b/arch/arm64/kernel/psci.c | |||
| @@ -57,6 +57,9 @@ static struct psci_operations psci_ops; | |||
| 57 | static int (*invoke_psci_fn)(u64, u64, u64, u64); | 57 | static int (*invoke_psci_fn)(u64, u64, u64, u64); |
| 58 | typedef int (*psci_initcall_t)(const struct device_node *); | 58 | typedef int (*psci_initcall_t)(const struct device_node *); |
| 59 | 59 | ||
| 60 | asmlinkage int __invoke_psci_fn_hvc(u64, u64, u64, u64); | ||
| 61 | asmlinkage int __invoke_psci_fn_smc(u64, u64, u64, u64); | ||
| 62 | |||
| 60 | enum psci_function { | 63 | enum psci_function { |
| 61 | PSCI_FN_CPU_SUSPEND, | 64 | PSCI_FN_CPU_SUSPEND, |
| 62 | PSCI_FN_CPU_ON, | 65 | PSCI_FN_CPU_ON, |
| @@ -109,40 +112,6 @@ static void psci_power_state_unpack(u32 power_state, | |||
| 109 | PSCI_0_2_POWER_STATE_AFFL_SHIFT; | 112 | PSCI_0_2_POWER_STATE_AFFL_SHIFT; |
| 110 | } | 113 | } |
| 111 | 114 | ||
| 112 | /* | ||
| 113 | * The following two functions are invoked via the invoke_psci_fn pointer | ||
| 114 | * and will not be inlined, allowing us to piggyback on the AAPCS. | ||
| 115 | */ | ||
| 116 | static noinline int __invoke_psci_fn_hvc(u64 function_id, u64 arg0, u64 arg1, | ||
| 117 | u64 arg2) | ||
| 118 | { | ||
| 119 | asm volatile( | ||
| 120 | __asmeq("%0", "x0") | ||
| 121 | __asmeq("%1", "x1") | ||
| 122 | __asmeq("%2", "x2") | ||
| 123 | __asmeq("%3", "x3") | ||
| 124 | "hvc #0\n" | ||
| 125 | : "+r" (function_id) | ||
| 126 | : "r" (arg0), "r" (arg1), "r" (arg2)); | ||
| 127 | |||
| 128 | return function_id; | ||
| 129 | } | ||
| 130 | |||
| 131 | static noinline int __invoke_psci_fn_smc(u64 function_id, u64 arg0, u64 arg1, | ||
| 132 | u64 arg2) | ||
| 133 | { | ||
| 134 | asm volatile( | ||
| 135 | __asmeq("%0", "x0") | ||
| 136 | __asmeq("%1", "x1") | ||
| 137 | __asmeq("%2", "x2") | ||
| 138 | __asmeq("%3", "x3") | ||
| 139 | "smc #0\n" | ||
| 140 | : "+r" (function_id) | ||
| 141 | : "r" (arg0), "r" (arg1), "r" (arg2)); | ||
| 142 | |||
| 143 | return function_id; | ||
| 144 | } | ||
| 145 | |||
| 146 | static int psci_get_version(void) | 115 | static int psci_get_version(void) |
| 147 | { | 116 | { |
| 148 | int err; | 117 | int err; |
diff --git a/arch/arm64/kernel/signal32.c b/arch/arm64/kernel/signal32.c index c20a300e2213..d26fcd4cd6e6 100644 --- a/arch/arm64/kernel/signal32.c +++ b/arch/arm64/kernel/signal32.c | |||
| @@ -154,8 +154,7 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from) | |||
| 154 | case __SI_TIMER: | 154 | case __SI_TIMER: |
| 155 | err |= __put_user(from->si_tid, &to->si_tid); | 155 | err |= __put_user(from->si_tid, &to->si_tid); |
| 156 | err |= __put_user(from->si_overrun, &to->si_overrun); | 156 | err |= __put_user(from->si_overrun, &to->si_overrun); |
| 157 | err |= __put_user((compat_uptr_t)(unsigned long)from->si_ptr, | 157 | err |= __put_user(from->si_int, &to->si_int); |
| 158 | &to->si_ptr); | ||
| 159 | break; | 158 | break; |
| 160 | case __SI_POLL: | 159 | case __SI_POLL: |
| 161 | err |= __put_user(from->si_band, &to->si_band); | 160 | err |= __put_user(from->si_band, &to->si_band); |
| @@ -184,7 +183,7 @@ int copy_siginfo_to_user32(compat_siginfo_t __user *to, const siginfo_t *from) | |||
| 184 | case __SI_MESGQ: /* But this is */ | 183 | case __SI_MESGQ: /* But this is */ |
| 185 | err |= __put_user(from->si_pid, &to->si_pid); | 184 | err |= __put_user(from->si_pid, &to->si_pid); |
| 186 | err |= __put_user(from->si_uid, &to->si_uid); | 185 | err |= __put_user(from->si_uid, &to->si_uid); |
| 187 | err |= __put_user((compat_uptr_t)(unsigned long)from->si_ptr, &to->si_ptr); | 186 | err |= __put_user(from->si_int, &to->si_int); |
| 188 | break; | 187 | break; |
| 189 | case __SI_SYS: | 188 | case __SI_SYS: |
| 190 | err |= __put_user((compat_uptr_t)(unsigned long) | 189 | err |= __put_user((compat_uptr_t)(unsigned long) |
diff --git a/arch/arm64/kernel/vdso/gettimeofday.S b/arch/arm64/kernel/vdso/gettimeofday.S index fe652ffd34c2..efa79e8d4196 100644 --- a/arch/arm64/kernel/vdso/gettimeofday.S +++ b/arch/arm64/kernel/vdso/gettimeofday.S | |||
| @@ -174,8 +174,6 @@ ENDPROC(__kernel_clock_gettime) | |||
| 174 | /* int __kernel_clock_getres(clockid_t clock_id, struct timespec *res); */ | 174 | /* int __kernel_clock_getres(clockid_t clock_id, struct timespec *res); */ |
| 175 | ENTRY(__kernel_clock_getres) | 175 | ENTRY(__kernel_clock_getres) |
| 176 | .cfi_startproc | 176 | .cfi_startproc |
| 177 | cbz w1, 3f | ||
| 178 | |||
| 179 | cmp w0, #CLOCK_REALTIME | 177 | cmp w0, #CLOCK_REALTIME |
| 180 | ccmp w0, #CLOCK_MONOTONIC, #0x4, ne | 178 | ccmp w0, #CLOCK_MONOTONIC, #0x4, ne |
| 181 | b.ne 1f | 179 | b.ne 1f |
| @@ -188,6 +186,7 @@ ENTRY(__kernel_clock_getres) | |||
| 188 | b.ne 4f | 186 | b.ne 4f |
| 189 | ldr x2, 6f | 187 | ldr x2, 6f |
| 190 | 2: | 188 | 2: |
| 189 | cbz w1, 3f | ||
| 191 | stp xzr, x2, [x1] | 190 | stp xzr, x2, [x1] |
| 192 | 191 | ||
| 193 | 3: /* res == NULL. */ | 192 | 3: /* res == NULL. */ |
diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c index 0a24b9b8c698..58e0c2bdde04 100644 --- a/arch/arm64/mm/dma-mapping.c +++ b/arch/arm64/mm/dma-mapping.c | |||
| @@ -348,8 +348,6 @@ static struct dma_map_ops swiotlb_dma_ops = { | |||
| 348 | .mapping_error = swiotlb_dma_mapping_error, | 348 | .mapping_error = swiotlb_dma_mapping_error, |
| 349 | }; | 349 | }; |
| 350 | 350 | ||
| 351 | extern int swiotlb_late_init_with_default_size(size_t default_size); | ||
| 352 | |||
| 353 | static int __init atomic_pool_init(void) | 351 | static int __init atomic_pool_init(void) |
| 354 | { | 352 | { |
| 355 | pgprot_t prot = __pgprot(PROT_NORMAL_NC); | 353 | pgprot_t prot = __pgprot(PROT_NORMAL_NC); |
| @@ -411,21 +409,13 @@ out: | |||
| 411 | return -ENOMEM; | 409 | return -ENOMEM; |
| 412 | } | 410 | } |
| 413 | 411 | ||
| 414 | static int __init swiotlb_late_init(void) | 412 | static int __init arm64_dma_init(void) |
| 415 | { | 413 | { |
| 416 | size_t swiotlb_size = min(SZ_64M, MAX_ORDER_NR_PAGES << PAGE_SHIFT); | 414 | int ret; |
| 417 | 415 | ||
| 418 | dma_ops = &swiotlb_dma_ops; | 416 | dma_ops = &swiotlb_dma_ops; |
| 419 | 417 | ||
| 420 | return swiotlb_late_init_with_default_size(swiotlb_size); | 418 | ret = atomic_pool_init(); |
| 421 | } | ||
| 422 | |||
| 423 | static int __init arm64_dma_init(void) | ||
| 424 | { | ||
| 425 | int ret = 0; | ||
| 426 | |||
| 427 | ret |= swiotlb_late_init(); | ||
| 428 | ret |= atomic_pool_init(); | ||
| 429 | 419 | ||
| 430 | return ret; | 420 | return ret; |
| 431 | } | 421 | } |
diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c index 71145f952070..ae85da6307bb 100644 --- a/arch/arm64/mm/init.c +++ b/arch/arm64/mm/init.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | #include <linux/dma-mapping.h> | 33 | #include <linux/dma-mapping.h> |
| 34 | #include <linux/dma-contiguous.h> | 34 | #include <linux/dma-contiguous.h> |
| 35 | #include <linux/efi.h> | 35 | #include <linux/efi.h> |
| 36 | #include <linux/swiotlb.h> | ||
| 36 | 37 | ||
| 37 | #include <asm/fixmap.h> | 38 | #include <asm/fixmap.h> |
| 38 | #include <asm/memory.h> | 39 | #include <asm/memory.h> |
| @@ -45,6 +46,7 @@ | |||
| 45 | #include "mm.h" | 46 | #include "mm.h" |
| 46 | 47 | ||
| 47 | phys_addr_t memstart_addr __read_mostly = 0; | 48 | phys_addr_t memstart_addr __read_mostly = 0; |
| 49 | phys_addr_t arm64_dma_phys_limit __read_mostly; | ||
| 48 | 50 | ||
| 49 | #ifdef CONFIG_BLK_DEV_INITRD | 51 | #ifdef CONFIG_BLK_DEV_INITRD |
| 50 | static int __init early_initrd(char *p) | 52 | static int __init early_initrd(char *p) |
| @@ -85,7 +87,7 @@ static void __init zone_sizes_init(unsigned long min, unsigned long max) | |||
| 85 | 87 | ||
| 86 | /* 4GB maximum for 32-bit only capable devices */ | 88 | /* 4GB maximum for 32-bit only capable devices */ |
| 87 | if (IS_ENABLED(CONFIG_ZONE_DMA)) { | 89 | if (IS_ENABLED(CONFIG_ZONE_DMA)) { |
| 88 | max_dma = PFN_DOWN(max_zone_dma_phys()); | 90 | max_dma = PFN_DOWN(arm64_dma_phys_limit); |
| 89 | zone_size[ZONE_DMA] = max_dma - min; | 91 | zone_size[ZONE_DMA] = max_dma - min; |
| 90 | } | 92 | } |
| 91 | zone_size[ZONE_NORMAL] = max - max_dma; | 93 | zone_size[ZONE_NORMAL] = max - max_dma; |
| @@ -156,8 +158,6 @@ early_param("mem", early_mem); | |||
| 156 | 158 | ||
| 157 | void __init arm64_memblock_init(void) | 159 | void __init arm64_memblock_init(void) |
| 158 | { | 160 | { |
| 159 | phys_addr_t dma_phys_limit = 0; | ||
| 160 | |||
| 161 | memblock_enforce_memory_limit(memory_limit); | 161 | memblock_enforce_memory_limit(memory_limit); |
| 162 | 162 | ||
| 163 | /* | 163 | /* |
| @@ -174,8 +174,10 @@ void __init arm64_memblock_init(void) | |||
| 174 | 174 | ||
| 175 | /* 4GB maximum for 32-bit only capable devices */ | 175 | /* 4GB maximum for 32-bit only capable devices */ |
| 176 | if (IS_ENABLED(CONFIG_ZONE_DMA)) | 176 | if (IS_ENABLED(CONFIG_ZONE_DMA)) |
| 177 | dma_phys_limit = max_zone_dma_phys(); | 177 | arm64_dma_phys_limit = max_zone_dma_phys(); |
| 178 | dma_contiguous_reserve(dma_phys_limit); | 178 | else |
| 179 | arm64_dma_phys_limit = PHYS_MASK + 1; | ||
| 180 | dma_contiguous_reserve(arm64_dma_phys_limit); | ||
| 179 | 181 | ||
| 180 | memblock_allow_resize(); | 182 | memblock_allow_resize(); |
| 181 | memblock_dump_all(); | 183 | memblock_dump_all(); |
| @@ -276,6 +278,8 @@ static void __init free_unused_memmap(void) | |||
| 276 | */ | 278 | */ |
| 277 | void __init mem_init(void) | 279 | void __init mem_init(void) |
| 278 | { | 280 | { |
| 281 | swiotlb_init(1); | ||
| 282 | |||
| 279 | set_max_mapnr(pfn_to_page(max_pfn) - mem_map); | 283 | set_max_mapnr(pfn_to_page(max_pfn) - mem_map); |
| 280 | 284 | ||
| 281 | #ifndef CONFIG_SPARSEMEM_VMEMMAP | 285 | #ifndef CONFIG_SPARSEMEM_VMEMMAP |
