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