874c4fe389
There are some machines around (large xSeries or Unisys ES7000) that need physical IO-APIC destination mode to access all of their IO devices. This currently doesn't work in UP kernels as used in distribution installers. This patch allows to compile even UP kernels as GENERICARCH which allows to use physical or clustered APIC mode. Signed-off-by: Andi Kleen <ak@suse.de>
128 lines
3.6 KiB
C
128 lines
3.6 KiB
C
#ifndef _ASM_GENAPIC_H
|
|
#define _ASM_GENAPIC_H 1
|
|
|
|
#include <asm/mpspec.h>
|
|
|
|
/*
|
|
* 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_translation;
|
|
struct mpc_config_bus;
|
|
struct mp_config_table;
|
|
struct mpc_config_processor;
|
|
|
|
struct genapic {
|
|
char *name;
|
|
int (*probe)(void);
|
|
|
|
int (*apic_id_registered)(void);
|
|
cpumask_t (*target_cpus)(void);
|
|
int int_delivery_mode;
|
|
int int_dest_mode;
|
|
int ESR_DISABLE;
|
|
int apic_destination_logical;
|
|
unsigned long (*check_apicid_used)(physid_mask_t bitmap, int apicid);
|
|
unsigned long (*check_apicid_present)(int apicid);
|
|
int no_balance_irq;
|
|
int no_ioapic_check;
|
|
void (*init_apic_ldr)(void);
|
|
physid_mask_t (*ioapic_phys_id_map)(physid_mask_t map);
|
|
|
|
void (*clustered_apic_check)(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);
|
|
int (*mpc_apic_id)(struct mpc_config_processor *m,
|
|
struct mpc_config_translation *t);
|
|
void (*setup_portio_remap)(void);
|
|
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 */
|
|
void (*mpc_oem_bus_info)(struct mpc_config_bus *, char *,
|
|
struct mpc_config_translation *);
|
|
void (*mpc_oem_pci_bus)(struct mpc_config_bus *,
|
|
struct mpc_config_translation *);
|
|
|
|
/* 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 mp_config_table *mpc, char *oem,
|
|
char *productid);
|
|
int (*acpi_madt_oem_check)(char *oem_id, char *oem_table_id);
|
|
|
|
unsigned (*get_apic_id)(unsigned long x);
|
|
unsigned long apic_id_mask;
|
|
unsigned int (*cpu_mask_to_apicid)(cpumask_t cpumask);
|
|
|
|
#ifdef CONFIG_SMP
|
|
/* ipi */
|
|
void (*send_IPI_mask)(cpumask_t mask, int vector);
|
|
void (*send_IPI_allbutself)(int vector);
|
|
void (*send_IPI_all)(int vector);
|
|
#endif
|
|
};
|
|
|
|
#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
|
|
|
|
#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(clustered_apic_check) \
|
|
APICFUNC(multi_timer_check) \
|
|
APICFUNC(apicid_to_node) \
|
|
APICFUNC(cpu_to_logical_apicid) \
|
|
APICFUNC(cpu_present_to_apicid) \
|
|
APICFUNC(apicid_to_cpu_present) \
|
|
APICFUNC(mpc_apic_id) \
|
|
APICFUNC(setup_portio_remap) \
|
|
APICFUNC(check_phys_apicid_present) \
|
|
APICFUNC(mpc_oem_bus_info) \
|
|
APICFUNC(mpc_oem_pci_bus) \
|
|
APICFUNC(mps_oem_check) \
|
|
APICFUNC(get_apic_id) \
|
|
.apic_id_mask = APIC_ID_MASK, \
|
|
APICFUNC(cpu_mask_to_apicid) \
|
|
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) \
|
|
}
|
|
|
|
extern struct genapic *genapic;
|
|
|
|
#endif
|