x86_init.h revision 9325a28ce2fa7c597e5ed41455a06c30b82b5710
157844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner#ifndef _ASM_X86_PLATFORM_H 257844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner#define _ASM_X86_PLATFORM_H 357844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner 4030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner#include <asm/pgtable_types.h> 547a3d5da70f411bc044ecd3c0593b158b09d0efaThomas Gleixner#include <asm/bootparam.h> 6030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner 752fdb5684660f9fd7129f7bbbe279a02893bacb8Thomas Gleixnerstruct mpc_bus; 8fd6c6661492226bb82f422157c535ac573cbecbdThomas Gleixnerstruct mpc_cpu; 972302142e165313ee58af81bd76708c12b58d7abThomas Gleixnerstruct mpc_table; 10fd6c6661492226bb82f422157c535ac573cbecbdThomas Gleixner 1157844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner/** 12f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixner * struct x86_init_mpparse - platform specific mpparse ops 13f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixner * @mpc_record: platform specific mpc record accounting 14de93410310952fb7b705f784ef22493c8362dbe8Thomas Gleixner * @setup_ioapic_ids: platform specific ioapic id override 15fd6c6661492226bb82f422157c535ac573cbecbdThomas Gleixner * @mpc_apic_id: platform specific mpc apic id assignment 1672302142e165313ee58af81bd76708c12b58d7abThomas Gleixner * @smp_read_mpc_oem: platform specific oem mpc table setup 1752fdb5684660f9fd7129f7bbbe279a02893bacb8Thomas Gleixner * @mpc_oem_pci_bus: platform specific pci bus setup (default NULL) 1890e1c6969d8711edb888a00ec54c74370f125c8fThomas Gleixner * @mpc_oem_bus_info: platform specific mpc bus info 19b3f1b617f49447df6c3f5fac9c225aaea8b724eaThomas Gleixner * @find_smp_config: find the smp configuration 20b3f1b617f49447df6c3f5fac9c225aaea8b724eaThomas Gleixner * @get_smp_config: get the smp configuration 21f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixner */ 22f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixnerstruct x86_init_mpparse { 23f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixner void (*mpc_record)(unsigned int mode); 24de93410310952fb7b705f784ef22493c8362dbe8Thomas Gleixner void (*setup_ioapic_ids)(void); 25fd6c6661492226bb82f422157c535ac573cbecbdThomas Gleixner int (*mpc_apic_id)(struct mpc_cpu *m); 2672302142e165313ee58af81bd76708c12b58d7abThomas Gleixner void (*smp_read_mpc_oem)(struct mpc_table *mpc); 2752fdb5684660f9fd7129f7bbbe279a02893bacb8Thomas Gleixner void (*mpc_oem_pci_bus)(struct mpc_bus *m); 2890e1c6969d8711edb888a00ec54c74370f125c8fThomas Gleixner void (*mpc_oem_bus_info)(struct mpc_bus *m, char *name); 29b24c2a925a9837cccf54d50aeac22ba0cbc15455Yinghai Lu void (*find_smp_config)(void); 30b3f1b617f49447df6c3f5fac9c225aaea8b724eaThomas Gleixner void (*get_smp_config)(unsigned int early); 31f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixner}; 32f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixner 33f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixner/** 34f7cf5a5b8c0e59eac8d30b62271cb0fa52e53ebcThomas Gleixner * struct x86_init_resources - platform specific resource related ops 35f7cf5a5b8c0e59eac8d30b62271cb0fa52e53ebcThomas Gleixner * @probe_roms: probe BIOS roms 368fee697d990c54976c8dc167270633299e2515d2Thomas Gleixner * @reserve_resources: reserve the standard resources for the 378fee697d990c54976c8dc167270633299e2515d2Thomas Gleixner * platform 386b18ae3e2ff62daa9f181401759161dd8de0aadfThomas Gleixner * @memory_setup: platform specific memory setup 39f7cf5a5b8c0e59eac8d30b62271cb0fa52e53ebcThomas Gleixner * 40f7cf5a5b8c0e59eac8d30b62271cb0fa52e53ebcThomas Gleixner */ 41f7cf5a5b8c0e59eac8d30b62271cb0fa52e53ebcThomas Gleixnerstruct x86_init_resources { 42f7cf5a5b8c0e59eac8d30b62271cb0fa52e53ebcThomas Gleixner void (*probe_roms)(void); 438fee697d990c54976c8dc167270633299e2515d2Thomas Gleixner void (*reserve_resources)(void); 446b18ae3e2ff62daa9f181401759161dd8de0aadfThomas Gleixner char *(*memory_setup)(void); 45f7cf5a5b8c0e59eac8d30b62271cb0fa52e53ebcThomas Gleixner}; 46f7cf5a5b8c0e59eac8d30b62271cb0fa52e53ebcThomas Gleixner 47f7cf5a5b8c0e59eac8d30b62271cb0fa52e53ebcThomas Gleixner/** 48d9112f43021554ded2ef2b9bea5f88ba4b52abe0Thomas Gleixner * struct x86_init_irqs - platform specific interrupt setup 49d9112f43021554ded2ef2b9bea5f88ba4b52abe0Thomas Gleixner * @pre_vector_init: init code to run before interrupt vectors 50d9112f43021554ded2ef2b9bea5f88ba4b52abe0Thomas Gleixner * are set up. 5166bcaf0bde100a4b54b82fc6fea6ceee2212ffb4Thomas Gleixner * @intr_init: interrupt init code 52428cf9025b15573e16e658032f2b963283e34ae0Thomas Gleixner * @trap_init: platform specific trap setup 53d9112f43021554ded2ef2b9bea5f88ba4b52abe0Thomas Gleixner */ 54d9112f43021554ded2ef2b9bea5f88ba4b52abe0Thomas Gleixnerstruct x86_init_irqs { 55d9112f43021554ded2ef2b9bea5f88ba4b52abe0Thomas Gleixner void (*pre_vector_init)(void); 5666bcaf0bde100a4b54b82fc6fea6ceee2212ffb4Thomas Gleixner void (*intr_init)(void); 57428cf9025b15573e16e658032f2b963283e34ae0Thomas Gleixner void (*trap_init)(void); 58d9112f43021554ded2ef2b9bea5f88ba4b52abe0Thomas Gleixner}; 59d9112f43021554ded2ef2b9bea5f88ba4b52abe0Thomas Gleixner 60d9112f43021554ded2ef2b9bea5f88ba4b52abe0Thomas Gleixner/** 6142bbdb43b16d233b2dacb4cd76e28f61c2a86dc6Thomas Gleixner * struct x86_init_oem - oem platform specific customizing functions 6242bbdb43b16d233b2dacb4cd76e28f61c2a86dc6Thomas Gleixner * @arch_setup: platform specific architecure setup 636f30c1ac3fcf11e08f00670f293546a112cdf4e3Thomas Gleixner * @banner: print a platform specific banner 6442bbdb43b16d233b2dacb4cd76e28f61c2a86dc6Thomas Gleixner */ 6542bbdb43b16d233b2dacb4cd76e28f61c2a86dc6Thomas Gleixnerstruct x86_init_oem { 6642bbdb43b16d233b2dacb4cd76e28f61c2a86dc6Thomas Gleixner void (*arch_setup)(void); 676f30c1ac3fcf11e08f00670f293546a112cdf4e3Thomas Gleixner void (*banner)(void); 6842bbdb43b16d233b2dacb4cd76e28f61c2a86dc6Thomas Gleixner}; 6942bbdb43b16d233b2dacb4cd76e28f61c2a86dc6Thomas Gleixner 7042bbdb43b16d233b2dacb4cd76e28f61c2a86dc6Thomas Gleixner/** 71030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner * struct x86_init_paging - platform specific paging functions 72030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner * @pagetable_setup_start: platform specific pre paging_init() call 73030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner * @pagetable_setup_done: platform specific post paging_init() call 74030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner */ 75030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixnerstruct x86_init_paging { 76030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner void (*pagetable_setup_start)(pgd_t *base); 77030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner void (*pagetable_setup_done)(pgd_t *base); 78030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner}; 79030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner 80030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner/** 81736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner * struct x86_init_timers - platform specific timer setup 82736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner * @setup_perpcu_clockev: set up the per cpu clock event device for the 83736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner * boot cpu 84845b3944bbdf9e9247849bf037f27ff3a3f26d87Thomas Gleixner * @tsc_pre_init: platform function called before TSC init 85845b3944bbdf9e9247849bf037f27ff3a3f26d87Thomas Gleixner * @timer_init: initialize the platform timer (default PIT/HPET) 86736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner */ 87736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixnerstruct x86_init_timers { 88736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner void (*setup_percpu_clockev)(void); 89845b3944bbdf9e9247849bf037f27ff3a3f26d87Thomas Gleixner void (*tsc_pre_init)(void); 90845b3944bbdf9e9247849bf037f27ff3a3f26d87Thomas Gleixner void (*timer_init)(void); 91736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner}; 92736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner 93736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner/** 94d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori * struct x86_init_iommu - platform specific iommu setup 95d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori * @iommu_init: platform specific iommu setup 96d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori */ 97d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonoristruct x86_init_iommu { 98d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori int (*iommu_init)(void); 99d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori}; 100d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori 101b72d0db9dd41da1f2ec6274b03e8909583c64e41Thomas Gleixner /* 102b72d0db9dd41da1f2ec6274b03e8909583c64e41Thomas Gleixner * struct x86_init_pci - platform specific pci init functions 103b72d0db9dd41da1f2ec6274b03e8909583c64e41Thomas Gleixner * @init: platform specific pci init 104ab3b37937e8f4fb38dc9780b7bc3fd3c5195cca3Thomas Gleixner * @init_irq: platform specific pci irq init 1059325a28ce2fa7c597e5ed41455a06c30b82b5710Thomas Gleixner * @fixup_irqs: platform specific pci irq fixup 106b72d0db9dd41da1f2ec6274b03e8909583c64e41Thomas Gleixner */ 107b72d0db9dd41da1f2ec6274b03e8909583c64e41Thomas Gleixnerstruct x86_init_pci { 108b72d0db9dd41da1f2ec6274b03e8909583c64e41Thomas Gleixner int (*init)(void); 109ab3b37937e8f4fb38dc9780b7bc3fd3c5195cca3Thomas Gleixner void (*init_irq)(void); 1109325a28ce2fa7c597e5ed41455a06c30b82b5710Thomas Gleixner void (*fixup_irqs)(void); 111b72d0db9dd41da1f2ec6274b03e8909583c64e41Thomas Gleixner}; 112b72d0db9dd41da1f2ec6274b03e8909583c64e41Thomas Gleixner 113d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori/** 11457844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner * struct x86_init_ops - functions for platform specific setup 11557844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner * 11657844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner */ 11757844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixnerstruct x86_init_ops { 118f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixner struct x86_init_resources resources; 119f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixner struct x86_init_mpparse mpparse; 120d9112f43021554ded2ef2b9bea5f88ba4b52abe0Thomas Gleixner struct x86_init_irqs irqs; 12142bbdb43b16d233b2dacb4cd76e28f61c2a86dc6Thomas Gleixner struct x86_init_oem oem; 122030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner struct x86_init_paging paging; 123736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner struct x86_init_timers timers; 124d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori struct x86_init_iommu iommu; 125b72d0db9dd41da1f2ec6274b03e8909583c64e41Thomas Gleixner struct x86_init_pci pci; 126736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner}; 127736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner 128736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner/** 129736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner * struct x86_cpuinit_ops - platform specific cpu hotplug setups 130736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner * @setup_percpu_clockev: set up the per cpu clock event device 131736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner */ 132736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixnerstruct x86_cpuinit_ops { 133736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner void (*setup_percpu_clockev)(void); 13457844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner}; 13557844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner 1362d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixner/** 1372d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixner * struct x86_platform_ops - platform specific runtime functions 1382d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixner * @calibrate_tsc: calibrate TSC 1397bd867dfb4e0357e06a3211ab2bd0e714110def3Feng Tang * @get_wallclock: get time from HW clock like RTC etc. 1407bd867dfb4e0357e06a3211ab2bd0e714110def3Feng Tang * @set_wallclock: set time back to HW clock 141eb41c8be89dbe079f49202774e04a79ccac48a09H. Peter Anvin * @is_untracked_pat_range exclude from PAT logic 1422d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixner */ 1432d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixnerstruct x86_platform_ops { 1442d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixner unsigned long (*calibrate_tsc)(void); 1457bd867dfb4e0357e06a3211ab2bd0e714110def3Feng Tang unsigned long (*get_wallclock)(void); 1467bd867dfb4e0357e06a3211ab2bd0e714110def3Feng Tang int (*set_wallclock)(unsigned long nowtime); 147338bac527ed0e35b4cb50390972f15d3cbce92caFUJITA Tomonori void (*iommu_shutdown)(void); 148eb41c8be89dbe079f49202774e04a79ccac48a09H. Peter Anvin bool (*is_untracked_pat_range)(u64 start, u64 end); 1492d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixner}; 1502d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixner 15157844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixnerextern struct x86_init_ops x86_init; 152736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixnerextern struct x86_cpuinit_ops x86_cpuinit; 1532d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixnerextern struct x86_platform_ops x86_platform; 15457844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner 15557844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixnerextern void x86_init_noop(void); 156f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixnerextern void x86_init_uint_noop(unsigned int unused); 15757844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner 15857844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner#endif 159