Commit a5b518ed authored by Paul Mackerras's avatar Paul Mackerras
Browse files

ppc64/powerpc: Fix time initialization on SMP systems



This moves smp_space_timers from arch/ppc64/kernel/smp.c to
arch/powerpc/kernel/time.c and makes it initialize last_jiffy[]
instead of paca[].next_jiffy_update_tb, since last_jiffy[] is
now what the time code uses.  It also declares smp_space_timers
in include/asm-powerpc/time.h and gets rid of an ifdef in
div128_by_32.

Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent e2b55306
Loading
Loading
Loading
Loading
+1 −13
Original line number Original line Diff line number Diff line
@@ -458,7 +458,7 @@ void wakeup_decrementer(void)
		per_cpu(last_jiffy, i) = tb_last_stamp;
		per_cpu(last_jiffy, i) = tb_last_stamp;
}
}


#ifdef CONFIG_SMPxxx
#ifdef CONFIG_SMP
void __init smp_space_timers(unsigned int max_cpus)
void __init smp_space_timers(unsigned int max_cpus)
{
{
	int i;
	int i;
@@ -948,16 +948,6 @@ void div128_by_32(u64 dividend_high, u64 dividend_low,
	w = a / divisor;
	w = a / divisor;
	ra = ((u64)(a - (w * divisor)) << 32) + b;
	ra = ((u64)(a - (w * divisor)) << 32) + b;


#ifdef CONFIG_PPC64
	x = ra / divisor;
	rb = ((ra - (x * divisor)) << 32) + c;

	y = rb / divisor;
	rc = ((rb - (y * divisor)) << 32) + d;

	z = rc / divisor;
#else
	/* for 32-bit, use do_div from div64.h */
	rb = ((u64) do_div(ra, divisor) << 32) + c;
	rb = ((u64) do_div(ra, divisor) << 32) + c;
	x = ra;
	x = ra;


@@ -966,10 +956,8 @@ void div128_by_32(u64 dividend_high, u64 dividend_low,


	do_div(rc, divisor);
	do_div(rc, divisor);
	z = rc;
	z = rc;
#endif


	dr->result_high = ((u64)w << 32) + x;
	dr->result_high = ((u64)w << 32) + x;
	dr->result_low  = ((u64)y << 32) + z;
	dr->result_low  = ((u64)y << 32) + z;


}
}
+0 −15
Original line number Original line Diff line number Diff line
@@ -105,21 +105,6 @@ void __devinit smp_generic_kick_cpu(int nr)


#endif /* CONFIG_MPIC */
#endif /* CONFIG_MPIC */


static void __init smp_space_timers(unsigned int max_cpus)
{
	int i;
	unsigned long offset = tb_ticks_per_jiffy / max_cpus;
	unsigned long previous_tb = paca[boot_cpuid].next_jiffy_update_tb;

	for_each_cpu(i) {
		if (i != boot_cpuid) {
			paca[i].next_jiffy_update_tb =
				previous_tb + offset;
			previous_tb = paca[i].next_jiffy_update_tb;
		}
	}
}

void smp_message_recv(int msg, struct pt_regs *regs)
void smp_message_recv(int msg, struct pt_regs *regs)
{
{
	switch(msg) {
	switch(msg) {
+5 −3
Original line number Original line Diff line number Diff line
@@ -196,8 +196,10 @@ static inline unsigned long tb_ticks_since(unsigned long tstamp)
extern u64 mulhdu(u64, u64);
extern u64 mulhdu(u64, u64);
#endif
#endif


unsigned mulhwu_scale_factor(unsigned, unsigned);
extern void smp_space_timers(unsigned int);
void div128_by_32(u64 dividend_high, u64 dividend_low,

extern unsigned mulhwu_scale_factor(unsigned, unsigned);
extern void div128_by_32(u64 dividend_high, u64 dividend_low,
			 unsigned divisor, struct div_result *dr);
			 unsigned divisor, struct div_result *dr);


/* Used to store Processor Utilization register (purr) values */
/* Used to store Processor Utilization register (purr) values */