Merge branch 'x86/uv' into x86/x2apic
Conflicts: arch/x86/kernel/Makefile Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Коммит
9553e11325
|
@ -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
|
||||
|
|
|
@ -0,0 +1,48 @@
|
|||
/*
|
||||
* 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);
|
|
@ -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));
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
#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 */
|
Загрузка…
Ссылка в новой задаче