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

Commit 9553e113 authored by Ingo Molnar's avatar Ingo Molnar
Browse files

Merge branch 'x86/uv' into x86/x2apic



Conflicts:

	arch/x86/kernel/Makefile

Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parents 453c1404 7019cc2d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -102,6 +102,7 @@ obj-$(CONFIG_OLPC) += olpc.o
# 64 bit specific files
ifeq ($(CONFIG_X86_64),y)
        obj-y				+= genapic_64.o genapic_flat_64.o genx2apic_uv_x.o tlb_uv.o
	obj-y				+= bios_uv.o
        obj-y				+= genx2apic_cluster.o
        obj-y				+= genx2apic_phys.o
        obj-$(CONFIG_X86_PM_TIMER)	+= pmtimer_64.o
+48 −0
Original line number Diff line number Diff line
/*
 * BIOS run time interface routines.
 *
 *  Copyright (c) 2008 Silicon Graphics, Inc.  All Rights Reserved.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 */

#include <asm/uv/bios.h>

const char *
x86_bios_strerror(long status)
{
	const char *str;
	switch (status) {
	case  0: str = "Call completed without error"; break;
	case -1: str = "Not implemented"; break;
	case -2: str = "Invalid argument"; break;
	case -3: str = "Call completed with error"; break;
	default: str = "Unknown BIOS status code"; break;
	}
	return str;
}

long
x86_bios_freq_base(unsigned long which, unsigned long *ticks_per_second,
		   unsigned long *drift_info)
{
	struct uv_bios_retval isrv;

	BIOS_CALL(isrv, BIOS_FREQ_BASE, which, 0, 0, 0, 0, 0, 0);
	*ticks_per_second = isrv.v0;
	*drift_info = isrv.v1;
	return isrv.status;
}
EXPORT_SYMBOL_GPL(x86_bios_freq_base);
+23 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include <asm/pgtable.h>
#include <asm/uv/uv_mmrs.h>
#include <asm/uv/uv_hub.h>
#include <asm/uv/bios.h>

DEFINE_PER_CPU(struct uv_hub_info_s, __uv_hub_info);
EXPORT_PER_CPU_SYMBOL_GPL(__uv_hub_info);
@@ -41,6 +42,9 @@ EXPORT_SYMBOL_GPL(uv_cpu_to_blade);
short uv_possible_blades;
EXPORT_SYMBOL_GPL(uv_possible_blades);

unsigned long sn_rtc_cycles_per_second;
EXPORT_SYMBOL(sn_rtc_cycles_per_second);

/* Start with all IRQs pointing to boot CPU.  IRQ balancing will shift them. */

static cpumask_t uv_target_cpus(void)
@@ -306,6 +310,23 @@ static __init void map_mmioh_high(int max_pnode)
		map_high("MMIOH", mmioh.s.base, shift, map_uc);
}

static __init void uv_rtc_init(void)
{
	long status, ticks_per_sec, drift;

	status =
	    x86_bios_freq_base(BIOS_FREQ_BASE_REALTIME_CLOCK, &ticks_per_sec,
					&drift);
	if (status != 0 || ticks_per_sec < 100000) {
		printk(KERN_WARNING
			"unable to determine platform RTC clock frequency, "
			"guessing.\n");
		/* BIOS gives wrong value for clock freq. so guess */
		sn_rtc_cycles_per_second = 1000000000000UL / 30000UL;
	} else
		sn_rtc_cycles_per_second = ticks_per_sec;
}

static __init void uv_system_init(void)
{
	union uvh_si_addr_map_config_u m_n_config;
@@ -360,6 +381,8 @@ static __init void uv_system_init(void)
	gnode_upper = (((unsigned long)node_id.s.node_id) &
		       ~((1 << n_val) - 1)) << m_val;

	uv_rtc_init();

	for_each_present_cpu(cpu) {
		nid = cpu_to_node(cpu);
		pnode = uv_apicid_to_pnode(per_cpu(x86_cpu_to_apicid, cpu));
+68 −0
Original line number Diff line number Diff line
#ifndef _ASM_X86_BIOS_H
#define _ASM_X86_BIOS_H

/*
 * BIOS layer definitions.
 *
 *  Copyright (c) 2008 Silicon Graphics, Inc.  All Rights Reserved.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 */

#include <linux/rtc.h>

#define BIOS_FREQ_BASE			0x01000001

enum {
	BIOS_FREQ_BASE_PLATFORM = 0,
	BIOS_FREQ_BASE_INTERVAL_TIMER = 1,
	BIOS_FREQ_BASE_REALTIME_CLOCK = 2
};

# define BIOS_CALL(result, a0, a1, a2, a3, a4, a5, a6, a7)		\
	do {								\
		/* XXX - the real call goes here */			\
		result.status = BIOS_STATUS_UNIMPLEMENTED;		\
		isrv.v0 = 0;						\
		isrv.v1 = 0;						\
	} while (0)

enum {
	BIOS_STATUS_SUCCESS		=  0,
	BIOS_STATUS_UNIMPLEMENTED	= -1,
	BIOS_STATUS_EINVAL		= -2,
	BIOS_STATUS_ERROR		= -3
};

struct uv_bios_retval {
	/*
	 * A zero status value indicates call completed without error.
	 * A negative status value indicates reason of call failure.
	 * A positive status value indicates success but an
	 * informational value should be printed (e.g., "reboot for
	 * change to take effect").
	 */
	s64 status;
	u64 v0;
	u64 v1;
	u64 v2;
};

extern long
x86_bios_freq_base(unsigned long which, unsigned long *ticks_per_second,
		   unsigned long *drift_info);
extern const char *x86_bios_strerror(long status);

#endif /* _ASM_X86_BIOS_H */