• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #ifndef _ASM_X86_GENAPIC_32_H
2 #define _ASM_X86_GENAPIC_32_H
3 
4 #include <asm/mpspec.h>
5 #include <asm/atomic.h>
6 
7 /*
8  * Generic APIC driver interface.
9  *
10  * An straight forward mapping of the APIC related parts of the
11  * x86 subarchitecture interface to a dynamic object.
12  *
13  * This is used by the "generic" x86 subarchitecture.
14  *
15  * Copyright 2003 Andi Kleen, SuSE Labs.
16  */
17 
18 struct mpc_bus;
19 struct mpc_table;
20 struct mpc_cpu;
21 
22 struct genapic {
23 	char *name;
24 	int (*probe)(void);
25 
26 	int (*apic_id_registered)(void);
27 	const struct cpumask *(*target_cpus)(void);
28 	int int_delivery_mode;
29 	int int_dest_mode;
30 	int ESR_DISABLE;
31 	int apic_destination_logical;
32 	unsigned long (*check_apicid_used)(physid_mask_t bitmap, int apicid);
33 	unsigned long (*check_apicid_present)(int apicid);
34 	int no_balance_irq;
35 	int no_ioapic_check;
36 	void (*init_apic_ldr)(void);
37 	physid_mask_t (*ioapic_phys_id_map)(physid_mask_t map);
38 
39 	void (*setup_apic_routing)(void);
40 	int (*multi_timer_check)(int apic, int irq);
41 	int (*apicid_to_node)(int logical_apicid);
42 	int (*cpu_to_logical_apicid)(int cpu);
43 	int (*cpu_present_to_apicid)(int mps_cpu);
44 	physid_mask_t (*apicid_to_cpu_present)(int phys_apicid);
45 	void (*setup_portio_remap)(void);
46 	int (*check_phys_apicid_present)(int boot_cpu_physical_apicid);
47 	void (*enable_apic_mode)(void);
48 	u32 (*phys_pkg_id)(u32 cpuid_apic, int index_msb);
49 
50 	/* mpparse */
51 	/* When one of the next two hooks returns 1 the genapic
52 	   is switched to this. Essentially they are additional probe
53 	   functions. */
54 	int (*mps_oem_check)(struct mpc_table *mpc, char *oem,
55 			     char *productid);
56 	int (*acpi_madt_oem_check)(char *oem_id, char *oem_table_id);
57 
58 	unsigned (*get_apic_id)(unsigned long x);
59 	unsigned long apic_id_mask;
60 	unsigned int (*cpu_mask_to_apicid)(const struct cpumask *cpumask);
61 	unsigned int (*cpu_mask_to_apicid_and)(const struct cpumask *cpumask,
62 					       const struct cpumask *andmask);
63 	void (*vector_allocation_domain)(int cpu, struct cpumask *retmask);
64 
65 #ifdef CONFIG_SMP
66 	/* ipi */
67 	void (*send_IPI_mask)(const struct cpumask *mask, int vector);
68 	void (*send_IPI_mask_allbutself)(const struct cpumask *mask,
69 					 int vector);
70 	void (*send_IPI_allbutself)(int vector);
71 	void (*send_IPI_all)(int vector);
72 #endif
73 	int (*wakeup_cpu)(int apicid, unsigned long start_eip);
74 	int trampoline_phys_low;
75 	int trampoline_phys_high;
76 	void (*wait_for_init_deassert)(atomic_t *deassert);
77 	void (*smp_callin_clear_local_apic)(void);
78 	void (*store_NMI_vector)(unsigned short *high, unsigned short *low);
79 	void (*restore_NMI_vector)(unsigned short *high, unsigned short *low);
80 	void (*inquire_remote_apic)(int apicid);
81 };
82 
83 #define APICFUNC(x) .x = x,
84 
85 /* More functions could be probably marked IPIFUNC and save some space
86    in UP GENERICARCH kernels, but I don't have the nerve right now
87    to untangle this mess. -AK  */
88 #ifdef CONFIG_SMP
89 #define IPIFUNC(x) APICFUNC(x)
90 #else
91 #define IPIFUNC(x)
92 #endif
93 
94 #define APIC_INIT(aname, aprobe)			\
95 {							\
96 	.name = aname,					\
97 	.probe = aprobe,				\
98 	.int_delivery_mode = INT_DELIVERY_MODE,		\
99 	.int_dest_mode = INT_DEST_MODE,			\
100 	.no_balance_irq = NO_BALANCE_IRQ,		\
101 	.ESR_DISABLE = esr_disable,			\
102 	.apic_destination_logical = APIC_DEST_LOGICAL,	\
103 	APICFUNC(apic_id_registered)			\
104 	APICFUNC(target_cpus)				\
105 	APICFUNC(check_apicid_used)			\
106 	APICFUNC(check_apicid_present)			\
107 	APICFUNC(init_apic_ldr)				\
108 	APICFUNC(ioapic_phys_id_map)			\
109 	APICFUNC(setup_apic_routing)			\
110 	APICFUNC(multi_timer_check)			\
111 	APICFUNC(apicid_to_node)			\
112 	APICFUNC(cpu_to_logical_apicid)			\
113 	APICFUNC(cpu_present_to_apicid)			\
114 	APICFUNC(apicid_to_cpu_present)			\
115 	APICFUNC(setup_portio_remap)			\
116 	APICFUNC(check_phys_apicid_present)		\
117 	APICFUNC(mps_oem_check)				\
118 	APICFUNC(get_apic_id)				\
119 	.apic_id_mask = APIC_ID_MASK,			\
120 	APICFUNC(cpu_mask_to_apicid)			\
121 	APICFUNC(cpu_mask_to_apicid_and)		\
122 	APICFUNC(vector_allocation_domain)		\
123 	APICFUNC(acpi_madt_oem_check)			\
124 	IPIFUNC(send_IPI_mask)				\
125 	IPIFUNC(send_IPI_allbutself)			\
126 	IPIFUNC(send_IPI_all)				\
127 	APICFUNC(enable_apic_mode)			\
128 	APICFUNC(phys_pkg_id)				\
129 	.trampoline_phys_low = TRAMPOLINE_PHYS_LOW,		\
130 	.trampoline_phys_high = TRAMPOLINE_PHYS_HIGH,		\
131 	APICFUNC(wait_for_init_deassert)		\
132 	APICFUNC(smp_callin_clear_local_apic)		\
133 	APICFUNC(store_NMI_vector)			\
134 	APICFUNC(restore_NMI_vector)			\
135 	APICFUNC(inquire_remote_apic)			\
136 }
137 
138 extern struct genapic *genapic;
139 extern void es7000_update_genapic_to_cluster(void);
140 
141 enum uv_system_type {UV_NONE, UV_LEGACY_APIC, UV_X2APIC, UV_NON_UNIQUE_APIC};
142 #define get_uv_system_type()		UV_NONE
143 #define is_uv_system()			0
144 #define uv_wakeup_secondary(a, b)	1
145 #define uv_system_init()		do {} while (0)
146 
147 
148 #endif /* _ASM_X86_GENAPIC_32_H */
149