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 | 11 | */ |
9844ab11 | 12 | #include <linux/cpumask.h> |
9844ab11 | 13 | |
521b82fe | 14 | #include <asm/apic.h> |
9844ab11 | 15 | |
f88f2b4f | 16 | static void noop_init_apic_ldr(void) { } |
4727da2e | 17 | static void noop_send_IPI(int cpu, int vector) { } |
f88f2b4f CG |
18 | static void noop_send_IPI_mask(const struct cpumask *cpumask, int vector) { } |
19 | static void noop_send_IPI_mask_allbutself(const struct cpumask *cpumask, int vector) { } | |
20 | static void noop_send_IPI_allbutself(int vector) { } | |
21 | static void noop_send_IPI_all(int vector) { } | |
22 | static void noop_send_IPI_self(int vector) { } | |
23 | static void noop_apic_wait_icr_idle(void) { } | |
24 | static void noop_apic_icr_write(u32 low, u32 id) { } | |
25 | ||
26 | static int noop_wakeup_secondary_cpu(int apicid, unsigned long start_eip) | |
9844ab11 | 27 | { |
f88f2b4f | 28 | return -1; |
9844ab11 CG |
29 | } |
30 | ||
f88f2b4f CG |
31 | static u32 noop_safe_apic_wait_icr_idle(void) |
32 | { | |
33 | return 0; | |
34 | } | |
35 | ||
36 | static u64 noop_apic_icr_read(void) | |
37 | { | |
38 | return 0; | |
39 | } | |
40 | ||
f88f2b4f CG |
41 | static int noop_phys_pkg_id(int cpuid_apic, int index_msb) |
42 | { | |
43 | return 0; | |
44 | } | |
45 | ||
46 | static unsigned int noop_get_apic_id(unsigned long x) | |
47 | { | |
48 | return 0; | |
49 | } | |
9844ab11 CG |
50 | |
51 | static int noop_probe(void) | |
52 | { | |
f88f2b4f CG |
53 | /* |
54 | * NOOP apic should not ever be | |
55 | * enabled via probe routine | |
56 | */ | |
9844ab11 CG |
57 | return 0; |
58 | } | |
59 | ||
60 | static int noop_apic_id_registered(void) | |
61 | { | |
f88f2b4f CG |
62 | /* |
63 | * if we would be really "pedantic" | |
64 | * we should pass read_apic_id() here | |
65 | * but since NOOP suppose APIC ID = 0 | |
66 | * lets save a few cycles | |
67 | */ | |
68 | return physid_isset(0, phys_cpu_present_map); | |
9844ab11 CG |
69 | } |
70 | ||
9844ab11 CG |
71 | static u32 noop_apic_read(u32 reg) |
72 | { | |
93984fbd | 73 | WARN_ON_ONCE(boot_cpu_has(X86_FEATURE_APIC) && !disable_apic); |
9844ab11 CG |
74 | return 0; |
75 | } | |
76 | ||
f88f2b4f CG |
77 | static void noop_apic_write(u32 reg, u32 v) |
78 | { | |
93984fbd | 79 | WARN_ON_ONCE(boot_cpu_has(X86_FEATURE_APIC) && !disable_apic); |
f88f2b4f CG |
80 | } |
81 | ||
1da91779 TG |
82 | #ifdef CONFIG_X86_32 |
83 | static int noop_x86_32_early_logical_apicid(int cpu) | |
84 | { | |
85 | return BAD_APICID; | |
86 | } | |
87 | #endif | |
88 | ||
404f6aac | 89 | struct apic apic_noop __ro_after_init = { |
9844ab11 CG |
90 | .name = "noop", |
91 | .probe = noop_probe, | |
92 | .acpi_madt_oem_check = NULL, | |
93 | ||
fa63030e | 94 | .apic_id_valid = default_apic_id_valid, |
9844ab11 CG |
95 | .apic_id_registered = noop_apic_id_registered, |
96 | ||
a31e58e1 | 97 | .irq_delivery_mode = dest_Fixed, |
9844ab11 CG |
98 | /* logical delivery broadcast to all CPUs: */ |
99 | .irq_dest_mode = 1, | |
100 | ||
9844ab11 CG |
101 | .disable_esr = 0, |
102 | .dest_logical = APIC_DEST_LOGICAL, | |
4c59f3e6 | 103 | .check_apicid_used = default_check_apicid_used, |
9844ab11 | 104 | |
9844ab11 CG |
105 | .init_apic_ldr = noop_init_apic_ldr, |
106 | ||
7abc0753 | 107 | .ioapic_phys_id_map = default_ioapic_phys_id_map, |
9844ab11 | 108 | .setup_apic_routing = NULL, |
9844ab11 | 109 | |
9844ab11 | 110 | .cpu_present_to_apicid = default_cpu_present_to_apicid, |
7abc0753 | 111 | .apicid_to_cpu_present = physid_set_mask_of_physid, |
9844ab11 | 112 | |
9844ab11 | 113 | .check_phys_apicid_present = default_check_phys_apicid_present, |
9844ab11 | 114 | |
f88f2b4f | 115 | .phys_pkg_id = noop_phys_pkg_id, |
9844ab11 | 116 | |
9844ab11 CG |
117 | .get_apic_id = noop_get_apic_id, |
118 | .set_apic_id = NULL, | |
9844ab11 | 119 | |
9f9e3bb1 | 120 | .calc_dest_apicid = apic_flat_calc_apicid, |
9844ab11 | 121 | |
4727da2e | 122 | .send_IPI = noop_send_IPI, |
9844ab11 CG |
123 | .send_IPI_mask = noop_send_IPI_mask, |
124 | .send_IPI_mask_allbutself = noop_send_IPI_mask_allbutself, | |
125 | .send_IPI_allbutself = noop_send_IPI_allbutself, | |
126 | .send_IPI_all = noop_send_IPI_all, | |
127 | .send_IPI_self = noop_send_IPI_self, | |
128 | ||
129 | .wakeup_secondary_cpu = noop_wakeup_secondary_cpu, | |
130 | ||
9844ab11 CG |
131 | .inquire_remote_apic = NULL, |
132 | ||
133 | .read = noop_apic_read, | |
134 | .write = noop_apic_write, | |
2a43195d | 135 | .eoi_write = noop_apic_write, |
9844ab11 CG |
136 | .icr_read = noop_apic_icr_read, |
137 | .icr_write = noop_apic_icr_write, | |
138 | .wait_icr_idle = noop_apic_wait_icr_idle, | |
139 | .safe_wait_icr_idle = noop_safe_apic_wait_icr_idle, | |
acb8bc09 TH |
140 | |
141 | #ifdef CONFIG_X86_32 | |
142 | .x86_32_early_logical_apicid = noop_x86_32_early_logical_apicid, | |
143 | #endif | |
9844ab11 | 144 | }; |