]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | // SPDX-License-Identifier: GPL-2.0 |
9844ab11 CG |
2 | /* |
3 | * NOOP APIC driver. | |
4 | * | |
5 | * Does almost nothing and should be substituted by a real apic driver via | |
6 | * probe routine. | |
7 | * | |
8 | * Though in case if apic is disabled (for some reason) we try | |
9 | * to not uglify the caller's code and allow to call (some) apic routines | |
f88f2b4f | 10 | * like self-ipi, etc... |
9844ab11 CG |
11 | */ |
12 | ||
13 | #include <linux/threads.h> | |
14 | #include <linux/cpumask.h> | |
9844ab11 CG |
15 | #include <linux/string.h> |
16 | #include <linux/kernel.h> | |
17 | #include <linux/ctype.h> | |
9844ab11 CG |
18 | #include <linux/errno.h> |
19 | #include <asm/fixmap.h> | |
20 | #include <asm/mpspec.h> | |
21 | #include <asm/apicdef.h> | |
22 | #include <asm/apic.h> | |
23 | #include <asm/setup.h> | |
24 | ||
25 | #include <linux/smp.h> | |
26 | #include <asm/ipi.h> | |
27 | ||
28 | #include <linux/interrupt.h> | |
29 | #include <asm/acpi.h> | |
66441bd3 | 30 | #include <asm/e820/api.h> |
9844ab11 | 31 | |
f88f2b4f | 32 | static void noop_init_apic_ldr(void) { } |
4727da2e | 33 | static void noop_send_IPI(int cpu, int vector) { } |
f88f2b4f CG |
34 | static void noop_send_IPI_mask(const struct cpumask *cpumask, int vector) { } |
35 | static void noop_send_IPI_mask_allbutself(const struct cpumask *cpumask, int vector) { } | |
36 | static void noop_send_IPI_allbutself(int vector) { } | |
37 | static void noop_send_IPI_all(int vector) { } | |
38 | static void noop_send_IPI_self(int vector) { } | |
39 | static void noop_apic_wait_icr_idle(void) { } | |
40 | static void noop_apic_icr_write(u32 low, u32 id) { } | |
41 | ||
42 | static int noop_wakeup_secondary_cpu(int apicid, unsigned long start_eip) | |
9844ab11 | 43 | { |
f88f2b4f | 44 | return -1; |
9844ab11 CG |
45 | } |
46 | ||
f88f2b4f CG |
47 | static u32 noop_safe_apic_wait_icr_idle(void) |
48 | { | |
49 | return 0; | |
50 | } | |
51 | ||
52 | static u64 noop_apic_icr_read(void) | |
53 | { | |
54 | return 0; | |
55 | } | |
56 | ||
f88f2b4f CG |
57 | static int noop_phys_pkg_id(int cpuid_apic, int index_msb) |
58 | { | |
59 | return 0; | |
60 | } | |
61 | ||
62 | static unsigned int noop_get_apic_id(unsigned long x) | |
63 | { | |
64 | return 0; | |
65 | } | |
9844ab11 CG |
66 | |
67 | static int noop_probe(void) | |
68 | { | |
f88f2b4f CG |
69 | /* |
70 | * NOOP apic should not ever be | |
71 | * enabled via probe routine | |
72 | */ | |
9844ab11 CG |
73 | return 0; |
74 | } | |
75 | ||
76 | static int noop_apic_id_registered(void) | |
77 | { | |
f88f2b4f CG |
78 | /* |
79 | * if we would be really "pedantic" | |
80 | * we should pass read_apic_id() here | |
81 | * but since NOOP suppose APIC ID = 0 | |
82 | * lets save a few cycles | |
83 | */ | |
84 | return physid_isset(0, phys_cpu_present_map); | |
9844ab11 CG |
85 | } |
86 | ||
87 | static const struct cpumask *noop_target_cpus(void) | |
88 | { | |
9844ab11 CG |
89 | /* only BSP here */ |
90 | return cpumask_of(0); | |
91 | } | |
92 | ||
1ac322d0 SS |
93 | static void noop_vector_allocation_domain(int cpu, struct cpumask *retmask, |
94 | const struct cpumask *mask) | |
9844ab11 | 95 | { |
9844ab11 CG |
96 | if (cpu != 0) |
97 | pr_warning("APIC: Vector allocated for non-BSP cpu\n"); | |
9d8e1066 | 98 | cpumask_copy(retmask, cpumask_of(cpu)); |
9844ab11 CG |
99 | } |
100 | ||
9844ab11 CG |
101 | static u32 noop_apic_read(u32 reg) |
102 | { | |
93984fbd | 103 | WARN_ON_ONCE(boot_cpu_has(X86_FEATURE_APIC) && !disable_apic); |
9844ab11 CG |
104 | return 0; |
105 | } | |
106 | ||
f88f2b4f CG |
107 | static void noop_apic_write(u32 reg, u32 v) |
108 | { | |
93984fbd | 109 | WARN_ON_ONCE(boot_cpu_has(X86_FEATURE_APIC) && !disable_apic); |
f88f2b4f CG |
110 | } |
111 | ||
404f6aac | 112 | struct apic apic_noop __ro_after_init = { |
9844ab11 CG |
113 | .name = "noop", |
114 | .probe = noop_probe, | |
115 | .acpi_madt_oem_check = NULL, | |
116 | ||
fa63030e | 117 | .apic_id_valid = default_apic_id_valid, |
9844ab11 CG |
118 | .apic_id_registered = noop_apic_id_registered, |
119 | ||
120 | .irq_delivery_mode = dest_LowestPrio, | |
121 | /* logical delivery broadcast to all CPUs: */ | |
122 | .irq_dest_mode = 1, | |
123 | ||
124 | .target_cpus = noop_target_cpus, | |
125 | .disable_esr = 0, | |
126 | .dest_logical = APIC_DEST_LOGICAL, | |
4c59f3e6 | 127 | .check_apicid_used = default_check_apicid_used, |
9844ab11 CG |
128 | |
129 | .vector_allocation_domain = noop_vector_allocation_domain, | |
130 | .init_apic_ldr = noop_init_apic_ldr, | |
131 | ||
7abc0753 | 132 | .ioapic_phys_id_map = default_ioapic_phys_id_map, |
9844ab11 | 133 | .setup_apic_routing = NULL, |
9844ab11 | 134 | |
9844ab11 | 135 | .cpu_present_to_apicid = default_cpu_present_to_apicid, |
7abc0753 | 136 | .apicid_to_cpu_present = physid_set_mask_of_physid, |
9844ab11 | 137 | |
9844ab11 | 138 | .check_phys_apicid_present = default_check_phys_apicid_present, |
9844ab11 | 139 | |
f88f2b4f | 140 | .phys_pkg_id = noop_phys_pkg_id, |
9844ab11 | 141 | |
9844ab11 CG |
142 | .get_apic_id = noop_get_apic_id, |
143 | .set_apic_id = NULL, | |
9844ab11 | 144 | |
91cd9cb7 | 145 | .cpu_mask_to_apicid = flat_cpu_mask_to_apicid, |
9844ab11 | 146 | |
4727da2e | 147 | .send_IPI = noop_send_IPI, |
9844ab11 CG |
148 | .send_IPI_mask = noop_send_IPI_mask, |
149 | .send_IPI_mask_allbutself = noop_send_IPI_mask_allbutself, | |
150 | .send_IPI_allbutself = noop_send_IPI_allbutself, | |
151 | .send_IPI_all = noop_send_IPI_all, | |
152 | .send_IPI_self = noop_send_IPI_self, | |
153 | ||
154 | .wakeup_secondary_cpu = noop_wakeup_secondary_cpu, | |
155 | ||
9844ab11 CG |
156 | .inquire_remote_apic = NULL, |
157 | ||
158 | .read = noop_apic_read, | |
159 | .write = noop_apic_write, | |
2a43195d | 160 | .eoi_write = noop_apic_write, |
9844ab11 CG |
161 | .icr_read = noop_apic_icr_read, |
162 | .icr_write = noop_apic_icr_write, | |
163 | .wait_icr_idle = noop_apic_wait_icr_idle, | |
164 | .safe_wait_icr_idle = noop_safe_apic_wait_icr_idle, | |
acb8bc09 TH |
165 | |
166 | #ifdef CONFIG_X86_32 | |
167 | .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, | |
168 | #endif | |
9844ab11 | 169 | }; |