diff options
| -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 | ||
