Lines Matching +full:hardware +full:- +full:managed
1 // SPDX-License-Identifier: GPL-2.0-only
78 info->mask = mask; in init_irq_alloc_info()
94 while (irqd->parent_data) in apic_chip_data()
95 irqd = irqd->parent_data; in apic_chip_data()
97 return irqd->chip_data; in apic_chip_data()
104 return apicd ? &apicd->hw_irq_cfg : NULL; in irqd_cfg()
119 INIT_HLIST_NODE(&apicd->clist); in alloc_apic_chip_data()
135 apicd->hw_irq_cfg.vector = vector; in apic_update_irq_cfg()
136 apicd->hw_irq_cfg.dest_apicid = apic->calc_dest_apicid(cpu); in apic_update_irq_cfg()
141 trace_vector_config(irqd->irq, vector, cpu, apicd->hw_irq_cfg.dest_apicid); in apic_update_irq_cfg()
144 static void apic_free_vector(unsigned int cpu, unsigned int vector, bool managed) in apic_free_vector() argument
147 irq_matrix_free(vector_matrix, cpu, vector, managed); in apic_free_vector()
154 bool managed = irqd_affinity_is_managed(irqd); in chip_data_update() local
158 trace_vector_update(irqd->irq, newvec, newcpu, apicd->vector, in chip_data_update()
159 apicd->cpu); in chip_data_update()
167 apicd->prev_vector = 0; in chip_data_update()
168 if (!apicd->vector || apicd->vector == MANAGED_IRQ_SHUTDOWN_VECTOR) in chip_data_update()
178 if (cpu_online(apicd->cpu)) { in chip_data_update()
179 apicd->move_in_progress = true; in chip_data_update()
180 apicd->prev_vector = apicd->vector; in chip_data_update()
181 apicd->prev_cpu = apicd->cpu; in chip_data_update()
182 WARN_ON_ONCE(apicd->cpu == newcpu); in chip_data_update()
184 apic_free_vector(apicd->cpu, apicd->vector, managed); in chip_data_update()
188 apicd->vector = newvec; in chip_data_update()
189 apicd->cpu = newcpu; in chip_data_update()
210 apicd->is_managed = true; in reserve_managed_vector()
213 trace_vector_reserve_managed(irqd->irq, ret); in reserve_managed_vector()
222 apicd->can_reserve = true; in reserve_irq_vector_locked()
223 apicd->has_reserved = true; in reserve_irq_vector_locked()
225 trace_vector_reserve(irqd->irq, 0); in reserve_irq_vector_locked()
243 bool resvd = apicd->has_reserved; in assign_vector_locked()
244 unsigned int cpu = apicd->cpu; in assign_vector_locked()
245 int vector = apicd->vector; in assign_vector_locked()
263 if (apicd->move_in_progress || !hlist_unhashed(&apicd->clist)) in assign_vector_locked()
264 return -EBUSY; in assign_vector_locked()
267 trace_vector_alloc(irqd->irq, vector, resvd, vector); in assign_vector_locked()
289 /* Get the affinity mask - either irq_default_affinity or (user) set */ in assign_irq_vector_any_locked()
320 if (info->mask) in assign_irq_vector_policy()
321 return assign_irq_vector(irqd, info->mask); in assign_irq_vector_policy()
339 if (apicd->vector && cpumask_test_cpu(apicd->cpu, vector_searchmask)) in assign_managed_vector()
343 trace_vector_alloc_managed(irqd->irq, vector, vector); in assign_managed_vector()
354 bool managed = irqd_affinity_is_managed(irqd); in clear_irq_vector() local
355 unsigned int vector = apicd->vector; in clear_irq_vector()
362 trace_vector_clear(irqd->irq, vector, apicd->cpu, apicd->prev_vector, in clear_irq_vector()
363 apicd->prev_cpu); in clear_irq_vector()
365 per_cpu(vector_irq, apicd->cpu)[vector] = VECTOR_SHUTDOWN; in clear_irq_vector()
366 apic_free_vector(apicd->cpu, vector, managed); in clear_irq_vector()
367 apicd->vector = 0; in clear_irq_vector()
370 vector = apicd->prev_vector; in clear_irq_vector()
374 per_cpu(vector_irq, apicd->prev_cpu)[vector] = VECTOR_SHUTDOWN; in clear_irq_vector()
375 apic_free_vector(apicd->prev_cpu, vector, managed); in clear_irq_vector()
376 apicd->prev_vector = 0; in clear_irq_vector()
377 apicd->move_in_progress = 0; in clear_irq_vector()
378 hlist_del_init(&apicd->clist); in clear_irq_vector()
386 trace_vector_deactivate(irqd->irq, apicd->is_managed, in x86_vector_deactivate()
387 apicd->can_reserve, false); in x86_vector_deactivate()
390 if (!apicd->is_managed && !apicd->can_reserve) in x86_vector_deactivate()
393 if (apicd->has_reserved) in x86_vector_deactivate()
398 if (apicd->can_reserve) in x86_vector_deactivate()
412 apicd->has_reserved = false; in activate_reserved()
421 apicd->can_reserve = false; in activate_reserved()
431 irqd->irq); in activate_reserved()
445 pr_err("Managed startup for irq %u, but no CPU\n", irqd->irq); in activate_managed()
446 return -EINVAL; in activate_managed()
455 pr_err("Managed startup irq %u, no vector available\n", in activate_managed()
456 irqd->irq); in activate_managed()
468 trace_vector_activate(irqd->irq, apicd->is_managed, in x86_vector_activate()
469 apicd->can_reserve, reserve); in x86_vector_activate()
472 if (!apicd->can_reserve && !apicd->is_managed) in x86_vector_activate()
476 else if (apicd->is_managed) in x86_vector_activate()
478 else if (apicd->has_reserved) in x86_vector_activate()
489 trace_vector_teardown(irqd->irq, apicd->is_managed, in vector_free_reserved_and_managed()
490 apicd->has_reserved); in vector_free_reserved_and_managed()
492 if (apicd->has_reserved) in vector_free_reserved_and_managed()
494 if (apicd->is_managed) in vector_free_reserved_and_managed()
508 if (irqd && irqd->chip_data) { in x86_vector_free_irqs()
512 apicd = irqd->chip_data; in x86_vector_free_irqs()
526 apicd->vector = ISA_IRQ_VECTOR(virq); in vector_configure_legacy()
527 apicd->cpu = 0; in vector_configure_legacy()
536 apic_update_irq_cfg(irqd, apicd->vector, apicd->cpu); in vector_configure_legacy()
539 apicd->can_reserve = true; in vector_configure_legacy()
557 return -ENXIO; in x86_vector_alloc_irqs()
563 if (WARN_ON_ONCE(info->flags & X86_IRQ_ALLOC_LEGACY && in x86_vector_alloc_irqs()
565 return -EINVAL; in x86_vector_alloc_irqs()
571 WARN_ON_ONCE(irqd->chip_data); in x86_vector_alloc_irqs()
574 err = -ENOMEM; in x86_vector_alloc_irqs()
578 apicd->irq = virq + i; in x86_vector_alloc_irqs()
579 irqd->chip = &lapic_controller; in x86_vector_alloc_irqs()
580 irqd->chip_data = apicd; in x86_vector_alloc_irqs()
581 irqd->hwirq = virq + i; in x86_vector_alloc_irqs()
597 * switch back to legacy mode. Only update the hardware in x86_vector_alloc_irqs()
600 if (info->flags & X86_IRQ_ALLOC_LEGACY) { in x86_vector_alloc_irqs()
608 irqd->chip_data = NULL; in x86_vector_alloc_irqs()
634 irq = irqd->irq; in x86_vector_debug_show()
641 if (!irqd->chip_data) { in x86_vector_debug_show()
647 memcpy(&apicd, irqd->chip_data, sizeof(apicd)); in x86_vector_debug_show()
666 if (fwspec->param_count != 1) in x86_fwspec_is_ioapic()
669 if (is_fwnode_irqchip(fwspec->fwnode)) { in x86_fwspec_is_ioapic()
670 const char *fwname = fwnode_get_name(fwspec->fwnode); in x86_fwspec_is_ioapic()
671 return fwname && !strncmp(fwname, "IO-APIC-", 8) && in x86_fwspec_is_ioapic()
672 simple_strtol(fwname+8, NULL, 10) == fwspec->param[0]; in x86_fwspec_is_ioapic()
674 return to_of_node(fwspec->fwnode) && in x86_fwspec_is_ioapic()
675 of_device_is_compatible(to_of_node(fwspec->fwnode), in x86_fwspec_is_ioapic()
676 "intel,ce4100-ioapic"); in x86_fwspec_is_ioapic()
681 if (fwspec->param_count != 1) in x86_fwspec_is_hpet()
684 if (is_fwnode_irqchip(fwspec->fwnode)) { in x86_fwspec_is_hpet()
685 const char *fwname = fwnode_get_name(fwspec->fwnode); in x86_fwspec_is_hpet()
686 return fwname && !strncmp(fwname, "HPET-MSI-", 9) && in x86_fwspec_is_hpet()
687 simple_strtol(fwname+9, NULL, 10) == fwspec->param[0]; in x86_fwspec_is_hpet()
741 return legacy_pic->probe(); in arch_probe_nr_irqs()
748 * and movable in the cpu hotplug check and it prevents managed in lapic_assign_legacy_vector()
827 int isairq = vector - ISA_IRQ_VECTOR(0); in __setup_vector_irq()
852 * they can be distributed to any online CPU in hardware. The in lapic_online()
873 WARN_ON_ONCE(timer_delete_sync_try(&cl->timer) < 0); in lapic_offline()
874 WARN_ON_ONCE(!hlist_empty(&cl->head)); in lapic_offline()
885 return -EIO; in apic_set_affinity()
899 unsigned int vector = apicd->prev_vector; in free_moved_vector()
900 unsigned int cpu = apicd->prev_cpu; in free_moved_vector()
901 bool managed = apicd->is_managed; in free_moved_vector() local
904 * Managed interrupts are usually not migrated away in free_moved_vector()
910 * a non-isolated CPU which is in the calculated in free_moved_vector()
913 trace_vector_free_moved(apicd->irq, cpu, vector, managed); in free_moved_vector()
914 apic_free_vector(cpu, vector, managed); in free_moved_vector()
916 hlist_del_init(&apicd->clist); in free_moved_vector()
917 apicd->prev_vector = 0; in free_moved_vector()
918 apicd->move_in_progress = 0; in free_moved_vector()
922 * Called from fixup_irqs() with @desc->lock held and interrupts disabled.
939 vector = apicd->prev_vector; in apic_force_complete_move()
940 if (!vector || (apicd->cpu != cpu && apicd->prev_cpu != cpu)) in apic_force_complete_move()
946 * -EBUSY. This can leave the interrupt in a stale state. in apic_force_complete_move()
958 if (apicd->move_in_progress) { in apic_force_complete_move()
962 * set_ioapic(new_vector) <-- Interrupt is raised before update in apic_force_complete_move()
983 * as stupid as the real hardware. in apic_force_complete_move()
992 irqd->irq, vector); in apic_force_complete_move()
1008 __apic_send_IPI(apicd->cpu, apicd->vector); in apic_retrigger_irq()
1051 hlist_for_each_entry_safe(apicd, tmp, &cl->head, clist) { in __vector_cleanup()
1052 unsigned int vector = apicd->prev_vector; in __vector_cleanup()
1057 * hardware issue if the vector arrived on the old target in __vector_cleanup()
1067 pr_warn_once("Moved interrupt pending in old target APIC %u\n", apicd->irq); in __vector_cleanup()
1079 mod_timer(&cl->timer, jiffies + 1); in __vector_cleanup()
1094 unsigned int cpu = apicd->prev_cpu; in __vector_schedule_cleanup()
1097 apicd->move_in_progress = 0; in __vector_schedule_cleanup()
1101 hlist_add_head(&apicd->clist, &cl->head); in __vector_schedule_cleanup()
1117 if (!timer_pending(&cl->timer)) { in __vector_schedule_cleanup()
1118 cl->timer.expires = jiffies + 1; in __vector_schedule_cleanup()
1119 add_timer_on(&cl->timer, cpu); in __vector_schedule_cleanup()
1122 pr_warn("IRQ %u schedule cleanup for offline CPU %u\n", apicd->irq, cpu); in __vector_schedule_cleanup()
1133 if (apicd->move_in_progress) in vector_schedule_cleanup()
1142 if (likely(!apicd->move_in_progress)) in irq_complete_move()
1151 if (apicd->cpu == smp_processor_id()) in irq_complete_move()
1171 ret = -ENOSPC; in lapic_can_unplug_cpu()
1356 int num = -1; in setup_show_lapic()