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