aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/mips/Kconfig1
-rw-r--r--arch/mips/Kconfig.debug36
-rw-r--r--arch/mips/Makefile4
-rw-r--r--arch/mips/ath79/clock.c2
-rw-r--r--arch/mips/cavium-octeon/octeon-platform.c2
-rw-r--r--arch/mips/include/asm/asmmacro.h1
-rw-r--r--arch/mips/include/asm/mach-cavium-octeon/mangle-port.h4
-rw-r--r--arch/mips/include/asm/mach-paravirt/kernel-entry-init.h2
-rw-r--r--arch/mips/kernel/mips-r2-to-r6-emul.c2
-rw-r--r--arch/mips/kernel/process.c8
-rw-r--r--arch/mips/kernel/setup.c7
-rw-r--r--arch/mips/kernel/smp.c7
-rw-r--r--arch/mips/kernel/uprobes.c2
-rw-r--r--arch/mips/kernel/vdso.c8
-rw-r--r--arch/mips/math-emu/dsemul.c1
-rw-r--r--arch/mips/mm/c-r4k.c2
-rw-r--r--arch/mips/mm/init.c13
17 files changed, 37 insertions, 65 deletions
diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
index 26388562e300..212ff92920d2 100644
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -65,6 +65,7 @@ config MIPS
65 select ARCH_CLOCKSOURCE_DATA 65 select ARCH_CLOCKSOURCE_DATA
66 select HANDLE_DOMAIN_IRQ 66 select HANDLE_DOMAIN_IRQ
67 select HAVE_EXIT_THREAD 67 select HAVE_EXIT_THREAD
68 select HAVE_REGS_AND_STACK_ACCESS_API
68 69
69menu "Machine selection" 70menu "Machine selection"
70 71
diff --git a/arch/mips/Kconfig.debug b/arch/mips/Kconfig.debug
index f0e314ceb8ba..7f975b20b20c 100644
--- a/arch/mips/Kconfig.debug
+++ b/arch/mips/Kconfig.debug
@@ -113,42 +113,6 @@ config SPINLOCK_TEST
113 help 113 help
114 Add several files to the debugfs to test spinlock speed. 114 Add several files to the debugfs to test spinlock speed.
115 115
116if CPU_MIPSR6
117
118choice
119 prompt "Compact branch policy"
120 default MIPS_COMPACT_BRANCHES_OPTIMAL
121
122config MIPS_COMPACT_BRANCHES_NEVER
123 bool "Never (force delay slot branches)"
124 help
125 Pass the -mcompact-branches=never flag to the compiler in order to
126 force it to always emit branches with delay slots, and make no use
127 of the compact branch instructions introduced by MIPSr6. This is
128 useful if you suspect there may be an issue with compact branches in
129 either the compiler or the CPU.
130
131config MIPS_COMPACT_BRANCHES_OPTIMAL
132 bool "Optimal (use where beneficial)"
133 help
134 Pass the -mcompact-branches=optimal flag to the compiler in order for
135 it to make use of compact branch instructions where it deems them
136 beneficial, and use branches with delay slots elsewhere. This is the
137 default compiler behaviour, and should be used unless you have a
138 reason to choose otherwise.
139
140config MIPS_COMPACT_BRANCHES_ALWAYS
141 bool "Always (force compact branches)"
142 help
143 Pass the -mcompact-branches=always flag to the compiler in order to
144 force it to always emit compact branches, making no use of branch
145 instructions with delay slots. This can result in more compact code
146 which may be beneficial in some scenarios.
147
148endchoice
149
150endif # CPU_MIPSR6
151
152config SCACHE_DEBUGFS 116config SCACHE_DEBUGFS
153 bool "L2 cache debugfs entries" 117 bool "L2 cache debugfs entries"
154 depends on DEBUG_FS 118 depends on DEBUG_FS
diff --git a/arch/mips/Makefile b/arch/mips/Makefile
index efd7a9dc93c4..598ab2930fce 100644
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
@@ -203,10 +203,6 @@ endif
203toolchain-virt := $(call cc-option-yn,$(mips-cflags) -mvirt) 203toolchain-virt := $(call cc-option-yn,$(mips-cflags) -mvirt)
204cflags-$(toolchain-virt) += -DTOOLCHAIN_SUPPORTS_VIRT 204cflags-$(toolchain-virt) += -DTOOLCHAIN_SUPPORTS_VIRT
205 205
206cflags-$(CONFIG_MIPS_COMPACT_BRANCHES_NEVER) += -mcompact-branches=never
207cflags-$(CONFIG_MIPS_COMPACT_BRANCHES_OPTIMAL) += -mcompact-branches=optimal
208cflags-$(CONFIG_MIPS_COMPACT_BRANCHES_ALWAYS) += -mcompact-branches=always
209
210# 206#
211# Firmware support 207# Firmware support
212# 208#
diff --git a/arch/mips/ath79/clock.c b/arch/mips/ath79/clock.c
index 2e7378467c5c..cc3a1e33a600 100644
--- a/arch/mips/ath79/clock.c
+++ b/arch/mips/ath79/clock.c
@@ -96,7 +96,7 @@ static struct clk * __init ath79_reg_ffclk(const char *name,
96 struct clk *clk; 96 struct clk *clk;
97 97
98 clk = clk_register_fixed_factor(NULL, name, parent_name, 0, mult, div); 98 clk = clk_register_fixed_factor(NULL, name, parent_name, 0, mult, div);
99 if (!clk) 99 if (IS_ERR(clk))
100 panic("failed to allocate %s clock structure", name); 100 panic("failed to allocate %s clock structure", name);
101 101
102 return clk; 102 return clk;
diff --git a/arch/mips/cavium-octeon/octeon-platform.c b/arch/mips/cavium-octeon/octeon-platform.c
index b31fbc9d6eae..37a932d9148c 100644
--- a/arch/mips/cavium-octeon/octeon-platform.c
+++ b/arch/mips/cavium-octeon/octeon-platform.c
@@ -1059,7 +1059,7 @@ static int __init octeon_publish_devices(void)
1059{ 1059{
1060 return of_platform_bus_probe(NULL, octeon_ids, NULL); 1060 return of_platform_bus_probe(NULL, octeon_ids, NULL);
1061} 1061}
1062device_initcall(octeon_publish_devices); 1062arch_initcall(octeon_publish_devices);
1063 1063
1064MODULE_AUTHOR("David Daney <ddaney@caviumnetworks.com>"); 1064MODULE_AUTHOR("David Daney <ddaney@caviumnetworks.com>");
1065MODULE_LICENSE("GPL"); 1065MODULE_LICENSE("GPL");
diff --git a/arch/mips/include/asm/asmmacro.h b/arch/mips/include/asm/asmmacro.h
index 56584a659183..83054f79f72a 100644
--- a/arch/mips/include/asm/asmmacro.h
+++ b/arch/mips/include/asm/asmmacro.h
@@ -157,6 +157,7 @@
157 ldc1 $f28, THREAD_FPR28(\thread) 157 ldc1 $f28, THREAD_FPR28(\thread)
158 ldc1 $f30, THREAD_FPR30(\thread) 158 ldc1 $f30, THREAD_FPR30(\thread)
159 ctc1 \tmp, fcr31 159 ctc1 \tmp, fcr31
160 .set pop
160 .endm 161 .endm
161 162
162 .macro fpu_restore_16odd thread 163 .macro fpu_restore_16odd thread
diff --git a/arch/mips/include/asm/mach-cavium-octeon/mangle-port.h b/arch/mips/include/asm/mach-cavium-octeon/mangle-port.h
index 0cf5ac1f7245..8ff2cbdf2c3e 100644
--- a/arch/mips/include/asm/mach-cavium-octeon/mangle-port.h
+++ b/arch/mips/include/asm/mach-cavium-octeon/mangle-port.h
@@ -15,8 +15,8 @@
15static inline bool __should_swizzle_bits(volatile void *a) 15static inline bool __should_swizzle_bits(volatile void *a)
16{ 16{
17 extern const bool octeon_should_swizzle_table[]; 17 extern const bool octeon_should_swizzle_table[];
18 u64 did = ((u64)(uintptr_t)a >> 40) & 0xff;
18 19
19 unsigned long did = ((unsigned long)a >> 40) & 0xff;
20 return octeon_should_swizzle_table[did]; 20 return octeon_should_swizzle_table[did];
21} 21}
22 22
@@ -29,7 +29,7 @@ static inline bool __should_swizzle_bits(volatile void *a)
29 29
30#define __should_swizzle_bits(a) false 30#define __should_swizzle_bits(a) false
31 31
32static inline bool __should_swizzle_addr(unsigned long p) 32static inline bool __should_swizzle_addr(u64 p)
33{ 33{
34 /* boot bus? */ 34 /* boot bus? */
35 return ((p >> 40) & 0xff) == 0; 35 return ((p >> 40) & 0xff) == 0;
diff --git a/arch/mips/include/asm/mach-paravirt/kernel-entry-init.h b/arch/mips/include/asm/mach-paravirt/kernel-entry-init.h
index 2f82bfa3a773..c9f5769dfc8f 100644
--- a/arch/mips/include/asm/mach-paravirt/kernel-entry-init.h
+++ b/arch/mips/include/asm/mach-paravirt/kernel-entry-init.h
@@ -11,11 +11,13 @@
11#define CP0_EBASE $15, 1 11#define CP0_EBASE $15, 1
12 12
13 .macro kernel_entry_setup 13 .macro kernel_entry_setup
14#ifdef CONFIG_SMP
14 mfc0 t0, CP0_EBASE 15 mfc0 t0, CP0_EBASE
15 andi t0, t0, 0x3ff # CPUNum 16 andi t0, t0, 0x3ff # CPUNum
16 beqz t0, 1f 17 beqz t0, 1f
17 # CPUs other than zero goto smp_bootstrap 18 # CPUs other than zero goto smp_bootstrap
18 j smp_bootstrap 19 j smp_bootstrap
20#endif /* CONFIG_SMP */
19 21
201: 221:
21 .endm 23 .endm
diff --git a/arch/mips/kernel/mips-r2-to-r6-emul.c b/arch/mips/kernel/mips-r2-to-r6-emul.c
index c3372cac6db2..0a7e10b5f9e3 100644
--- a/arch/mips/kernel/mips-r2-to-r6-emul.c
+++ b/arch/mips/kernel/mips-r2-to-r6-emul.c
@@ -1164,7 +1164,9 @@ fpu_emul:
1164 regs->regs[31] = r31; 1164 regs->regs[31] = r31;
1165 regs->cp0_epc = epc; 1165 regs->cp0_epc = epc;
1166 if (!used_math()) { /* First time FPU user. */ 1166 if (!used_math()) { /* First time FPU user. */
1167 preempt_disable();
1167 err = init_fpu(); 1168 err = init_fpu();
1169 preempt_enable();
1168 set_used_math(); 1170 set_used_math();
1169 } 1171 }
1170 lose_fpu(1); /* Save FPU state for the emulator. */ 1172 lose_fpu(1); /* Save FPU state for the emulator. */
diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c
index 7429ad09fbe3..d2d061520a23 100644
--- a/arch/mips/kernel/process.c
+++ b/arch/mips/kernel/process.c
@@ -605,14 +605,14 @@ int mips_set_process_fp_mode(struct task_struct *task, unsigned int value)
605 return -EOPNOTSUPP; 605 return -EOPNOTSUPP;
606 606
607 /* Avoid inadvertently triggering emulation */ 607 /* Avoid inadvertently triggering emulation */
608 if ((value & PR_FP_MODE_FR) && cpu_has_fpu && 608 if ((value & PR_FP_MODE_FR) && raw_cpu_has_fpu &&
609 !(current_cpu_data.fpu_id & MIPS_FPIR_F64)) 609 !(raw_current_cpu_data.fpu_id & MIPS_FPIR_F64))
610 return -EOPNOTSUPP; 610 return -EOPNOTSUPP;
611 if ((value & PR_FP_MODE_FRE) && cpu_has_fpu && !cpu_has_fre) 611 if ((value & PR_FP_MODE_FRE) && raw_cpu_has_fpu && !cpu_has_fre)
612 return -EOPNOTSUPP; 612 return -EOPNOTSUPP;
613 613
614 /* FR = 0 not supported in MIPS R6 */ 614 /* FR = 0 not supported in MIPS R6 */
615 if (!(value & PR_FP_MODE_FR) && cpu_has_fpu && cpu_has_mips_r6) 615 if (!(value & PR_FP_MODE_FR) && raw_cpu_has_fpu && cpu_has_mips_r6)
616 return -EOPNOTSUPP; 616 return -EOPNOTSUPP;
617 617
618 /* Proceed with the mode switch */ 618 /* Proceed with the mode switch */
diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c
index 36cf8d65c47d..3be0e6ba2797 100644
--- a/arch/mips/kernel/setup.c
+++ b/arch/mips/kernel/setup.c
@@ -87,6 +87,13 @@ void __init add_memory_region(phys_addr_t start, phys_addr_t size, long type)
87 int x = boot_mem_map.nr_map; 87 int x = boot_mem_map.nr_map;
88 int i; 88 int i;
89 89
90 /*
91 * If the region reaches the top of the physical address space, adjust
92 * the size slightly so that (start + size) doesn't overflow
93 */
94 if (start + size - 1 == (phys_addr_t)ULLONG_MAX)
95 --size;
96
90 /* Sanity check */ 97 /* Sanity check */
91 if (start + size < start) { 98 if (start + size < start) {
92 pr_warn("Trying to add an invalid memory region, skipped\n"); 99 pr_warn("Trying to add an invalid memory region, skipped\n");
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c
index f95f094f36e4..b0baf48951fa 100644
--- a/arch/mips/kernel/smp.c
+++ b/arch/mips/kernel/smp.c
@@ -322,6 +322,9 @@ asmlinkage void start_secondary(void)
322 cpumask_set_cpu(cpu, &cpu_coherent_mask); 322 cpumask_set_cpu(cpu, &cpu_coherent_mask);
323 notify_cpu_starting(cpu); 323 notify_cpu_starting(cpu);
324 324
325 cpumask_set_cpu(cpu, &cpu_callin_map);
326 synchronise_count_slave(cpu);
327
325 set_cpu_online(cpu, true); 328 set_cpu_online(cpu, true);
326 329
327 set_cpu_sibling_map(cpu); 330 set_cpu_sibling_map(cpu);
@@ -329,10 +332,6 @@ asmlinkage void start_secondary(void)
329 332
330 calculate_cpu_foreign_map(); 333 calculate_cpu_foreign_map();
331 334
332 cpumask_set_cpu(cpu, &cpu_callin_map);
333
334 synchronise_count_slave(cpu);
335
336 /* 335 /*
337 * irq will be enabled in ->smp_finish(), enabling it too early 336 * irq will be enabled in ->smp_finish(), enabling it too early
338 * is dangerous. 337 * is dangerous.
diff --git a/arch/mips/kernel/uprobes.c b/arch/mips/kernel/uprobes.c
index 8452d933a645..1149b30c9aeb 100644
--- a/arch/mips/kernel/uprobes.c
+++ b/arch/mips/kernel/uprobes.c
@@ -222,7 +222,7 @@ int arch_uprobe_exception_notify(struct notifier_block *self,
222 return NOTIFY_DONE; 222 return NOTIFY_DONE;
223 223
224 switch (val) { 224 switch (val) {
225 case DIE_BREAK: 225 case DIE_UPROBE:
226 if (uprobe_pre_sstep_notifier(regs)) 226 if (uprobe_pre_sstep_notifier(regs))
227 return NOTIFY_STOP; 227 return NOTIFY_STOP;
228 break; 228 break;
diff --git a/arch/mips/kernel/vdso.c b/arch/mips/kernel/vdso.c
index 9abe447a4b48..f9dbfb14af33 100644
--- a/arch/mips/kernel/vdso.c
+++ b/arch/mips/kernel/vdso.c
@@ -39,16 +39,16 @@ static struct vm_special_mapping vdso_vvar_mapping = {
39static void __init init_vdso_image(struct mips_vdso_image *image) 39static void __init init_vdso_image(struct mips_vdso_image *image)
40{ 40{
41 unsigned long num_pages, i; 41 unsigned long num_pages, i;
42 unsigned long data_pfn;
42 43
43 BUG_ON(!PAGE_ALIGNED(image->data)); 44 BUG_ON(!PAGE_ALIGNED(image->data));
44 BUG_ON(!PAGE_ALIGNED(image->size)); 45 BUG_ON(!PAGE_ALIGNED(image->size));
45 46
46 num_pages = image->size / PAGE_SIZE; 47 num_pages = image->size / PAGE_SIZE;
47 48
48 for (i = 0; i < num_pages; i++) { 49 data_pfn = __phys_to_pfn(__pa_symbol(image->data));
49 image->mapping.pages[i] = 50 for (i = 0; i < num_pages; i++)
50 virt_to_page(image->data + (i * PAGE_SIZE)); 51 image->mapping.pages[i] = pfn_to_page(data_pfn + i);
51 }
52} 52}
53 53
54static int __init init_vdso(void) 54static int __init init_vdso(void)
diff --git a/arch/mips/math-emu/dsemul.c b/arch/mips/math-emu/dsemul.c
index 72a4642eee2c..4a094f7acb3d 100644
--- a/arch/mips/math-emu/dsemul.c
+++ b/arch/mips/math-emu/dsemul.c
@@ -298,5 +298,6 @@ bool do_dsemulret(struct pt_regs *xcp)
298 /* Set EPC to return to post-branch instruction */ 298 /* Set EPC to return to post-branch instruction */
299 xcp->cp0_epc = current->thread.bd_emu_cont_pc; 299 xcp->cp0_epc = current->thread.bd_emu_cont_pc;
300 pr_debug("dsemulret to 0x%08lx\n", xcp->cp0_epc); 300 pr_debug("dsemulret to 0x%08lx\n", xcp->cp0_epc);
301 MIPS_FPU_EMU_INC_STATS(ds_emul);
301 return true; 302 return true;
302} 303}
diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c
index cd72805b64a7..fa7d8d3790bf 100644
--- a/arch/mips/mm/c-r4k.c
+++ b/arch/mips/mm/c-r4k.c
@@ -800,7 +800,7 @@ static void r4k_flush_icache_range(unsigned long start, unsigned long end)
800 * If address-based cache ops don't require an SMP call, then 800 * If address-based cache ops don't require an SMP call, then
801 * use them exclusively for small flushes. 801 * use them exclusively for small flushes.
802 */ 802 */
803 size = start - end; 803 size = end - start;
804 cache_size = icache_size; 804 cache_size = icache_size;
805 if (!cpu_has_ic_fills_f_dc) { 805 if (!cpu_has_ic_fills_f_dc) {
806 size *= 2; 806 size *= 2;
diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c
index a5509e7dcad2..2c3749d98f04 100644
--- a/arch/mips/mm/init.c
+++ b/arch/mips/mm/init.c
@@ -261,7 +261,6 @@ unsigned __weak platform_maar_init(unsigned num_pairs)
261{ 261{
262 struct maar_config cfg[BOOT_MEM_MAP_MAX]; 262 struct maar_config cfg[BOOT_MEM_MAP_MAX];
263 unsigned i, num_configured, num_cfg = 0; 263 unsigned i, num_configured, num_cfg = 0;
264 phys_addr_t skip;
265 264
266 for (i = 0; i < boot_mem_map.nr_map; i++) { 265 for (i = 0; i < boot_mem_map.nr_map; i++) {
267 switch (boot_mem_map.map[i].type) { 266 switch (boot_mem_map.map[i].type) {
@@ -272,14 +271,14 @@ unsigned __weak platform_maar_init(unsigned num_pairs)
272 continue; 271 continue;
273 } 272 }
274 273
275 skip = 0x10000 - (boot_mem_map.map[i].addr & 0xffff); 274 /* Round lower up */
276
277 cfg[num_cfg].lower = boot_mem_map.map[i].addr; 275 cfg[num_cfg].lower = boot_mem_map.map[i].addr;
278 cfg[num_cfg].lower += skip; 276 cfg[num_cfg].lower = (cfg[num_cfg].lower + 0xffff) & ~0xffff;
279 277
280 cfg[num_cfg].upper = cfg[num_cfg].lower; 278 /* Round upper down */
281 cfg[num_cfg].upper += boot_mem_map.map[i].size - 1; 279 cfg[num_cfg].upper = boot_mem_map.map[i].addr +
282 cfg[num_cfg].upper -= skip; 280 boot_mem_map.map[i].size;
281 cfg[num_cfg].upper = (cfg[num_cfg].upper & ~0xffff) - 1;
283 282
284 cfg[num_cfg].attrs = MIPS_MAAR_S; 283 cfg[num_cfg].attrs = MIPS_MAAR_S;
285 num_cfg++; 284 num_cfg++;