2009-08-19 14:48:38 +02:00
# ifndef _ASM_X86_PLATFORM_H
# define _ASM_X86_PLATFORM_H
2009-08-20 14:30:02 +02:00
# include <asm/pgtable_types.h>
2009-08-29 15:03:59 +02:00
# include <asm/bootparam.h>
2009-08-20 14:30:02 +02:00
2009-08-20 12:45:33 +02:00
struct mpc_bus ;
2009-08-20 10:41:58 +02:00
struct mpc_cpu ;
2009-08-20 12:18:32 +02:00
struct mpc_table ;
2009-08-20 10:41:58 +02:00
2009-08-20 12:05:01 +02:00
/**
* struct x86_init_mpparse - platform specific mpparse ops
* @ mpc_record : platform specific mpc record accounting
2009-08-20 09:27:29 +02:00
* @ setup_ioapic_ids : platform specific ioapic id override
2009-08-20 10:41:58 +02:00
* @ mpc_apic_id : platform specific mpc apic id assignment
2009-08-20 12:18:32 +02:00
* @ smp_read_mpc_oem : platform specific oem mpc table setup
2009-08-20 12:45:33 +02:00
* @ mpc_oem_pci_bus : platform specific pci bus setup ( default NULL )
2009-08-20 12:34:47 +02:00
* @ mpc_oem_bus_info : platform specific mpc bus info
2009-08-20 11:11:52 +02:00
* @ find_smp_config : find the smp configuration
* @ get_smp_config : get the smp configuration
2009-08-20 12:05:01 +02:00
*/
struct x86_init_mpparse {
void ( * mpc_record ) ( unsigned int mode ) ;
2009-08-20 09:27:29 +02:00
void ( * setup_ioapic_ids ) ( void ) ;
2009-08-20 10:41:58 +02:00
int ( * mpc_apic_id ) ( struct mpc_cpu * m ) ;
2009-08-20 12:18:32 +02:00
void ( * smp_read_mpc_oem ) ( struct mpc_table * mpc ) ;
2009-08-20 12:45:33 +02:00
void ( * mpc_oem_pci_bus ) ( struct mpc_bus * m ) ;
2009-08-20 12:34:47 +02:00
void ( * mpc_oem_bus_info ) ( struct mpc_bus * m , char * name ) ;
2009-11-24 02:48:18 -08:00
void ( * find_smp_config ) ( void ) ;
2009-08-20 11:11:52 +02:00
void ( * get_smp_config ) ( unsigned int early ) ;
2009-08-20 12:05:01 +02:00
} ;
2009-08-19 14:43:56 +02:00
/**
* struct x86_init_resources - platform specific resource related ops
* @ probe_roms : probe BIOS roms
2009-08-19 14:55:50 +02:00
* @ reserve_resources : reserve the standard resources for the
* platform
2009-08-20 10:19:54 +02:00
* @ memory_setup : platform specific memory setup
2009-08-19 14:43:56 +02:00
*
*/
struct x86_init_resources {
void ( * probe_roms ) ( void ) ;
2009-08-19 14:55:50 +02:00
void ( * reserve_resources ) ( void ) ;
2009-08-20 10:19:54 +02:00
char * ( * memory_setup ) ( void ) ;
2009-08-19 14:43:56 +02:00
} ;
2009-08-20 09:41:38 +02:00
/**
* struct x86_init_irqs - platform specific interrupt setup
* @ pre_vector_init : init code to run before interrupt vectors
* are set up .
2009-08-20 09:59:09 +02:00
* @ intr_init : interrupt init code
2009-08-20 10:35:46 +02:00
* @ trap_init : platform specific trap setup
2009-08-20 09:41:38 +02:00
*/
struct x86_init_irqs {
void ( * pre_vector_init ) ( void ) ;
2009-08-20 09:59:09 +02:00
void ( * intr_init ) ( void ) ;
2009-08-20 10:35:46 +02:00
void ( * trap_init ) ( void ) ;
2009-08-20 09:41:38 +02:00
} ;
2009-08-20 13:04:10 +02:00
/**
* struct x86_init_oem - oem platform specific customizing functions
* @ arch_setup : platform specific architecure setup
2009-08-20 13:19:57 +02:00
* @ banner : print a platform specific banner
2009-08-20 13:04:10 +02:00
*/
struct x86_init_oem {
void ( * arch_setup ) ( void ) ;
2009-08-20 13:19:57 +02:00
void ( * banner ) ( void ) ;
2009-08-20 13:04:10 +02:00
} ;
2011-04-14 15:49:41 +01:00
/**
* struct x86_init_mapping - platform specific initial kernel pagetable setup
* @ pagetable_reserve : reserve a range of addresses for kernel pagetable usage
*
* For more details on the purpose of this hook , look in
* init_memory_mapping and the commit that added it .
*/
struct x86_init_mapping {
void ( * pagetable_reserve ) ( u64 start , u64 end ) ;
} ;
2009-08-20 14:30:02 +02:00
/**
* 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 ) ;
} ;
2009-08-19 12:35:53 +02:00
/**
* struct x86_init_timers - platform specific timer setup
* @ setup_perpcu_clockev : set up the per cpu clock event device for the
* boot cpu
2009-08-19 15:37:03 +02:00
* @ tsc_pre_init : platform function called before TSC init
* @ timer_init : initialize the platform timer ( default PIT / HPET )
2011-02-15 00:13:31 +08:00
* @ wallclock_init : init the wallclock device
2009-08-19 12:35:53 +02:00
*/
struct x86_init_timers {
void ( * setup_percpu_clockev ) ( void ) ;
2009-08-19 15:37:03 +02:00
void ( * tsc_pre_init ) ( void ) ;
void ( * timer_init ) ( void ) ;
2011-02-15 00:13:31 +08:00
void ( * wallclock_init ) ( void ) ;
2009-08-19 12:35:53 +02:00
} ;
2009-11-10 19:46:12 +09:00
/**
* struct x86_init_iommu - platform specific iommu setup
* @ iommu_init : platform specific iommu setup
*/
struct x86_init_iommu {
int ( * iommu_init ) ( void ) ;
} ;
2010-02-22 05:38:38 -08:00
/**
* struct x86_init_pci - platform specific pci init functions
* @ arch_init : platform specific pci arch init call
* @ init : platform specific pci subsystem init
2009-08-29 17:47:33 +02:00
* @ init_irq : platform specific pci irq init
2009-08-29 17:51:26 +02:00
* @ fixup_irqs : platform specific pci irq fixup
2009-08-29 16:24:51 +02:00
*/
struct x86_init_pci {
2010-02-22 05:38:38 -08:00
int ( * arch_init ) ( void ) ;
2009-08-29 16:24:51 +02:00
int ( * init ) ( void ) ;
2009-08-29 17:47:33 +02:00
void ( * init_irq ) ( void ) ;
2009-08-29 17:51:26 +02:00
void ( * fixup_irqs ) ( void ) ;
2009-08-29 16:24:51 +02:00
} ;
2009-08-19 14:48:38 +02:00
/**
* struct x86_init_ops - functions for platform specific setup
*
*/
struct x86_init_ops {
2009-08-20 12:05:01 +02:00
struct x86_init_resources resources ;
struct x86_init_mpparse mpparse ;
2009-08-20 09:41:38 +02:00
struct x86_init_irqs irqs ;
2009-08-20 13:04:10 +02:00
struct x86_init_oem oem ;
2011-04-14 15:49:41 +01:00
struct x86_init_mapping mapping ;
2009-08-20 14:30:02 +02:00
struct x86_init_paging paging ;
2009-08-19 12:35:53 +02:00
struct x86_init_timers timers ;
2009-11-10 19:46:12 +09:00
struct x86_init_iommu iommu ;
2009-08-29 16:24:51 +02:00
struct x86_init_pci pci ;
2009-08-19 12:35:53 +02:00
} ;
/**
* 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 ) ;
2009-08-19 14:48:38 +02:00
} ;
2009-08-20 17:06:25 +02:00
/**
* struct x86_platform_ops - platform specific runtime functions
* @ calibrate_tsc : calibrate TSC
2009-09-10 10:48:56 +08:00
* @ get_wallclock : get time from HW clock like RTC etc .
* @ set_wallclock : set time back to HW clock
2009-11-23 14:46:07 -08:00
* @ is_untracked_pat_range exclude from PAT logic
2010-02-26 10:49:12 -06:00
* @ nmi_init enable NMI on cpus
2010-07-05 23:03:18 +08:00
* @ i8042_detect pre - detect if i8042 controller exists
2009-08-20 17:06:25 +02:00
*/
struct x86_platform_ops {
unsigned long ( * calibrate_tsc ) ( void ) ;
2009-09-10 10:48:56 +08:00
unsigned long ( * get_wallclock ) ( void ) ;
int ( * set_wallclock ) ( unsigned long nowtime ) ;
2009-10-27 16:34:44 +09:00
void ( * iommu_shutdown ) ( void ) ;
2009-11-23 14:46:07 -08:00
bool ( * is_untracked_pat_range ) ( u64 start , u64 end ) ;
2010-02-26 10:49:12 -06:00
void ( * nmi_init ) ( void ) ;
2010-07-05 23:03:18 +08:00
int ( * i8042_detect ) ( void ) ;
2009-08-20 17:06:25 +02:00
} ;
2010-10-06 16:12:28 -04:00
struct pci_dev ;
struct x86_msi_ops {
int ( * setup_msi_irqs ) ( struct pci_dev * dev , int nvec , int type ) ;
void ( * teardown_msi_irq ) ( unsigned int irq ) ;
void ( * teardown_msi_irqs ) ( struct pci_dev * dev ) ;
} ;
2009-08-19 14:48:38 +02:00
extern struct x86_init_ops x86_init ;
2009-08-19 12:35:53 +02:00
extern struct x86_cpuinit_ops x86_cpuinit ;
2009-08-20 17:06:25 +02:00
extern struct x86_platform_ops x86_platform ;
2010-10-06 16:12:28 -04:00
extern struct x86_msi_ops x86_msi ;
2009-08-19 14:48:38 +02:00
extern void x86_init_noop ( void ) ;
2009-08-20 12:05:01 +02:00
extern void x86_init_uint_noop ( unsigned int unused ) ;
2009-08-19 14:48:38 +02:00
# endif