aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arc
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-02-16 17:56:52 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2015-02-16 17:56:52 -0500
commita68fb48380bb993306dd62a58cbd946b4348222a (patch)
tree610722b25e4785c0232b23ba9d04c7b49efd89d3 /arch/arc
parentea44a160e6dc5d3d7c680ea72dfbabef80343839 (diff)
parent06f34e1c28f3608b0ce5b310e41102d3fe7b65a1 (diff)
Merge tag 'arc-3.20-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc
Pull ARC updates from Vineet Gupta: "Some fixes, nothing too exciting this time as well..." * tag 'arc-3.20-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc: ARC: fix page address calculation if PAGE_OFFSET != LINUX_LINK_BASE ARC: Fix earlycon build breakage ARC: Dynamically determine BASE_BAUD from DeviceTree arc: Remove unused prepare_to_copy() ARC: use ACCESS_ONCE in cmpxchg loop ARC: add some more comments to ret_from_fork ARC: fix /proc/cpuinfo for offline cpus
Diffstat (limited to 'arch/arc')
-rw-r--r--arch/arc/include/asm/pgtable.h3
-rw-r--r--arch/arc/include/asm/processor.h3
-rw-r--r--arch/arc/include/asm/serial.h23
-rw-r--r--arch/arc/kernel/devtree.c24
-rw-r--r--arch/arc/kernel/entry.S14
-rw-r--r--arch/arc/kernel/setup.c7
-rw-r--r--arch/arc/kernel/smp.c2
7 files changed, 47 insertions, 29 deletions
diff --git a/arch/arc/include/asm/pgtable.h b/arch/arc/include/asm/pgtable.h
index ffed3b2cf313..9615fe1701c6 100644
--- a/arch/arc/include/asm/pgtable.h
+++ b/arch/arc/include/asm/pgtable.h
@@ -257,7 +257,8 @@ static inline void pmd_set(pmd_t *pmdp, pte_t *ptep)
257#define pmd_clear(xp) do { pmd_val(*(xp)) = 0; } while (0) 257#define pmd_clear(xp) do { pmd_val(*(xp)) = 0; } while (0)
258 258
259#define pte_page(x) (mem_map + \ 259#define pte_page(x) (mem_map + \
260 (unsigned long)(((pte_val(x) - PAGE_OFFSET) >> PAGE_SHIFT))) 260 (unsigned long)(((pte_val(x) - CONFIG_LINUX_LINK_BASE) >> \
261 PAGE_SHIFT)))
261 262
262#define mk_pte(page, pgprot) \ 263#define mk_pte(page, pgprot) \
263({ \ 264({ \
diff --git a/arch/arc/include/asm/processor.h b/arch/arc/include/asm/processor.h
index 210fe97464c3..4e547296831d 100644
--- a/arch/arc/include/asm/processor.h
+++ b/arch/arc/include/asm/processor.h
@@ -56,9 +56,6 @@ unsigned long thread_saved_pc(struct task_struct *t);
56/* Free all resources held by a thread */ 56/* Free all resources held by a thread */
57#define release_thread(thread) do { } while (0) 57#define release_thread(thread) do { } while (0)
58 58
59/* Prepare to copy thread state - unlazy all lazy status */
60#define prepare_to_copy(tsk) do { } while (0)
61
62/* 59/*
63 * A lot of busy-wait loops in SMP are based off of non-volatile data otherwise 60 * A lot of busy-wait loops in SMP are based off of non-volatile data otherwise
64 * get optimised away by gcc 61 * get optimised away by gcc
diff --git a/arch/arc/include/asm/serial.h b/arch/arc/include/asm/serial.h
index 602b0970a764..744a6ae15754 100644
--- a/arch/arc/include/asm/serial.h
+++ b/arch/arc/include/asm/serial.h
@@ -10,26 +10,13 @@
10#define _ASM_ARC_SERIAL_H 10#define _ASM_ARC_SERIAL_H
11 11
12/* 12/*
13 * early-8250 requires BASE_BAUD to be defined and includes this header. 13 * early 8250 (now earlycon) requires BASE_BAUD to be defined in this header.
14 * We put in a typical value: 14 * However to still determine it dynamically (for multi-platform images)
15 * (core clk / 16) - i.e. UART samples 16 times per sec. 15 * we do this in a helper by parsing the FDT early
16 * Athough in multi-platform-image this might not work, specially if the
17 * clk driving the UART is different.
18 * We can't use DeviceTree as this is typically for early serial.
19 */ 16 */
20 17
21#include <asm/clk.h> 18extern unsigned int __init arc_early_base_baud(void);
22 19
23#define BASE_BAUD (arc_get_core_freq() / 16) 20#define BASE_BAUD arc_early_base_baud()
24
25/*
26 * This is definitely going to break early 8250 consoles on multi-platform
27 * images but hey, it won't add any code complexity for a debug feature of
28 * one broken driver.
29 */
30#ifdef CONFIG_ARC_PLAT_TB10X
31#undef BASE_BAUD
32#define BASE_BAUD (arc_get_core_freq() / 16 / 3)
33#endif
34 21
35#endif /* _ASM_ARC_SERIAL_H */ 22#endif /* _ASM_ARC_SERIAL_H */
diff --git a/arch/arc/kernel/devtree.c b/arch/arc/kernel/devtree.c
index fffdb5e41b20..e32b54abff51 100644
--- a/arch/arc/kernel/devtree.c
+++ b/arch/arc/kernel/devtree.c
@@ -17,6 +17,28 @@
17#include <asm/clk.h> 17#include <asm/clk.h>
18#include <asm/mach_desc.h> 18#include <asm/mach_desc.h>
19 19
20#ifdef CONFIG_SERIAL_EARLYCON
21
22static unsigned int __initdata arc_base_baud;
23
24unsigned int __init arc_early_base_baud(void)
25{
26 return arc_base_baud/16;
27}
28
29static void __init arc_set_early_base_baud(unsigned long dt_root)
30{
31 unsigned int core_clk = arc_get_core_freq();
32
33 if (of_flat_dt_is_compatible(dt_root, "abilis,arc-tb10x"))
34 arc_base_baud = core_clk/3;
35 else
36 arc_base_baud = core_clk;
37}
38#else
39#define arc_set_early_base_baud(dt_root)
40#endif
41
20static const void * __init arch_get_next_mach(const char *const **match) 42static const void * __init arch_get_next_mach(const char *const **match)
21{ 43{
22 static const struct machine_desc *mdesc = __arch_info_begin; 44 static const struct machine_desc *mdesc = __arch_info_begin;
@@ -56,5 +78,7 @@ const struct machine_desc * __init setup_machine_fdt(void *dt)
56 if (clk) 78 if (clk)
57 arc_set_core_freq(of_read_ulong(clk, len/4)); 79 arc_set_core_freq(of_read_ulong(clk, len/4));
58 80
81 arc_set_early_base_baud(dt_root);
82
59 return mdesc; 83 return mdesc;
60} 84}
diff --git a/arch/arc/kernel/entry.S b/arch/arc/kernel/entry.S
index 83a046a7cd06..d868289c5a26 100644
--- a/arch/arc/kernel/entry.S
+++ b/arch/arc/kernel/entry.S
@@ -736,16 +736,20 @@ ENTRY(ret_from_fork)
736 ; put last task in scheduler queue 736 ; put last task in scheduler queue
737 bl @schedule_tail 737 bl @schedule_tail
738 738
739 ; If kernel thread, jump to its entry-point
740 ld r9, [sp, PT_status32] 739 ld r9, [sp, PT_status32]
741 brne r9, 0, 1f 740 brne r9, 0, 1f
742 741
743 jl.d [r14] 742 jl.d [r14] ; kernel thread entry point
744 mov r0, r13 ; arg to payload 743 mov r0, r13 ; (see PF_KTHREAD block in copy_thread)
745 744
7461: 7451:
747 ; special case of kernel_thread entry point returning back due to 746 ; Return to user space
748 ; kernel_execve() - pretend return from syscall to ret to userland 747 ; 1. Any forked task (Reach here via BRne above)
748 ; 2. First ever init task (Reach here via return from JL above)
749 ; This is the historic "kernel_execve" use-case, to return to init
750 ; user mode, in a round about way since that is always done from
751 ; a kernel thread which is executed via JL above but always returns
752 ; out whenever kernel_execve (now inline do_fork()) is involved
749 b ret_from_exception 753 b ret_from_exception
750END(ret_from_fork) 754END(ret_from_fork)
751 755
diff --git a/arch/arc/kernel/setup.c b/arch/arc/kernel/setup.c
index 252bf603db9c..900f68a70088 100644
--- a/arch/arc/kernel/setup.c
+++ b/arch/arc/kernel/setup.c
@@ -412,6 +412,11 @@ static int show_cpuinfo(struct seq_file *m, void *v)
412 char *str; 412 char *str;
413 int cpu_id = ptr_to_cpu(v); 413 int cpu_id = ptr_to_cpu(v);
414 414
415 if (!cpu_online(cpu_id)) {
416 seq_printf(m, "processor [%d]\t: Offline\n", cpu_id);
417 goto done;
418 }
419
415 str = (char *)__get_free_page(GFP_TEMPORARY); 420 str = (char *)__get_free_page(GFP_TEMPORARY);
416 if (!str) 421 if (!str)
417 goto done; 422 goto done;
@@ -429,7 +434,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)
429 434
430 free_page((unsigned long)str); 435 free_page((unsigned long)str);
431done: 436done:
432 seq_printf(m, "\n\n"); 437 seq_printf(m, "\n");
433 438
434 return 0; 439 return 0;
435} 440}
diff --git a/arch/arc/kernel/smp.c b/arch/arc/kernel/smp.c
index 20ebb602ea2f..6a400b1b0b62 100644
--- a/arch/arc/kernel/smp.c
+++ b/arch/arc/kernel/smp.c
@@ -221,7 +221,7 @@ static void ipi_send_msg_one(int cpu, enum ipi_msg_type msg)
221 * and read back old value 221 * and read back old value
222 */ 222 */
223 do { 223 do {
224 new = old = *ipi_data_ptr; 224 new = old = ACCESS_ONCE(*ipi_data_ptr);
225 new |= 1U << msg; 225 new |= 1U << msg;
226 } while (cmpxchg(ipi_data_ptr, old, new) != old); 226 } while (cmpxchg(ipi_data_ptr, old, new) != old);
227 227