[PATCH] Cleanup subarch definitions in Linux/i386
From: Zachary Amsden
Date: Wed Mar 29 2006 - 23:18:30 EST
There is some redundant code and unnecessary function calls where
inlines would be more appropriate in many of the sub-arches of i386. In
addition, some subarches do not compile with certain kernel config
options, which needed to be fixed. I have attempted to clean up the
subarch implementation of i386 by removing the requirement of
implementing a complete setup.c; instead, architectures are free to
define only the hooks they actually need in the subarch headers, by
introducing mach-xxx/mach_hooks.h and putting the generic definitions in
arch_hooks.h.
I have tested this as best as I can, and all of the subarches continue
to compile (in fact, even better with the config fixes). I don't have
all of the hardware combinations to actually test the generated kernels,
but in general, this is fairly straightforward code movement. One
liberty I took was removing the sub-arch hook for mca_nmi_handler, as it
is clear this does not apply to any other subarch than Voyager.
I created a new file, arch/i386/default.c, which has the default
functions that are appropriate for all kernel compiles, which removes
the redundant need to redefine IPI mechanisms in all architectures that
provide a setup.c file. This was required, since Voyager chooses to
override the entire functionality of smp.c.
Comments, suggestions, anything welcome. I think this is a much cleaner
approach, and both new and existing sub-architectures will benefit. I
am sorry this patch is so large, but it is very difficult to separate
into multiple steps that still allow all the subarches to compile.
Zach
Signed-off-by: Zachary Amsden <zach@xxxxxxxxxx>
Index: linux-2.6.16.1/arch/i386/Kconfig
===================================================================
--- linux-2.6.16.1.orig/arch/i386/Kconfig 2006-03-29 19:38:47.000000000 -0800
+++ linux-2.6.16.1/arch/i386/Kconfig 2006-03-29 19:38:54.000000000 -0800
@@ -218,7 +218,7 @@ config NR_CPUS
config SCHED_SMT
bool "SMT (Hyperthreading) scheduler support"
- depends on SMP
+ depends on SMP && !X86_VOYAGER
default off
help
SMT scheduler support improves the CPU scheduler's decision making
@@ -689,7 +689,7 @@ source kernel/Kconfig.hz
config KEXEC
bool "kexec system call (EXPERIMENTAL)"
- depends on EXPERIMENTAL
+ depends on EXPERIMENTAL && (!X86_VOYAGER && SMP)
help
kexec is a system call that implements the ability to shutdown your
current kernel, and to start another kernel. It is like a reboot
Index: linux-2.6.16.1/arch/i386/Makefile
===================================================================
--- linux-2.6.16.1.orig/arch/i386/Makefile 2006-03-29 19:38:47.000000000 -0800
+++ linux-2.6.16.1/arch/i386/Makefile 2006-03-29 19:38:54.000000000 -0800
@@ -45,37 +45,32 @@ CFLAGS += $(shell if [ $(call cc-vers
CFLAGS += $(cflags-y)
-# Default subarch .c files
-mcore-y := mach-default
+# Default subarch .c files (none)
+mcore-y :=
# Voyager subarch support
mflags-$(CONFIG_X86_VOYAGER) := -Iinclude/asm-i386/mach-voyager
-mcore-$(CONFIG_X86_VOYAGER) := mach-voyager
+mcore-$(CONFIG_X86_VOYAGER) := arch/i386/mach-voyager/
# VISWS subarch support
mflags-$(CONFIG_X86_VISWS) := -Iinclude/asm-i386/mach-visws
-mcore-$(CONFIG_X86_VISWS) := mach-visws
+mcore-$(CONFIG_X86_VISWS) := arch/i386/mach-visws/
# NUMAQ subarch support
mflags-$(CONFIG_X86_NUMAQ) := -Iinclude/asm-i386/mach-numaq
-mcore-$(CONFIG_X86_NUMAQ) := mach-default
# BIGSMP subarch support
mflags-$(CONFIG_X86_BIGSMP) := -Iinclude/asm-i386/mach-bigsmp
-mcore-$(CONFIG_X86_BIGSMP) := mach-default
#Summit subarch support
mflags-$(CONFIG_X86_SUMMIT) := -Iinclude/asm-i386/mach-summit
-mcore-$(CONFIG_X86_SUMMIT) := mach-default
# generic subarchitecture
mflags-$(CONFIG_X86_GENERICARCH) := -Iinclude/asm-i386/mach-generic
-mcore-$(CONFIG_X86_GENERICARCH) := mach-default
core-$(CONFIG_X86_GENERICARCH) += arch/i386/mach-generic/
# ES7000 subarch support
mflags-$(CONFIG_X86_ES7000) := -Iinclude/asm-i386/mach-es7000
-mcore-$(CONFIG_X86_ES7000) := mach-default
core-$(CONFIG_X86_ES7000) := arch/i386/mach-es7000/
# default subarch .h files
@@ -86,7 +81,7 @@ head-y := arch/i386/kernel/head.o arch/i
libs-y += arch/i386/lib/
core-y += arch/i386/kernel/ \
arch/i386/mm/ \
- arch/i386/$(mcore-y)/ \
+ $(mcore-y) \
arch/i386/crypto/
drivers-$(CONFIG_MATH_EMULATION) += arch/i386/math-emu/
drivers-$(CONFIG_PCI) += arch/i386/pci/
Index: linux-2.6.16.1/arch/i386/kernel/Makefile
===================================================================
--- linux-2.6.16.1.orig/arch/i386/kernel/Makefile 2006-03-29 19:38:47.000000000 -0800
+++ linux-2.6.16.1/arch/i386/kernel/Makefile 2006-03-29 19:38:54.000000000 -0800
@@ -7,7 +7,7 @@ extra-y := head.o init_task.o vmlinux.ld
obj-y := process.o semaphore.o signal.o entry.o traps.o irq.o \
ptrace.o time.o ioport.o ldt.o setup.o i8259.o sys_i386.o \
pci-dma.o i386_ksyms.o i387.o dmi_scan.o bootflag.o \
- quirks.o i8237.o topology.o
+ quirks.o i8237.o topology.o default.o
obj-y += cpu/
obj-y += timers/
Index: linux-2.6.16.1/arch/i386/kernel/default.c
===================================================================
--- linux-2.6.16.1.orig/arch/i386/kernel/default.c 2006-03-29 19:38:54.000000000 -0800
+++ linux-2.6.16.1/arch/i386/kernel/default.c 2006-03-29 19:38:54.000000000 -0800
@@ -0,0 +1,48 @@
+/*
+ * Default architecture definitions used by sub-arch hooks.
+ */
+
+#include <linux/config.h>
+#include <linux/smp.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <asm/arch_hooks.h>
+
+/*
+ * IRQ0 is the default timer interrupts.
+ * IRQ2 is cascade interrupt to second interrupt controller
+ */
+struct irqaction irq2 = { no_action, 0, CPU_MASK_NONE, "cascade", NULL, NULL};
+struct irqaction irq0 = { timer_interrupt, SA_INTERRUPT, CPU_MASK_NONE, "timer", NULL, NULL};
+
+
+/* These can't be moved into smp.c, as some subarchitectures override that */
+#ifdef CONFIG_SMP
+
+#ifdef CONFIG_HOTPLUG_CPU
+#define DEFAULT_SEND_IPI (1)
+#else
+#define DEFAULT_SEND_IPI (0)
+#endif
+
+int no_broadcast=DEFAULT_SEND_IPI;
+
+static __init int no_ipi_broadcast(char *str)
+{
+ get_option(&str, &no_broadcast);
+ printk ("Using %s mode\n", no_broadcast ? "No IPI Broadcast" :
+ "IPI Broadcast");
+ return 1;
+}
+
+__setup("no_ipi_broadcast", no_ipi_broadcast);
+
+static int __init print_ipi_mode(void)
+{
+ printk ("Using IPI %s mode\n", no_broadcast ? "No-Shortcut" :
+ "Shortcut");
+ return 0;
+}
+
+late_initcall(print_ipi_mode);
+#endif
Index: linux-2.6.16.1/arch/i386/kernel/i8259.c
===================================================================
--- linux-2.6.16.1.orig/arch/i386/kernel/i8259.c 2006-03-29 19:38:47.000000000 -0800
+++ linux-2.6.16.1/arch/i386/kernel/i8259.c 2006-03-29 19:38:54.000000000 -0800
@@ -419,6 +419,9 @@ void __init init_IRQ(void)
/* setup after call gates are initialised (usually add in
* the architecture specific gates)
*/
+#ifdef CONFIG_X86_LOCAL_APIC
+ apic_intr_init();
+#endif
intr_init_hook();
/*
Index: linux-2.6.16.1/arch/i386/kernel/mca.c
===================================================================
--- linux-2.6.16.1.orig/arch/i386/kernel/mca.c 2006-03-29 19:38:47.000000000 -0800
+++ linux-2.6.16.1/arch/i386/kernel/mca.c 2006-03-29 19:38:54.000000000 -0800
@@ -463,6 +463,18 @@ static int mca_handle_nmi_callback(struc
return 0;
}
+
+#ifdef CONFIG_X86_VOYAGER
+/*
+ * Voyager wants to do something smarter with NMIs. Rather than add an
+ * arch hook for this, keep the MCA code together where it is in context.
+ * No other subarch requires an MCA NMI hook, and most don't support MCA.
+ */
+extern void mca_nmi_hook(void);
+#else
+#define mca_nmi_hook() printk("NMI generated from unknown source!\n");
+#endif
+
void mca_handle_nmi(void)
{
/* First try - scan the various adapters and see if a specific
Index: linux-2.6.16.1/arch/i386/mach-default/Makefile
===================================================================
--- linux-2.6.16.1.orig/arch/i386/mach-default/Makefile 2006-03-29 19:38:47.000000000 -0800
+++ linux-2.6.16.1/arch/i386/mach-default/Makefile 2003-01-30 02:24:37.000000000 -0800
@@ -1,5 +0,0 @@
-#
-# Makefile for the linux kernel.
-#
-
-obj-y := setup.o
Index: linux-2.6.16.1/arch/i386/mach-default/setup.c
===================================================================
--- linux-2.6.16.1.orig/arch/i386/mach-default/setup.c 2006-03-29 19:38:47.000000000 -0800
+++ linux-2.6.16.1/arch/i386/mach-default/setup.c 2003-01-30 02:24:37.000000000 -0800
@@ -1,132 +0,0 @@
-/*
- * Machine specific setup for generic
- */
-
-#include <linux/config.h>
-#include <linux/smp.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <asm/acpi.h>
-#include <asm/arch_hooks.h>
-
-#ifdef CONFIG_HOTPLUG_CPU
-#define DEFAULT_SEND_IPI (1)
-#else
-#define DEFAULT_SEND_IPI (0)
-#endif
-
-int no_broadcast=DEFAULT_SEND_IPI;
-
-/**
- * pre_intr_init_hook - initialisation prior to setting up interrupt vectors
- *
- * Description:
- * Perform any necessary interrupt initialisation prior to setting up
- * the "ordinary" interrupt call gates. For legacy reasons, the ISA
- * interrupts should be initialised here if the machine emulates a PC
- * in any way.
- **/
-void __init pre_intr_init_hook(void)
-{
- init_ISA_irqs();
-}
-
-/*
- * IRQ2 is cascade interrupt to second interrupt controller
- */
-static struct irqaction irq2 = { no_action, 0, CPU_MASK_NONE, "cascade", NULL, NULL};
-
-/**
- * intr_init_hook - post gate setup interrupt initialisation
- *
- * Description:
- * Fill in any interrupts that may have been left out by the general
- * init_IRQ() routine. interrupts having to do with the machine rather
- * than the devices on the I/O bus (like APIC interrupts in intel MP
- * systems) are started here.
- **/
-void __init intr_init_hook(void)
-{
-#ifdef CONFIG_X86_LOCAL_APIC
- apic_intr_init();
-#endif
-
- if (!acpi_ioapic)
- setup_irq(2, &irq2);
-}
-
-/**
- * pre_setup_arch_hook - hook called prior to any setup_arch() execution
- *
- * Description:
- * generally used to activate any machine specific identification
- * routines that may be needed before setup_arch() runs. On VISWS
- * this is used to get the board revision and type.
- **/
-void __init pre_setup_arch_hook(void)
-{
-}
-
-/**
- * trap_init_hook - initialise system specific traps
- *
- * Description:
- * Called as the final act of trap_init(). Used in VISWS to initialise
- * the various board specific APIC traps.
- **/
-void __init trap_init_hook(void)
-{
-}
-
-static struct irqaction irq0 = { timer_interrupt, SA_INTERRUPT, CPU_MASK_NONE, "timer", NULL, NULL};
-
-/**
- * time_init_hook - do any specific initialisations for the system timer.
- *
- * Description:
- * Must plug the system timer interrupt source at HZ into the IRQ listed
- * in irq_vectors.h:TIMER_IRQ
- **/
-void __init time_init_hook(void)
-{
- setup_irq(0, &irq0);
-}
-
-#ifdef CONFIG_MCA
-/**
- * mca_nmi_hook - hook into MCA specific NMI chain
- *
- * Description:
- * The MCA (Microchannel Arcitecture) has an NMI chain for NMI sources
- * along the MCA bus. Use this to hook into that chain if you will need
- * it.
- **/
-void __init mca_nmi_hook(void)
-{
- /* If I recall correctly, there's a whole bunch of other things that
- * we can do to check for NMI problems, but that's all I know about
- * at the moment.
- */
-
- printk("NMI generated from unknown source!\n");
-}
-#endif
-
-static __init int no_ipi_broadcast(char *str)
-{
- get_option(&str, &no_broadcast);
- printk ("Using %s mode\n", no_broadcast ? "No IPI Broadcast" :
- "IPI Broadcast");
- return 1;
-}
-
-__setup("no_ipi_broadcast", no_ipi_broadcast);
-
-static int __init print_ipi_mode(void)
-{
- printk ("Using IPI %s mode\n", no_broadcast ? "No-Shortcut" :
- "Shortcut");
- return 0;
-}
-
-late_initcall(print_ipi_mode);
Index: linux-2.6.16.1/arch/i386/mach-visws/setup.c
===================================================================
--- linux-2.6.16.1.orig/arch/i386/mach-visws/setup.c 2006-03-29 19:38:47.000000000 -0800
+++ linux-2.6.16.1/arch/i386/mach-visws/setup.c 2006-03-29 19:38:54.000000000 -0800
@@ -13,8 +13,6 @@
#include "cobalt.h"
#include "piix4.h"
-int no_broadcast;
-
char visws_board_type = -1;
char visws_board_rev = -1;
@@ -94,30 +92,7 @@ void __init visws_get_board_type_and_rev
"unknown")), visws_board_rev);
}
-void __init pre_intr_init_hook(void)
-{
- init_VISWS_APIC_irqs();
-}
-
-void __init intr_init_hook(void)
-{
-#ifdef CONFIG_X86_LOCAL_APIC
- apic_intr_init();
-#endif
-}
-
-void __init pre_setup_arch_hook()
-{
- visws_get_board_type_and_rev();
-}
-
-static struct irqaction irq0 = {
- .handler = timer_interrupt,
- .flags = SA_INTERRUPT,
- .name = "timer",
-};
-
-void __init time_init_hook(void)
+void __init visws_time_init_hook(void)
{
printk(KERN_INFO "Starting Cobalt Timer system clock\n");
Index: linux-2.6.16.1/arch/i386/mach-visws/traps.c
===================================================================
--- linux-2.6.16.1.orig/arch/i386/mach-visws/traps.c 2006-03-29 19:38:47.000000000 -0800
+++ linux-2.6.16.1/arch/i386/mach-visws/traps.c 2006-03-29 19:38:54.000000000 -0800
@@ -62,7 +62,7 @@ static __init void cobalt_init(void)
co_apic_read(CO_APIC_ID));
}
-void __init trap_init_hook(void)
+void __init visws_trap_init_hook(void)
{
lithium_init();
cobalt_init();
Index: linux-2.6.16.1/arch/i386/mach-voyager/Makefile
===================================================================
--- linux-2.6.16.1.orig/arch/i386/mach-voyager/Makefile 2006-03-29 19:38:47.000000000 -0800
+++ linux-2.6.16.1/arch/i386/mach-voyager/Makefile 2006-03-29 19:38:54.000000000 -0800
@@ -3,6 +3,6 @@
#
EXTRA_CFLAGS += -I../kernel
-obj-y := setup.o voyager_basic.o voyager_thread.o
+obj-y := voyager_basic.o voyager_thread.o
obj-$(CONFIG_SMP) += voyager_smp.o voyager_cat.o
Index: linux-2.6.16.1/arch/i386/mach-voyager/setup.c
===================================================================
--- linux-2.6.16.1.orig/arch/i386/mach-voyager/setup.c 2006-03-29 19:38:47.000000000 -0800
+++ linux-2.6.16.1/arch/i386/mach-voyager/setup.c 2003-01-30 02:24:37.000000000 -0800
@@ -1,47 +0,0 @@
-/*
- * Machine specific setup for generic
- */
-
-#include <linux/config.h>
-#include <linux/init.h>
-#include <linux/interrupt.h>
-#include <asm/acpi.h>
-#include <asm/arch_hooks.h>
-
-void __init pre_intr_init_hook(void)
-{
- init_ISA_irqs();
-}
-
-/*
- * IRQ2 is cascade interrupt to second interrupt controller
- */
-static struct irqaction irq2 = { no_action, 0, CPU_MASK_NONE, "cascade", NULL, NULL};
-
-void __init intr_init_hook(void)
-{
-#ifdef CONFIG_SMP
- smp_intr_init();
-#endif
-
- if (!acpi_ioapic)
- setup_irq(2, &irq2);
-}
-
-void __init pre_setup_arch_hook(void)
-{
- /* Voyagers run their CPUs from independent clocks, so disable
- * the TSC code because we can't sync them */
- tsc_disable = 1;
-}
-
-void __init trap_init_hook(void)
-{
-}
-
-static struct irqaction irq0 = { timer_interrupt, SA_INTERRUPT, CPU_MASK_NONE, "timer", NULL, NULL};
-
-void __init time_init_hook(void)
-{
- setup_irq(0, &irq0);
-}
Index: linux-2.6.16.1/include/asm-i386/acpi.h
===================================================================
--- linux-2.6.16.1.orig/include/asm-i386/acpi.h 2006-03-29 19:38:47.000000000 -0800
+++ linux-2.6.16.1/include/asm-i386/acpi.h 2006-03-29 19:38:54.000000000 -0800
@@ -31,6 +31,7 @@
#include <acpi/pdc_intel.h>
#include <asm/system.h> /* defines cmpxchg */
+#include <asm/processor.h> /* defines boot_cpu_data */
#define COMPILER_DEPENDENT_INT64 long long
#define COMPILER_DEPENDENT_UINT64 unsigned long long
Index: linux-2.6.16.1/include/asm-i386/arch_hooks.h
===================================================================
--- linux-2.6.16.1.orig/include/asm-i386/arch_hooks.h 2006-03-29 19:38:47.000000000 -0800
+++ linux-2.6.16.1/include/asm-i386/arch_hooks.h 2006-03-29 19:38:54.000000000 -0800
@@ -1,7 +1,13 @@
#ifndef _ASM_ARCH_HOOKS_H
#define _ASM_ARCH_HOOKS_H
+#include <linux/config.h>
+#include <linux/smp.h>
+#include <linux/init.h>
#include <linux/interrupt.h>
+#include <asm/acpi.h>
+#include <asm/arch_hooks.h>
+#include <asm/desc.h>
/*
* linux/include/asm/arch_hooks.h
@@ -16,12 +22,93 @@ extern void apic_intr_init(void);
extern void smp_intr_init(void);
extern irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs);
-/* these are the defined hooks */
-extern void intr_init_hook(void);
-extern void pre_intr_init_hook(void);
-extern void pre_setup_arch_hook(void);
-extern void trap_init_hook(void);
-extern void time_init_hook(void);
-extern void mca_nmi_hook(void);
+/*
+ * There are also some generic structures used by most architectures.
+ *
+ * IRQ0 is the default timer interrupt
+ * IRQ2 is cascade interrupt to second interrupt controller
+ */
+extern struct irqaction irq0;
+extern struct irqaction irq2;
+
+static inline void legacy_intr_init_hook(void)
+{
+ if (!acpi_ioapic)
+ setup_irq(2, &irq2);
+}
+
+static inline void default_timer_init(void)
+{
+ setup_irq(0, &irq0);
+}
+
+/* include to allow sub-arch override */
+#include <mach_hooks.h>
+
+/* these are the default hooks */
+
+/**
+ * pre_intr_init_hook - initialisation prior to setting up interrupt vectors
+ *
+ * Description:
+ * Perform any necessary interrupt initialisation prior to setting up
+ * the "ordinary" interrupt call gates. For legacy reasons, the ISA
+ * interrupts should be initialised here if the machine emulates a PC
+ * in any way.
+ **/
+#ifndef pre_intr_init_hook
+#define pre_intr_init_hook() init_ISA_irqs()
+#endif
+
+
+/**
+ * intr_init_hook - post gate setup interrupt initialisation
+ *
+ * Description:
+ * Fill in any interrupts that may have been left out by the general
+ * init_IRQ() routine. interrupts having to do with the machine rather
+ * than the devices on the I/O bus (like APIC interrupts in intel MP
+ * systems) are started here.
+ **/
+#ifndef intr_init_hook
+#define intr_init_hook() legacy_intr_init_hook()
+#endif
+
+
+/**
+ * pre_setup_arch_hook - hook called prior to any setup_arch() execution
+ *
+ * Description:
+ * generally used to activate any machine specific identification
+ * routines that may be needed before setup_arch() runs. On VISWS
+ * this is used to get the board revision and type.
+ **/
+#ifndef pre_setup_arch_hook
+#define pre_setup_arch_hook()
+#endif
+
+
+/**
+ * trap_init_hook - initialise system specific traps
+ *
+ * Description:
+ * Called as the final act of trap_init(). Used in VISWS to initialise
+ * the various board specific APIC traps.
+ **/
+#ifndef trap_init_hook
+#define trap_init_hook()
+#endif
+
+
+/**
+ * time_init_hook - do any specific initialisations for the system timer.
+ *
+ * Description:
+ * Must plug the system timer interrupt source at HZ into the IRQ listed
+ * in irq_vectors.h:TIMER_IRQ
+ **/
+#ifndef time_init_hook
+#define time_init_hook() default_timer_init()
+#endif
#endif
Index: linux-2.6.16.1/include/asm-i386/mach-default/mach_hooks.h
===================================================================
--- linux-2.6.16.1.orig/include/asm-i386/mach-default/mach_hooks.h 2006-03-29 19:38:54.000000000 -0800
+++ linux-2.6.16.1/include/asm-i386/mach-default/mach_hooks.h 2006-03-29 19:38:54.000000000 -0800
@@ -0,0 +1,6 @@
+#ifndef _MACH_HOOKS_H
+#define _MACH_HOOKS_H
+
+/* Fall back to the default hooks in include/asm-i386/arch_hooks.h */
+
+#endif
Index: linux-2.6.16.1/include/asm-i386/mach-visws/mach_hooks.h
===================================================================
--- linux-2.6.16.1.orig/include/asm-i386/mach-visws/mach_hooks.h 2006-03-29 19:38:54.000000000 -0800
+++ linux-2.6.16.1/include/asm-i386/mach-visws/mach_hooks.h 2006-03-29 19:38:54.000000000 -0800
@@ -0,0 +1,15 @@
+#ifndef MACH_HOOKS_H
+#define MACH_HOOKS_H
+
+#define pre_intr_init_hook() init_VISWS_APIC_irqs()
+
+extern void visws_get_board_type_and_rev(void);
+#define pre_setup_arch_hook() visws_get_board_type_and_rev()
+
+extern void visws_time_init_hook(void);
+#define time_init_hook() visws_time_init_hook()
+
+extern void visws_trap_init_hook(void);
+#define trap_init_hook() visws_trap_init_hook()
+
+#endif
Index: linux-2.6.16.1/include/asm-i386/mach-voyager/mach_hooks.h
===================================================================
--- linux-2.6.16.1.orig/include/asm-i386/mach-voyager/mach_hooks.h 2006-03-29 19:38:54.000000000 -0800
+++ linux-2.6.16.1/include/asm-i386/mach-voyager/mach_hooks.h 2006-03-29 19:38:54.000000000 -0800
@@ -0,0 +1,38 @@
+#ifndef MACH_HOOKS_H
+#define MACH_HOOKS_H
+
+/**
+ * intr_init_hook - post gate setup interrupt initialisation
+ *
+ * Description:
+ * Fill in any interrupts that may have been left out by the general
+ * init_IRQ() routine. interrupts having to do with the machine rather
+ * than the devices on the I/O bus (like APIC interrupts in intel MP
+ * systems) are started here.
+ **/
+static inline void voyager_intr_init_hook(void)
+{
+#ifdef CONFIG_SMP
+ smp_intr_init();
+#endif
+ legacy_intr_init_hook();
+}
+
+#define intr_init_hook() voyager_intr_init_hook()
+
+
+/**
+ * pre_setup_arch_hook - hook called prior to any setup_arch() execution
+ *
+ * Description:
+ * generally used to activate any machine specific identification
+ * routines that may be needed before setup_arch() runs.
+ * Voyagers run their CPUs from independent clocks, so disable
+ * the TSC code because we can't sync them
+ **/
+#define pre_setup_arch_hook() \
+do { \
+ tsc_disable = 1; \
+} while (0)
+
+#endif