1
0
Fork 0

[SPARC64]: Fix memory controller register access when non-SMP.

get_cpu() always returns zero on non-SMP builds, but we
really want the physical cpu number in this code in order
to do the right thing.

Based upon a non-SMP kernel boot failure report from Bernd Zeimetz.

Signed-off-by: David S. Miller <davem@davemloft.net>
hifive-unleashed-5.1
David S. Miller 2007-12-07 00:58:55 -08:00
parent f194d132e4
commit b332b8bc9c
1 changed files with 10 additions and 6 deletions

View File

@ -1,7 +1,6 @@
/* $Id: chmc.c,v 1.4 2002/01/08 16:00:14 davem Exp $ /* memctrlr.c: Driver for UltraSPARC-III memory controller.
* memctrlr.c: Driver for UltraSPARC-III memory controller.
* *
* Copyright (C) 2001 David S. Miller (davem@redhat.com) * Copyright (C) 2001, 2007 David S. Miller (davem@davemloft.net)
*/ */
#include <linux/module.h> #include <linux/module.h>
@ -16,6 +15,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <asm/spitfire.h> #include <asm/spitfire.h>
#include <asm/chmctrl.h> #include <asm/chmctrl.h>
#include <asm/cpudata.h>
#include <asm/oplib.h> #include <asm/oplib.h>
#include <asm/prom.h> #include <asm/prom.h>
#include <asm/io.h> #include <asm/io.h>
@ -242,8 +242,11 @@ int chmc_getunumber(int syndrome_code,
*/ */
static u64 read_mcreg(struct mctrl_info *mp, unsigned long offset) static u64 read_mcreg(struct mctrl_info *mp, unsigned long offset)
{ {
unsigned long ret; unsigned long ret, this_cpu;
int this_cpu = get_cpu();
preempt_disable();
this_cpu = real_hard_smp_processor_id();
if (mp->portid == this_cpu) { if (mp->portid == this_cpu) {
__asm__ __volatile__("ldxa [%1] %2, %0" __asm__ __volatile__("ldxa [%1] %2, %0"
@ -255,7 +258,8 @@ static u64 read_mcreg(struct mctrl_info *mp, unsigned long offset)
: "r" (mp->regs + offset), : "r" (mp->regs + offset),
"i" (ASI_PHYS_BYPASS_EC_E)); "i" (ASI_PHYS_BYPASS_EC_E));
} }
put_cpu();
preempt_enable();
return ret; return ret;
} }