x86_init.h revision 6b617e224dfac0b64ed70dacdac50be6eb78a6a1
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) 866b617e224dfac0b64ed70dacdac50be6eb78a6a1Feng Tang * @wallclock_init: init the wallclock device 87736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner */ 88736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixnerstruct x86_init_timers { 89736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner void (*setup_percpu_clockev)(void); 90845b3944bbdf9e9247849bf037f27ff3a3f26d87Thomas Gleixner void (*tsc_pre_init)(void); 91845b3944bbdf9e9247849bf037f27ff3a3f26d87Thomas Gleixner void (*timer_init)(void); 926b617e224dfac0b64ed70dacdac50be6eb78a6a1Feng Tang void (*wallclock_init)(void); 93736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner}; 94736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner 95736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner/** 96d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori * struct x86_init_iommu - platform specific iommu setup 97d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori * @iommu_init: platform specific iommu setup 98d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori */ 99d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonoristruct x86_init_iommu { 100d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori int (*iommu_init)(void); 101d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori}; 102d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori 103d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori/** 1044fb6088a5cb3a77123fea1279bf2d5b16cf27648Thomas Gleixner * struct x86_init_pci - platform specific pci init functions 1054fb6088a5cb3a77123fea1279bf2d5b16cf27648Thomas Gleixner * @arch_init: platform specific pci arch init call 1064fb6088a5cb3a77123fea1279bf2d5b16cf27648Thomas Gleixner * @init: platform specific pci subsystem init 107ab3b37937e8f4fb38dc9780b7bc3fd3c5195cca3Thomas Gleixner * @init_irq: platform specific pci irq init 1089325a28ce2fa7c597e5ed41455a06c30b82b5710Thomas Gleixner * @fixup_irqs: platform specific pci irq fixup 109b72d0db9dd41da1f2ec6274b03e8909583c64e41Thomas Gleixner */ 110b72d0db9dd41da1f2ec6274b03e8909583c64e41Thomas Gleixnerstruct x86_init_pci { 1114fb6088a5cb3a77123fea1279bf2d5b16cf27648Thomas Gleixner int (*arch_init)(void); 112b72d0db9dd41da1f2ec6274b03e8909583c64e41Thomas Gleixner int (*init)(void); 113ab3b37937e8f4fb38dc9780b7bc3fd3c5195cca3Thomas Gleixner void (*init_irq)(void); 1149325a28ce2fa7c597e5ed41455a06c30b82b5710Thomas Gleixner void (*fixup_irqs)(void); 115b72d0db9dd41da1f2ec6274b03e8909583c64e41Thomas Gleixner}; 116b72d0db9dd41da1f2ec6274b03e8909583c64e41Thomas Gleixner 117d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori/** 11857844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner * struct x86_init_ops - functions for platform specific setup 11957844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner * 12057844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner */ 12157844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixnerstruct x86_init_ops { 122f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixner struct x86_init_resources resources; 123f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixner struct x86_init_mpparse mpparse; 124d9112f43021554ded2ef2b9bea5f88ba4b52abe0Thomas Gleixner struct x86_init_irqs irqs; 12542bbdb43b16d233b2dacb4cd76e28f61c2a86dc6Thomas Gleixner struct x86_init_oem oem; 126030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner struct x86_init_paging paging; 127736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner struct x86_init_timers timers; 128d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori struct x86_init_iommu iommu; 129b72d0db9dd41da1f2ec6274b03e8909583c64e41Thomas Gleixner struct x86_init_pci pci; 130736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner}; 131736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner 132736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner/** 133736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner * struct x86_cpuinit_ops - platform specific cpu hotplug setups 134736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner * @setup_percpu_clockev: set up the per cpu clock event device 135736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner */ 136736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixnerstruct x86_cpuinit_ops { 137736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner void (*setup_percpu_clockev)(void); 13857844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner}; 13957844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner 1402d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixner/** 1412d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixner * struct x86_platform_ops - platform specific runtime functions 1422d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixner * @calibrate_tsc: calibrate TSC 1437bd867dfb4e0357e06a3211ab2bd0e714110def3Feng Tang * @get_wallclock: get time from HW clock like RTC etc. 1447bd867dfb4e0357e06a3211ab2bd0e714110def3Feng Tang * @set_wallclock: set time back to HW clock 145eb41c8be89dbe079f49202774e04a79ccac48a09H. Peter Anvin * @is_untracked_pat_range exclude from PAT logic 14678c06176466cbd1b3f0f67709d3023c40dbebcbdRuss Anderson * @nmi_init enable NMI on cpus 147c516ac583973196162b1ba7e4d597d6f6892dac0Feng Tang * @i8042_detect pre-detect if i8042 controller exists 1482d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixner */ 1492d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixnerstruct x86_platform_ops { 1502d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixner unsigned long (*calibrate_tsc)(void); 1517bd867dfb4e0357e06a3211ab2bd0e714110def3Feng Tang unsigned long (*get_wallclock)(void); 1527bd867dfb4e0357e06a3211ab2bd0e714110def3Feng Tang int (*set_wallclock)(unsigned long nowtime); 153338bac527ed0e35b4cb50390972f15d3cbce92caFUJITA Tomonori void (*iommu_shutdown)(void); 154eb41c8be89dbe079f49202774e04a79ccac48a09H. Peter Anvin bool (*is_untracked_pat_range)(u64 start, u64 end); 15578c06176466cbd1b3f0f67709d3023c40dbebcbdRuss Anderson void (*nmi_init)(void); 156c516ac583973196162b1ba7e4d597d6f6892dac0Feng Tang int (*i8042_detect)(void); 1572d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixner}; 1582d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixner 159294ee6f89cfd629e276f632a6003a0fad7785dceStefano Stabellinistruct pci_dev; 160294ee6f89cfd629e276f632a6003a0fad7785dceStefano Stabellini 161294ee6f89cfd629e276f632a6003a0fad7785dceStefano Stabellinistruct x86_msi_ops { 162294ee6f89cfd629e276f632a6003a0fad7785dceStefano Stabellini int (*setup_msi_irqs)(struct pci_dev *dev, int nvec, int type); 163294ee6f89cfd629e276f632a6003a0fad7785dceStefano Stabellini void (*teardown_msi_irq)(unsigned int irq); 164294ee6f89cfd629e276f632a6003a0fad7785dceStefano Stabellini void (*teardown_msi_irqs)(struct pci_dev *dev); 165294ee6f89cfd629e276f632a6003a0fad7785dceStefano Stabellini}; 166294ee6f89cfd629e276f632a6003a0fad7785dceStefano Stabellini 16757844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixnerextern struct x86_init_ops x86_init; 168736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixnerextern struct x86_cpuinit_ops x86_cpuinit; 1692d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixnerextern struct x86_platform_ops x86_platform; 170294ee6f89cfd629e276f632a6003a0fad7785dceStefano Stabelliniextern struct x86_msi_ops x86_msi; 17157844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner 17257844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixnerextern void x86_init_noop(void); 173f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixnerextern void x86_init_uint_noop(unsigned int unused); 17457844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner 17557844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner#endif 176