Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+47 -29
+2 -1
arch/arc/include/asm/pgtable.h
··· 257 257 #define pmd_clear(xp) do { pmd_val(*(xp)) = 0; } while (0) 258 258 259 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 263 #define mk_pte(page, pgprot) \ 263 264 ({ \
-3
arch/arc/include/asm/processor.h
··· 56 56 /* Free all resources held by a thread */ 57 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 60 * A lot of busy-wait loops in SMP are based off of non-volatile data otherwise 64 61 * get optimised away by gcc
+5 -18
arch/arc/include/asm/serial.h
··· 10 10 #define _ASM_ARC_SERIAL_H 11 11 12 12 /* 13 - * early-8250 requires BASE_BAUD to be defined and includes this header. 14 - * We put in a typical value: 15 - * (core clk / 16) - i.e. UART samples 16 times per sec. 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. 13 + * early 8250 (now earlycon) requires BASE_BAUD to be defined in this header. 14 + * However to still determine it dynamically (for multi-platform images) 15 + * we do this in a helper by parsing the FDT early 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) 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 20 + #define BASE_BAUD arc_early_base_baud() 34 21 35 22 #endif /* _ASM_ARC_SERIAL_H */
+24
arch/arc/kernel/devtree.c
··· 17 17 #include <asm/clk.h> 18 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 42 static const void * __init arch_get_next_mach(const char *const **match) 21 43 { 22 44 static const struct machine_desc *mdesc = __arch_info_begin; ··· 77 55 clk = of_get_flat_dt_prop(dt_root, "clock-frequency", &len); 78 56 if (clk) 79 57 arc_set_core_freq(of_read_ulong(clk, len/4)); 58 + 59 + arc_set_early_base_baud(dt_root); 80 60 81 61 return mdesc; 82 62 }
+9 -5
arch/arc/kernel/entry.S
··· 736 736 ; put last task in scheduler queue 737 737 bl @schedule_tail 738 738 739 - ; If kernel thread, jump to its entry-point 740 739 ld r9, [sp, PT_status32] 741 740 brne r9, 0, 1f 742 741 743 - jl.d [r14] 744 - mov r0, r13 ; arg to payload 742 + jl.d [r14] ; kernel thread entry point 743 + mov r0, r13 ; (see PF_KTHREAD block in copy_thread) 745 744 746 745 1: 747 - ; special case of kernel_thread entry point returning back due to 748 - ; kernel_execve() - pretend return from syscall to ret to userland 746 + ; Return to user space 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 753 b ret_from_exception 750 754 END(ret_from_fork) 751 755
+6 -1
arch/arc/kernel/setup.c
··· 412 412 char *str; 413 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 420 str = (char *)__get_free_page(GFP_TEMPORARY); 416 421 if (!str) 417 422 goto done; ··· 434 429 435 430 free_page((unsigned long)str); 436 431 done: 437 - seq_printf(m, "\n\n"); 432 + seq_printf(m, "\n"); 438 433 439 434 return 0; 440 435 }
+1 -1
arch/arc/kernel/smp.c
··· 221 221 * and read back old value 222 222 */ 223 223 do { 224 - new = old = *ipi_data_ptr; 224 + new = old = ACCESS_ONCE(*ipi_data_ptr); 225 225 new |= 1U << msg; 226 226 } while (cmpxchg(ipi_data_ptr, old, new) != old); 227 227