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