1 /* 2 * Common functions shared between the various APIC flavours 3 * 4 * SPDX-License-Identifier: GPL-2.0 5 */ 6 #include <linux/irq.h> 7 #include <asm/apic.h> 8 9 #include "local.h" 10 11 u32 apic_default_calc_apicid(unsigned int cpu) 12 { 13 return per_cpu(x86_cpu_to_apicid, cpu); 14 } 15 16 u32 apic_flat_calc_apicid(unsigned int cpu) 17 { 18 return 1U << cpu; 19 } 20 21 bool default_check_apicid_used(physid_mask_t *map, int apicid) 22 { 23 return physid_isset(apicid, *map); 24 } 25 26 void default_ioapic_phys_id_map(physid_mask_t *phys_map, physid_mask_t *retmap) 27 { 28 *retmap = *phys_map; 29 } 30 31 int default_cpu_present_to_apicid(int mps_cpu) 32 { 33 if (mps_cpu < nr_cpu_ids && cpu_present(mps_cpu)) 34 return (int)per_cpu(x86_cpu_to_apicid, mps_cpu); 35 else 36 return BAD_APICID; 37 } 38 EXPORT_SYMBOL_GPL(default_cpu_present_to_apicid); 39 40 bool default_apic_id_registered(void) 41 { 42 return physid_isset(read_apic_id(), phys_cpu_present_map); 43 } 44 45 /* 46 * Set up the logical destination ID when the APIC operates in logical 47 * destination mode. 48 */ 49 void default_init_apic_ldr(void) 50 { 51 unsigned long val; 52 53 apic_write(APIC_DFR, APIC_DFR_FLAT); 54 val = apic_read(APIC_LDR) & ~APIC_LDR_MASK; 55 val |= SET_APIC_LOGICAL_ID(1UL << smp_processor_id()); 56 apic_write(APIC_LDR, val); 57 } 58