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
	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);
I
Ingo Molnar 已提交
51
	int (*phys_pkg_id)(int cpuid_apic, int index_msb);
I
Ingo Molnar 已提交
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75

	/*
	 * 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);
76

I
Ingo Molnar 已提交
77 78 79 80 81
	/* wakeup_secondary_cpu */
	int (*wakeup_cpu)(int apicid, unsigned long start_eip);

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

I
Ingo Molnar 已提交
83 84 85 86 87 88 89
	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 已提交
90
extern struct genapic *apic;
I
Ingo Molnar 已提交
91

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

extern void apic_send_IPI_self(int vector);

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

106
extern void default_setup_apic_routing(void);
107 108

extern int default_cpu_present_to_apicid(int mps_cpu);
109
extern int default_check_phys_apicid_present(int boot_cpu_physical_apicid);
110
#endif
I
Ingo Molnar 已提交
111

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