Skip to content

Commit

Permalink
Merge tag 'arc-3.20-rc1' of git://git.kernel.org/pub/scm/linux/kernel…
Browse files Browse the repository at this point in the history
…/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
  • Loading branch information
torvalds committed Feb 16, 2015
2 parents ea44a16 + 06f34e1 commit a68fb48
Show file tree
Hide file tree
Showing 7 changed files with 47 additions and 29 deletions.
3 changes: 2 additions & 1 deletion arch/arc/include/asm/pgtable.h
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,8 @@ static inline void pmd_set(pmd_t *pmdp, pte_t *ptep)
#define pmd_clear(xp) do { pmd_val(*(xp)) = 0; } while (0)

#define pte_page(x) (mem_map + \
(unsigned long)(((pte_val(x) - PAGE_OFFSET) >> PAGE_SHIFT)))
(unsigned long)(((pte_val(x) - CONFIG_LINUX_LINK_BASE) >> \
PAGE_SHIFT)))

#define mk_pte(page, pgprot) \
({ \
Expand Down
3 changes: 0 additions & 3 deletions arch/arc/include/asm/processor.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,6 @@ unsigned long thread_saved_pc(struct task_struct *t);
/* Free all resources held by a thread */
#define release_thread(thread) do { } while (0)

/* Prepare to copy thread state - unlazy all lazy status */
#define prepare_to_copy(tsk) do { } while (0)

/*
* A lot of busy-wait loops in SMP are based off of non-volatile data otherwise
* get optimised away by gcc
Expand Down
23 changes: 5 additions & 18 deletions arch/arc/include/asm/serial.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,26 +10,13 @@
#define _ASM_ARC_SERIAL_H

/*
* early-8250 requires BASE_BAUD to be defined and includes this header.
* We put in a typical value:
* (core clk / 16) - i.e. UART samples 16 times per sec.
* Athough in multi-platform-image this might not work, specially if the
* clk driving the UART is different.
* We can't use DeviceTree as this is typically for early serial.
* early 8250 (now earlycon) requires BASE_BAUD to be defined in this header.
* However to still determine it dynamically (for multi-platform images)
* we do this in a helper by parsing the FDT early
*/

#include <asm/clk.h>
extern unsigned int __init arc_early_base_baud(void);

#define BASE_BAUD (arc_get_core_freq() / 16)

/*
* This is definitely going to break early 8250 consoles on multi-platform
* images but hey, it won't add any code complexity for a debug feature of
* one broken driver.
*/
#ifdef CONFIG_ARC_PLAT_TB10X
#undef BASE_BAUD
#define BASE_BAUD (arc_get_core_freq() / 16 / 3)
#endif
#define BASE_BAUD arc_early_base_baud()

#endif /* _ASM_ARC_SERIAL_H */
24 changes: 24 additions & 0 deletions arch/arc/kernel/devtree.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,28 @@
#include <asm/clk.h>
#include <asm/mach_desc.h>

#ifdef CONFIG_SERIAL_EARLYCON

static unsigned int __initdata arc_base_baud;

unsigned int __init arc_early_base_baud(void)
{
return arc_base_baud/16;
}

static void __init arc_set_early_base_baud(unsigned long dt_root)
{
unsigned int core_clk = arc_get_core_freq();

if (of_flat_dt_is_compatible(dt_root, "abilis,arc-tb10x"))
arc_base_baud = core_clk/3;
else
arc_base_baud = core_clk;
}
#else
#define arc_set_early_base_baud(dt_root)
#endif

static const void * __init arch_get_next_mach(const char *const **match)
{
static const struct machine_desc *mdesc = __arch_info_begin;
Expand Down Expand Up @@ -56,5 +78,7 @@ const struct machine_desc * __init setup_machine_fdt(void *dt)
if (clk)
arc_set_core_freq(of_read_ulong(clk, len/4));

arc_set_early_base_baud(dt_root);

return mdesc;
}
14 changes: 9 additions & 5 deletions arch/arc/kernel/entry.S
Original file line number Diff line number Diff line change
Expand Up @@ -736,16 +736,20 @@ ENTRY(ret_from_fork)
; put last task in scheduler queue
bl @schedule_tail

; If kernel thread, jump to its entry-point
ld r9, [sp, PT_status32]
brne r9, 0, 1f

jl.d [r14]
mov r0, r13 ; arg to payload
jl.d [r14] ; kernel thread entry point
mov r0, r13 ; (see PF_KTHREAD block in copy_thread)

1:
; special case of kernel_thread entry point returning back due to
; kernel_execve() - pretend return from syscall to ret to userland
; Return to user space
; 1. Any forked task (Reach here via BRne above)
; 2. First ever init task (Reach here via return from JL above)
; This is the historic "kernel_execve" use-case, to return to init
; user mode, in a round about way since that is always done from
; a kernel thread which is executed via JL above but always returns
; out whenever kernel_execve (now inline do_fork()) is involved
b ret_from_exception
END(ret_from_fork)

Expand Down
7 changes: 6 additions & 1 deletion arch/arc/kernel/setup.c
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,11 @@ static int show_cpuinfo(struct seq_file *m, void *v)
char *str;
int cpu_id = ptr_to_cpu(v);

if (!cpu_online(cpu_id)) {
seq_printf(m, "processor [%d]\t: Offline\n", cpu_id);
goto done;
}

str = (char *)__get_free_page(GFP_TEMPORARY);
if (!str)
goto done;
Expand All @@ -429,7 +434,7 @@ static int show_cpuinfo(struct seq_file *m, void *v)

free_page((unsigned long)str);
done:
seq_printf(m, "\n\n");
seq_printf(m, "\n");

return 0;
}
Expand Down
2 changes: 1 addition & 1 deletion arch/arc/kernel/smp.c
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ static void ipi_send_msg_one(int cpu, enum ipi_msg_type msg)
* and read back old value
*/
do {
new = old = *ipi_data_ptr;
new = old = ACCESS_ONCE(*ipi_data_ptr);
new |= 1U << msg;
} while (cmpxchg(ipi_data_ptr, old, new) != old);

Expand Down

0 comments on commit a68fb48

Please sign in to comment.