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

Commit b332b8bc authored by David S. Miller's avatar David S. Miller
Browse files

[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: default avatarDavid S. Miller <davem@davemloft.net>
parent f194d132
Loading
Loading
Loading
Loading
+10 −6
Original line number Original line Diff line number Diff line
/* $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;
}
}