x86: Add UV bios call infrastructure v4
PATCH 2/4 x86: Add UV bios call infrastructure v4
[PATCH 2/4] x86: Add UV bios call infrastructure v4
Add the EFI callback function and associated wrapper code. Initialize SAL system table entry info at boot time.
Signed-off-by Russ Anderson <[email protected]>
Signed-off-by Paul Jackson <[email protected]>
Acked-by Huang Ying <[email protected]>
--- arch/x86/kernel/bios_uv.c | 101 ++++++++++++++++++++++++++++++--------- arch/x86/kernel/genx2apic_uv_x.c | 1 include/asm-x86/efi.h | 13 +++++ include/asm-x86/uv/bios.h | 73 +++++++++++++++------------- 4 files changed, 135 insertions(+), 53 deletions(-)
arch/x86/kernel/bios_uv.c +80 -21
@@ -1,8 +1,6 @@/* * 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
@@ -16,33 +14,94 @@* 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 +* +* Copyright (c) 2008 Silicon Graphics, Inc. All Rights Reserved. +* Copyright (c) Russ Anderson */ +#include <linux/efi.h> +#include <asm/efi.h> +#include <linux/io.h> #include <asm/uv/bios.h> -const char * -x86_bios_strerror (long status) +struct uv_systab uv_systab; + +s64 uv_bios_call (enum uv_bios_cmd which,u64 a1,u64 a2,u64 a3,u64 a4,u64 a5) { -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; +struct uv_systab *tab = &uv_systab; + +if (!tab->function) +/* +* BIOS does not support UV systab +*/ +return BIOS_STATUS_UNIMPLEMENTED ; + +return efi_call6 ((void *)__va (tab->function), + (u64 )which, a1, a2, a3, a4, a5); } -long -x86_bios_freq_base (unsigned long which,unsigned long *ticks_per_second, -unsigned long *drift_info) +s64 uv_bios_call_irqsave (enum uv_bios_cmd which,u64 a1,u64 a2,u64 a3, +u64 a4,u64 a5) { -struct uv_bios_retval isrv; +unsigned long bios_flags; +s64 ret; + +local_irq_save (bios_flags); + ret =uv_bios_call (which, a1, a2, a3, a4, a5); +local_irq_restore (bios_flags); + +return ret; +} + +s64 uv_bios_call_reentrant (enum uv_bios_cmd which,u64 a1,u64 a2,u64 a3, +u64 a4,u64 a5) +{ +s64 ret; + +preempt_disable (); + ret =uv_bios_call (which, a1, a2, a3, a4, a5); +preempt_enable (); -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; +return ret; +} + +long +x86_bios_freq_base (unsigned long clock_type,unsigned long *ticks_per_second, +unsigned long *drift_info) +{ +return uv_bios_call (UV_BIOS_FREQ_BASE , clock_type, + (u64 )ticks_per_second,0 ,0 ,0 ); }EXPORT_SYMBOL_GPL (x86_bios_freq_base); + + +#ifdef CONFIG_EFI +void uv_bios_init (void ) +{ +struct uv_systab *tab; + +if ((efi.uv_systab ==EFI_INVALID_TABLE_ADDR ) || + (efi.uv_systab == (unsigned long )NULL )) { +printk (KERN_CRIT "No EFI UV System Table.\n" ); + uv_systab.function = (unsigned long )NULL ; +return ; + } + + tab = (struct uv_systab *)ioremap (efi.uv_systab, +sizeof (struct uv_systab )); +if (strncmp (tab->signature,"UVST" ,4 ) !=0 ) +printk (KERN_ERR "bad signature in UV system table!" ); + +/* +* Copy table to permanent spot for later use. +*/ +memcpy (&uv_systab, tab,sizeof (struct uv_systab )); +iounmap (tab); + +printk (KERN_INFO "EFI UV System Table Revision %d\n" , tab->revision); +} +#else /* !CONFIG_EFI */ + +void uv_bios_init (void ) { } +#endif +
arch/x86/kernel/genx2apic_uv_x.c +1 -0
@@ -428,6 +428,7 @@ void __init uv_system_init(void) gnode_upper = (((unsigned long )node_id.s.node_id) & ~((1 << n_val) -1 )) << m_val; +uv_bios_init ();uv_rtc_init ();for_each_present_cpu (cpu) {
include/asm-x86/uv/bios.h +41 -32
100 lines not on this page · raw message
include/asm-x86/efi.h +13 -0
@@ -94,4 +94,17 @@ extern void efi_reserve_early(void);extern void efi_call_phys_prelog (void );extern void efi_call_phys_epilog (void ); +#ifndef CONFIG_EFI +/* +* IF EFI is not configured, have the EFI calls return -ENOSYS. +*/ +#define efi_call0 (_f) (-ENOSYS) +#define efi_call1 (_f, _a1) (-ENOSYS) +#define efi_call2 (_f, _a1, _a2) (-ENOSYS) +#define efi_call3 (_f, _a1, _a2, _a3) (-ENOSYS) +#define efi_call4 (_f, _a1, _a2, _a3, _a4) (-ENOSYS) +#define efi_call5 (_f, _a1, _a2, _a3, _a4, _a5) (-ENOSYS) +#define efi_call6 (_f, _a1, _a2, _a3, _a4, _a5, _a6) (-ENOSYS) +#endif /* CONFIG_EFI */ +#endif /* ASM_X86__EFI_H */
Signature · 2 lines
Russ Anderson, OS RAS/Partitioning Project Lead SGI - Silicon Graphics Inc [email protected]