1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _ASM_GENAPIC_H
2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _ASM_GENAPIC_H 1
3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/mpspec.h>
5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/*
7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Generic APIC driver interface.
8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * An straight forward mapping of the APIC related parts of the
10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * x86 subarchitecture interface to a dynamic object.
11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * This is used by the "generic" x86 subarchitecture.
13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru *
14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Copyright 2003 Andi Kleen, SuSE Labs.
15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */
16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct mpc_config_translation;
18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct mpc_config_bus;
19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct mp_config_table;
20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct mpc_config_processor;
21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustruct genapic {
23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	char *name;
24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*probe)(void);
25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*apic_id_registered)(void);
27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	cpumask_t (*target_cpus)(void);
28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int int_delivery_mode;
29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int int_dest_mode;
30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int ESR_DISABLE;
31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int apic_destination_logical;
32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long (*check_apicid_used)(physid_mask_t bitmap, int apicid);
33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long (*check_apicid_present)(int apicid);
34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int no_balance_irq;
35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int no_ioapic_check;
36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void (*init_apic_ldr)(void);
37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	physid_mask_t (*ioapic_phys_id_map)(physid_mask_t map);
38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void (*setup_apic_routing)(void);
40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*multi_timer_check)(int apic, int irq);
41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*apicid_to_node)(int logical_apicid);
42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*cpu_to_logical_apicid)(int cpu);
43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*cpu_present_to_apicid)(int mps_cpu);
44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	physid_mask_t (*apicid_to_cpu_present)(int phys_apicid);
45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*mpc_apic_id)(struct mpc_config_processor *m,
46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			   struct mpc_config_translation *t);
47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void (*setup_portio_remap)(void);
48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*check_phys_apicid_present)(int boot_cpu_physical_apicid);
49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void (*enable_apic_mode)(void);
50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	u32 (*phys_pkg_id)(u32 cpuid_apic, int index_msb);
51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	/* mpparse */
53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void (*mpc_oem_bus_info)(struct mpc_config_bus *, char *,
54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				 struct mpc_config_translation *);
55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void (*mpc_oem_pci_bus)(struct mpc_config_bus *,
56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru				struct mpc_config_translation *);
57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	/* When one of the next two hooks returns 1 the genapic
59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	   is switched to this. Essentially they are additional probe
60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	   functions. */
61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*mps_oem_check)(struct mp_config_table *mpc, char *oem,
62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru			      char *productid);
63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	int (*acpi_madt_oem_check)(char *oem_id, char *oem_table_id);
64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned (*get_apic_id)(unsigned long x);
66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned long apic_id_mask;
67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	unsigned int (*cpu_mask_to_apicid)(cpumask_t cpumask);
68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_SMP
70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	/* ipi */
71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void (*send_IPI_mask)(cpumask_t mask, int vector);
72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void (*send_IPI_allbutself)(int vector);
73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	void (*send_IPI_all)(int vector);
74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru};
76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define APICFUNC(x) .x = x,
78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* More functions could be probably marked IPIFUNC and save some space
80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   in UP GENERICARCH kernels, but I don't have the nerve right now
81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru   to untangle this mess. -AK  */
82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef CONFIG_SMP
83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IPIFUNC(x) APICFUNC(x)
84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#else
85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define IPIFUNC(x)
86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define APIC_INIT(aname, aprobe) { \
89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	.name = aname, \
90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	.probe = aprobe, \
91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	.int_delivery_mode = INT_DELIVERY_MODE, \
92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	.int_dest_mode = INT_DEST_MODE, \
93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	.no_balance_irq = NO_BALANCE_IRQ, \
94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	.ESR_DISABLE = esr_disable, \
95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	.apic_destination_logical = APIC_DEST_LOGICAL, \
96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(apic_id_registered) \
97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(target_cpus) \
98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(check_apicid_used) \
99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(check_apicid_present) \
100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(init_apic_ldr) \
101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(ioapic_phys_id_map) \
102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(setup_apic_routing) \
103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(multi_timer_check) \
104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(apicid_to_node) \
105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(cpu_to_logical_apicid) \
106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(cpu_present_to_apicid) \
107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(apicid_to_cpu_present) \
108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(mpc_apic_id) \
109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(setup_portio_remap) \
110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(check_phys_apicid_present) \
111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(mpc_oem_bus_info) \
112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(mpc_oem_pci_bus) \
113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(mps_oem_check) \
114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(get_apic_id) \
115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	.apic_id_mask = APIC_ID_MASK, \
116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(cpu_mask_to_apicid) \
117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(acpi_madt_oem_check) \
118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	IPIFUNC(send_IPI_mask) \
119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	IPIFUNC(send_IPI_allbutself) \
120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	IPIFUNC(send_IPI_all) \
121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(enable_apic_mode) \
122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	APICFUNC(phys_pkg_id) \
123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru	}
124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct genapic *genapic;
126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru
127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif
128