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; 1064be4c1c2428e148de6081af235e2418e6a66ddaDaniel J Bluemanstruct cpuinfo_x86; 11fd6c6661492226bb82f422157c535ac573cbecbdThomas Gleixner 1257844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner/** 13f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixner * struct x86_init_mpparse - platform specific mpparse ops 14f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixner * @mpc_record: platform specific mpc record accounting 15de93410310952fb7b705f784ef22493c8362dbe8Thomas Gleixner * @setup_ioapic_ids: platform specific ioapic id override 16fd6c6661492226bb82f422157c535ac573cbecbdThomas Gleixner * @mpc_apic_id: platform specific mpc apic id assignment 1772302142e165313ee58af81bd76708c12b58d7abThomas Gleixner * @smp_read_mpc_oem: platform specific oem mpc table setup 1852fdb5684660f9fd7129f7bbbe279a02893bacb8Thomas Gleixner * @mpc_oem_pci_bus: platform specific pci bus setup (default NULL) 1990e1c6969d8711edb888a00ec54c74370f125c8fThomas Gleixner * @mpc_oem_bus_info: platform specific mpc bus info 20b3f1b617f49447df6c3f5fac9c225aaea8b724eaThomas Gleixner * @find_smp_config: find the smp configuration 21b3f1b617f49447df6c3f5fac9c225aaea8b724eaThomas Gleixner * @get_smp_config: get the smp configuration 22f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixner */ 23f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixnerstruct x86_init_mpparse { 24f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixner void (*mpc_record)(unsigned int mode); 25de93410310952fb7b705f784ef22493c8362dbe8Thomas Gleixner void (*setup_ioapic_ids)(void); 26fd6c6661492226bb82f422157c535ac573cbecbdThomas Gleixner int (*mpc_apic_id)(struct mpc_cpu *m); 2772302142e165313ee58af81bd76708c12b58d7abThomas Gleixner void (*smp_read_mpc_oem)(struct mpc_table *mpc); 2852fdb5684660f9fd7129f7bbbe279a02893bacb8Thomas Gleixner void (*mpc_oem_pci_bus)(struct mpc_bus *m); 2990e1c6969d8711edb888a00ec54c74370f125c8fThomas Gleixner void (*mpc_oem_bus_info)(struct mpc_bus *m, char *name); 30b24c2a925a9837cccf54d50aeac22ba0cbc15455Yinghai Lu void (*find_smp_config)(void); 31b3f1b617f49447df6c3f5fac9c225aaea8b724eaThomas Gleixner void (*get_smp_config)(unsigned int early); 32f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixner}; 33f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixner 34f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixner/** 35f7cf5a5b8c0e59eac8d30b62271cb0fa52e53ebcThomas Gleixner * struct x86_init_resources - platform specific resource related ops 36f7cf5a5b8c0e59eac8d30b62271cb0fa52e53ebcThomas Gleixner * @probe_roms: probe BIOS roms 378fee697d990c54976c8dc167270633299e2515d2Thomas Gleixner * @reserve_resources: reserve the standard resources for the 388fee697d990c54976c8dc167270633299e2515d2Thomas Gleixner * platform 396b18ae3e2ff62daa9f181401759161dd8de0aadfThomas Gleixner * @memory_setup: platform specific memory setup 40f7cf5a5b8c0e59eac8d30b62271cb0fa52e53ebcThomas Gleixner * 41f7cf5a5b8c0e59eac8d30b62271cb0fa52e53ebcThomas Gleixner */ 42f7cf5a5b8c0e59eac8d30b62271cb0fa52e53ebcThomas Gleixnerstruct x86_init_resources { 43f7cf5a5b8c0e59eac8d30b62271cb0fa52e53ebcThomas Gleixner void (*probe_roms)(void); 448fee697d990c54976c8dc167270633299e2515d2Thomas Gleixner void (*reserve_resources)(void); 456b18ae3e2ff62daa9f181401759161dd8de0aadfThomas Gleixner char *(*memory_setup)(void); 46f7cf5a5b8c0e59eac8d30b62271cb0fa52e53ebcThomas Gleixner}; 47f7cf5a5b8c0e59eac8d30b62271cb0fa52e53ebcThomas Gleixner 48f7cf5a5b8c0e59eac8d30b62271cb0fa52e53ebcThomas Gleixner/** 49d9112f43021554ded2ef2b9bea5f88ba4b52abe0Thomas Gleixner * struct x86_init_irqs - platform specific interrupt setup 50d9112f43021554ded2ef2b9bea5f88ba4b52abe0Thomas Gleixner * @pre_vector_init: init code to run before interrupt vectors 51d9112f43021554ded2ef2b9bea5f88ba4b52abe0Thomas Gleixner * are set up. 5266bcaf0bde100a4b54b82fc6fea6ceee2212ffb4Thomas Gleixner * @intr_init: interrupt init code 53428cf9025b15573e16e658032f2b963283e34ae0Thomas Gleixner * @trap_init: platform specific trap setup 54d9112f43021554ded2ef2b9bea5f88ba4b52abe0Thomas Gleixner */ 55d9112f43021554ded2ef2b9bea5f88ba4b52abe0Thomas Gleixnerstruct x86_init_irqs { 56d9112f43021554ded2ef2b9bea5f88ba4b52abe0Thomas Gleixner void (*pre_vector_init)(void); 5766bcaf0bde100a4b54b82fc6fea6ceee2212ffb4Thomas Gleixner void (*intr_init)(void); 58428cf9025b15573e16e658032f2b963283e34ae0Thomas Gleixner void (*trap_init)(void); 59d9112f43021554ded2ef2b9bea5f88ba4b52abe0Thomas Gleixner}; 60d9112f43021554ded2ef2b9bea5f88ba4b52abe0Thomas Gleixner 61d9112f43021554ded2ef2b9bea5f88ba4b52abe0Thomas Gleixner/** 6242bbdb43b16d233b2dacb4cd76e28f61c2a86dc6Thomas Gleixner * struct x86_init_oem - oem platform specific customizing functions 6342bbdb43b16d233b2dacb4cd76e28f61c2a86dc6Thomas Gleixner * @arch_setup: platform specific architecure setup 646f30c1ac3fcf11e08f00670f293546a112cdf4e3Thomas Gleixner * @banner: print a platform specific banner 6542bbdb43b16d233b2dacb4cd76e28f61c2a86dc6Thomas Gleixner */ 6642bbdb43b16d233b2dacb4cd76e28f61c2a86dc6Thomas Gleixnerstruct x86_init_oem { 6742bbdb43b16d233b2dacb4cd76e28f61c2a86dc6Thomas Gleixner void (*arch_setup)(void); 686f30c1ac3fcf11e08f00670f293546a112cdf4e3Thomas Gleixner void (*banner)(void); 6942bbdb43b16d233b2dacb4cd76e28f61c2a86dc6Thomas Gleixner}; 7042bbdb43b16d233b2dacb4cd76e28f61c2a86dc6Thomas Gleixner 7142bbdb43b16d233b2dacb4cd76e28f61c2a86dc6Thomas Gleixner/** 72279b706bf800b5967037f492dbe4fc5081ad5d0fStefano Stabellini * struct x86_init_mapping - platform specific initial kernel pagetable setup 73279b706bf800b5967037f492dbe4fc5081ad5d0fStefano Stabellini * @pagetable_reserve: reserve a range of addresses for kernel pagetable usage 74279b706bf800b5967037f492dbe4fc5081ad5d0fStefano Stabellini * 75279b706bf800b5967037f492dbe4fc5081ad5d0fStefano Stabellini * For more details on the purpose of this hook, look in 76279b706bf800b5967037f492dbe4fc5081ad5d0fStefano Stabellini * init_memory_mapping and the commit that added it. 77279b706bf800b5967037f492dbe4fc5081ad5d0fStefano Stabellini */ 78279b706bf800b5967037f492dbe4fc5081ad5d0fStefano Stabellinistruct x86_init_mapping { 79279b706bf800b5967037f492dbe4fc5081ad5d0fStefano Stabellini void (*pagetable_reserve)(u64 start, u64 end); 80279b706bf800b5967037f492dbe4fc5081ad5d0fStefano Stabellini}; 81279b706bf800b5967037f492dbe4fc5081ad5d0fStefano Stabellini 82279b706bf800b5967037f492dbe4fc5081ad5d0fStefano Stabellini/** 83030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner * struct x86_init_paging - platform specific paging functions 84030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner * @pagetable_setup_start: platform specific pre paging_init() call 85030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner * @pagetable_setup_done: platform specific post paging_init() call 86030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner */ 87030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixnerstruct x86_init_paging { 88030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner void (*pagetable_setup_start)(pgd_t *base); 89030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner void (*pagetable_setup_done)(pgd_t *base); 90030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner}; 91030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner 92030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner/** 93736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner * struct x86_init_timers - platform specific timer setup 94736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner * @setup_perpcu_clockev: set up the per cpu clock event device for the 95736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner * boot cpu 96845b3944bbdf9e9247849bf037f27ff3a3f26d87Thomas Gleixner * @tsc_pre_init: platform function called before TSC init 97845b3944bbdf9e9247849bf037f27ff3a3f26d87Thomas Gleixner * @timer_init: initialize the platform timer (default PIT/HPET) 986b617e224dfac0b64ed70dacdac50be6eb78a6a1Feng Tang * @wallclock_init: init the wallclock device 99736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner */ 100736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixnerstruct x86_init_timers { 101736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner void (*setup_percpu_clockev)(void); 102845b3944bbdf9e9247849bf037f27ff3a3f26d87Thomas Gleixner void (*tsc_pre_init)(void); 103845b3944bbdf9e9247849bf037f27ff3a3f26d87Thomas Gleixner void (*timer_init)(void); 1046b617e224dfac0b64ed70dacdac50be6eb78a6a1Feng Tang void (*wallclock_init)(void); 105736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner}; 106736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner 107736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner/** 108d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori * struct x86_init_iommu - platform specific iommu setup 109d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori * @iommu_init: platform specific iommu setup 110d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori */ 111d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonoristruct x86_init_iommu { 112d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori int (*iommu_init)(void); 113d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori}; 114d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori 115d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori/** 1164fb6088a5cb3a77123fea1279bf2d5b16cf27648Thomas Gleixner * struct x86_init_pci - platform specific pci init functions 1174fb6088a5cb3a77123fea1279bf2d5b16cf27648Thomas Gleixner * @arch_init: platform specific pci arch init call 1184fb6088a5cb3a77123fea1279bf2d5b16cf27648Thomas Gleixner * @init: platform specific pci subsystem init 119ab3b37937e8f4fb38dc9780b7bc3fd3c5195cca3Thomas Gleixner * @init_irq: platform specific pci irq init 1209325a28ce2fa7c597e5ed41455a06c30b82b5710Thomas Gleixner * @fixup_irqs: platform specific pci irq fixup 121b72d0db9dd41da1f2ec6274b03e8909583c64e41Thomas Gleixner */ 122b72d0db9dd41da1f2ec6274b03e8909583c64e41Thomas Gleixnerstruct x86_init_pci { 1234fb6088a5cb3a77123fea1279bf2d5b16cf27648Thomas Gleixner int (*arch_init)(void); 124b72d0db9dd41da1f2ec6274b03e8909583c64e41Thomas Gleixner int (*init)(void); 125ab3b37937e8f4fb38dc9780b7bc3fd3c5195cca3Thomas Gleixner void (*init_irq)(void); 1269325a28ce2fa7c597e5ed41455a06c30b82b5710Thomas Gleixner void (*fixup_irqs)(void); 127b72d0db9dd41da1f2ec6274b03e8909583c64e41Thomas Gleixner}; 128b72d0db9dd41da1f2ec6274b03e8909583c64e41Thomas Gleixner 129d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori/** 13057844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner * struct x86_init_ops - functions for platform specific setup 13157844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner * 13257844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner */ 13357844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixnerstruct x86_init_ops { 134f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixner struct x86_init_resources resources; 135f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixner struct x86_init_mpparse mpparse; 136d9112f43021554ded2ef2b9bea5f88ba4b52abe0Thomas Gleixner struct x86_init_irqs irqs; 13742bbdb43b16d233b2dacb4cd76e28f61c2a86dc6Thomas Gleixner struct x86_init_oem oem; 138279b706bf800b5967037f492dbe4fc5081ad5d0fStefano Stabellini struct x86_init_mapping mapping; 139030cb6c00d242c20e92a3327d0cac17ce02d0cc3Thomas Gleixner struct x86_init_paging paging; 140736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner struct x86_init_timers timers; 141d07c1be0693e0902d743160b8b638585b808f8acFUJITA Tomonori struct x86_init_iommu iommu; 142b72d0db9dd41da1f2ec6274b03e8909583c64e41Thomas Gleixner struct x86_init_pci pci; 143736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner}; 144736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner 145736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner/** 146736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner * struct x86_cpuinit_ops - platform specific cpu hotplug setups 147736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner * @setup_percpu_clockev: set up the per cpu clock event device 148df156f90a0f90649dd38b7667901ef85478f3d2bIgor Mammedov * @early_percpu_clock_init: early init of the per cpu clock event device 149736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner */ 150736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixnerstruct x86_cpuinit_ops { 151736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixner void (*setup_percpu_clockev)(void); 152df156f90a0f90649dd38b7667901ef85478f3d2bIgor Mammedov void (*early_percpu_clock_init)(void); 15364be4c1c2428e148de6081af235e2418e6a66ddaDaniel J Blueman void (*fixup_cpu_id)(struct cpuinfo_x86 *c, int node); 15457844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner}; 15557844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner 1562d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixner/** 1572d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixner * struct x86_platform_ops - platform specific runtime functions 1582d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixner * @calibrate_tsc: calibrate TSC 159cf8ff6b6ab0e99dd3058852f4ec76a6140abadecFeng Tang * @wallclock_init: init the wallclock device 1607bd867dfb4e0357e06a3211ab2bd0e714110def3Feng Tang * @get_wallclock: get time from HW clock like RTC etc. 1617bd867dfb4e0357e06a3211ab2bd0e714110def3Feng Tang * @set_wallclock: set time back to HW clock 162eb41c8be89dbe079f49202774e04a79ccac48a09H. Peter Anvin * @is_untracked_pat_range exclude from PAT logic 16378c06176466cbd1b3f0f67709d3023c40dbebcbdRuss Anderson * @nmi_init enable NMI on cpus 164c516ac583973196162b1ba7e4d597d6f6892dac0Feng Tang * @i8042_detect pre-detect if i8042 controller exists 165b74f05d61b73af584d0c39121980171389ecfaaaMarcelo Tosatti * @save_sched_clock_state: save state for sched_clock() on suspend 166b74f05d61b73af584d0c39121980171389ecfaaaMarcelo Tosatti * @restore_sched_clock_state: restore state for sched_clock() on resume 1672d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixner */ 1682d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixnerstruct x86_platform_ops { 1692d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixner unsigned long (*calibrate_tsc)(void); 170cf8ff6b6ab0e99dd3058852f4ec76a6140abadecFeng Tang void (*wallclock_init)(void); 1717bd867dfb4e0357e06a3211ab2bd0e714110def3Feng Tang unsigned long (*get_wallclock)(void); 1727bd867dfb4e0357e06a3211ab2bd0e714110def3Feng Tang int (*set_wallclock)(unsigned long nowtime); 173338bac527ed0e35b4cb50390972f15d3cbce92caFUJITA Tomonori void (*iommu_shutdown)(void); 174eb41c8be89dbe079f49202774e04a79ccac48a09H. Peter Anvin bool (*is_untracked_pat_range)(u64 start, u64 end); 17578c06176466cbd1b3f0f67709d3023c40dbebcbdRuss Anderson void (*nmi_init)(void); 176064a59b6dd1f341cc478c212bb436e3da9cb8d04Jacob Pan unsigned char (*get_nmi_reason)(void); 177c516ac583973196162b1ba7e4d597d6f6892dac0Feng Tang int (*i8042_detect)(void); 178b74f05d61b73af584d0c39121980171389ecfaaaMarcelo Tosatti void (*save_sched_clock_state)(void); 179b74f05d61b73af584d0c39121980171389ecfaaaMarcelo Tosatti void (*restore_sched_clock_state)(void); 1802d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixner}; 1812d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixner 182294ee6f89cfd629e276f632a6003a0fad7785dceStefano Stabellinistruct pci_dev; 183294ee6f89cfd629e276f632a6003a0fad7785dceStefano Stabellini 184294ee6f89cfd629e276f632a6003a0fad7785dceStefano Stabellinistruct x86_msi_ops { 185294ee6f89cfd629e276f632a6003a0fad7785dceStefano Stabellini int (*setup_msi_irqs)(struct pci_dev *dev, int nvec, int type); 186294ee6f89cfd629e276f632a6003a0fad7785dceStefano Stabellini void (*teardown_msi_irq)(unsigned int irq); 187294ee6f89cfd629e276f632a6003a0fad7785dceStefano Stabellini void (*teardown_msi_irqs)(struct pci_dev *dev); 18876ccc297018d25d55b789bbd508861ef1e2cdb0cKonrad Rzeszutek Wilk void (*restore_msi_irqs)(struct pci_dev *dev, int irq); 189294ee6f89cfd629e276f632a6003a0fad7785dceStefano Stabellini}; 190294ee6f89cfd629e276f632a6003a0fad7785dceStefano Stabellini 19157844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixnerextern struct x86_init_ops x86_init; 192736decac643e8982655e22ac7f0e5e61c5b7f9bdThomas Gleixnerextern struct x86_cpuinit_ops x86_cpuinit; 1932d826404f0bdcac2a4dd7e3c446b70d6a3b63b78Thomas Gleixnerextern struct x86_platform_ops x86_platform; 194294ee6f89cfd629e276f632a6003a0fad7785dceStefano Stabelliniextern struct x86_msi_ops x86_msi; 19557844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner 19657844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixnerextern void x86_init_noop(void); 197f4848472cd99487e182b64fb2a5d0e4fedbe86adThomas Gleixnerextern void x86_init_uint_noop(unsigned int unused); 19857844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner 19957844a8f8e29802f37ad9a0f94eb11d6ae358603Thomas Gleixner#endif 200