1 // SPDX-License-Identifier: GPL-2.0
3 #include <linux/cpumask.h>
4 #include <linux/acpi.h>
10 static struct apic apic_x2apic_phys
;
11 u32 x2apic_max_apicid __ro_after_init
= UINT_MAX
;
13 void __init
x2apic_set_max_apicid(u32 apicid
)
15 x2apic_max_apicid
= apicid
;
16 if (apic
->x2apic_set_max_apicid
)
17 apic
->max_apic_id
= apicid
;
20 static int __init
set_x2apic_phys_mode(char *arg
)
25 early_param("x2apic_phys", set_x2apic_phys_mode
);
27 static bool x2apic_fadt_phys(void)
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");
39 static int x2apic_acpi_madt_oem_check(char *oem_id
, char *oem_table_id
)
41 return x2apic_enabled() && (x2apic_phys
|| x2apic_fadt_phys());
44 static void x2apic_send_IPI(int cpu
, int vector
)
46 u32 dest
= per_cpu(x86_cpu_to_apicid
, cpu
);
48 /* x2apic MSRs are special and need a special fence: */
50 __x2apic_send_IPI_dest(dest
, vector
, APIC_DEST_PHYSICAL
);
54 __x2apic_send_IPI_mask(const struct cpumask
*mask
, int vector
, int apic_dest
)
56 unsigned long query_cpu
;
57 unsigned long this_cpu
;
60 /* x2apic MSRs are special and need a special fence: */
63 local_irq_save(flags
);
65 this_cpu
= smp_processor_id();
66 for_each_cpu(query_cpu
, mask
) {
67 if (apic_dest
== APIC_DEST_ALLBUT
&& this_cpu
== query_cpu
)
69 __x2apic_send_IPI_dest(per_cpu(x86_cpu_to_apicid
, query_cpu
),
70 vector
, APIC_DEST_PHYSICAL
);
72 local_irq_restore(flags
);
75 static void x2apic_send_IPI_mask(const struct cpumask
*mask
, int vector
)
77 __x2apic_send_IPI_mask(mask
, vector
, APIC_DEST_ALLINC
);
81 x2apic_send_IPI_mask_allbutself(const struct cpumask
*mask
, int vector
)
83 __x2apic_send_IPI_mask(mask
, vector
, APIC_DEST_ALLBUT
);
86 static void __x2apic_send_IPI_shorthand(int vector
, u32 which
)
88 unsigned long cfg
= __prepare_ICR(which
, vector
, 0);
90 /* x2apic MSRs are special and need a special fence: */
92 native_x2apic_icr_write(cfg
, 0);
95 void x2apic_send_IPI_allbutself(int vector
)
97 __x2apic_send_IPI_shorthand(vector
, APIC_DEST_ALLBUT
);
100 void x2apic_send_IPI_all(int vector
)
102 __x2apic_send_IPI_shorthand(vector
, APIC_DEST_ALLINC
);
105 void x2apic_send_IPI_self(int vector
)
107 apic_write(APIC_SELF_IPI
, vector
);
110 void __x2apic_send_IPI_dest(unsigned int apicid
, int vector
, unsigned int dest
)
112 unsigned long cfg
= __prepare_ICR(0, vector
, dest
);
113 native_x2apic_icr_write(cfg
, apicid
);
116 static int x2apic_phys_probe(void)
121 if (x2apic_phys
|| x2apic_fadt_phys())
124 return apic
== &apic_x2apic_phys
;
127 u32
x2apic_get_apic_id(u32 id
)
132 static struct apic apic_x2apic_phys __ro_after_init
= {
134 .name
= "physical x2apic",
135 .probe
= x2apic_phys_probe
,
136 .acpi_madt_oem_check
= x2apic_acpi_madt_oem_check
,
138 .dest_mode_logical
= false,
142 .cpu_present_to_apicid
= default_cpu_present_to_apicid
,
144 .max_apic_id
= UINT_MAX
,
145 .x2apic_set_max_apicid
= true,
146 .get_apic_id
= x2apic_get_apic_id
,
148 .calc_dest_apicid
= apic_default_calc_apicid
,
150 .send_IPI
= x2apic_send_IPI
,
151 .send_IPI_mask
= x2apic_send_IPI_mask
,
152 .send_IPI_mask_allbutself
= x2apic_send_IPI_mask_allbutself
,
153 .send_IPI_allbutself
= x2apic_send_IPI_allbutself
,
154 .send_IPI_all
= x2apic_send_IPI_all
,
155 .send_IPI_self
= x2apic_send_IPI_self
,
156 .nmi_to_offline_cpu
= true,
158 .read
= native_apic_msr_read
,
159 .write
= native_apic_msr_write
,
160 .eoi
= native_apic_msr_eoi
,
161 .icr_read
= native_x2apic_icr_read
,
162 .icr_write
= native_x2apic_icr_write
,
165 apic_driver(apic_x2apic_phys
);