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