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