Commit 78f28b7c authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'x86-platform-for-linus' of...

Merge branch 'x86-platform-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip

* 'x86-platform-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip: (38 commits)
  x86: Move get/set_wallclock to x86_platform_ops
  x86: platform: Fix section annotations
  x86: apic namespace cleanup
  x86: Distangle ioapic and i8259
  x86: Add Moorestown early detection
  x86: Add hardware_subarch ID for Moorestown
  x86: Add early platform detection
  x86: Move tsc_init to late_time_init
  x86: Move tsc_calibration to x86_init_ops
  x86: Replace the now identical time_32/64.c by time.c
  x86: time_32/64.c unify profile_pc
  x86: Move calibrate_cpu to tsc.c
  x86: Make timer setup and global variables the same in time_32/64.c
  x86: Remove mca bus ifdef from timer interrupt
  x86: Simplify timer_ack magic in time_32.c
  x86: Prepare unification of time_32/64.c
  x86: Remove do_timer hook
  x86: Add timer_init to x86_init_ops
  x86: Move percpu clockevents setup to x86_init_ops
  x86: Move xen_post_allocator_init into xen_pagetable_setup_done
  ...

Fix up conflicts in arch/x86/include/asm/io_apic.h
parents 3240a77b 7bd867df
...@@ -599,6 +599,7 @@ Protocol: 2.07+ ...@@ -599,6 +599,7 @@ Protocol: 2.07+
0x00000000 The default x86/PC environment 0x00000000 The default x86/PC environment
0x00000001 lguest 0x00000001 lguest
0x00000002 Xen 0x00000002 Xen
0x00000003 Moorestown MID
Field name: hardware_subarch_data Field name: hardware_subarch_data
Type: write (subarch-dependent) Type: write (subarch-dependent)
......
...@@ -325,6 +325,7 @@ config X86_EXTENDED_PLATFORM ...@@ -325,6 +325,7 @@ config X86_EXTENDED_PLATFORM
SGI 320/540 (Visual Workstation) SGI 320/540 (Visual Workstation)
Summit/EXA (IBM x440) Summit/EXA (IBM x440)
Unisys ES7000 IA32 series Unisys ES7000 IA32 series
Moorestown MID devices
If you have one of these systems, or if you want to build a If you have one of these systems, or if you want to build a
generic distribution kernel, say Y here - otherwise say N. generic distribution kernel, say Y here - otherwise say N.
...@@ -384,6 +385,18 @@ config X86_ELAN ...@@ -384,6 +385,18 @@ config X86_ELAN
If unsure, choose "PC-compatible" instead. If unsure, choose "PC-compatible" instead.
config X86_MRST
bool "Moorestown MID platform"
depends on X86_32
depends on X86_EXTENDED_PLATFORM
---help---
Moorestown is Intel's Low Power Intel Architecture (LPIA) based Moblin
Internet Device(MID) platform. Moorestown consists of two chips:
Lincroft (CPU core, graphics, and memory controller) and Langwell IOH.
Unlike standard x86 PCs, Moorestown does not have many legacy devices
nor standard legacy replacement devices/features. e.g. Moorestown does
not contain i8259, i8254, HPET, legacy BIOS, most of the io ports.
config X86_RDC321X config X86_RDC321X
bool "RDC R-321x SoC" bool "RDC R-321x SoC"
depends on X86_32 depends on X86_32
......
...@@ -70,9 +70,6 @@ static inline void default_inquire_remote_apic(int apicid) ...@@ -70,9 +70,6 @@ static inline void default_inquire_remote_apic(int apicid)
*/ */
#ifdef CONFIG_PARAVIRT #ifdef CONFIG_PARAVIRT
#include <asm/paravirt.h> #include <asm/paravirt.h>
#else
#define setup_boot_clock setup_boot_APIC_clock
#define setup_secondary_clock setup_secondary_APIC_clock
#endif #endif
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
...@@ -252,6 +249,8 @@ static inline void lapic_shutdown(void) { } ...@@ -252,6 +249,8 @@ static inline void lapic_shutdown(void) { }
static inline void init_apic_mappings(void) { } static inline void init_apic_mappings(void) { }
static inline void disable_local_APIC(void) { } static inline void disable_local_APIC(void) { }
static inline void apic_disable(void) { } static inline void apic_disable(void) { }
# define setup_boot_APIC_clock x86_init_noop
# define setup_secondary_APIC_clock x86_init_noop
#endif /* !CONFIG_X86_LOCAL_APIC */ #endif /* !CONFIG_X86_LOCAL_APIC */
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
...@@ -300,7 +299,7 @@ struct apic { ...@@ -300,7 +299,7 @@ struct apic {
int (*cpu_present_to_apicid)(int mps_cpu); int (*cpu_present_to_apicid)(int mps_cpu);
physid_mask_t (*apicid_to_cpu_present)(int phys_apicid); physid_mask_t (*apicid_to_cpu_present)(int phys_apicid);
void (*setup_portio_remap)(void); void (*setup_portio_remap)(void);
int (*check_phys_apicid_present)(int boot_cpu_physical_apicid); int (*check_phys_apicid_present)(int phys_apicid);
void (*enable_apic_mode)(void); void (*enable_apic_mode)(void);
int (*phys_pkg_id)(int cpuid_apic, int index_msb); int (*phys_pkg_id)(int cpuid_apic, int index_msb);
...@@ -434,7 +433,7 @@ extern struct apic apic_x2apic_uv_x; ...@@ -434,7 +433,7 @@ extern struct apic apic_x2apic_uv_x;
DECLARE_PER_CPU(int, x2apic_extra_bits); DECLARE_PER_CPU(int, x2apic_extra_bits);
extern int default_cpu_present_to_apicid(int mps_cpu); extern int default_cpu_present_to_apicid(int mps_cpu);
extern int default_check_phys_apicid_present(int boot_cpu_physical_apicid); extern int default_check_phys_apicid_present(int phys_apicid);
#endif #endif
static inline void default_wait_for_init_deassert(atomic_t *deassert) static inline void default_wait_for_init_deassert(atomic_t *deassert)
...@@ -550,9 +549,9 @@ static inline int __default_cpu_present_to_apicid(int mps_cpu) ...@@ -550,9 +549,9 @@ static inline int __default_cpu_present_to_apicid(int mps_cpu)
} }
static inline int static inline int
__default_check_phys_apicid_present(int boot_cpu_physical_apicid) __default_check_phys_apicid_present(int phys_apicid)
{ {
return physid_isset(boot_cpu_physical_apicid, phys_cpu_present_map); return physid_isset(phys_apicid, phys_cpu_present_map);
} }
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
...@@ -562,13 +561,13 @@ static inline int default_cpu_present_to_apicid(int mps_cpu) ...@@ -562,13 +561,13 @@ static inline int default_cpu_present_to_apicid(int mps_cpu)
} }
static inline int static inline int
default_check_phys_apicid_present(int boot_cpu_physical_apicid) default_check_phys_apicid_present(int phys_apicid)
{ {
return __default_check_phys_apicid_present(boot_cpu_physical_apicid); return __default_check_phys_apicid_present(phys_apicid);
} }
#else #else
extern int default_cpu_present_to_apicid(int mps_cpu); extern int default_cpu_present_to_apicid(int mps_cpu);
extern int default_check_phys_apicid_present(int boot_cpu_physical_apicid); extern int default_check_phys_apicid_present(int phys_apicid);
#endif #endif
static inline physid_mask_t default_apicid_to_cpu_present(int phys_apicid) static inline physid_mask_t default_apicid_to_cpu_present(int phys_apicid)
......
...@@ -110,4 +110,14 @@ struct boot_params { ...@@ -110,4 +110,14 @@ struct boot_params {
__u8 _pad9[276]; /* 0xeec */ __u8 _pad9[276]; /* 0xeec */
} __attribute__((packed)); } __attribute__((packed));
enum {
X86_SUBARCH_PC = 0,
X86_SUBARCH_LGUEST,
X86_SUBARCH_XEN,
X86_SUBARCH_MRST,
X86_NR_SUBARCHS,
};
#endif /* _ASM_X86_BOOTPARAM_H */ #endif /* _ASM_X86_BOOTPARAM_H */
/* defines for inline arch setup functions */
#include <linux/clockchips.h>
#include <asm/i8259.h>
#include <asm/i8253.h>
/**
* do_timer_interrupt_hook - hook into timer tick
*
* Call the pit clock event handler. see asm/i8253.h
**/
static inline void do_timer_interrupt_hook(void)
{
global_clock_event->event_handler(global_clock_event);
}
...@@ -126,8 +126,6 @@ extern void e820_reserve_resources(void); ...@@ -126,8 +126,6 @@ extern void e820_reserve_resources(void);
extern void e820_reserve_resources_late(void); extern void e820_reserve_resources_late(void);
extern void setup_memory_map(void); extern void setup_memory_map(void);
extern char *default_machine_specific_memory_setup(void); extern char *default_machine_specific_memory_setup(void);
extern char *machine_specific_memory_setup(void);
extern char *memory_setup(void);
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#ifndef ASM_X86__HYPERVISOR_H #ifndef ASM_X86__HYPERVISOR_H
#define ASM_X86__HYPERVISOR_H #define ASM_X86__HYPERVISOR_H
extern unsigned long get_hypervisor_tsc_freq(void);
extern void init_hypervisor(struct cpuinfo_x86 *c); extern void init_hypervisor(struct cpuinfo_x86 *c);
extern void init_hypervisor_platform(void);
#endif #endif
...@@ -143,6 +143,8 @@ extern int noioapicreroute; ...@@ -143,6 +143,8 @@ extern int noioapicreroute;
/* 1 if the timer IRQ uses the '8259A Virtual Wire' mode */ /* 1 if the timer IRQ uses the '8259A Virtual Wire' mode */
extern int timer_through_8259; extern int timer_through_8259;
extern void io_apic_disable_legacy(void);
/* /*
* If we use the IO-APIC for IRQ routing, disable automatic * If we use the IO-APIC for IRQ routing, disable automatic
* assignment of PCI IRQ's. * assignment of PCI IRQ's.
...@@ -176,6 +178,7 @@ extern int setup_ioapic_entry(int apic, int irq, ...@@ -176,6 +178,7 @@ extern int setup_ioapic_entry(int apic, int irq,
int polarity, int vector, int pin); int polarity, int vector, int pin);
extern void ioapic_write_entry(int apic, int pin, extern void ioapic_write_entry(int apic, int pin,
struct IO_APIC_route_entry e); struct IO_APIC_route_entry e);
extern void setup_ioapic_ids_from_mpc(void);
struct mp_ioapic_gsi{ struct mp_ioapic_gsi{
int gsi_base; int gsi_base;
...@@ -187,12 +190,14 @@ int mp_find_ioapic_pin(int ioapic, int gsi); ...@@ -187,12 +190,14 @@ int mp_find_ioapic_pin(int ioapic, int gsi);
void __init mp_register_ioapic(int id, u32 address, u32 gsi_base); void __init mp_register_ioapic(int id, u32 address, u32 gsi_base);
#else /* !CONFIG_X86_IO_APIC */ #else /* !CONFIG_X86_IO_APIC */
#define io_apic_assign_pci_irqs 0 #define io_apic_assign_pci_irqs 0
#define setup_ioapic_ids_from_mpc x86_init_noop
static const int timer_through_8259 = 0; static const int timer_through_8259 = 0;
static inline void ioapic_init_mappings(void) { } static inline void ioapic_init_mappings(void) { }
static inline void ioapic_insert_resources(void) { } static inline void ioapic_insert_resources(void) { }
static inline void probe_nr_irqs_gsi(void) { } static inline void probe_nr_irqs_gsi(void) { }
#endif #endif
#endif /* _ASM_X86_IO_APIC_H */ #endif /* _ASM_X86_IO_APIC_H */
...@@ -37,7 +37,6 @@ extern void fixup_irqs(void); ...@@ -37,7 +37,6 @@ extern void fixup_irqs(void);
#endif #endif
extern void (*generic_interrupt_extension)(void); extern void (*generic_interrupt_extension)(void);
extern void init_IRQ(void);
extern void native_init_IRQ(void); extern void native_init_IRQ(void);
extern bool handle_irq(unsigned irq, struct pt_regs *regs); extern bool handle_irq(unsigned irq, struct pt_regs *regs);
...@@ -47,4 +46,6 @@ extern unsigned int do_IRQ(struct pt_regs *regs); ...@@ -47,4 +46,6 @@ extern unsigned int do_IRQ(struct pt_regs *regs);
extern DECLARE_BITMAP(used_vectors, NR_VECTORS); extern DECLARE_BITMAP(used_vectors, NR_VECTORS);
extern int vector_used_by_percpu_irq(unsigned int vector); extern int vector_used_by_percpu_irq(unsigned int vector);
extern void init_ISA_irqs(void);
#endif /* _ASM_X86_IRQ_H */ #endif /* _ASM_X86_IRQ_H */
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <asm/mpspec_def.h> #include <asm/mpspec_def.h>
#include <asm/x86_init.h>
extern int apic_version[MAX_APICS]; extern int apic_version[MAX_APICS];
extern int pic_mode; extern int pic_mode;
...@@ -41,9 +42,6 @@ extern int quad_local_to_mp_bus_id [NR_CPUS/4][4]; ...@@ -41,9 +42,6 @@ extern int quad_local_to_mp_bus_id [NR_CPUS/4][4];
#endif /* CONFIG_X86_64 */ #endif /* CONFIG_X86_64 */
extern void early_find_smp_config(void);
extern void early_get_smp_config(void);
#if defined(CONFIG_MCA) || defined(CONFIG_EISA) #if defined(CONFIG_MCA) || defined(CONFIG_EISA)
extern int mp_bus_id_to_type[MAX_MP_BUSSES]; extern int mp_bus_id_to_type[MAX_MP_BUSSES];
#endif #endif
...@@ -52,20 +50,55 @@ extern DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES); ...@@ -52,20 +50,55 @@ extern DECLARE_BITMAP(mp_bus_not_pci, MAX_MP_BUSSES);
extern unsigned int boot_cpu_physical_apicid; extern unsigned int boot_cpu_physical_apicid;
extern unsigned int max_physical_apicid; extern unsigned int max_physical_apicid;
extern int smp_found_config;
extern int mpc_default_type; extern int mpc_default_type;
extern unsigned long mp_lapic_addr; extern unsigned long mp_lapic_addr;
extern void get_smp_config(void); #ifdef CONFIG_X86_LOCAL_APIC
extern int smp_found_config;
#else
# define smp_found_config 0
#endif
static inline void get_smp_config(void)
{
x86_init.mpparse.get_smp_config(0);
}
static inline void early_get_smp_config(void)
{
x86_init.mpparse.get_smp_config(1);
}
static inline void find_smp_config(void)
{
x86_init.mpparse.find_smp_config(1);
}
static inline void early_find_smp_config(void)
{
x86_init.mpparse.find_smp_config(0);
}
#ifdef CONFIG_X86_MPPARSE #ifdef CONFIG_X86_MPPARSE
extern void find_smp_config(void);
extern void early_reserve_e820_mpc_new(void); extern void early_reserve_e820_mpc_new(void);
extern int enable_update_mptable; extern int enable_update_mptable;
extern int default_mpc_apic_id(struct mpc_cpu *m);
extern void default_smp_read_mpc_oem(struct mpc_table *mpc);
# ifdef CONFIG_X86_IO_APIC
extern void default_mpc_oem_bus_info(struct mpc_bus *m, char *str);
# else
# define default_mpc_oem_bus_info NULL
# endif
extern void default_find_smp_config(unsigned int reserve);
extern void default_get_smp_config(unsigned int early);
#else #else
static inline void find_smp_config(void) { }
static inline void early_reserve_e820_mpc_new(void) { } static inline void early_reserve_e820_mpc_new(void) { }
#define enable_update_mptable 0 #define enable_update_mptable 0
#define default_mpc_apic_id NULL
#define default_smp_read_mpc_oem NULL
#define default_mpc_oem_bus_info NULL
#define default_find_smp_config x86_init_uint_noop
#define default_get_smp_config x86_init_uint_noop
#endif #endif
void __cpuinit generic_processor_info(int apicid, int version); void __cpuinit generic_processor_info(int apicid, int version);
......
...@@ -24,22 +24,6 @@ static inline void load_sp0(struct tss_struct *tss, ...@@ -24,22 +24,6 @@ static inline void load_sp0(struct tss_struct *tss,
PVOP_VCALL2(pv_cpu_ops.load_sp0, tss, thread); PVOP_VCALL2(pv_cpu_ops.load_sp0, tss, thread);
} }
#define ARCH_SETUP pv_init_ops.arch_setup();
static inline unsigned long get_wallclock(void)
{
return PVOP_CALL0(unsigned long, pv_time_ops.get_wallclock);
}
static inline int set_wallclock(unsigned long nowtime)
{
return PVOP_CALL1(int, pv_time_ops.set_wallclock, nowtime);
}
static inline void (*choose_time_init(void))(void)
{
return pv_time_ops.time_init;
}
/* The paravirtualized CPUID instruction. */ /* The paravirtualized CPUID instruction. */
static inline void __cpuid(unsigned int *eax, unsigned int *ebx, static inline void __cpuid(unsigned int *eax, unsigned int *ebx,
unsigned int *ecx, unsigned int *edx) unsigned int *ecx, unsigned int *edx)
...@@ -245,7 +229,6 @@ static inline unsigned long long paravirt_sched_clock(void) ...@@ -245,7 +229,6 @@ static inline unsigned long long paravirt_sched_clock(void)
{ {
return PVOP_CALL0(unsigned long long, pv_time_ops.sched_clock); return PVOP_CALL0(unsigned long long, pv_time_ops.sched_clock);
} }
#define calibrate_tsc() (pv_time_ops.get_tsc_khz())
static inline unsigned long long paravirt_read_pmc(int counter) static inline unsigned long long paravirt_read_pmc(int counter)
{ {
...@@ -363,34 +346,6 @@ static inline void slow_down_io(void) ...@@ -363,34 +346,6 @@ static inline void slow_down_io(void)
#endif #endif
} }
#ifdef CONFIG_X86_LOCAL_APIC
static inline void setup_boot_clock(void)
{
PVOP_VCALL0(pv_apic_ops.setup_boot_clock);
}
static inline void setup_secondary_clock(void)
{
PVOP_VCALL0(pv_apic_ops.setup_secondary_clock);
}
#endif
static inline void paravirt_post_allocator_init(void)
{
if (pv_init_ops.post_allocator_init)
(*pv_init_ops.post_allocator_init)();
}
static inline void paravirt_pagetable_setup_start(pgd_t *base)
{
(*pv_mmu_ops.pagetable_setup_start)(base);
}
static inline void paravirt_pagetable_setup_done(pgd_t *base)
{
(*pv_mmu_ops.pagetable_setup_done)(base);
}
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
static inline void startup_ipi_hook(int phys_apicid, unsigned long start_eip, static inline void startup_ipi_hook(int phys_apicid, unsigned long start_eip,
unsigned long start_esp) unsigned long start_esp)
...@@ -948,6 +903,8 @@ static inline unsigned long __raw_local_irq_save(void) ...@@ -948,6 +903,8 @@ static inline unsigned long __raw_local_irq_save(void)
#undef PVOP_VCALL4 #undef PVOP_VCALL4
#undef PVOP_CALL4 #undef PVOP_CALL4
extern void default_banner(void);
#else /* __ASSEMBLY__ */ #else /* __ASSEMBLY__ */
#define _PVSITE(ptype, clobbers, ops, word, algn) \ #define _PVSITE(ptype, clobbers, ops, word, algn) \
...@@ -1088,5 +1045,7 @@ static inline unsigned long __raw_local_irq_save(void) ...@@ -1088,5 +1045,7 @@ static inline unsigned long __raw_local_irq_save(void)
#endif /* CONFIG_X86_32 */ #endif /* CONFIG_X86_32 */
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#endif /* CONFIG_PARAVIRT */ #else /* CONFIG_PARAVIRT */
# define default_banner x86_init_noop
#endif /* !CONFIG_PARAVIRT */
#endif /* _ASM_X86_PARAVIRT_H */ #endif /* _ASM_X86_PARAVIRT_H */
...@@ -78,14 +78,6 @@ struct pv_init_ops { ...@@ -78,14 +78,6 @@ struct pv_init_ops {
*/ */
unsigned (*patch)(u8 type, u16 clobber, void *insnbuf, unsigned (*patch)(u8 type, u16 clobber, void *insnbuf,
unsigned long addr, unsigned len); unsigned long addr, unsigned len);
/* Basic arch-specific setup */
void (*arch_setup)(void);
char *(*memory_setup)(void);
void (*post_allocator_init)(void);
/* Print a banner to identify the environment */
void (*banner)(void);
}; };
...@@ -96,12 +88,6 @@ struct pv_lazy_ops { ...@@ -96,12 +88,6 @@ struct pv_lazy_ops {
}; };
struct pv_time_ops { struct pv_time_ops {
void (*time_init)(void);
/* Set and set time of day */
unsigned long (*get_wallclock)(void);
int (*set_wallclock)(unsigned long);
unsigned long long (*sched_clock)(void); unsigned long long (*sched_clock)(void);
unsigned long (*get_tsc_khz)(void); unsigned long (*get_tsc_khz)(void);
}; };
...@@ -203,8 +189,6 @@ struct pv_cpu_ops { ...@@ -203,8 +189,6 @@ struct pv_cpu_ops {
}; };
struct pv_irq_ops { struct pv_irq_ops {
void (*init_IRQ)(void);
/* /*
* Get/set interrupt state. save_fl and restore_fl are only * Get/set interrupt state. save_fl and restore_fl are only
* expected to use X86_EFLAGS_IF; all other bits * expected to use X86_EFLAGS_IF; all other bits
...@@ -229,9 +213,6 @@ struct pv_irq_ops { ...@@ -229,9 +213,6 @@ struct pv_irq_ops {
struct pv_apic_ops { struct pv_apic_ops {
#ifdef CONFIG_X86_LOCAL_APIC #ifdef CONFIG_X86_LOCAL_APIC
void (*setup_boot_clock)(void);
void (*setup_secondary_clock)(void);
void (*startup_ipi_hook)(int phys_apicid, void (*startup_ipi_hook)(int phys_apicid,
unsigned long start_eip, unsigned long start_eip,
unsigned long start_esp); unsigned long start_esp);
...@@ -239,15 +220,6 @@ struct pv_apic_ops { ...@@ -239,15 +220,6 @@ struct pv_apic_ops {
}; };
struct pv_mmu_ops { struct pv_mmu_ops {
/*
* Called before/after init_mm pagetable setup. setup_start
* may reset %cr3, and may pre-install parts of the pagetable;
* pagetable setup is expected to preserve any existing
* mapping.
*/
void (*pagetable_setup_start)(pgd_t *pgd_base);
void (*pagetable_setup_done)(pgd_t *pgd_base);
unsigned long (*read_cr2)(void); unsigned long (*read_cr2)(void);
void (*write_cr2)(unsigned long); void (*write_cr2)(unsigned long);
......
...@@ -56,16 +56,6 @@ extern struct list_head pgd_list; ...@@ -56,16 +56,6 @@ extern struct list_head pgd_list;
#define pte_update(mm, addr, ptep) do { } while (0) #define pte_update(mm, addr, ptep) do { } while (0)
#define pte_update_defer(mm, addr, ptep) do { } while (0) #define pte_update_defer(mm, addr, ptep) do { } while (0)
static inline void __init paravirt_pagetable_setup_start(pgd_t *base)
{
native_pagetable_setup_start(base);
}
static inline void __init paravirt_pagetable_setup_done(pgd_t *base)
{
native_pagetable_setup_done(base);
}
#define pgd_val(x) native_pgd_val(x) #define pgd_val(x) native_pgd_val(x)
#define __pgd(x) native_make_pgd(x) #define __pgd(x) native_make_pgd(x)
......
...@@ -299,8 +299,8 @@ void set_pte_vaddr(unsigned long vaddr, pte_t pte); ...@@ -299,8 +299,8 @@ void set_pte_vaddr(unsigned long vaddr, pte_t pte);
extern void native_pagetable_setup_start(pgd_t *base); extern void native_pagetable_setup_start(pgd_t *base);
extern void native_pagetable_setup_done(pgd_t *base); extern void native_pagetable_setup_done(pgd_t *base);
#else #else
static inline void native_pagetable_setup_start(pgd_t *base) {} #define native_pagetable_setup_start x86_init_pgd_noop
static inline void native_pagetable_setup_done(pgd_t *base) {} #define native_pagetable_setup_done x86_init_pgd_noop
#endif #endif
struct seq_file; struct seq_file;
......
...@@ -5,43 +5,6 @@ ...@@ -5,43 +5,6 @@
#define COMMAND_LINE_SIZE 2048 #define COMMAND_LINE_SIZE 2048
#ifndef __ASSEMBLY__
/*
* Any setup quirks to be performed?
*/
struct mpc_cpu;
struct mpc_bus;
struct mpc_oemtable;
struct x86_quirks {
int (*arch_pre_time_init)(void);
int (*arch_time_init)(void);
int (*arch_pre_intr_init)(void);
int (*arch_intr_init)(void);
int (*arch_trap_init)(void);
char * (*arch_memory_setup)(void);
int (*mach_get_smp_config)(unsigned int early);
int (*mach_find_smp_config)(unsigned int reserve);
int *mpc_record;
int (*mpc_apic_id)(struct mpc_cpu *m);
void (*mpc_oem_bus_info)(struct mpc_bus *m, char *name);
void (*mpc_oem_pci_bus)(struct mpc_bus *m);
void (*smp_read_mpc_oem)(struct mpc_oemtable *oemtable,
unsigned short oemsize);
int (*setup_ioapic_ids)(void);
};
extern void x86_quirk_intr_init(void);
extern void x86_quirk_trap_init(void);
extern void x86_quirk_pre_time_init(void);
extern void x86_quirk_time_init(void);
#endif /* __ASSEMBLY__ */
#ifdef __i386__ #ifdef __i386__
#include <linux/pfn.h> #include <linux/pfn.h>
...@@ -61,6 +24,7 @@ extern void x86_quirk_time_init(void); ...@@ -61,6 +24,7 @@ extern void x86_quirk_time_init(void);
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
#include <asm/bootparam.h> #include <asm/bootparam.h>
#include <asm/x86_init.h>
/* Interrupt control for vSMPowered x86_64 systems */ /* Interrupt control for vSMPowered x86_64 systems */
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
...@@ -79,11 +43,16 @@ static inline void visws_early_detect(void) { } ...@@ -79,11 +43,16 @@ static inline void visws_early_detect(void) { }
static inline int is_visws_box(void) { return 0; } static inline int is_visws_box(void) { return 0; }
#endif #endif
extern struct x86_quirks *x86_quirks;
extern unsigned long saved_video_mode; extern unsigned long saved_video_mode;
#ifndef CONFIG_PARAVIRT extern void reserve_standard_io_resources(void);
#define paravirt_post_allocator_init() do {} while (0) extern void i386_reserve_resources(void);
extern void setup_default_timer_irq(void);
#ifdef CONFIG_X86_MRST
extern void x86_mrst_early_setup(void);
#else
static inline void x86_mrst_early_setup(void) { }
#endif #endif
#ifndef _SETUP #ifndef _SETUP
......
...@@ -4,60 +4,7 @@ ...@@ -4,60 +4,7 @@
extern void hpet_time_init(void); extern void hpet_time_init(void);
#include <asm/mc146818rtc.h> #include <asm/mc146818rtc.h>
#ifdef CONFIG_X86_32
#include <linux/efi.h>
static inline unsigned long native_get_wallclock(void)
{
unsigned long retval;
if (efi_enabled)
retval = efi_get_time();
else
retval = mach_get_cmos_time();
return retval;
}
static inline int native_set_wallclock(unsigned long nowtime)
{
int retval;
if (efi_enabled)
retval = efi_set_rtc_mmss(nowtime);
else
retval = mach_set_rtc_mmss(nowtime);
return retval;
}
#else
extern void native_time_init_hook(void);
static inline unsigned long native_get_wallclock(void)
{
return mach_get_cmos_time();
}
static inline int native_set_wallclock(unsigned long nowtime)
{
return mach_set_rtc_mmss(nowtime);
}
#endif
extern void time_init(void); extern void time_init(void);
#ifdef CONFIG_PARAVIRT
#include <asm/paravirt.h>
#else /* !CONFIG_PARAVIRT */
#define get_wallclock() native_get_wallclock()
#define set_wallclock(x) native_set_wallclock(x)
#define choose_time_init() hpet_time_init
#endif /* CONFIG_PARAVIRT */
extern unsigned long __init calibrate_cpu(void);
#endif /* _ASM_X86_TIME_H */ #endif /* _ASM_X86_TIME_H */
...@@ -8,20 +8,16 @@ ...@@ -8,20 +8,16 @@
#define TICK_SIZE (tick_nsec / 1000) #define TICK_SIZE (tick_nsec / 1000)
unsigned long long native_sched_clock(void); unsigned long long native_sched_clock(void);
unsigned long native_calibrate_tsc(void); extern int recalibrate_cpu_khz(void);
#ifdef CONFIG_X86_32 #if defined(CONFIG_X86_32) && defined(CONFIG_X86_IO_APIC)
extern int timer_ack; extern int timer_ack;
extern irqreturn_t timer_interrupt(int irq, void *dev_id); #else
#endif /* CONFIG_X86_32 */ # define timer_ack (0)
extern int recalibrate_cpu_khz(void); #endif
extern int no_timer_check; extern int no_timer_check;
#ifndef CONFIG_PARAVIRT
#define calibrate_tsc() native_calibrate_tsc()
#endif
/* Accelerators for sched_clock() /* Accelerators for sched_clock()
* convert from cycles(64bits) => nanoseconds (64bits) * convert from cycles(64bits) => nanoseconds (64bits)
* basic equation: * basic equation:
......
...@@ -48,7 +48,8 @@ static __always_inline cycles_t vget_cycles(void) ...@@ -48,7 +48,8 @@ static __always_inline cycles_t vget_cycles(void)
extern void tsc_init(void); extern void tsc_init(void);
extern void mark_tsc_unstable(char *reason); extern void mark_tsc_unstable(char *reason);
extern int unsynchronized_tsc(void); extern int unsynchronized_tsc(void);
int check_tsc_unstable(void); extern int check_tsc_unstable(void);
extern unsigned long native_calibrate_tsc(void);
/* /*
* Boot-time check whether the TSCs are synchronized across * Boot-time check whether the TSCs are synchronized across
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
#ifndef ASM_X86__VMWARE_H #ifndef ASM_X86__VMWARE_H
#define ASM_X86__VMWARE_H #define ASM_X86__VMWARE_H
extern unsigned long vmware_get_tsc_khz(void); extern void vmware_platform_setup(void);
extern int vmware_platform(void); extern int vmware_platform(void);
extern void vmware_set_feature_bits(struct cpuinfo_x86 *c); extern void vmware_set_feature_bits(struct cpuinfo_x86 *c);
......
#ifndef _ASM_X86_PLATFORM_H
#define _ASM_X86_PLATFORM_H
#include <asm/pgtable_types.h>
#include <asm/bootparam.h>
struct mpc_bus;
struct mpc_cpu;
struct mpc_table;
/**
* struct x86_init_mpparse - platform specific mpparse ops
* @mpc_record: platform specific mpc record accounting
* @setup_ioapic_ids: platform specific ioapic id override
* @mpc_apic_id: platform specific mpc apic id assignment
* @smp_read_mpc_oem: platform specific oem mpc table setup
* @mpc_oem_pci_bus: platform specific pci bus setup (default NULL)
* @mpc_oem_bus_info: platform specific mpc bus info
* @find_smp_config: find the smp configuration
* @get_smp_config: get the smp configuration
*/
struct x86_init_mpparse {
void (*mpc_record)(unsigned int mode);
void (*setup_ioapic_ids)(void);
int (*mpc_apic_id)(struct mpc_cpu *m);
void (*smp_read_mpc_oem)(struct mpc_table *mpc);
void (*mpc_oem_pci_bus)(struct mpc_bus *m);
void (*mpc_oem_bus_info)(struct mpc_bus *m, char *name);
void (*find_smp_config)(unsigned int reserve);
void (*get_smp_config)(unsigned int early);
};
/**
* struct x86_init_resources - platform specific resource related ops
* @probe_roms: probe BIOS roms
* @reserve_resources: reserve the standard resources for the
* platform
* @memory_setup: platform specific memory setup
*
*/
struct x86_init_resources {
void (*probe_roms)(void);
void (*reserve_resources)(void);
char *(*memory_setup)(void);
};
/**
* struct x86_init_irqs - platform specific interrupt setup
* @pre_vector_init: init code to run before interrupt vectors
* are set up.
* @intr_init: interrupt init code
* @trap_init: platform specific trap setup
*/
struct x86_init_irqs {
void (*pre_vector_init)(void);
void (*intr_init)(void);
void (*trap_init)(void);
};
/**
* struct x86_init_oem - oem platform specific customizing functions
* @arch_setup: platform specific architecure setup
* @banner: print a platform specific banner
*/
struct x86_init_oem {
void (*arch_setup)(void);
void (*banner)(void);
};
/**
* struct x86_init_paging - platform specific paging functions
* @pagetable_setup_start: platform specific pre paging_init() call
* @pagetable_setup_done: platform specific post paging_init() call
*/
struct x86_init_paging {
void (*pagetable_setup_start)(pgd_t *base);
void (*pagetable_setup_done)(pgd_t *base);
};
/**
* struct x86_init_timers - platform specific timer setup
* @setup_perpcu_clockev: set up the per cpu clock event device for the
* boot cpu
* @tsc_pre_init: platform function called before TSC init
* @timer_init: initialize the platform timer (default PIT/HPET)
*/
struct x86_init_timers {
void (*setup_percpu_clockev)(void);
void (*tsc_pre_init)(void);
void (*timer_init)(void);
};
/**
* struct x86_init_ops - functions for platform specific setup
*
*/
struct x86_init_ops {
struct x86_init_resources resources;
struct x86_init_mpparse mpparse;
struct x86_init_irqs irqs;
struct x86_init_oem oem;
struct x86_init_paging paging;
struct x86_init_timers timers;
};
/**
* struct x86_cpuinit_ops - platform specific cpu hotplug setups
* @setup_percpu_clockev: set up the per cpu clock event device
*/
struct x86_cpuinit_ops {
void (*setup_percpu_clockev)(void);
};
/**
* struct x86_platform_ops - platform specific runtime functions
* @calibrate_tsc: calibrate TSC
* @get_wallclock: get time from HW clock like RTC etc.
* @set_wallclock: set time back to HW clock
*/
struct x86_platform_ops {
unsigned long (*calibrate_tsc)(void);
unsigned long (*get_wallclock)(void);
int (*set_wallclock)(unsigned long nowtime);
};
extern struct x86_init_ops x86_init;
extern struct x86_cpuinit_ops x86_cpuinit;
extern struct x86_platform_ops x86_platform;
extern void x86_init_noop(void);
extern void x86_init_uint_noop(unsigned int unused);
#endif
...@@ -31,8 +31,8 @@ GCOV_PROFILE_paravirt.o := n ...@@ -31,8 +31,8 @@ GCOV_PROFILE_paravirt.o := n
obj-y := process_$(BITS).o signal.o entry_$(BITS).o obj-y := process_$(BITS).o signal.o entry_$(BITS).o
obj-y += traps.o irq.o irq_$(BITS).o dumpstack_$(BITS).o obj-y += traps.o irq.o irq_$(BITS).o dumpstack_$(BITS).o
obj-y += time_$(BITS).o ioport.o ldt.o dumpstack.o obj-y += time.o ioport.o ldt.o dumpstack.o
obj-y += setup.o i8259.o irqinit.o obj-y += setup.o x86_init.o i8259.o irqinit.o
obj-$(CONFIG_X86_VISWS) += visws_quirks.o obj-$(CONFIG_X86_VISWS) += visws_quirks.o
obj-$(CONFIG_X86_32) += probe_roms_32.o obj-$(CONFIG_X86_32) += probe_roms_32.o
obj-$(CONFIG_X86_32) += sys_i386_32.o i386_ksyms_32.o obj-$(CONFIG_X86_32) += sys_i386_32.o i386_ksyms_32.o
...@@ -105,6 +105,7 @@ obj-$(CONFIG_SCx200) += scx200.o ...@@ -105,6 +105,7 @@ obj-$(CONFIG_SCx200) += scx200.o
scx200-y += scx200_32.o scx200-y += scx200_32.o
obj-$(CONFIG_OLPC) += olpc.o obj-$(CONFIG_OLPC) += olpc.o
obj-$(CONFIG_X86_MRST) += mrst.o
microcode-y := microcode_core.o microcode-y := microcode_core.o
microcode-$(CONFIG_MICROCODE_INTEL) += microcode_intel.o microcode-$(CONFIG_MICROCODE_INTEL) += microcode_intel.o
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#include <linux/mm.h> #include <linux/mm.h>
#include <asm/perf_counter.h> #include <asm/perf_counter.h>
#include <asm/x86_init.h>
#include <asm/pgalloc.h> #include <asm/pgalloc.h>
#include <asm/atomic.h> #include <asm/atomic.h>
#include <asm/mpspec.h> #include <asm/mpspec.h>
...@@ -1709,7 +1710,7 @@ int __init APIC_init_uniprocessor(void) ...@@ -1709,7 +1710,7 @@ int __init APIC_init_uniprocessor(void)
localise_nmi_watchdog(); localise_nmi_watchdog();
#endif #endif
setup_boot_clock(); x86_init.timers.setup_percpu_clockev();
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
check_nmi_watchdog(); check_nmi_watchdog();
#endif #endif
......
...@@ -112,7 +112,7 @@ static physid_mask_t bigsmp_ioapic_phys_id_map(physid_mask_t phys_map) ...@@ -112,7 +112,7 @@ static physid_mask_t bigsmp_ioapic_phys_id_map(physid_mask_t phys_map)
return physids_promote(0xFFL); return physids_promote(0xFFL);
} }
static int bigsmp_check_phys_apicid_present(int boot_cpu_physical_apicid) static int bigsmp_check_phys_apicid_present(int phys_apicid)
{ {
return 1; return 1;
} }
......
...@@ -96,6 +96,11 @@ struct mpc_intsrc mp_irqs[MAX_IRQ_SOURCES]; ...@@ -96,6 +96,11 @@ struct mpc_intsrc mp_irqs[MAX_IRQ_SOURCES];
/* # of MP IRQ source entries */ /* # of MP IRQ source entries */
int mp_irq_entries; int mp_irq_entries;
/* Number of legacy interrupts */
static int nr_legacy_irqs __read_mostly = NR_IRQS_LEGACY;
/* GSI interrupts */
static int nr_irqs_gsi = NR_IRQS_LEGACY;
#if defined (CONFIG_MCA) || defined (CONFIG_EISA) #if defined (CONFIG_MCA) || defined (CONFIG_EISA)
int mp_bus_id_to_type[MAX_MP_BUSSES]; int mp_bus_id_to_type[MAX_MP_BUSSES];
#endif #endif
...@@ -173,6 +178,12 @@ static struct irq_cfg irq_cfgx[NR_IRQS] = { ...@@ -173,6 +178,12 @@ static struct irq_cfg irq_cfgx[NR_IRQS] = {
[15] = { .vector = IRQ15_VECTOR, }, [15] = { .vector = IRQ15_VECTOR, },
}; };
void __init io_apic_disable_legacy(void)
{
nr_legacy_irqs = 0;
nr_irqs_gsi = 0;
}
int __init arch_early_irq_init(void) int __init arch_early_irq_init(void)
{ {
struct irq_cfg *cfg; struct irq_cfg *cfg;
...@@ -190,7 +201,7 @@ int __init arch_early_irq_init(void) ...@@ -190,7 +201,7 @@ int __init arch_early_irq_init(void)
desc->chip_data = &cfg[i]; desc->chip_data = &cfg[i];
zalloc_cpumask_var_node(&cfg[i].domain, GFP_NOWAIT, node); zalloc_cpumask_var_node(&cfg[i].domain, GFP_NOWAIT, node);
zalloc_cpumask_var_node(&cfg[i].old_domain, GFP_NOWAIT, node); zalloc_cpumask_var_node(&cfg[i].old_domain, GFP_NOWAIT, node);
if (i < NR_IRQS_LEGACY) if (i < nr_legacy_irqs)
cpumask_setall(cfg[i].domain); cpumask_setall(cfg[i].domain);
} }
...@@ -867,7 +878,7 @@ static int __init find_isa_irq_apic(int irq, int type) ...@@ -867,7 +878,7 @@ static int __init find_isa_irq_apic(int irq, int type)
*/ */
static int EISA_ELCR(unsigned int irq) static int EISA_ELCR(unsigned int irq)
{ {
if (irq < NR_IRQS_LEGACY) { if (irq < nr_legacy_irqs) {
unsigned int port = 0x4d0 + (irq >> 3); unsigned int port = 0x4d0 + (irq >> 3);
return (inb(port) >> (irq & 7)) & 1; return (inb(port) >> (irq & 7)) & 1;
} }
...@@ -1464,7 +1475,7 @@ static void setup_IO_APIC_irq(int apic_id, int pin, unsigned int irq, struct irq ...@@ -1464,7 +1475,7 @@ static void setup_IO_APIC_irq(int apic_id, int pin, unsigned int irq, struct irq
} }
ioapic_register_intr(irq, desc, trigger); ioapic_register_intr(irq, desc, trigger);
if (irq < NR_IRQS_LEGACY) if (irq < nr_legacy_irqs)
disable_8259A_irq(irq); disable_8259A_irq(irq);
ioapic_write_entry(apic_id, pin, entry); ioapic_write_entry(apic_id, pin, entry);
...@@ -1831,7 +1842,7 @@ __apicdebuginit(void) print_PIC(void) ...@@ -1831,7 +1842,7 @@ __apicdebuginit(void) print_PIC(void)
unsigned int v; unsigned int v;
unsigned long flags; unsigned long flags;
if (apic_verbosity == APIC_QUIET) if (apic_verbosity == APIC_QUIET || !nr_legacy_irqs)
return; return;
printk(KERN_DEBUG "\nprinting PIC contents\n"); printk(KERN_DEBUG "\nprinting PIC contents\n");
...@@ -1894,6 +1905,10 @@ void __init enable_IO_APIC(void) ...@@ -1894,6 +1905,10 @@ void __init enable_IO_APIC(void)
spin_unlock_irqrestore(&ioapic_lock, flags); spin_unlock_irqrestore(&ioapic_lock, flags);
nr_ioapic_registers[apic] = reg_01.bits.entries+1; nr_ioapic_registers[apic] = reg_01.bits.entries+1;
} }
if (!nr_legacy_irqs)
return;
for(apic = 0; apic < nr_ioapics; apic++) { for(apic = 0; apic < nr_ioapics; apic++) {
int pin; int pin;
/* See if any of the pins is in ExtINT mode */ /* See if any of the pins is in ExtINT mode */
...@@ -1948,6 +1963,9 @@ void disable_IO_APIC(void) ...@@ -1948,6 +1963,9 @@ void disable_IO_APIC(void)
*/ */
clear_IO_APIC(); clear_IO_APIC();
if (!nr_legacy_irqs)
return;
/* /*
* If the i8259 is routed through an IOAPIC * If the i8259 is routed through an IOAPIC
* Put that IOAPIC in virtual wire mode * Put that IOAPIC in virtual wire mode
...@@ -1994,7 +2012,7 @@ void disable_IO_APIC(void) ...@@ -1994,7 +2012,7 @@ void disable_IO_APIC(void)
* by Matt Domsch <Matt_Domsch@dell.com> Tue Dec 21 12:25:05 CST 1999 * by Matt Domsch <Matt_Domsch@dell.com> Tue Dec 21 12:25:05 CST 1999
*/ */
static void __init setup_ioapic_ids_from_mpc(void) void __init setup_ioapic_ids_from_mpc(void)
{ {
union IO_APIC_reg_00 reg_00; union IO_APIC_reg_00 reg_00;
physid_mask_t phys_id_present_map; physid_mask_t phys_id_present_map;
...@@ -2003,9 +2021,8 @@ static void __init setup_ioapic_ids_from_mpc(void) ...@@ -2003,9 +2021,8 @@ static void __init setup_ioapic_ids_from_mpc(void)
unsigned char old_id; unsigned char old_id;
unsigned long flags; unsigned long flags;
if (x86_quirks->setup_ioapic_ids && x86_quirks->setup_ioapic_ids()) if (acpi_ioapic)
return; return;
/* /*
* Don't check I/O APIC IDs for xAPIC systems. They have * Don't check I/O APIC IDs for xAPIC systems. They have
* no meaning without the serial APIC bus. * no meaning without the serial APIC bus.
...@@ -2179,7 +2196,7 @@ static unsigned int startup_ioapic_irq(unsigned int irq) ...@@ -2179,7 +2196,7 @@ static unsigned int startup_ioapic_irq(unsigned int irq)
struct irq_cfg *cfg; struct irq_cfg *cfg;
spin_lock_irqsave(&ioapic_lock, flags); spin_lock_irqsave(&ioapic_lock, flags);
if (irq < NR_IRQS_LEGACY) { if (irq < nr_legacy_irqs) {
disable_8259A_irq(irq); disable_8259A_irq(irq);
if (i8259A_irq_pending(irq)) if (i8259A_irq_pending(irq))
was_pending = 1; was_pending = 1;
...@@ -2657,7 +2674,7 @@ static inline void init_IO_APIC_traps(void) ...@@ -2657,7 +2674,7 @@ static inline void init_IO_APIC_traps(void)
* so default to an old-fashioned 8259 * so default to an old-fashioned 8259
* interrupt if we can.. * interrupt if we can..
*/ */
if (irq < NR_IRQS_LEGACY) if (irq < nr_legacy_irqs)
make_8259A_irq(irq); make_8259A_irq(irq);
else else
/* Strange. Oh, well.. */ /* Strange. Oh, well.. */
...@@ -2993,7 +3010,7 @@ static inline void __init check_timer(void) ...@@ -2993,7 +3010,7 @@ static inline void __init check_timer(void)
* the I/O APIC in all cases now. No actual device should request * the I/O APIC in all cases now. No actual device should request
* it anyway. --macro * it anyway. --macro
*/ */
#define PIC_IRQS (1 << PIC_CASCADE_IR) #define PIC_IRQS (1UL << PIC_CASCADE_IR)
void __init setup_IO_APIC(void) void __init setup_IO_APIC(void)
{ {
...@@ -3001,20 +3018,18 @@ void __init setup_IO_APIC(void) ...@@ -3001,20 +3018,18 @@ void __init setup_IO_APIC(void)
/* /*
* calling enable_IO_APIC() is moved to setup_local_APIC for BP * calling enable_IO_APIC() is moved to setup_local_APIC for BP
*/ */
io_apic_irqs = nr_legacy_irqs ? ~PIC_IRQS : ~0UL;
io_apic_irqs = ~PIC_IRQS;
apic_printk(APIC_VERBOSE, "ENABLING IO-APIC IRQs\n"); apic_printk(APIC_VERBOSE, "ENABLING IO-APIC IRQs\n");
/* /*
* Set up IO-APIC IRQ routing. * Set up IO-APIC IRQ routing.
*/ */
#ifdef CONFIG_X86_32 x86_init.mpparse.setup_ioapic_ids();
if (!acpi_ioapic)
setup_ioapic_ids_from_mpc();
#endif
sync_Arb_IDs(); sync_Arb_IDs();
setup_IO_APIC_irqs(); setup_IO_APIC_irqs();
init_IO_APIC_traps(); init_IO_APIC_traps();
if (nr_legacy_irqs)
check_timer(); check_timer();
} }
...@@ -3116,7 +3131,6 @@ static int __init ioapic_init_sysfs(void) ...@@ -3116,7 +3131,6 @@ static int __init ioapic_init_sysfs(void)
device_initcall(ioapic_init_sysfs); device_initcall(ioapic_init_sysfs);
static int nr_irqs_gsi = NR_IRQS_LEGACY;
/* /*
* Dynamic irq allocate and deallocation * Dynamic irq allocate and deallocation
*/ */
...@@ -3856,7 +3870,7 @@ static int __io_apic_set_pci_routing(struct device *dev, int irq, ...@@ -3856,7 +3870,7 @@ static int __io_apic_set_pci_routing(struct device *dev, int irq,
/* /*
* IRQs < 16 are already in the irq_2_pin[] map * IRQs < 16 are already in the irq_2_pin[] map
*/ */
if (irq >= NR_IRQS_LEGACY) { if (irq >= nr_legacy_irqs) {
cfg = desc->chip_data; cfg = desc->chip_data;
if (add_pin_to_irq_node_nopanic(cfg, node, ioapic, pin)) { if (add_pin_to_irq_node_nopanic(cfg, node, ioapic, pin)) {
printk(KERN_INFO "can not add pin %d for irq %d\n", printk(KERN_INFO "can not add pin %d for irq %d\n",
......
...@@ -66,7 +66,6 @@ struct mpc_trans { ...@@ -66,7 +66,6 @@ struct mpc_trans {
unsigned short trans_reserved; unsigned short trans_reserved;
}; };
/* x86_quirks member */
static int mpc_record; static int mpc_record;
static struct mpc_trans *translation_table[MAX_MPC_ENTRY]; static struct mpc_trans *translation_table[MAX_MPC_ENTRY];
...@@ -130,10 +129,9 @@ void __cpuinit numaq_tsc_disable(void) ...@@ -130,10 +129,9 @@ void __cpuinit numaq_tsc_disable(void)
} }
} }
static int __init numaq_pre_time_init(void) static void __init numaq_tsc_init(void)
{ {
numaq_tsc_disable(); numaq_tsc_disable();
return 0;
} }
static inline int generate_logical_apicid(int quad, int phys_apicid) static inline int generate_logical_apicid(int quad, int phys_apicid)
...@@ -177,6 +175,19 @@ static void mpc_oem_pci_bus(struct mpc_bus *m) ...@@ -177,6 +175,19 @@ static void mpc_oem_pci_bus(struct mpc_bus *m)
quad_local_to_mp_bus_id[quad][local] = m->busid; quad_local_to_mp_bus_id[quad][local] = m->busid;
} }
/*
* Called from mpparse code.
* mode = 0: prescan
* mode = 1: one mpc entry scanned
*/
static void numaq_mpc_record(unsigned int mode)
{
if (!mode)
mpc_record = 0;
else
mpc_record++;
}
static void __init MP_translation_info(struct mpc_trans *m) static void __init MP_translation_info(struct mpc_trans *m)
{ {
printk(KERN_INFO printk(KERN_INFO
...@@ -206,9 +217,9 @@ static int __init mpf_checksum(unsigned char *mp, int len) ...@@ -206,9 +217,9 @@ static int __init mpf_checksum(unsigned char *mp, int len)
/* /*
* Read/parse the MPC oem tables * Read/parse the MPC oem tables
*/ */
static void __init static void __init smp_read_mpc_oem(struct mpc_table *mpc)
smp_read_mpc_oem(struct mpc_oemtable *oemtable, unsigned short oemsize)
{ {
struct mpc_oemtable *oemtable = (void *)(long)mpc->oemptr;
int count = sizeof(*oemtable); /* the header size */ int count = sizeof(*oemtable); /* the header size */
unsigned char *oemptr = ((unsigned char *)oemtable) + count; unsigned char *oemptr = ((unsigned char *)oemtable) + count;
...@@ -250,29 +261,6 @@ static void __init ...@@ -250,29 +261,6 @@ static void __init
} }
} }
static int __init numaq_setup_ioapic_ids(void)
{
/* so can skip it */
return 1;
}
static struct x86_quirks numaq_x86_quirks __initdata = {
.arch_pre_time_init = numaq_pre_time_init,
.arch_time_init = NULL,
.arch_pre_intr_init = NULL,
.arch_memory_setup = NULL,
.arch_intr_init = NULL,
.arch_trap_init = NULL,
.mach_get_smp_config = NULL,
.mach_find_smp_config = NULL,
.mpc_record = &mpc_record,
.mpc_apic_id = mpc_apic_id,
.mpc_oem_bus_info = mpc_oem_bus_info,
.mpc_oem_pci_bus = mpc_oem_pci_bus,
.smp_read_mpc_oem = smp_read_mpc_oem,
.setup_ioapic_ids = numaq_setup_ioapic_ids,
};
static __init void early_check_numaq(void) static __init void early_check_numaq(void)
{ {
/* /*
...@@ -286,8 +274,15 @@ static __init void early_check_numaq(void) ...@@ -286,8 +274,15 @@ static __init void early_check_numaq(void)
if (smp_found_config) if (smp_found_config)
early_get_smp_config(); early_get_smp_config();
if (found_numaq) if (found_numaq) {
x86_quirks = &numaq_x86_quirks; x86_init.mpparse.mpc_record = numaq_mpc_record;
x86_init.mpparse.setup_ioapic_ids = x86_init_noop;
x86_init.mpparse.mpc_apic_id = mpc_apic_id;
x86_init.mpparse.smp_read_mpc_oem = smp_read_mpc_oem;
x86_init.mpparse.mpc_oem_pci_bus = mpc_oem_pci_bus;
x86_init.mpparse.mpc_oem_bus_info = mpc_oem_bus_info;
x86_init.timers.tsc_pre_init = numaq_tsc_init;
}
} }
int __init get_memcfg_numaq(void) int __init get_memcfg_numaq(void)
...@@ -418,7 +413,7 @@ static inline physid_mask_t numaq_apicid_to_cpu_present(int logical_apicid) ...@@ -418,7 +413,7 @@ static inline physid_mask_t numaq_apicid_to_cpu_present(int logical_apicid)
/* Where the IO area was mapped on multiquad, always 0 otherwise */ /* Where the IO area was mapped on multiquad, always 0 otherwise */
void *xquad_portio; void *xquad_portio;
static inline int numaq_check_phys_apicid_present(int boot_cpu_physical_apicid) static inline int numaq_check_phys_apicid_present(int phys_apicid)
{ {
return 1; return 1;
} }
......
...@@ -272,7 +272,7 @@ static physid_mask_t summit_apicid_to_cpu_present(int apicid) ...@@ -272,7 +272,7 @@ static physid_mask_t summit_apicid_to_cpu_present(int apicid)
return physid_mask_of_physid(0); return physid_mask_of_physid(0);
} }
static int summit_check_phys_apicid_present(int boot_cpu_physical_apicid) static int summit_check_phys_apicid_present(int physical_apicid)
{ {
return 1; return 1;
} }
......
...@@ -34,13 +34,6 @@ detect_hypervisor_vendor(struct cpuinfo_x86 *c) ...@@ -34,13 +34,6 @@ detect_hypervisor_vendor(struct cpuinfo_x86 *c)
c->x86_hyper_vendor = X86_HYPER_VENDOR_NONE; c->x86_hyper_vendor = X86_HYPER_VENDOR_NONE;
} }
unsigned long get_hypervisor_tsc_freq(void)
{
if (boot_cpu_data.x86_hyper_vendor == X86_HYPER_VENDOR_VMWARE)
return vmware_get_tsc_khz();
return 0;
}
static inline void __cpuinit static inline void __cpuinit
hypervisor_set_feature_bits(struct cpuinfo_x86 *c) hypervisor_set_feature_bits(struct cpuinfo_x86 *c)
{ {
...@@ -55,3 +48,10 @@ void __cpuinit init_hypervisor(struct cpuinfo_x86 *c) ...@@ -55,3 +48,10 @@ void __cpuinit init_hypervisor(struct cpuinfo_x86 *c)
detect_hypervisor_vendor(c); detect_hypervisor_vendor(c);
hypervisor_set_feature_bits(c); hypervisor_set_feature_bits(c);
} }
void __init init_hypervisor_platform(void)
{
init_hypervisor(&boot_cpu_data);
if (boot_cpu_data.x86_hyper_vendor == X86_HYPER_VENDOR_VMWARE)
vmware_platform_setup();
}
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <linux/dmi.h> #include <linux/dmi.h>
#include <asm/div64.h> #include <asm/div64.h>
#include <asm/vmware.h> #include <asm/vmware.h>
#include <asm/x86_init.h>
#define CPUID_VMWARE_INFO_LEAF 0x40000000 #define CPUID_VMWARE_INFO_LEAF 0x40000000
#define VMWARE_HYPERVISOR_MAGIC 0x564D5868 #define VMWARE_HYPERVISOR_MAGIC 0x564D5868
...@@ -47,21 +48,29 @@ static inline int __vmware_platform(void) ...@@ -47,21 +48,29 @@ static inline int __vmware_platform(void)
return eax != (uint32_t)-1 && ebx == VMWARE_HYPERVISOR_MAGIC; return eax != (uint32_t)-1 && ebx == VMWARE_HYPERVISOR_MAGIC;
} }
static unsigned long __vmware_get_tsc_khz(void) static unsigned long vmware_get_tsc_khz(void)
{ {
uint64_t tsc_hz; uint64_t tsc_hz;
uint32_t eax, ebx, ecx, edx; uint32_t eax, ebx, ecx, edx;
VMWARE_PORT(GETHZ, eax, ebx, ecx, edx); VMWARE_PORT(GETHZ, eax, ebx, ecx, edx);
if (ebx == UINT_MAX)
return 0;
tsc_hz = eax | (((uint64_t)ebx) << 32); tsc_hz = eax | (((uint64_t)ebx) << 32);
do_div(tsc_hz, 1000); do_div(tsc_hz, 1000);
BUG_ON(tsc_hz >> 32); BUG_ON(tsc_hz >> 32);
return tsc_hz; return tsc_hz;
} }
void __init vmware_platform_setup(void)
{
uint32_t eax, ebx, ecx, edx;
VMWARE_PORT(GETHZ, eax, ebx, ecx, edx);
if (ebx != UINT_MAX)
x86_platform.calibrate_tsc = vmware_get_tsc_khz;
}
/* /*
* While checking the dmi string infomation, just checking the product * While checking the dmi string infomation, just checking the product
* serial key should be enough, as this will always have a VMware * serial key should be enough, as this will always have a VMware
...@@ -87,12 +96,6 @@ int vmware_platform(void) ...@@ -87,12 +96,6 @@ int vmware_platform(void)
return 0; return 0;
} }
unsigned long vmware_get_tsc_khz(void)
{
BUG_ON(!vmware_platform());
return __vmware_get_tsc_khz();
}
/* /*
* VMware hypervisor takes care of exporting a reliable TSC to the guest. * VMware hypervisor takes care of exporting a reliable TSC to the guest.
* Still, due to timing difference when running on virtual cpus, the TSC can * Still, due to timing difference when running on virtual cpus, the TSC can
......
...@@ -1455,28 +1455,11 @@ char *__init default_machine_specific_memory_setup(void) ...@@ -1455,28 +1455,11 @@ char *__init default_machine_specific_memory_setup(void)
return who; return who;
} }
char *__init __attribute__((weak)) machine_specific_memory_setup(void)
{
if (x86_quirks->arch_memory_setup) {
char *who = x86_quirks->arch_memory_setup();
if (who)
return who;
}
return default_machine_specific_memory_setup();
}
/* Overridden in paravirt.c if CONFIG_PARAVIRT */
char * __init __attribute__((weak)) memory_setup(void)
{
return machine_specific_memory_setup();
}
void __init setup_memory_map(void) void __init setup_memory_map(void)
{ {
char *who; char *who;
who = memory_setup(); who = x86_init.resources.memory_setup();
memcpy(&e820_saved, &e820, sizeof(struct e820map)); memcpy(&e820_saved, &e820, sizeof(struct e820map));
printk(KERN_INFO "BIOS-provided physical RAM map:\n"); printk(KERN_INFO "BIOS-provided physical RAM map:\n");
e820_print_map(who); e820_print_map(who);
......
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
#include <asm/time.h> #include <asm/time.h>
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
#include <asm/x86_init.h>
#define EFI_DEBUG 1 #define EFI_DEBUG 1
#define PFX "EFI: " #define PFX "EFI: "
...@@ -453,6 +454,9 @@ void __init efi_init(void) ...@@ -453,6 +454,9 @@ void __init efi_init(void)
if (add_efi_memmap) if (add_efi_memmap)
do_add_efi_memmap(); do_add_efi_memmap();
x86_platform.get_wallclock = efi_get_time;
x86_platform.set_wallclock = efi_set_rtc_mmss;
/* Setup for EFI runtime service */ /* Setup for EFI runtime service */
reboot_type = BOOT_EFI; reboot_type = BOOT_EFI;
......
...@@ -11,8 +11,21 @@ ...@@ -11,8 +11,21 @@
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/sections.h> #include <asm/sections.h>
#include <asm/e820.h> #include <asm/e820.h>
#include <asm/bios_ebda.h> #include <asm/page.h>
#include <asm/trampoline.h> #include <asm/trampoline.h>
#include <asm/apic.h>
#include <asm/io_apic.h>
#include <asm/bios_ebda.h>
static void __init i386_default_early_setup(void)
{
/* Initilize 32bit specific setup functions */
x86_init.resources.probe_roms = probe_roms;
x86_init.resources.reserve_resources = i386_reserve_resources;
x86_init.mpparse.setup_ioapic_ids = setup_ioapic_ids_from_mpc;
reserve_ebda_region();
}
void __init i386_start_kernel(void) void __init i386_start_kernel(void)
{ {
...@@ -29,7 +42,16 @@ void __init i386_start_kernel(void) ...@@ -29,7 +42,16 @@ void __init i386_start_kernel(void)
reserve_early(ramdisk_image, ramdisk_end, "RAMDISK"); reserve_early(ramdisk_image, ramdisk_end, "RAMDISK");
} }
#endif #endif
reserve_ebda_region();
/* Call the subarch specific early setup function */
switch (boot_params.hdr.hardware_subarch) {
case X86_SUBARCH_MRST:
x86_mrst_early_setup();
break;
default:
i386_default_early_setup();
break;
}
/* /*
* At this point everything still needed from the boot loader * At this point everything still needed from the boot loader
......
...@@ -23,8 +23,8 @@ ...@@ -23,8 +23,8 @@
#include <asm/sections.h> #include <asm/sections.h>
#include <asm/kdebug.h> #include <asm/kdebug.h>
#include <asm/e820.h> #include <asm/e820.h>
#include <asm/bios_ebda.h>
#include <asm/trampoline.h> #include <asm/trampoline.h>
#include <asm/bios_ebda.h>
static void __init zap_identity_mappings(void) static void __init zap_identity_mappings(void)
{ {
......
...@@ -157,6 +157,7 @@ subarch_entries: ...@@ -157,6 +157,7 @@ subarch_entries:
.long default_entry /* normal x86/PC */ .long default_entry /* normal x86/PC */
.long lguest_entry /* lguest hypervisor */ .long lguest_entry /* lguest hypervisor */
.long xen_entry /* Xen hypervisor */ .long xen_entry /* Xen hypervisor */
.long default_entry /* Moorestown MID */
num_subarch_entries = (. - subarch_entries) / 4 num_subarch_entries = (. - subarch_entries) / 4
.previous .previous
#endif /* CONFIG_PARAVIRT */ #endif /* CONFIG_PARAVIRT */
......
...@@ -116,7 +116,7 @@ int vector_used_by_percpu_irq(unsigned int vector) ...@@ -116,7 +116,7 @@ int vector_used_by_percpu_irq(unsigned int vector)
return 0; return 0;
} }
static void __init init_ISA_irqs(void) void __init init_ISA_irqs(void)
{ {
int i; int i;
...@@ -140,8 +140,10 @@ static void __init init_ISA_irqs(void) ...@@ -140,8 +140,10 @@ static void __init init_ISA_irqs(void)
} }
} }
/* Overridden in paravirt.c */ void __init init_IRQ(void)
void init_IRQ(void) __attribute__((weak, alias("native_init_IRQ"))); {
x86_init.irqs.intr_init();
}
static void __init smp_intr_init(void) static void __init smp_intr_init(void)
{ {
...@@ -213,32 +215,12 @@ static void __init apic_intr_init(void) ...@@ -213,32 +215,12 @@ static void __init apic_intr_init(void)
#endif #endif
} }
/**
* x86_quirk_pre_intr_init - 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.
**/
static void __init x86_quirk_pre_intr_init(void)
{
#ifdef CONFIG_X86_32
if (x86_quirks->arch_pre_intr_init) {
if (x86_quirks->arch_pre_intr_init())
return;
}
#endif
init_ISA_irqs();
}
void __init native_init_IRQ(void) void __init native_init_IRQ(void)
{ {
int i; int i;
/* Execute any quirks before the call gates are initialised: */ /* Execute any quirks before the call gates are initialised: */
x86_quirk_pre_intr_init(); x86_init.irqs.pre_vector_init();
apic_intr_init(); apic_intr_init();
...@@ -257,12 +239,6 @@ void __init native_init_IRQ(void) ...@@ -257,12 +239,6 @@ void __init native_init_IRQ(void)
setup_irq(2, &irq2); setup_irq(2, &irq2);
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
/*
* Call quirks after call gates are initialised (usually add in
* the architecture specific gates):
*/
x86_quirk_intr_init();
/* /*
* External FPU? Set up irq13 if so, for * External FPU? Set up irq13 if so, for
* original braindamaged IBM FERR coupling. * original braindamaged IBM FERR coupling.
......
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
#include <asm/msr.h> #include <asm/msr.h>
#include <asm/apic.h> #include <asm/apic.h>
#include <linux/percpu.h> #include <linux/percpu.h>
#include <asm/x86_init.h>
#include <asm/reboot.h> #include <asm/reboot.h>
#define KVM_SCALE 22 #define KVM_SCALE 22
...@@ -182,12 +184,13 @@ void __init kvmclock_init(void) ...@@ -182,12 +184,13 @@ void __init kvmclock_init(void)
if (kvmclock && kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE)) { if (kvmclock && kvm_para_has_feature(KVM_FEATURE_CLOCKSOURCE)) {
if (kvm_register_clock("boot clock")) if (kvm_register_clock("boot clock"))
return; return;
pv_time_ops.get_wallclock = kvm_get_wallclock;
pv_time_ops.set_wallclock = kvm_set_wallclock;
pv_time_ops.sched_clock = kvm_clock_read; pv_time_ops.sched_clock = kvm_clock_read;
pv_time_ops.get_tsc_khz = kvm_get_tsc_khz; x86_platform.calibrate_tsc = kvm_get_tsc_khz;
x86_platform.get_wallclock = kvm_get_wallclock;
x86_platform.set_wallclock = kvm_set_wallclock;
#ifdef CONFIG_X86_LOCAL_APIC #ifdef CONFIG_X86_LOCAL_APIC
pv_apic_ops.setup_secondary_clock = kvm_setup_secondary_clock; x86_cpuinit.setup_percpu_clockev =
kvm_setup_secondary_clock;
#endif #endif
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
smp_ops.smp_prepare_boot_cpu = kvm_smp_prepare_boot_cpu; smp_ops.smp_prepare_boot_cpu = kvm_smp_prepare_boot_cpu;
......
...@@ -45,6 +45,11 @@ static int __init mpf_checksum(unsigned char *mp, int len) ...@@ -45,6 +45,11 @@ static int __init mpf_checksum(unsigned char *mp, int len)
return sum & 0xFF; return sum & 0xFF;
} }
int __init default_mpc_apic_id(struct mpc_cpu *m)
{
return m->apicid;
}
static void __init MP_processor_info(struct mpc_cpu *m) static void __init MP_processor_info(struct mpc_cpu *m)
{ {
int apicid; int apicid;
...@@ -55,10 +60,7 @@ static void __init MP_processor_info(struct mpc_cpu *m) ...@@ -55,10 +60,7 @@ static void __init MP_processor_info(struct mpc_cpu *m)
return; return;
} }
if (x86_quirks->mpc_apic_id) apicid = x86_init.mpparse.mpc_apic_id(m);
apicid = x86_quirks->mpc_apic_id(m);
else
apicid = m->apicid;
if (m->cpuflag & CPU_BOOTPROCESSOR) { if (m->cpuflag & CPU_BOOTPROCESSOR) {
bootup_cpu = " (Bootup-CPU)"; bootup_cpu = " (Bootup-CPU)";
...@@ -70,16 +72,18 @@ static void __init MP_processor_info(struct mpc_cpu *m) ...@@ -70,16 +72,18 @@ static void __init MP_processor_info(struct mpc_cpu *m)
} }
#ifdef CONFIG_X86_IO_APIC #ifdef CONFIG_X86_IO_APIC
static void __init MP_bus_info(struct mpc_bus *m) void __init default_mpc_oem_bus_info(struct mpc_bus *m, char *str)
{ {
char str[7];
memcpy(str, m->bustype, 6); memcpy(str, m->bustype, 6);
str[6] = 0; str[6] = 0;
if (x86_quirks->mpc_oem_bus_info)
x86_quirks->mpc_oem_bus_info(m, str);
else
apic_printk(APIC_VERBOSE, "Bus #%d is %s\n", m->busid, str); apic_printk(APIC_VERBOSE, "Bus #%d is %s\n", m->busid, str);
}
static void __init MP_bus_info(struct mpc_bus *m)
{
char str[7];
x86_init.mpparse.mpc_oem_bus_info(m, str);
#if MAX_MP_BUSSES < 256 #if MAX_MP_BUSSES < 256
if (m->busid >= MAX_MP_BUSSES) { if (m->busid >= MAX_MP_BUSSES) {
...@@ -96,8 +100,8 @@ static void __init MP_bus_info(struct mpc_bus *m) ...@@ -96,8 +100,8 @@ static void __init MP_bus_info(struct mpc_bus *m)
mp_bus_id_to_type[m->busid] = MP_BUS_ISA; mp_bus_id_to_type[m->busid] = MP_BUS_ISA;
#endif #endif
} else if (strncmp(str, BUSTYPE_PCI, sizeof(BUSTYPE_PCI) - 1) == 0) { } else if (strncmp(str, BUSTYPE_PCI, sizeof(BUSTYPE_PCI) - 1) == 0) {
if (x86_quirks->mpc_oem_pci_bus) if (x86_init.mpparse.mpc_oem_pci_bus)
x86_quirks->mpc_oem_pci_bus(m); x86_init.mpparse.mpc_oem_pci_bus(m);
clear_bit(m->busid, mp_bus_not_pci); clear_bit(m->busid, mp_bus_not_pci);
#if defined(CONFIG_EISA) || defined(CONFIG_MCA) #if defined(CONFIG_EISA) || defined(CONFIG_MCA)
...@@ -291,6 +295,8 @@ static void __init smp_dump_mptable(struct mpc_table *mpc, unsigned char *mpt) ...@@ -291,6 +295,8 @@ static void __init smp_dump_mptable(struct mpc_table *mpc, unsigned char *mpt)
1, mpc, mpc->length, 1); 1, mpc, mpc->length, 1);
} }
void __init default_smp_read_mpc_oem(struct mpc_table *mpc) { }
static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early) static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early)
{ {
char str[16]; char str[16];
...@@ -312,16 +318,13 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early) ...@@ -312,16 +318,13 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early)
if (early) if (early)
return 1; return 1;
if (mpc->oemptr && x86_quirks->smp_read_mpc_oem) { if (mpc->oemptr)
struct mpc_oemtable *oem_table = (void *)(long)mpc->oemptr; x86_init.mpparse.smp_read_mpc_oem(mpc);
x86_quirks->smp_read_mpc_oem(oem_table, mpc->oemsize);
}
/* /*
* Now process the configuration blocks. * Now process the configuration blocks.
*/ */
if (x86_quirks->mpc_record) x86_init.mpparse.mpc_record(0);
*x86_quirks->mpc_record = 0;
while (count < mpc->length) { while (count < mpc->length) {
switch (*mpt) { switch (*mpt) {
...@@ -353,8 +356,7 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early) ...@@ -353,8 +356,7 @@ static int __init smp_read_mpc(struct mpc_table *mpc, unsigned early)
count = mpc->length; count = mpc->length;
break; break;
} }
if (x86_quirks->mpc_record) x86_init.mpparse.mpc_record(1);
(*x86_quirks->mpc_record)++;
} }
#ifdef CONFIG_X86_BIGSMP #ifdef CONFIG_X86_BIGSMP
...@@ -608,7 +610,7 @@ static int __init check_physptr(struct mpf_intel *mpf, unsigned int early) ...@@ -608,7 +610,7 @@ static int __init check_physptr(struct mpf_intel *mpf, unsigned int early)
/* /*
* Scan the memory blocks for an SMP configuration block. * Scan the memory blocks for an SMP configuration block.
*/ */
static void __init __get_smp_config(unsigned int early) void __init default_get_smp_config(unsigned int early)
{ {
struct mpf_intel *mpf = mpf_found; struct mpf_intel *mpf = mpf_found;
...@@ -625,11 +627,6 @@ static void __init __get_smp_config(unsigned int early) ...@@ -625,11 +627,6 @@ static void __init __get_smp_config(unsigned int early)
if (acpi_lapic && acpi_ioapic) if (acpi_lapic && acpi_ioapic)
return; return;
if (x86_quirks->mach_get_smp_config) {
if (x86_quirks->mach_get_smp_config(early))
return;
}
printk(KERN_INFO "Intel MultiProcessor Specification v1.%d\n", printk(KERN_INFO "Intel MultiProcessor Specification v1.%d\n",
mpf->specification); mpf->specification);
#if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86_32) #if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86_32)
...@@ -670,16 +667,6 @@ static void __init __get_smp_config(unsigned int early) ...@@ -670,16 +667,6 @@ static void __init __get_smp_config(unsigned int early)
*/ */
} }
void __init early_get_smp_config(void)
{
__get_smp_config(1);
}
void __init get_smp_config(void)
{
__get_smp_config(0);
}
static void __init smp_reserve_bootmem(struct mpf_intel *mpf) static void __init smp_reserve_bootmem(struct mpf_intel *mpf)
{ {
unsigned long size = get_mpc_size(mpf->physptr); unsigned long size = get_mpc_size(mpf->physptr);
...@@ -745,14 +732,10 @@ static int __init smp_scan_config(unsigned long base, unsigned long length, ...@@ -745,14 +732,10 @@ static int __init smp_scan_config(unsigned long base, unsigned long length,
return 0; return 0;
} }
static void __init __find_smp_config(unsigned int reserve) void __init default_find_smp_config(unsigned int reserve)
{ {
unsigned int address; unsigned int address;
if (x86_quirks->mach_find_smp_config) {
if (x86_quirks->mach_find_smp_config(reserve))
return;
}
/* /*
* FIXME: Linux assumes you have 640K of base ram.. * FIXME: Linux assumes you have 640K of base ram..
* this continues the error... * this continues the error...
...@@ -787,16 +770,6 @@ static void __init __find_smp_config(unsigned int reserve) ...@@ -787,16 +770,6 @@ static void __init __find_smp_config(unsigned int reserve)
smp_scan_config(address, 0x400, reserve); smp_scan_config(address, 0x400, reserve);
} }
void __init early_find_smp_config(void)
{
__find_smp_config(0);
}
void __init find_smp_config(void)
{
__find_smp_config(1);
}
#ifdef CONFIG_X86_IO_APIC #ifdef CONFIG_X86_IO_APIC
static u8 __initdata irq_used[MAX_IRQ_SOURCES]; static u8 __initdata irq_used[MAX_IRQ_SOURCES];
......
/*
* mrst.c: Intel Moorestown platform specific setup code
*
* (C) Copyright 2008 Intel Corporation
* Author: Jacob Pan (jacob.jun.pan@intel.com)
*
* 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; version 2
* of the License.
*/
#include <linux/init.h>
#include <asm/setup.h>
/*
* Moorestown specific x86_init function overrides and early setup
* calls.
*/
void __init x86_mrst_early_setup(void)
{
x86_init.resources.probe_roms = x86_init_noop;
x86_init.resources.reserve_resources = x86_init_noop;
}
...@@ -54,17 +54,12 @@ u64 _paravirt_ident_64(u64 x) ...@@ -54,17 +54,12 @@ u64 _paravirt_ident_64(u64 x)
return x; return x;
} }
static void __init default_banner(void) void __init default_banner(void)
{ {
printk(KERN_INFO "Booting paravirtualized kernel on %s\n", printk(KERN_INFO "Booting paravirtualized kernel on %s\n",
pv_info.name); pv_info.name);
} }
char *memory_setup(void)
{
return pv_init_ops.memory_setup();
}
/* Simple instruction patching code. */ /* Simple instruction patching code. */
#define DEF_NATIVE(ops, name, code) \ #define DEF_NATIVE(ops, name, code) \
extern const char start_##ops##_##name[], end_##ops##_##name[]; \ extern const char start_##ops##_##name[], end_##ops##_##name[]; \
...@@ -188,11 +183,6 @@ unsigned paravirt_patch_insns(void *insnbuf, unsigned len, ...@@ -188,11 +183,6 @@ unsigned paravirt_patch_insns(void *insnbuf, unsigned len,
return insn_len; return insn_len;
} }
void init_IRQ(void)
{
pv_irq_ops.init_IRQ();
}
static void native_flush_tlb(void) static void native_flush_tlb(void)
{ {
__native_flush_tlb(); __native_flush_tlb();
...@@ -218,13 +208,6 @@ extern void native_irq_enable_sysexit(void); ...@@ -218,13 +208,6 @@ extern void native_irq_enable_sysexit(void);
extern void native_usergs_sysret32(void); extern void native_usergs_sysret32(void);
extern void native_usergs_sysret64(void); extern void native_usergs_sysret64(void);
static int __init print_banner(void)
{
pv_init_ops.banner();
return 0;
}
core_initcall(print_banner);
static struct resource reserve_ioports = { static struct resource reserve_ioports = {
.start = 0, .start = 0,
.end = IO_SPACE_LIMIT, .end = IO_SPACE_LIMIT,
...@@ -320,21 +303,13 @@ struct pv_info pv_info = { ...@@ -320,21 +303,13 @@ struct pv_info pv_info = {
struct pv_init_ops pv_init_ops = { struct pv_init_ops pv_init_ops = {
.patch = native_patch, .patch = native_patch,
.banner = default_banner,
.arch_setup = paravirt_nop,
.memory_setup = machine_specific_memory_setup,
}; };
struct pv_time_ops pv_time_ops = { struct pv_time_ops pv_time_ops = {
.time_init = hpet_time_init,
.get_wallclock = native_get_wallclock,
.set_wallclock = native_set_wallclock,
.sched_clock = native_sched_clock, .sched_clock = native_sched_clock,
.get_tsc_khz = native_calibrate_tsc,
}; };
struct pv_irq_ops pv_irq_ops = { struct pv_irq_ops pv_irq_ops = {
.init_IRQ = native_init_IRQ,
.save_fl = __PV_IS_CALLEE_SAVE(native_save_fl), .save_fl = __PV_IS_CALLEE_SAVE(native_save_fl),
.restore_fl = __PV_IS_CALLEE_SAVE(native_restore_fl), .restore_fl = __PV_IS_CALLEE_SAVE(native_restore_fl),
.irq_disable = __PV_IS_CALLEE_SAVE(native_irq_disable), .irq_disable = __PV_IS_CALLEE_SAVE(native_irq_disable),
...@@ -409,8 +384,6 @@ struct pv_cpu_ops pv_cpu_ops = { ...@@ -409,8 +384,6 @@ struct pv_cpu_ops pv_cpu_ops = {
struct pv_apic_ops pv_apic_ops = { struct pv_apic_ops pv_apic_ops = {
#ifdef CONFIG_X86_LOCAL_APIC #ifdef CONFIG_X86_LOCAL_APIC
.setup_boot_clock = setup_boot_APIC_clock,
.setup_secondary_clock = setup_secondary_APIC_clock,
.startup_ipi_hook = paravirt_nop, .startup_ipi_hook = paravirt_nop,
#endif #endif
}; };
...@@ -424,13 +397,6 @@ struct pv_apic_ops pv_apic_ops = { ...@@ -424,13 +397,6 @@ struct pv_apic_ops pv_apic_ops = {
#endif #endif
struct pv_mmu_ops pv_mmu_ops = { struct pv_mmu_ops pv_mmu_ops = {
#ifndef CONFIG_X86_64
.pagetable_setup_start = native_pagetable_setup_start,
.pagetable_setup_done = native_pagetable_setup_done,
#else
.pagetable_setup_start = paravirt_nop,
.pagetable_setup_done = paravirt_nop,
#endif
.read_cr2 = native_read_cr2, .read_cr2 = native_read_cr2,
.write_cr2 = native_write_cr2, .write_cr2 = native_write_cr2,
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <linux/pnp.h> #include <linux/pnp.h>
#include <asm/vsyscall.h> #include <asm/vsyscall.h>
#include <asm/x86_init.h>
#include <asm/time.h> #include <asm/time.h>
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
...@@ -165,13 +166,13 @@ void rtc_cmos_write(unsigned char val, unsigned char addr) ...@@ -165,13 +166,13 @@ void rtc_cmos_write(unsigned char val, unsigned char addr)
} }
EXPORT_SYMBOL(rtc_cmos_write); EXPORT_SYMBOL(rtc_cmos_write);
static int set_rtc_mmss(unsigned long nowtime) int update_persistent_clock(struct timespec now)
{ {
unsigned long flags; unsigned long flags;
int retval; int retval;
spin_lock_irqsave(&rtc_lock, flags); spin_lock_irqsave(&rtc_lock, flags);
retval = set_wallclock(nowtime); retval = x86_platform.set_wallclock(now.tv_sec);
spin_unlock_irqrestore(&rtc_lock, flags); spin_unlock_irqrestore(&rtc_lock, flags);
return retval; return retval;
...@@ -183,18 +184,13 @@ void read_persistent_clock(struct timespec *ts) ...@@ -183,18 +184,13 @@ void read_persistent_clock(struct timespec *ts)
unsigned long retval, flags; unsigned long retval, flags;
spin_lock_irqsave(&rtc_lock, flags); spin_lock_irqsave(&rtc_lock, flags);
retval = get_wallclock(); retval = x86_platform.get_wallclock();
spin_unlock_irqrestore(&rtc_lock, flags); spin_unlock_irqrestore(&rtc_lock, flags);
ts->tv_sec = retval; ts->tv_sec = retval;
ts->tv_nsec = 0; ts->tv_nsec = 0;
} }
int update_persistent_clock(struct timespec now)
{
return set_rtc_mmss(now.tv_sec);
}
unsigned long long native_read_tsc(void) unsigned long long native_read_tsc(void)
{ {
return __native_read_tsc(); return __native_read_tsc();
......
...@@ -109,10 +109,6 @@ ...@@ -109,10 +109,6 @@
#include <asm/numa_64.h> #include <asm/numa_64.h>
#endif #endif
#ifndef ARCH_SETUP
#define ARCH_SETUP
#endif
/* /*
* end_pfn only includes RAM, while max_pfn_mapped includes all e820 entries. * end_pfn only includes RAM, while max_pfn_mapped includes all e820 entries.
* The direct mapping extends to max_pfn_mapped, so that we can directly access * The direct mapping extends to max_pfn_mapped, so that we can directly access
...@@ -134,9 +130,9 @@ int default_cpu_present_to_apicid(int mps_cpu) ...@@ -134,9 +130,9 @@ int default_cpu_present_to_apicid(int mps_cpu)
return __default_cpu_present_to_apicid(mps_cpu); return __default_cpu_present_to_apicid(mps_cpu);
} }
int default_check_phys_apicid_present(int boot_cpu_physical_apicid) int default_check_phys_apicid_present(int phys_apicid)
{ {
return __default_check_phys_apicid_present(boot_cpu_physical_apicid); return __default_check_phys_apicid_present(phys_apicid);
} }
#endif #endif
...@@ -172,13 +168,6 @@ static struct resource bss_resource = { ...@@ -172,13 +168,6 @@ static struct resource bss_resource = {
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
static struct resource video_ram_resource = {
.name = "Video RAM area",
.start = 0xa0000,
.end = 0xbffff,
.flags = IORESOURCE_BUSY | IORESOURCE_MEM
};
/* cpu data as detected by the assembly code in head.S */ /* cpu data as detected by the assembly code in head.S */
struct cpuinfo_x86 new_cpu_data __cpuinitdata = {0, 0, 0, 0, -1, 1, 0, 0, -1}; struct cpuinfo_x86 new_cpu_data __cpuinitdata = {0, 0, 0, 0, -1, 1, 0, 0, -1};
/* common cpu data for all cpus */ /* common cpu data for all cpus */
...@@ -606,7 +595,7 @@ static struct resource standard_io_resources[] = { ...@@ -606,7 +595,7 @@ static struct resource standard_io_resources[] = {
.flags = IORESOURCE_BUSY | IORESOURCE_IO } .flags = IORESOURCE_BUSY | IORESOURCE_IO }
}; };
static void __init reserve_standard_io_resources(void) void __init reserve_standard_io_resources(void)
{ {
int i; int i;
...@@ -638,10 +627,6 @@ static int __init setup_elfcorehdr(char *arg) ...@@ -638,10 +627,6 @@ static int __init setup_elfcorehdr(char *arg)
early_param("elfcorehdr", setup_elfcorehdr); early_param("elfcorehdr", setup_elfcorehdr);
#endif #endif
static struct x86_quirks default_x86_quirks __initdata;
struct x86_quirks *x86_quirks __initdata = &default_x86_quirks;
#ifdef CONFIG_X86_RESERVE_LOW_64K #ifdef CONFIG_X86_RESERVE_LOW_64K
static int __init dmi_low_memory_corruption(const struct dmi_system_id *d) static int __init dmi_low_memory_corruption(const struct dmi_system_id *d)
{ {
...@@ -773,7 +758,7 @@ void __init setup_arch(char **cmdline_p) ...@@ -773,7 +758,7 @@ void __init setup_arch(char **cmdline_p)
} }
#endif #endif
ARCH_SETUP x86_init.oem.arch_setup();
setup_memory_map(); setup_memory_map();
parse_setup_data(); parse_setup_data();
...@@ -844,11 +829,9 @@ void __init setup_arch(char **cmdline_p) ...@@ -844,11 +829,9 @@ void __init setup_arch(char **cmdline_p)
* VMware detection requires dmi to be available, so this * VMware detection requires dmi to be available, so this
* needs to be done after dmi_scan_machine, for the BP. * needs to be done after dmi_scan_machine, for the BP.
*/ */
init_hypervisor(&boot_cpu_data); init_hypervisor_platform();
#ifdef CONFIG_X86_32 x86_init.resources.probe_roms();
probe_roms();
#endif
/* after parse_early_param, so could debug it */ /* after parse_early_param, so could debug it */
insert_resource(&iomem_resource, &code_resource); insert_resource(&iomem_resource, &code_resource);
...@@ -983,10 +966,9 @@ void __init setup_arch(char **cmdline_p) ...@@ -983,10 +966,9 @@ void __init setup_arch(char **cmdline_p)
kvmclock_init(); kvmclock_init();
#endif #endif
paravirt_pagetable_setup_start(swapper_pg_dir); x86_init.paging.pagetable_setup_start(swapper_pg_dir);
paging_init(); paging_init();
paravirt_pagetable_setup_done(swapper_pg_dir); x86_init.paging.pagetable_setup_done(swapper_pg_dir);
paravirt_post_allocator_init();
tboot_probe(); tboot_probe();
...@@ -1003,13 +985,11 @@ void __init setup_arch(char **cmdline_p) ...@@ -1003,13 +985,11 @@ void __init setup_arch(char **cmdline_p)
*/ */
acpi_boot_init(); acpi_boot_init();
#if defined(CONFIG_X86_MPPARSE) || defined(CONFIG_X86_VISWS)
/* /*
* get boot-time SMP configuration: * get boot-time SMP configuration:
*/ */
if (smp_found_config) if (smp_found_config)
get_smp_config(); get_smp_config();
#endif
prefill_possible_map(); prefill_possible_map();
...@@ -1028,10 +1008,7 @@ void __init setup_arch(char **cmdline_p) ...@@ -1028,10 +1008,7 @@ void __init setup_arch(char **cmdline_p)
e820_reserve_resources(); e820_reserve_resources();
e820_mark_nosave_regions(max_low_pfn); e820_mark_nosave_regions(max_low_pfn);
#ifdef CONFIG_X86_32 x86_init.resources.reserve_resources();
request_resource(&iomem_resource, &video_ram_resource);
#endif
reserve_standard_io_resources();
e820_setup_gap(); e820_setup_gap();
...@@ -1043,78 +1020,22 @@ void __init setup_arch(char **cmdline_p) ...@@ -1043,78 +1020,22 @@ void __init setup_arch(char **cmdline_p)
conswitchp = &dummy_con; conswitchp = &dummy_con;
#endif #endif
#endif #endif
x86_init.oem.banner();
} }
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
/** static struct resource video_ram_resource = {
* x86_quirk_intr_init - post gate setup interrupt initialisation .name = "Video RAM area",
* .start = 0xa0000,
* Description: .end = 0xbffff,
* Fill in any interrupts that may have been left out by the general .flags = IORESOURCE_BUSY | IORESOURCE_MEM
* 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 x86_quirk_intr_init(void)
{
if (x86_quirks->arch_intr_init) {
if (x86_quirks->arch_intr_init())
return;
}
}
/**
* x86_quirk_trap_init - 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 x86_quirk_trap_init(void)
{
if (x86_quirks->arch_trap_init) {
if (x86_quirks->arch_trap_init())
return;
}
}
static struct irqaction irq0 = {
.handler = timer_interrupt,
.flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER,
.name = "timer"
}; };
/** void __init i386_reserve_resources(void)
* x86_quirk_pre_time_init - do any specific initialisations before.
*
**/
void __init x86_quirk_pre_time_init(void)
{ {
if (x86_quirks->arch_pre_time_init) request_resource(&iomem_resource, &video_ram_resource);
x86_quirks->arch_pre_time_init(); reserve_standard_io_resources();
} }
/**
* x86_quirk_time_init - 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 x86_quirk_time_init(void)
{
if (x86_quirks->arch_time_init) {
/*
* A nonzero return code does not mean failure, it means
* that the architecture quirk does not want any
* generic (timer) setup to be performed after this:
*/
if (x86_quirks->arch_time_init())
return;
}
irq0.mask = cpumask_of_cpu(0);
setup_irq(0, &irq0);
}
#endif /* CONFIG_X86_32 */ #endif /* CONFIG_X86_32 */
...@@ -324,7 +324,7 @@ notrace static void __cpuinit start_secondary(void *unused) ...@@ -324,7 +324,7 @@ notrace static void __cpuinit start_secondary(void *unused)
/* enable local interrupts */ /* enable local interrupts */
local_irq_enable(); local_irq_enable();
setup_secondary_clock(); x86_cpuinit.setup_percpu_clockev();
wmb(); wmb();
cpu_idle(); cpu_idle();
...@@ -1114,7 +1114,7 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus) ...@@ -1114,7 +1114,7 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)
printk(KERN_INFO "CPU%d: ", 0); printk(KERN_INFO "CPU%d: ", 0);
print_cpu_info(&cpu_data(0)); print_cpu_info(&cpu_data(0));
setup_boot_clock(); x86_init.timers.setup_percpu_clockev();
if (is_uv_system()) if (is_uv_system())
uv_system_init(); uv_system_init();
......
/* /*
* "High Precision Event Timer" based timekeeping.
*
* Copyright (c) 1991,1992,1995 Linus Torvalds * Copyright (c) 1991,1992,1995 Linus Torvalds
* Copyright (c) 1994 Alan Modra * Copyright (c) 1994 Alan Modra
* Copyright (c) 1995 Markus Kuhn * Copyright (c) 1995 Markus Kuhn
...@@ -8,37 +6,44 @@ ...@@ -8,37 +6,44 @@
* Copyright (c) 1998 Andrea Arcangeli * Copyright (c) 1998 Andrea Arcangeli
* Copyright (c) 2002,2006 Vojtech Pavlik * Copyright (c) 2002,2006 Vojtech Pavlik
* Copyright (c) 2003 Andi Kleen * Copyright (c) 2003 Andi Kleen
* RTC support code taken from arch/i386/kernel/timers/time_hpet.c *
*/ */
#include <linux/clockchips.h> #include <linux/clockchips.h>
#include <linux/init.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/module.h>
#include <linux/time.h> #include <linux/time.h>
#include <linux/mca.h> #include <linux/mca.h>
#include <linux/nmi.h>
#include <asm/vsyscall.h>
#include <asm/x86_init.h>
#include <asm/i8259.h>
#include <asm/i8253.h> #include <asm/i8253.h>
#include <asm/timer.h>
#include <asm/hpet.h> #include <asm/hpet.h>
#include <asm/vgtod.h>
#include <asm/time.h> #include <asm/time.h>
#include <asm/timer.h>
#if defined(CONFIG_X86_32) && defined(CONFIG_X86_IO_APIC)
int timer_ack;
#endif
#ifdef CONFIG_X86_64
volatile unsigned long __jiffies __section_jiffies = INITIAL_JIFFIES; volatile unsigned long __jiffies __section_jiffies = INITIAL_JIFFIES;
#endif
unsigned long profile_pc(struct pt_regs *regs) unsigned long profile_pc(struct pt_regs *regs)
{ {
unsigned long pc = instruction_pointer(regs); unsigned long pc = instruction_pointer(regs);
/* Assume the lock function has either no stack frame or a copy
of flags from PUSHF
Eflags always has bits 22 and up cleared unlike kernel addresses. */
if (!user_mode_vm(regs) && in_lock_functions(pc)) { if (!user_mode_vm(regs) && in_lock_functions(pc)) {
#ifdef CONFIG_FRAME_POINTER #ifdef CONFIG_FRAME_POINTER
return *(unsigned long *)(regs->bp + sizeof(long)); return *(unsigned long *)(regs->bp + sizeof(long));
#else #else
unsigned long *sp = (unsigned long *)regs->sp; unsigned long *sp = (unsigned long *)regs->sp;
/*
* Return address is either directly at stack pointer
* or above a saved flags. Eflags has bits 22-31 zero,
* kernel addresses don't.
*/
if (sp[0] >> 22) if (sp[0] >> 22)
return sp[0]; return sp[0];
if (sp[1] >> 22) if (sp[1] >> 22)
...@@ -49,87 +54,68 @@ unsigned long profile_pc(struct pt_regs *regs) ...@@ -49,87 +54,68 @@ unsigned long profile_pc(struct pt_regs *regs)
} }
EXPORT_SYMBOL(profile_pc); EXPORT_SYMBOL(profile_pc);
/*
* Default timer interrupt handler for PIT/HPET
*/
static irqreturn_t timer_interrupt(int irq, void *dev_id) static irqreturn_t timer_interrupt(int irq, void *dev_id)
{ {
/* Keep nmi watchdog up to date */
inc_irq_stat(irq0_irqs); inc_irq_stat(irq0_irqs);
global_clock_event->event_handler(global_clock_event); /* Optimized out for !IO_APIC and x86_64 */
if (timer_ack) {
#ifdef CONFIG_MCA /*
if (MCA_bus) { * Subtle, when I/O APICs are used we have to ack timer IRQ
u8 irq_v = inb_p(0x61); /* read the current state */ * manually to deassert NMI lines for the watchdog if run
outb_p(irq_v|0x80, 0x61); /* reset the IRQ */ * on an 82489DX-based system.
*/
spin_lock(&i8259A_lock);
outb(0x0c, PIC_MASTER_OCW3);
/* Ack the IRQ; AEOI will end it automatically. */
inb(PIC_MASTER_POLL);
spin_unlock(&i8259A_lock);
} }
#endif
return IRQ_HANDLED; global_clock_event->event_handler(global_clock_event);
}
/* calibrate_cpu is used on systems with fixed rate TSCs to determine /* MCA bus quirk: Acknowledge irq0 by setting bit 7 in port 0x61 */
* processor frequency */ if (MCA_bus)
#define TICK_COUNT 100000000 outb_p(inb_p(0x61)| 0x80, 0x61);
unsigned long __init calibrate_cpu(void)
{
int tsc_start, tsc_now;
int i, no_ctr_free;
unsigned long evntsel3 = 0, pmc3 = 0, pmc_now = 0;
unsigned long flags;
for (i = 0; i < 4; i++)
if (avail_to_resrv_perfctr_nmi_bit(i))
break;
no_ctr_free = (i == 4);
if (no_ctr_free) {
WARN(1, KERN_WARNING "Warning: AMD perfctrs busy ... "
"cpu_khz value may be incorrect.\n");
i = 3;
rdmsrl(MSR_K7_EVNTSEL3, evntsel3);
wrmsrl(MSR_K7_EVNTSEL3, 0);
rdmsrl(MSR_K7_PERFCTR3, pmc3);
} else {
reserve_perfctr_nmi(MSR_K7_PERFCTR0 + i);
reserve_evntsel_nmi(MSR_K7_EVNTSEL0 + i);
}
local_irq_save(flags);
/* start measuring cycles, incrementing from 0 */
wrmsrl(MSR_K7_PERFCTR0 + i, 0);
wrmsrl(MSR_K7_EVNTSEL0 + i, 1 << 22 | 3 << 16 | 0x76);
rdtscl(tsc_start);
do {
rdmsrl(MSR_K7_PERFCTR0 + i, pmc_now);
tsc_now = get_cycles();
} while ((tsc_now - tsc_start) < TICK_COUNT);
local_irq_restore(flags);
if (no_ctr_free) {
wrmsrl(MSR_K7_EVNTSEL3, 0);
wrmsrl(MSR_K7_PERFCTR3, pmc3);
wrmsrl(MSR_K7_EVNTSEL3, evntsel3);
} else {
release_perfctr_nmi(MSR_K7_PERFCTR0 + i);
release_evntsel_nmi(MSR_K7_EVNTSEL0 + i);
}
return pmc_now * tsc_khz / (tsc_now - tsc_start); return IRQ_HANDLED;
} }
static struct irqaction irq0 = { static struct irqaction irq0 = {
.handler = timer_interrupt, .handler = timer_interrupt,
.flags = IRQF_DISABLED | IRQF_IRQPOLL | IRQF_NOBALANCING | IRQF_TIMER, .flags = IRQF_DISABLED | IRQF_NOBALANCING | IRQF_IRQPOLL | IRQF_TIMER,
.name = "timer" .name = "timer"
}; };
void __init setup_default_timer_irq(void)
{
irq0.mask = cpumask_of_cpu(0);
setup_irq(0, &irq0);
}
/* Default timer init function */
void __init hpet_time_init(void) void __init hpet_time_init(void)
{ {
if (!hpet_enable()) if (!hpet_enable())
setup_pit_timer(); setup_pit_timer();
setup_default_timer_irq();
setup_irq(0, &irq0);
} }
void __init time_init(void) static __init void x86_late_time_init(void)
{ {
x86_init.timers.timer_init();
tsc_init(); tsc_init();
}
late_time_init = choose_time_init(); /*
* Initialize TSC and delay the periodic timer init to
* late x86_late_time_init() so ioremap works.
*/
void __init time_init(void)
{
late_time_init = x86_late_time_init;
} }
/*
* Copyright (C) 1991, 1992, 1995 Linus Torvalds
*
* This file contains the PC-specific time handling details:
* reading the RTC at bootup, etc..
* 1994-07-02 Alan Modra
* fixed set_rtc_mmss, fixed time.year for >= 2000, new mktime
* 1995-03-26 Markus Kuhn
* fixed 500 ms bug at call to set_rtc_mmss, fixed DS12887
* precision CMOS clock update
* 1996-05-03 Ingo Molnar
* fixed time warps in do_[slow|fast]_gettimeoffset()
* 1997-09-10 Updated NTP code according to technical memorandum Jan '96
* "A Kernel Model for Precision Timekeeping" by Dave Mills
* 1998-09-05 (Various)
* More robust do_fast_gettimeoffset() algorithm implemented
* (works with APM, Cyrix 6x86MX and Centaur C6),
* monotonic gettimeofday() with fast_get_timeoffset(),
* drift-proof precision TSC calibration on boot
* (C. Scott Ananian <cananian@alumni.princeton.edu>, Andrew D.
* Balsa <andrebalsa@altern.org>, Philip Gladstone <philip@raptor.com>;
* ported from 2.0.35 Jumbo-9 by Michael Krause <m.krause@tu-harburg.de>).
* 1998-12-16 Andrea Arcangeli
* Fixed Jumbo-9 code in 2.1.131: do_gettimeofday was missing 1 jiffy
* because was not accounting lost_ticks.
* 1998-12-24 Copyright (C) 1998 Andrea Arcangeli
* Fixed a xtime SMP race (we need the xtime_lock rw spinlock to
* serialize accesses to xtime/lost_ticks).
*/
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/time.h>
#include <linux/mca.h>
#include <asm/setup.h>
#include <asm/hpet.h>
#include <asm/time.h>
#include <asm/timer.h>
#include <asm/do_timer.h>
int timer_ack;
unsigned long profile_pc(struct pt_regs *regs)
{
unsigned long pc = instruction_pointer(regs);
#ifdef CONFIG_SMP
if (!user_mode_vm(regs) && in_lock_functions(pc)) {
#ifdef CONFIG_FRAME_POINTER
return *(unsigned long *)(regs->bp + sizeof(long));
#else
unsigned long *sp = (unsigned long *)&regs->sp;
/* Return address is either directly at stack pointer
or above a saved flags. Eflags has bits 22-31 zero,
kernel addresses don't. */
if (sp[0] >> 22)
return sp[0];
if (sp[1] >> 22)
return sp[1];
#endif
}
#endif
return pc;
}
EXPORT_SYMBOL(profile_pc);
/*
* This is the same as the above, except we _also_ save the current
* Time Stamp Counter value at the time of the timer interrupt, so that
* we later on can estimate the time of day more exactly.
*/
irqreturn_t timer_interrupt(int irq, void *dev_id)
{
/* Keep nmi watchdog up to date */
inc_irq_stat(irq0_irqs);
#ifdef CONFIG_X86_IO_APIC
if (timer_ack) {
/*
* Subtle, when I/O APICs are used we have to ack timer IRQ
* manually to deassert NMI lines for the watchdog if run
* on an 82489DX-based system.
*/
spin_lock(&i8259A_lock);
outb(0x0c, PIC_MASTER_OCW3);
/* Ack the IRQ; AEOI will end it automatically. */
inb(PIC_MASTER_POLL);
spin_unlock(&i8259A_lock);
}
#endif
do_timer_interrupt_hook();
#ifdef CONFIG_MCA
if (MCA_bus) {
/* The PS/2 uses level-triggered interrupts. You can't
turn them off, nor would you want to (any attempt to
enable edge-triggered interrupts usually gets intercepted by a
special hardware circuit). Hence we have to acknowledge
the timer interrupt. Through some incredibly stupid
design idea, the reset for IRQ 0 is done by setting the
high bit of the PPI port B (0x61). Note that some PS/2s,
notably the 55SX, work fine if this is removed. */
u8 irq_v = inb_p(0x61); /* read the current state */
outb_p(irq_v | 0x80, 0x61); /* reset the IRQ */
}
#endif
return IRQ_HANDLED;
}
/* Duplicate of time_init() below, with hpet_enable part added */
void __init hpet_time_init(void)
{
if (!hpet_enable())
setup_pit_timer();
x86_quirk_time_init();
}
/*
* This is called directly from init code; we must delay timer setup in the
* HPET case as we can't make the decision to turn on HPET this early in the
* boot process.
*
* The chosen time_init function will usually be hpet_time_init, above, but
* in the case of virtual hardware, an alternative function may be substituted.
*/
void __init time_init(void)
{
x86_quirk_pre_time_init();
tsc_init();
late_time_init = choose_time_init();
}
...@@ -59,6 +59,7 @@ ...@@ -59,6 +59,7 @@
#include <asm/mach_traps.h> #include <asm/mach_traps.h>
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
#include <asm/x86_init.h>
#include <asm/pgalloc.h> #include <asm/pgalloc.h>
#include <asm/proto.h> #include <asm/proto.h>
#else #else
...@@ -972,7 +973,5 @@ void __init trap_init(void) ...@@ -972,7 +973,5 @@ void __init trap_init(void)
*/ */
cpu_init(); cpu_init();
#ifdef CONFIG_X86_32 x86_init.irqs.trap_init();
x86_quirk_trap_init();
#endif
} }
...@@ -17,6 +17,8 @@ ...@@ -17,6 +17,8 @@
#include <asm/time.h> #include <asm/time.h>
#include <asm/delay.h> #include <asm/delay.h>
#include <asm/hypervisor.h> #include <asm/hypervisor.h>
#include <asm/nmi.h>
#include <asm/x86_init.h>
unsigned int __read_mostly cpu_khz; /* TSC clocks / usec, not used here */ unsigned int __read_mostly cpu_khz; /* TSC clocks / usec, not used here */
EXPORT_SYMBOL(cpu_khz); EXPORT_SYMBOL(cpu_khz);
...@@ -400,15 +402,9 @@ unsigned long native_calibrate_tsc(void) ...@@ -400,15 +402,9 @@ unsigned long native_calibrate_tsc(void)
{ {
u64 tsc1, tsc2, delta, ref1, ref2; u64 tsc1, tsc2, delta, ref1, ref2;
unsigned long tsc_pit_min = ULONG_MAX, tsc_ref_min = ULONG_MAX; unsigned long tsc_pit_min = ULONG_MAX, tsc_ref_min = ULONG_MAX;
unsigned long flags, latch, ms, fast_calibrate, hv_tsc_khz; unsigned long flags, latch, ms, fast_calibrate;
int hpet = is_hpet_enabled(), i, loopmin; int hpet = is_hpet_enabled(), i, loopmin;
hv_tsc_khz = get_hypervisor_tsc_freq();
if (hv_tsc_khz) {
printk(KERN_INFO "TSC: Frequency read from the hypervisor\n");
return hv_tsc_khz;
}
local_irq_save(flags); local_irq_save(flags);
fast_calibrate = quick_pit_calibrate(); fast_calibrate = quick_pit_calibrate();
local_irq_restore(flags); local_irq_restore(flags);
...@@ -566,7 +562,7 @@ int recalibrate_cpu_khz(void) ...@@ -566,7 +562,7 @@ int recalibrate_cpu_khz(void)
unsigned long cpu_khz_old = cpu_khz; unsigned long cpu_khz_old = cpu_khz;
if (cpu_has_tsc) { if (cpu_has_tsc) {
tsc_khz = calibrate_tsc(); tsc_khz = x86_platform.calibrate_tsc();
cpu_khz = tsc_khz; cpu_khz = tsc_khz;
cpu_data(0).loops_per_jiffy = cpu_data(0).loops_per_jiffy =
cpufreq_scale(cpu_data(0).loops_per_jiffy, cpufreq_scale(cpu_data(0).loops_per_jiffy,
...@@ -860,15 +856,71 @@ static void __init init_tsc_clocksource(void) ...@@ -860,15 +856,71 @@ static void __init init_tsc_clocksource(void)
clocksource_register(&clocksource_tsc); clocksource_register(&clocksource_tsc);
} }
#ifdef CONFIG_X86_64
/*
* calibrate_cpu is used on systems with fixed rate TSCs to determine
* processor frequency
*/
#define TICK_COUNT 100000000
static unsigned long __init calibrate_cpu(void)
{
int tsc_start, tsc_now;
int i, no_ctr_free;
unsigned long evntsel3 = 0, pmc3 = 0, pmc_now = 0;
unsigned long flags;
for (i = 0; i < 4; i++)
if (avail_to_resrv_perfctr_nmi_bit(i))
break;
no_ctr_free = (i == 4);
if (no_ctr_free) {
WARN(1, KERN_WARNING "Warning: AMD perfctrs busy ... "
"cpu_khz value may be incorrect.\n");
i = 3;
rdmsrl(MSR_K7_EVNTSEL3, evntsel3);
wrmsrl(MSR_K7_EVNTSEL3, 0);
rdmsrl(MSR_K7_PERFCTR3, pmc3);
} else {
reserve_perfctr_nmi(MSR_K7_PERFCTR0 + i);
reserve_evntsel_nmi(MSR_K7_EVNTSEL0 + i);
}
local_irq_save(flags);
/* start measuring cycles, incrementing from 0 */
wrmsrl(MSR_K7_PERFCTR0 + i, 0);
wrmsrl(MSR_K7_EVNTSEL0 + i, 1 << 22 | 3 << 16 | 0x76);
rdtscl(tsc_start);
do {
rdmsrl(MSR_K7_PERFCTR0 + i, pmc_now);
tsc_now = get_cycles();
} while ((tsc_now - tsc_start) < TICK_COUNT);
local_irq_restore(flags);
if (no_ctr_free) {
wrmsrl(MSR_K7_EVNTSEL3, 0);
wrmsrl(MSR_K7_PERFCTR3, pmc3);
wrmsrl(MSR_K7_EVNTSEL3, evntsel3);
} else {
release_perfctr_nmi(MSR_K7_PERFCTR0 + i);
release_evntsel_nmi(MSR_K7_EVNTSEL0 + i);
}
return pmc_now * tsc_khz / (tsc_now - tsc_start);
}
#else
static inline unsigned long calibrate_cpu(void) { return cpu_khz; }
#endif
void __init tsc_init(void) void __init tsc_init(void)
{ {
u64 lpj; u64 lpj;
int cpu; int cpu;
x86_init.timers.tsc_pre_init();
if (!cpu_has_tsc) if (!cpu_has_tsc)
return; return;
tsc_khz = calibrate_tsc(); tsc_khz = x86_platform.calibrate_tsc();
cpu_khz = tsc_khz; cpu_khz = tsc_khz;
if (!tsc_khz) { if (!tsc_khz) {
...@@ -876,11 +928,9 @@ void __init tsc_init(void) ...@@ -876,11 +928,9 @@ void __init tsc_init(void)
return; return;
} }
#ifdef CONFIG_X86_64
if (cpu_has(&boot_cpu_data, X86_FEATURE_CONSTANT_TSC) && if (cpu_has(&boot_cpu_data, X86_FEATURE_CONSTANT_TSC) &&
(boot_cpu_data.x86_vendor == X86_VENDOR_AMD)) (boot_cpu_data.x86_vendor == X86_VENDOR_AMD))
cpu_khz = calibrate_cpu(); cpu_khz = calibrate_cpu();
#endif
printk("Detected %lu.%03lu MHz processor.\n", printk("Detected %lu.%03lu MHz processor.\n",
(unsigned long)cpu_khz / 1000, (unsigned long)cpu_khz / 1000,
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include <asm/setup.h> #include <asm/setup.h>
#include <asm/apic.h> #include <asm/apic.h>
#include <asm/e820.h> #include <asm/e820.h>
#include <asm/time.h>
#include <asm/io.h> #include <asm/io.h>
#include <linux/kernel_stat.h> #include <linux/kernel_stat.h>
...@@ -53,7 +54,7 @@ int is_visws_box(void) ...@@ -53,7 +54,7 @@ int is_visws_box(void)
return visws_board_type >= 0; return visws_board_type >= 0;
} }
static int __init visws_time_init(void) static void __init visws_time_init(void)
{ {
printk(KERN_INFO "Starting Cobalt Timer system clock\n"); printk(KERN_INFO "Starting Cobalt Timer system clock\n");
...@@ -66,21 +67,13 @@ static int __init visws_time_init(void) ...@@ -66,21 +67,13 @@ static int __init visws_time_init(void)
/* Enable (unmask) the timer interrupt */ /* Enable (unmask) the timer interrupt */
co_cpu_write(CO_CPU_CTRL, co_cpu_read(CO_CPU_CTRL) & ~CO_CTRL_TIMEMASK); co_cpu_write(CO_CPU_CTRL, co_cpu_read(CO_CPU_CTRL) & ~CO_CTRL_TIMEMASK);
/* setup_default_timer_irq();
* Zero return means the generic timer setup code will set up
* the standard vector:
*/
return 0;
} }
static int __init visws_pre_intr_init(void) /* Replaces the default init_ISA_irqs in the generic setup */
static void __init visws_pre_intr_init(void)
{ {
init_VISWS_APIC_irqs(); init_VISWS_APIC_irqs();
/*
* We dont want ISA irqs to be set up by the generic code:
*/
return 1;
} }
/* Quirk for machine specific memory setup. */ /* Quirk for machine specific memory setup. */
...@@ -156,12 +149,8 @@ static void visws_machine_power_off(void) ...@@ -156,12 +149,8 @@ static void visws_machine_power_off(void)
outl(PIIX_SPECIAL_STOP, 0xCFC); outl(PIIX_SPECIAL_STOP, 0xCFC);
} }
static int __init visws_get_smp_config(unsigned int early) static void __init visws_get_smp_config(unsigned int early)
{ {
/*
* Prevent MP-table parsing by the generic code:
*/
return 1;
} }
/* /*
...@@ -208,7 +197,7 @@ static void __init MP_processor_info(struct mpc_cpu *m) ...@@ -208,7 +197,7 @@ static void __init MP_processor_info(struct mpc_cpu *m)
apic_version[m->apicid] = ver; apic_version[m->apicid] = ver;
} }
static int __init visws_find_smp_config(unsigned int reserve) static void __init visws_find_smp_config(unsigned int reserve)
{ {
struct mpc_cpu *mp = phys_to_virt(CO_CPU_TAB_PHYS); struct mpc_cpu *mp = phys_to_virt(CO_CPU_TAB_PHYS);
unsigned short ncpus = readw(phys_to_virt(CO_CPU_NUM_PHYS)); unsigned short ncpus = readw(phys_to_virt(CO_CPU_NUM_PHYS));
...@@ -230,21 +219,9 @@ static int __init visws_find_smp_config(unsigned int reserve) ...@@ -230,21 +219,9 @@ static int __init visws_find_smp_config(unsigned int reserve)
MP_processor_info(mp++); MP_processor_info(mp++);
mp_lapic_addr = APIC_DEFAULT_PHYS_BASE; mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
return 1;
} }
static int visws_trap_init(void); static void visws_trap_init(void);
static struct x86_quirks visws_x86_quirks __initdata = {
.arch_time_init = visws_time_init,
.arch_pre_intr_init = visws_pre_intr_init,
.arch_memory_setup = visws_memory_setup,
.arch_intr_init = NULL,
.arch_trap_init = visws_trap_init,
.mach_get_smp_config = visws_get_smp_config,
.mach_find_smp_config = visws_find_smp_config,
};
void __init visws_early_detect(void) void __init visws_early_detect(void)
{ {
...@@ -257,11 +234,14 @@ void __init visws_early_detect(void) ...@@ -257,11 +234,14 @@ void __init visws_early_detect(void)
return; return;
/* /*
* Install special quirks for timer, interrupt and memory setup: * Override the default platform setup functions
* Fall back to generic behavior for traps:
* Override generic MP-table parsing:
*/ */
x86_quirks = &visws_x86_quirks; x86_init.resources.memory_setup = visws_memory_setup;
x86_init.mpparse.get_smp_config = visws_get_smp_config;
x86_init.mpparse.find_smp_config = visws_find_smp_config;
x86_init.irqs.pre_vector_init = visws_pre_intr_init;
x86_init.irqs.trap_init = visws_trap_init;
x86_init.timers.timer_init = visws_time_init;
/* /*
* Install reboot quirks: * Install reboot quirks:
...@@ -400,12 +380,10 @@ static __init void cobalt_init(void) ...@@ -400,12 +380,10 @@ static __init void cobalt_init(void)
co_apic_read(CO_APIC_ID)); co_apic_read(CO_APIC_ID));
} }
static int __init visws_trap_init(void) static void __init visws_trap_init(void)
{ {
lithium_init(); lithium_init();
cobalt_init(); cobalt_init();
return 1;
} }
/* /*
......
...@@ -817,15 +817,15 @@ static inline int __init activate_vmi(void) ...@@ -817,15 +817,15 @@ static inline int __init activate_vmi(void)
vmi_timer_ops.set_alarm = vmi_get_function(VMI_CALL_SetAlarm); vmi_timer_ops.set_alarm = vmi_get_function(VMI_CALL_SetAlarm);
vmi_timer_ops.cancel_alarm = vmi_timer_ops.cancel_alarm =
vmi_get_function(VMI_CALL_CancelAlarm); vmi_get_function(VMI_CALL_CancelAlarm);
pv_time_ops.time_init = vmi_time_init; x86_init.timers.timer_init = vmi_time_init;
pv_time_ops.get_wallclock = vmi_get_wallclock;
pv_time_ops.set_wallclock = vmi_set_wallclock;
#ifdef CONFIG_X86_LOCAL_APIC #ifdef CONFIG_X86_LOCAL_APIC
pv_apic_ops.setup_boot_clock = vmi_time_bsp_init; x86_init.timers.setup_percpu_clockev = vmi_time_bsp_init;
pv_apic_ops.setup_secondary_clock = vmi_time_ap_init; x86_cpuinit.setup_percpu_clockev = vmi_time_ap_init;
#endif #endif
pv_time_ops.sched_clock = vmi_sched_clock; pv_time_ops.sched_clock = vmi_sched_clock;
pv_time_ops.get_tsc_khz = vmi_tsc_khz; x86_platform.calibrate_tsc = vmi_tsc_khz;
x86_platform.get_wallclock = vmi_get_wallclock;
x86_platform.set_wallclock = vmi_set_wallclock;
/* We have true wallclock functions; disable CMOS clock sync */ /* We have true wallclock functions; disable CMOS clock sync */
no_sync_cmos_clock = 1; no_sync_cmos_clock = 1;
......
...@@ -68,7 +68,7 @@ unsigned long long vmi_sched_clock(void) ...@@ -68,7 +68,7 @@ unsigned long long vmi_sched_clock(void)
return cycles_2_ns(vmi_timer_ops.get_cycle_counter(VMI_CYCLES_AVAILABLE)); return cycles_2_ns(vmi_timer_ops.get_cycle_counter(VMI_CYCLES_AVAILABLE));
} }
/* paravirt_ops.get_tsc_khz = vmi_tsc_khz */ /* x86_platform.calibrate_tsc = vmi_tsc_khz */
unsigned long vmi_tsc_khz(void) unsigned long vmi_tsc_khz(void)
{ {
unsigned long long khz; unsigned long long khz;
......
/*
* Copyright (C) 2009 Thomas Gleixner <tglx@linutronix.de>
*
* For licencing details see kernel-base/COPYING
*/
#include <linux/init.h>
#include <asm/bios_ebda.h>
#include <asm/paravirt.h>
#include <asm/mpspec.h>
#include <asm/setup.h>
#include <asm/apic.h>
#include <asm/e820.h>
#include <asm/time.h>
#include <asm/irq.h>
#include <asm/tsc.h>
void __cpuinit x86_init_noop(void) { }
void __init x86_init_uint_noop(unsigned int unused) { }
void __init x86_init_pgd_noop(pgd_t *unused) { }
/*
* The platform setup functions are preset with the default functions
* for standard PC hardware.
*/
struct x86_init_ops x86_init __initdata = {
.resources = {
.probe_roms = x86_init_noop,
.reserve_resources = reserve_standard_io_resources,
.memory_setup = default_machine_specific_memory_setup,
},
.mpparse = {
.mpc_record = x86_init_uint_noop,
.setup_ioapic_ids = x86_init_noop,
.mpc_apic_id = default_mpc_apic_id,
.smp_read_mpc_oem = default_smp_read_mpc_oem,
.mpc_oem_bus_info = default_mpc_oem_bus_info,
.find_smp_config = default_find_smp_config,
.get_smp_config = default_get_smp_config,
},
.irqs = {
.pre_vector_init = init_ISA_irqs,
.intr_init = native_init_IRQ,
.trap_init = x86_init_noop,
},
.oem = {
.arch_setup = x86_init_noop,
.banner = default_banner,
},
.paging = {
.pagetable_setup_start = native_pagetable_setup_start,
.pagetable_setup_done = native_pagetable_setup_done,
},
.timers = {
.setup_percpu_clockev = setup_boot_APIC_clock,
.tsc_pre_init = x86_init_noop,
.timer_init = hpet_time_init,
},
};
struct x86_cpuinit_ops x86_cpuinit __cpuinitdata = {
.setup_percpu_clockev = setup_secondary_APIC_clock,
};
struct x86_platform_ops x86_platform = {
.calibrate_tsc = native_calibrate_tsc,
.get_wallclock = mach_get_cmos_time,
.set_wallclock = mach_set_rtc_mmss,
};
...@@ -1262,7 +1262,6 @@ __init void lguest_init(void) ...@@ -1262,7 +1262,6 @@ __init void lguest_init(void)
*/ */
/* Interrupt-related operations */ /* Interrupt-related operations */
pv_irq_ops.init_IRQ = lguest_init_IRQ;
pv_irq_ops.save_fl = PV_CALLEE_SAVE(save_fl); pv_irq_ops.save_fl = PV_CALLEE_SAVE(save_fl);
pv_irq_ops.restore_fl = __PV_IS_CALLEE_SAVE(lg_restore_fl); pv_irq_ops.restore_fl = __PV_IS_CALLEE_SAVE(lg_restore_fl);
pv_irq_ops.irq_disable = PV_CALLEE_SAVE(irq_disable); pv_irq_ops.irq_disable = PV_CALLEE_SAVE(irq_disable);
...@@ -1270,7 +1269,6 @@ __init void lguest_init(void) ...@@ -1270,7 +1269,6 @@ __init void lguest_init(void)
pv_irq_ops.safe_halt = lguest_safe_halt; pv_irq_ops.safe_halt = lguest_safe_halt;
/* Setup operations */ /* Setup operations */
pv_init_ops.memory_setup = lguest_memory_setup;
pv_init_ops.patch = lguest_patch; pv_init_ops.patch = lguest_patch;
/* Intercepts of various CPU instructions */ /* Intercepts of various CPU instructions */
...@@ -1320,10 +1318,11 @@ __init void lguest_init(void) ...@@ -1320,10 +1318,11 @@ __init void lguest_init(void)
set_lguest_basic_apic_ops(); set_lguest_basic_apic_ops();
#endif #endif
/* Time operations */ x86_init.resources.memory_setup = lguest_memory_setup;
pv_time_ops.get_wallclock = lguest_get_wallclock; x86_init.irqs.intr_init = lguest_init_IRQ;
pv_time_ops.time_init = lguest_time_init; x86_init.timers.timer_init = lguest_time_init;
pv_time_ops.get_tsc_khz = lguest_tsc_khz; x86_platform.calibrate_tsc = lguest_tsc_khz;
x86_platform.get_wallclock = lguest_get_wallclock;
/* /*
* Now is a good time to look at the implementations of these functions * Now is a good time to look at the implementations of these functions
......
...@@ -912,19 +912,9 @@ static const struct pv_info xen_info __initdata = { ...@@ -912,19 +912,9 @@ static const struct pv_info xen_info __initdata = {
static const struct pv_init_ops xen_init_ops __initdata = { static const struct pv_init_ops xen_init_ops __initdata = {
.patch = xen_patch, .patch = xen_patch,
.banner = xen_banner,
.memory_setup = xen_memory_setup,
.arch_setup = xen_arch_setup,
.post_allocator_init = xen_post_allocator_init,
}; };
static const struct pv_time_ops xen_time_ops __initdata = { static const struct pv_time_ops xen_time_ops __initdata = {
.time_init = xen_time_init,
.set_wallclock = xen_set_wallclock,
.get_wallclock = xen_get_wallclock,
.get_tsc_khz = xen_tsc_khz,
.sched_clock = xen_sched_clock, .sched_clock = xen_sched_clock,
}; };
...@@ -990,8 +980,6 @@ static const struct pv_cpu_ops xen_cpu_ops __initdata = { ...@@ -990,8 +980,6 @@ static const struct pv_cpu_ops xen_cpu_ops __initdata = {
static const struct pv_apic_ops xen_apic_ops __initdata = { static const struct pv_apic_ops xen_apic_ops __initdata = {
#ifdef CONFIG_X86_LOCAL_APIC #ifdef CONFIG_X86_LOCAL_APIC
.setup_boot_clock = paravirt_nop,
.setup_secondary_clock = paravirt_nop,
.startup_ipi_hook = paravirt_nop, .startup_ipi_hook = paravirt_nop,
#endif #endif
}; };
...@@ -1070,7 +1058,18 @@ asmlinkage void __init xen_start_kernel(void) ...@@ -1070,7 +1058,18 @@ asmlinkage void __init xen_start_kernel(void)
pv_time_ops = xen_time_ops; pv_time_ops = xen_time_ops;
pv_cpu_ops = xen_cpu_ops; pv_cpu_ops = xen_cpu_ops;
pv_apic_ops = xen_apic_ops; pv_apic_ops = xen_apic_ops;
pv_mmu_ops = xen_mmu_ops;
x86_init.resources.memory_setup = xen_memory_setup;
x86_init.oem.arch_setup = xen_arch_setup;
x86_init.oem.banner = xen_banner;
x86_init.timers.timer_init = xen_time_init;
x86_init.timers.setup_percpu_clockev = x86_init_noop;
x86_cpuinit.setup_percpu_clockev = x86_init_noop;
x86_platform.calibrate_tsc = xen_tsc_khz;
x86_platform.get_wallclock = xen_get_wallclock;
x86_platform.set_wallclock = xen_set_wallclock;
/* /*
* Set up some pagetable state before starting to set any ptes. * Set up some pagetable state before starting to set any ptes.
...@@ -1095,6 +1094,7 @@ asmlinkage void __init xen_start_kernel(void) ...@@ -1095,6 +1094,7 @@ asmlinkage void __init xen_start_kernel(void)
*/ */
xen_setup_stackprotector(); xen_setup_stackprotector();
xen_init_mmu_ops();
xen_init_irq_ops(); xen_init_irq_ops();
xen_init_cpuid_mask(); xen_init_cpuid_mask();
......
#include <linux/hardirq.h> #include <linux/hardirq.h>
#include <asm/x86_init.h>
#include <xen/interface/xen.h> #include <xen/interface/xen.h>
#include <xen/interface/sched.h> #include <xen/interface/sched.h>
#include <xen/interface/vcpu.h> #include <xen/interface/vcpu.h>
...@@ -112,8 +114,6 @@ static void xen_halt(void) ...@@ -112,8 +114,6 @@ static void xen_halt(void)
} }
static const struct pv_irq_ops xen_irq_ops __initdata = { static const struct pv_irq_ops xen_irq_ops __initdata = {
.init_IRQ = xen_init_IRQ,
.save_fl = PV_CALLEE_SAVE(xen_save_fl), .save_fl = PV_CALLEE_SAVE(xen_save_fl),
.restore_fl = PV_CALLEE_SAVE(xen_restore_fl), .restore_fl = PV_CALLEE_SAVE(xen_restore_fl),
.irq_disable = PV_CALLEE_SAVE(xen_irq_disable), .irq_disable = PV_CALLEE_SAVE(xen_irq_disable),
...@@ -129,4 +129,5 @@ static const struct pv_irq_ops xen_irq_ops __initdata = { ...@@ -129,4 +129,5 @@ static const struct pv_irq_ops xen_irq_ops __initdata = {
void __init xen_init_irq_ops() void __init xen_init_irq_ops()
{ {
pv_irq_ops = xen_irq_ops; pv_irq_ops = xen_irq_ops;
x86_init.irqs.intr_init = xen_init_IRQ;
} }
...@@ -1229,9 +1229,12 @@ static __init void xen_pagetable_setup_start(pgd_t *base) ...@@ -1229,9 +1229,12 @@ static __init void xen_pagetable_setup_start(pgd_t *base)
{ {
} }
static void xen_post_allocator_init(void);
static __init void xen_pagetable_setup_done(pgd_t *base) static __init void xen_pagetable_setup_done(pgd_t *base)
{ {
xen_setup_shared_info(); xen_setup_shared_info();
xen_post_allocator_init();
} }
static void xen_write_cr2(unsigned long cr2) static void xen_write_cr2(unsigned long cr2)
...@@ -1841,7 +1844,7 @@ static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot) ...@@ -1841,7 +1844,7 @@ static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot)
#endif #endif
} }
__init void xen_post_allocator_init(void) static __init void xen_post_allocator_init(void)
{ {
pv_mmu_ops.set_pte = xen_set_pte; pv_mmu_ops.set_pte = xen_set_pte;
pv_mmu_ops.set_pmd = xen_set_pmd; pv_mmu_ops.set_pmd = xen_set_pmd;
...@@ -1875,10 +1878,7 @@ static void xen_leave_lazy_mmu(void) ...@@ -1875,10 +1878,7 @@ static void xen_leave_lazy_mmu(void)
preempt_enable(); preempt_enable();
} }
const struct pv_mmu_ops xen_mmu_ops __initdata = { static const struct pv_mmu_ops xen_mmu_ops __initdata = {
.pagetable_setup_start = xen_pagetable_setup_start,
.pagetable_setup_done = xen_pagetable_setup_done,
.read_cr2 = xen_read_cr2, .read_cr2 = xen_read_cr2,
.write_cr2 = xen_write_cr2, .write_cr2 = xen_write_cr2,
...@@ -1954,6 +1954,12 @@ const struct pv_mmu_ops xen_mmu_ops __initdata = { ...@@ -1954,6 +1954,12 @@ const struct pv_mmu_ops xen_mmu_ops __initdata = {
.set_fixmap = xen_set_fixmap, .set_fixmap = xen_set_fixmap,
}; };
void __init xen_init_mmu_ops(void)
{
x86_init.paging.pagetable_setup_start = xen_pagetable_setup_start;
x86_init.paging.pagetable_setup_done = xen_pagetable_setup_done;
pv_mmu_ops = xen_mmu_ops;
}
#ifdef CONFIG_XEN_DEBUG_FS #ifdef CONFIG_XEN_DEBUG_FS
......
...@@ -59,5 +59,5 @@ void xen_ptep_modify_prot_commit(struct mm_struct *mm, unsigned long addr, ...@@ -59,5 +59,5 @@ void xen_ptep_modify_prot_commit(struct mm_struct *mm, unsigned long addr,
unsigned long xen_read_cr2_direct(void); unsigned long xen_read_cr2_direct(void);
extern const struct pv_mmu_ops xen_mmu_ops; extern void xen_init_mmu_ops(void);
#endif /* _XEN_MMU_H */ #endif /* _XEN_MMU_H */
...@@ -30,8 +30,6 @@ pgd_t *xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn); ...@@ -30,8 +30,6 @@ pgd_t *xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn);
void xen_ident_map_ISA(void); void xen_ident_map_ISA(void);
void xen_reserve_top(void); void xen_reserve_top(void);
void xen_post_allocator_init(void);
char * __init xen_memory_setup(void); char * __init xen_memory_setup(void);
void __init xen_arch_setup(void); void __init xen_arch_setup(void);
void __init xen_init_IRQ(void); void __init xen_init_IRQ(void);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment