genapic.h 3.3 KB
Newer Older
I
Ingo Molnar 已提交
1 2 3 4 5
#ifndef _ASM_X86_GENAPIC_H
#define _ASM_X86_GENAPIC_H

#include <linux/cpumask.h>

I
Ingo Molnar 已提交
6 7 8
#include <asm/mpspec.h>
#include <asm/atomic.h>

I
Ingo Molnar 已提交
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
/*
 * Copyright 2004 James Cleverdon, IBM.
 * Subject to the GNU Public License, v.2
 *
 * Generic APIC sub-arch data struct.
 *
 * Hacked for x86-64 by James Cleverdon from i386 architecture code by
 * Martin Bligh, Andi Kleen, James Bottomley, John Stultz, and
 * James Cleverdon.
 */
struct genapic {
	char *name;

	int (*probe)(void);
	int (*acpi_madt_oem_check)(char *oem_id, char *oem_table_id);
	int (*apic_id_registered)(void);

26 27
	u32 irq_delivery_mode;
	u32 irq_dest_mode;
I
Ingo Molnar 已提交
28 29 30

	const struct cpumask *(*target_cpus)(void);

31
	int disable_esr;
I
Ingo Molnar 已提交
32

33
	int dest_logical;
I
Ingo Molnar 已提交
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
	unsigned long (*check_apicid_used)(physid_mask_t bitmap, int apicid);
	unsigned long (*check_apicid_present)(int apicid);

	void (*vector_allocation_domain)(int cpu, struct cpumask *retmask);
	void (*init_apic_ldr)(void);

	physid_mask_t (*ioapic_phys_id_map)(physid_mask_t map);

	void (*setup_apic_routing)(void);
	int (*multi_timer_check)(int apic, int irq);
	int (*apicid_to_node)(int logical_apicid);
	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);
	void (*setup_portio_remap)(void);
	int (*check_phys_apicid_present)(int boot_cpu_physical_apicid);
	void (*enable_apic_mode)(void);
#ifdef CONFIG_X86_32
	u32 (*phys_pkg_id)(u32 cpuid_apic, int index_msb);
#else
	unsigned int (*phys_pkg_id)(int index_msb);
#endif

	/*
	 * When one of the next two hooks returns 1 the genapic
	 * is switched to this. Essentially they are additional
	 * probe functions:
	 */
	int (*mps_oem_check)(struct mpc_table *mpc, char *oem,
			     char *productid);

	unsigned int (*get_apic_id)(unsigned long x);
	unsigned long (*set_apic_id)(unsigned int id);
	unsigned long apic_id_mask;

	unsigned int (*cpu_mask_to_apicid)(const struct cpumask *cpumask);
	unsigned int (*cpu_mask_to_apicid_and)(const struct cpumask *cpumask,
					       const struct cpumask *andmask);

	/* ipi */
	void (*send_IPI_mask)(const struct cpumask *mask, int vector);
	void (*send_IPI_mask_allbutself)(const struct cpumask *mask,
					 int vector);
	void (*send_IPI_allbutself)(int vector);
	void (*send_IPI_all)(int vector);
	void (*send_IPI_self)(int vector);
80

I
Ingo Molnar 已提交
81 82 83 84 85
	/* wakeup_secondary_cpu */
	int (*wakeup_cpu)(int apicid, unsigned long start_eip);

	int trampoline_phys_low;
	int trampoline_phys_high;
I
Ingo Molnar 已提交
86

I
Ingo Molnar 已提交
87 88 89 90 91 92 93
	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);
};

I
Ingo Molnar 已提交
94
extern struct genapic *apic;
I
Ingo Molnar 已提交
95

I
Ingo Molnar 已提交
96
#ifdef CONFIG_X86_32
I
Ingo Molnar 已提交
97
extern void es7000_update_genapic_to_cluster(void);
98
#else
I
Ingo Molnar 已提交
99 100 101 102
extern struct genapic apic_flat;
extern struct genapic apic_physflat;
extern struct genapic apic_x2apic_cluster;
extern struct genapic apic_x2apic_phys;
103
extern int default_acpi_madt_oem_check(char *, char *);
I
Ingo Molnar 已提交
104 105 106 107 108 109

extern void apic_send_IPI_self(int vector);

extern struct genapic apic_x2apic_uv_x;
DECLARE_PER_CPU(int, x2apic_extra_bits);

110
extern void default_setup_apic_routing(void);
111 112

extern int default_cpu_present_to_apicid(int mps_cpu);
113
#endif
I
Ingo Molnar 已提交
114

I
Ingo Molnar 已提交
115
#endif /* _ASM_X86_GENAPIC_64_H */