1 // SPDX-License-Identifier: GPL-2.0 2 3 #include <linux/cpumask.h> 4 #include <linux/acpi.h> 5 6 #include "local.h" 7 8 int x2apic_phys; 9 10 static struct apic apic_x2apic_phys; 11 u32 x2apic_max_apicid __ro_after_init = UINT_MAX; 12 13 void __init x2apic_set_max_apicid(u32 apicid) 14 { 15 x2apic_max_apicid = apicid; 16 if (apic->x2apic_set_max_apicid) 17 apic->max_apic_id = apicid; 18 } 19 20 static int __init set_x2apic_phys_mode(char *arg) 21 { 22 x2apic_phys = 1; 23 return 0; 24 } 25 early_param("x2apic_phys", set_x2apic_phys_mode); 26 27 static bool x2apic_fadt_phys(void) 28 { 29 #ifdef CONFIG_ACPI 30 if ((acpi_gbl_FADT.header.revision >= FADT2_REVISION_ID) && 31 (acpi_gbl_FADT.flags & ACPI_FADT_APIC_PHYSICAL)) { 32 printk(KERN_DEBUG "System requires x2apic physical mode\n"); 33 return true; 34 } 35 #endif 36 return false; 37 } 38 39 static int x2apic_acpi_madt_oem_check(char *oem_id, char *oem_table_id) 40 { 41 return x2apic_enabled() && (x2apic_phys || x2apic_fadt_phys()); 42 } 43 44 static void x2apic_send_IPI(int cpu, int vector) 45 { 46 u32 dest = per_cpu(x86_cpu_to_apicid, cpu); 47 48 /* x2apic MSRs are special and need a special fence: */ 49 weak_wrmsr_fence(); 50 __x2apic_send_IPI_dest(dest, vector, APIC_DEST_PHYSICAL); 51 } 52 53 static void 54 __x2apic_send_IPI_mask(const struct cpumask *mask, int vector, int apic_dest) 55 { 56 unsigned long query_cpu; 57 unsigned long this_cpu; 58 unsigned long flags; 59 60 /* x2apic MSRs are special and need a special fence: */ 61 weak_wrmsr_fence(); 62 63 local_irq_save(flags); 64 65 this_cpu = smp_processor_id(); 66 for_each_cpu(query_cpu, mask) { 67 if (apic_dest == APIC_DEST_ALLBUT && this_cpu == query_cpu) 68 continue; 69 __x2apic_send_IPI_dest(per_cpu(x86_cpu_to_apicid, query_cpu), 70 vector, APIC_DEST_PHYSICAL); 71 } 72 local_irq_restore(flags); 73 } 74 75 static void x2apic_send_IPI_mask(const struct cpumask *mask, int vector) 76 { 77 __x2apic_send_IPI_mask(mask, vector, APIC_DEST_ALLINC); 78 } 79 80 static void 81 x2apic_send_IPI_mask_allbutself(const struct cpumask *mask, int vector) 82 { 83 __x2apic_send_IPI_mask(mask, vector, APIC_DEST_ALLBUT); 84 } 85 86 static void __x2apic_send_IPI_shorthand(int vector, u32 which) 87 { 88 /* x2apic MSRs are special and need a special fence: */ 89 weak_wrmsr_fence(); 90 native_x2apic_icr_write(__prepare_ICR(which, vector, 0), 0); 91 } 92 93 void x2apic_send_IPI_allbutself(int vector) 94 { 95 __x2apic_send_IPI_shorthand(vector, APIC_DEST_ALLBUT); 96 } 97 98 void x2apic_send_IPI_all(int vector) 99 { 100 __x2apic_send_IPI_shorthand(vector, APIC_DEST_ALLINC); 101 } 102 103 void x2apic_send_IPI_self(int vector) 104 { 105 apic_write(APIC_SELF_IPI, vector); 106 } 107 108 static int x2apic_phys_probe(void) 109 { 110 if (!x2apic_mode) 111 return 0; 112 113 if (x2apic_phys || x2apic_fadt_phys()) 114 return 1; 115 116 return apic == &apic_x2apic_phys; 117 } 118 119 u32 x2apic_get_apic_id(u32 id) 120 { 121 return id; 122 } 123 124 static struct apic apic_x2apic_phys __ro_after_init = { 125 126 .name = "physical x2apic", 127 .probe = x2apic_phys_probe, 128 .acpi_madt_oem_check = x2apic_acpi_madt_oem_check, 129 130 .dest_mode_logical = false, 131 132 .disable_esr = 0, 133 134 .cpu_present_to_apicid = default_cpu_present_to_apicid, 135 136 .max_apic_id = UINT_MAX, 137 .x2apic_set_max_apicid = true, 138 .get_apic_id = x2apic_get_apic_id, 139 140 .calc_dest_apicid = apic_default_calc_apicid, 141 142 .send_IPI = x2apic_send_IPI, 143 .send_IPI_mask = x2apic_send_IPI_mask, 144 .send_IPI_mask_allbutself = x2apic_send_IPI_mask_allbutself, 145 .send_IPI_allbutself = x2apic_send_IPI_allbutself, 146 .send_IPI_all = x2apic_send_IPI_all, 147 .send_IPI_self = x2apic_send_IPI_self, 148 .nmi_to_offline_cpu = true, 149 150 .read = native_apic_msr_read, 151 .write = native_apic_msr_write, 152 .eoi = native_apic_msr_eoi, 153 .icr_read = native_x2apic_icr_read, 154 .icr_write = native_x2apic_icr_write, 155 }; 156 157 apic_driver(apic_x2apic_phys); 158