Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a68fb483 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
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
parents ea44a160 06f34e1c
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -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 pmd_clear(xp)			do { pmd_val(*(xp)) = 0; } while (0)


#define pte_page(x) (mem_map + \
#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)						\
#define mk_pte(page, pgprot)						\
({									\
({									\
+0 −3
Original line number Original line Diff line number Diff line
@@ -56,9 +56,6 @@ unsigned long thread_saved_pc(struct task_struct *t);
/* Free all resources held by a thread */
/* Free all resources held by a thread */
#define release_thread(thread) do { } while (0)
#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
 * A lot of busy-wait loops in SMP are based off of non-volatile data otherwise
 * get optimised away by gcc
 * get optimised away by gcc
+5 −18
Original line number Original line Diff line number Diff line
@@ -10,26 +10,13 @@
#define _ASM_ARC_SERIAL_H
#define _ASM_ARC_SERIAL_H


/*
/*
 * early-8250 requires BASE_BAUD to be defined and includes this header.
 * early 8250 (now earlycon) requires BASE_BAUD to be defined in this header.
 * We put in a typical value:
 * However to still determine it dynamically (for multi-platform images)
 * 	(core clk / 16) - i.e. UART samples 16 times per sec.
 * we do this in a helper by parsing the FDT early
 * 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.
 */
 */


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


#define BASE_BAUD	(arc_get_core_freq() / 16)
#define BASE_BAUD	arc_early_base_baud()

/*
 * 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


#endif /* _ASM_ARC_SERIAL_H */
#endif /* _ASM_ARC_SERIAL_H */
+24 −0
Original line number Original line Diff line number Diff line
@@ -17,6 +17,28 @@
#include <asm/clk.h>
#include <asm/clk.h>
#include <asm/mach_desc.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 void * __init arch_get_next_mach(const char *const **match)
{
{
	static const struct machine_desc *mdesc = __arch_info_begin;
	static const struct machine_desc *mdesc = __arch_info_begin;
@@ -56,5 +78,7 @@ const struct machine_desc * __init setup_machine_fdt(void *dt)
	if (clk)
	if (clk)
		arc_set_core_freq(of_read_ulong(clk, len/4));
		arc_set_core_freq(of_read_ulong(clk, len/4));


	arc_set_early_base_baud(dt_root);

	return mdesc;
	return mdesc;
}
}
+9 −5
Original line number Original line Diff line number Diff line
@@ -736,16 +736,20 @@ ENTRY(ret_from_fork)
	; put last task in scheduler queue
	; put last task in scheduler queue
	bl   @schedule_tail
	bl   @schedule_tail


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


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


1:
1:
	; special case of kernel_thread entry point returning back due to
	; Return to user space
	; kernel_execve() - pretend return from syscall to ret to userland
	; 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
	b    ret_from_exception
END(ret_from_fork)
END(ret_from_fork)


Loading