genapic_32.h 4.6 KB
Newer Older
H
H. Peter Anvin 已提交
1 2
#ifndef _ASM_X86_GENAPIC_32_H
#define _ASM_X86_GENAPIC_32_H
L
Linus Torvalds 已提交
3

4
#include <asm/mpspec.h>
5
#include <asm/atomic.h>
6

L
Linus Torvalds 已提交
7 8 9 10 11 12 13 14 15 16 17 18
/*
 * Generic APIC driver interface.
 *
 * An straight forward mapping of the APIC related parts of the
 * x86 subarchitecture interface to a dynamic object.
 *
 * This is used by the "generic" x86 subarchitecture.
 *
 * Copyright 2003 Andi Kleen, SuSE Labs.
 */

struct mpc_config_bus;
19
struct mpc_table;
L
Linus Torvalds 已提交
20 21
struct mpc_config_processor;

22 23 24
struct genapic {
	char *name;
	int (*probe)(void);
L
Linus Torvalds 已提交
25 26

	int (*apic_id_registered)(void);
27
	const struct cpumask *(*target_cpus)(void);
L
Linus Torvalds 已提交
28
	int int_delivery_mode;
29
	int int_dest_mode;
L
Linus Torvalds 已提交
30 31 32
	int ESR_DISABLE;
	int apic_destination_logical;
	unsigned long (*check_apicid_used)(physid_mask_t bitmap, int apicid);
33
	unsigned long (*check_apicid_present)(int apicid);
L
Linus Torvalds 已提交
34 35 36 37 38
	int no_balance_irq;
	int no_ioapic_check;
	void (*init_apic_ldr)(void);
	physid_mask_t (*ioapic_phys_id_map)(physid_mask_t map);

39
	void (*setup_apic_routing)(void);
L
Linus Torvalds 已提交
40
	int (*multi_timer_check)(int apic, int irq);
41
	int (*apicid_to_node)(int logical_apicid);
L
Linus Torvalds 已提交
42 43 44
	int (*cpu_to_logical_apicid)(int cpu);
	int (*cpu_present_to_apicid)(int mps_cpu);
	physid_mask_t (*apicid_to_cpu_present)(int phys_apicid);
45
	void (*setup_portio_remap)(void);
L
Linus Torvalds 已提交
46 47 48 49 50 51
	int (*check_phys_apicid_present)(int boot_cpu_physical_apicid);
	void (*enable_apic_mode)(void);
	u32 (*phys_pkg_id)(u32 cpuid_apic, int index_msb);

	/* mpparse */
	/* When one of the next two hooks returns 1 the genapic
52
	   is switched to this. Essentially they are additional probe
L
Linus Torvalds 已提交
53
	   functions. */
54
	int (*mps_oem_check)(struct mpc_table *mpc, char *oem,
55
			     char *productid);
L
Linus Torvalds 已提交
56 57 58 59
	int (*acpi_madt_oem_check)(char *oem_id, char *oem_table_id);

	unsigned (*get_apic_id)(unsigned long x);
	unsigned long apic_id_mask;
60
	unsigned int (*cpu_mask_to_apicid)(const struct cpumask *cpumask);
61 62
	unsigned int (*cpu_mask_to_apicid_and)(const struct cpumask *cpumask,
					       const struct cpumask *andmask);
63
	void (*vector_allocation_domain)(int cpu, struct cpumask *retmask);
64 65

#ifdef CONFIG_SMP
L
Linus Torvalds 已提交
66
	/* ipi */
67 68 69
	void (*send_IPI_mask)(const struct cpumask *mask, int vector);
	void (*send_IPI_mask_allbutself)(const struct cpumask *mask,
					 int vector);
L
Linus Torvalds 已提交
70 71
	void (*send_IPI_allbutself)(int vector);
	void (*send_IPI_all)(int vector);
72
#endif
73
	int (*wakeup_cpu)(int apicid, unsigned long start_eip);
74 75 76 77 78 79 80
	int trampoline_phys_low;
	int trampoline_phys_high;
	void (*wait_for_init_deassert)(atomic_t *deassert);
	void (*smp_callin_clear_local_apic)(void);
	void (*store_NMI_vector)(unsigned short *high, unsigned short *low);
	void (*restore_NMI_vector)(unsigned short *high, unsigned short *low);
	void (*inquire_remote_apic)(int apicid);
81
};
L
Linus Torvalds 已提交
82

83 84 85 86 87 88 89 90 91 92
#define APICFUNC(x) .x = x,

/* More functions could be probably marked IPIFUNC and save some space
   in UP GENERICARCH kernels, but I don't have the nerve right now
   to untangle this mess. -AK  */
#ifdef CONFIG_SMP
#define IPIFUNC(x) APICFUNC(x)
#else
#define IPIFUNC(x)
#endif
L
Linus Torvalds 已提交
93

94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
#define APIC_INIT(aname, aprobe)			\
{							\
	.name = aname,					\
	.probe = aprobe,				\
	.int_delivery_mode = INT_DELIVERY_MODE,		\
	.int_dest_mode = INT_DEST_MODE,			\
	.no_balance_irq = NO_BALANCE_IRQ,		\
	.ESR_DISABLE = esr_disable,			\
	.apic_destination_logical = APIC_DEST_LOGICAL,	\
	APICFUNC(apic_id_registered)			\
	APICFUNC(target_cpus)				\
	APICFUNC(check_apicid_used)			\
	APICFUNC(check_apicid_present)			\
	APICFUNC(init_apic_ldr)				\
	APICFUNC(ioapic_phys_id_map)			\
	APICFUNC(setup_apic_routing)			\
	APICFUNC(multi_timer_check)			\
	APICFUNC(apicid_to_node)			\
	APICFUNC(cpu_to_logical_apicid)			\
	APICFUNC(cpu_present_to_apicid)			\
	APICFUNC(apicid_to_cpu_present)			\
	APICFUNC(setup_portio_remap)			\
	APICFUNC(check_phys_apicid_present)		\
	APICFUNC(mps_oem_check)				\
	APICFUNC(get_apic_id)				\
	.apic_id_mask = APIC_ID_MASK,			\
	APICFUNC(cpu_mask_to_apicid)			\
M
Mike Travis 已提交
121
	APICFUNC(cpu_mask_to_apicid_and)		\
122
	APICFUNC(vector_allocation_domain)		\
123 124 125 126 127 128
	APICFUNC(acpi_madt_oem_check)			\
	IPIFUNC(send_IPI_mask)				\
	IPIFUNC(send_IPI_allbutself)			\
	IPIFUNC(send_IPI_all)				\
	APICFUNC(enable_apic_mode)			\
	APICFUNC(phys_pkg_id)				\
129 130 131 132 133 134 135
	.trampoline_phys_low = TRAMPOLINE_PHYS_LOW,		\
	.trampoline_phys_high = TRAMPOLINE_PHYS_HIGH,		\
	APICFUNC(wait_for_init_deassert)		\
	APICFUNC(smp_callin_clear_local_apic)		\
	APICFUNC(store_NMI_vector)			\
	APICFUNC(restore_NMI_vector)			\
	APICFUNC(inquire_remote_apic)			\
136
}
L
Linus Torvalds 已提交
137

138
extern struct genapic *genapic;
139
extern void es7000_update_genapic_to_cluster(void);
L
Linus Torvalds 已提交
140

141 142 143
enum uv_system_type {UV_NONE, UV_LEGACY_APIC, UV_X2APIC, UV_NON_UNIQUE_APIC};
#define get_uv_system_type()		UV_NONE
#define is_uv_system()			0
J
Jack Steiner 已提交
144
#define uv_wakeup_secondary(a, b)	1
145
#define uv_system_init()		do {} while (0)
146 147


H
H. Peter Anvin 已提交
148
#endif /* _ASM_X86_GENAPIC_32_H */