diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-16 17:56:52 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-16 17:56:52 -0500 |
commit | a68fb48380bb993306dd62a58cbd946b4348222a (patch) | |
tree | 610722b25e4785c0232b23ba9d04c7b49efd89d3 /arch/arc | |
parent | ea44a160e6dc5d3d7c680ea72dfbabef80343839 (diff) | |
parent | 06f34e1c28f3608b0ce5b310e41102d3fe7b65a1 (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.h | 3 | ||||
-rw-r--r-- | arch/arc/include/asm/processor.h | 3 | ||||
-rw-r--r-- | arch/arc/include/asm/serial.h | 23 | ||||
-rw-r--r-- | arch/arc/kernel/devtree.c | 24 | ||||
-rw-r--r-- | arch/arc/kernel/entry.S | 14 | ||||
-rw-r--r-- | arch/arc/kernel/setup.c | 7 | ||||
-rw-r--r-- | arch/arc/kernel/smp.c | 2 |
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> | 18 | extern 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 | |||
22 | static unsigned int __initdata arc_base_baud; | ||
23 | |||
24 | unsigned int __init arc_early_base_baud(void) | ||
25 | { | ||
26 | return arc_base_baud/16; | ||
27 | } | ||
28 | |||
29 | static 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 | |||
20 | static const void * __init arch_get_next_mach(const char *const **match) | 42 | static 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 | ||
746 | 1: | 745 | 1: |
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 |
750 | END(ret_from_fork) | 754 | END(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); |
431 | done: | 436 | done: |
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 | ||