Lines Matching +full:cpu +full:- +full:nr
1 // SPDX-License-Identifier: GPL-2.0-or-later
17 #include <linux/cpu.h>
31 #include <asm/text-patching.h>
34 #include <asm/ppc-opcode.h>
50 static void pnv_smp_setup_cpu(int cpu) in pnv_smp_setup_cpu() argument
61 else if (cpu != boot_cpuid) in pnv_smp_setup_cpu()
65 static int pnv_smp_kick_cpu(int nr) in pnv_smp_kick_cpu() argument
73 if (nr < 0 || nr >= nr_cpu_ids) in pnv_smp_kick_cpu()
74 return -EINVAL; in pnv_smp_kick_cpu()
76 pcpu = get_hard_smp_processor_id(nr); in pnv_smp_kick_cpu()
79 * kick the CPU via the PACA in pnv_smp_kick_cpu()
81 if (paca_ptrs[nr]->cpu_start || !firmware_has_feature(FW_FEATURE_OPAL)) in pnv_smp_kick_cpu()
85 * At this point, the CPU can either be spinning on the way in in pnv_smp_kick_cpu()
92 pr_warn("OPAL Error %ld querying CPU %d state\n", rc, nr); in pnv_smp_kick_cpu()
93 return -ENODEV; in pnv_smp_kick_cpu()
107 pr_devel("OPAL: Starting CPU %d (HW 0x%x)...\n", nr, pcpu); in pnv_smp_kick_cpu()
110 pr_warn("OPAL Error %ld starting CPU %d\n", rc, nr); in pnv_smp_kick_cpu()
111 return -ENODEV; in pnv_smp_kick_cpu()
115 * An unavailable CPU (or any other unknown status) in pnv_smp_kick_cpu()
120 pr_devel("OPAL: CPU %d (HW 0x%x) is unavailable" in pnv_smp_kick_cpu()
121 " (status %d)...\n", nr, pcpu, status); in pnv_smp_kick_cpu()
122 return -ENODEV; in pnv_smp_kick_cpu()
126 return smp_generic_kick_cpu(nr); in pnv_smp_kick_cpu()
133 int cpu = smp_processor_id(); in pnv_smp_cpu_disable() local
137 * the generic fixup_irqs. --BenH. in pnv_smp_cpu_disable()
139 set_cpu_online(cpu, false); in pnv_smp_cpu_disable()
141 systemcfg->processorCount--; in pnv_smp_cpu_disable()
143 if (cpu == boot_cpuid) in pnv_smp_cpu_disable()
170 unsigned int cpu; in pnv_cpu_offline_self() local
176 cpu = smp_processor_id(); in pnv_cpu_offline_self()
177 DBG("CPU%d offline\n", cpu); in pnv_cpu_offline_self()
178 generic_set_cpu_dead(cpu); in pnv_cpu_offline_self()
186 * This turns the irq soft-disabled state we're called with, into a in pnv_cpu_offline_self()
187 * hard-disabled state with pending irq_happened interrupts cleared. in pnv_cpu_offline_self()
189 * PACA_IRQ_DEC - Decrementer should be ignored. in pnv_cpu_offline_self()
190 * PACA_IRQ_HMI - Can be ignored, processing is done in real mode. in pnv_cpu_offline_self()
191 * PACA_IRQ_DBELL, EE, PMI - Unexpected. in pnv_cpu_offline_self()
194 if (generic_check_cpu_restart(cpu)) in pnv_cpu_offline_self()
198 if (local_paca->irq_happened & unexpected_mask) { in pnv_cpu_offline_self()
199 if (local_paca->irq_happened & PACA_IRQ_EE) in pnv_cpu_offline_self()
201 DBG("CPU%d Unexpected exit while offline irq_happened=%lx!\n", in pnv_cpu_offline_self()
202 cpu, local_paca->irq_happened); in pnv_cpu_offline_self()
204 local_paca->irq_happened = PACA_IRQ_HARD_DIS; in pnv_cpu_offline_self()
211 * If the CPU gets woken up by a special wakeup, ensure that in pnv_cpu_offline_self()
213 * the CPU will come back to the kernel due to a spurious in pnv_cpu_offline_self()
217 pnv_program_cpu_hotplug_lpcr(cpu, lpcr_val); in pnv_cpu_offline_self()
219 while (!generic_check_cpu_restart(cpu)) { in pnv_cpu_offline_self()
222 * offline, except for those when changing micro-threading in pnv_cpu_offline_self()
227 kvmppc_clear_host_ipi(cpu); in pnv_cpu_offline_self()
229 srr1 = pnv_cpu_offline(cpu); in pnv_cpu_offline_self()
240 * just as some other cpu is sending us an interrupt. in pnv_cpu_offline_self()
280 if (srr1 && !generic_check_cpu_restart(cpu)) in pnv_cpu_offline_self()
281 DBG("CPU%d Unexpected exit while offline srr1=%lx!\n", in pnv_cpu_offline_self()
282 cpu, srr1); in pnv_cpu_offline_self()
287 * Re-enable decrementer interrupts in LPCR. in pnv_cpu_offline_self()
290 * for non-hotplug cases. So program the LPCR via stop api as in pnv_cpu_offline_self()
294 pnv_program_cpu_hotplug_lpcr(cpu, lpcr_val); in pnv_cpu_offline_self()
296 DBG("CPU%d coming online...\n", cpu); in pnv_cpu_offline_self()
301 static int pnv_cpu_bootable(unsigned int nr) in pnv_cpu_bootable() argument
307 * setting (smt-enabled on the kernel command line). in pnv_cpu_bootable()
312 return smp_generic_cpu_bootable(nr); in pnv_cpu_bootable()
315 static int pnv_smp_prepare_cpu(int cpu) in pnv_smp_prepare_cpu() argument
318 return xive_smp_prepare_cpu(cpu); in pnv_smp_prepare_cpu()
323 static void (*ic_cause_ipi)(int cpu);
325 static void pnv_cause_ipi(int cpu) in pnv_cause_ipi() argument
327 if (doorbell_try_core_ipi(cpu)) in pnv_cause_ipi()
330 ic_cause_ipi(cpu); in pnv_cause_ipi()
341 ic_cause_ipi = smp_ops->cause_ipi; in pnv_smp_probe()
345 smp_ops->cause_ipi = doorbell_global_ipi; in pnv_smp_probe()
347 smp_ops->cause_ipi = pnv_cause_ipi; in pnv_smp_probe()
358 static int pnv_cause_nmi_ipi(int cpu) in pnv_cause_nmi_ipi() argument
362 if (cpu >= 0) { in pnv_cause_nmi_ipi()
363 int h = get_hard_smp_processor_id(cpu); in pnv_cause_nmi_ipi()
377 } else if (cpu == NMI_IPI_ALL_OTHERS) { in pnv_cause_nmi_ipi()
382 opal_quiesce(QUIESCE_HOLD, -1); in pnv_cause_nmi_ipi()
400 opal_quiesce(QUIESCE_RESUME, -1); in pnv_cause_nmi_ipi()