Lines Matching refs:irqd

78 static struct apic_chip_data *apic_chip_data(struct irq_data *irqd)  in apic_chip_data()  argument
80 if (!irqd) in apic_chip_data()
83 while (irqd->parent_data) in apic_chip_data()
84 irqd = irqd->parent_data; in apic_chip_data()
86 return irqd->chip_data; in apic_chip_data()
89 struct irq_cfg *irqd_cfg(struct irq_data *irqd) in irqd_cfg() argument
91 struct apic_chip_data *apicd = apic_chip_data(irqd); in irqd_cfg()
117 static void apic_update_irq_cfg(struct irq_data *irqd, unsigned int vector, in apic_update_irq_cfg() argument
120 struct apic_chip_data *apicd = apic_chip_data(irqd); in apic_update_irq_cfg()
126 irq_data_update_effective_affinity(irqd, cpumask_of(cpu)); in apic_update_irq_cfg()
127 trace_vector_config(irqd->irq, vector, cpu, in apic_update_irq_cfg()
131 static void apic_update_vector(struct irq_data *irqd, unsigned int newvec, in apic_update_vector() argument
134 struct apic_chip_data *apicd = apic_chip_data(irqd); in apic_update_vector()
135 struct irq_desc *desc = irq_data_to_desc(irqd); in apic_update_vector()
136 bool managed = irqd_affinity_is_managed(irqd); in apic_update_vector()
140 trace_vector_update(irqd->irq, newvec, newcpu, apicd->vector, in apic_update_vector()
177 static void vector_assign_managed_shutdown(struct irq_data *irqd) in vector_assign_managed_shutdown() argument
181 apic_update_irq_cfg(irqd, MANAGED_IRQ_SHUTDOWN_VECTOR, cpu); in vector_assign_managed_shutdown()
184 static int reserve_managed_vector(struct irq_data *irqd) in reserve_managed_vector() argument
186 const struct cpumask *affmsk = irq_data_get_affinity_mask(irqd); in reserve_managed_vector()
187 struct apic_chip_data *apicd = apic_chip_data(irqd); in reserve_managed_vector()
195 trace_vector_reserve_managed(irqd->irq, ret); in reserve_managed_vector()
199 static void reserve_irq_vector_locked(struct irq_data *irqd) in reserve_irq_vector_locked() argument
201 struct apic_chip_data *apicd = apic_chip_data(irqd); in reserve_irq_vector_locked()
206 irqd_set_can_reserve(irqd); in reserve_irq_vector_locked()
207 trace_vector_reserve(irqd->irq, 0); in reserve_irq_vector_locked()
208 vector_assign_managed_shutdown(irqd); in reserve_irq_vector_locked()
211 static int reserve_irq_vector(struct irq_data *irqd) in reserve_irq_vector() argument
216 reserve_irq_vector_locked(irqd); in reserve_irq_vector()
222 assign_vector_locked(struct irq_data *irqd, const struct cpumask *dest) in assign_vector_locked() argument
224 struct apic_chip_data *apicd = apic_chip_data(irqd); in assign_vector_locked()
249 trace_vector_alloc(irqd->irq, vector, resvd, vector); in assign_vector_locked()
252 apic_update_vector(irqd, vector, cpu); in assign_vector_locked()
253 apic_update_irq_cfg(irqd, vector, cpu); in assign_vector_locked()
258 static int assign_irq_vector(struct irq_data *irqd, const struct cpumask *dest) in assign_irq_vector() argument
265 ret = assign_vector_locked(irqd, vector_searchmask); in assign_irq_vector()
270 static int assign_irq_vector_any_locked(struct irq_data *irqd) in assign_irq_vector_any_locked() argument
273 const struct cpumask *affmsk = irq_data_get_affinity_mask(irqd); in assign_irq_vector_any_locked()
274 int node = irq_data_get_node(irqd); in assign_irq_vector_any_locked()
279 if (!assign_vector_locked(irqd, vector_searchmask)) in assign_irq_vector_any_locked()
285 if (!assign_vector_locked(irqd, vector_searchmask)) in assign_irq_vector_any_locked()
290 if (!assign_vector_locked(irqd, cpumask_of_node(node))) in assign_irq_vector_any_locked()
295 return assign_vector_locked(irqd, cpu_online_mask); in assign_irq_vector_any_locked()
299 assign_irq_vector_policy(struct irq_data *irqd, struct irq_alloc_info *info) in assign_irq_vector_policy() argument
301 if (irqd_affinity_is_managed(irqd)) in assign_irq_vector_policy()
302 return reserve_managed_vector(irqd); in assign_irq_vector_policy()
304 return assign_irq_vector(irqd, info->mask); in assign_irq_vector_policy()
309 return reserve_irq_vector(irqd); in assign_irq_vector_policy()
313 assign_managed_vector(struct irq_data *irqd, const struct cpumask *dest) in assign_managed_vector() argument
315 const struct cpumask *affmsk = irq_data_get_affinity_mask(irqd); in assign_managed_vector()
316 struct apic_chip_data *apicd = apic_chip_data(irqd); in assign_managed_vector()
326 trace_vector_alloc_managed(irqd->irq, vector, vector); in assign_managed_vector()
329 apic_update_vector(irqd, vector, cpu); in assign_managed_vector()
330 apic_update_irq_cfg(irqd, vector, cpu); in assign_managed_vector()
334 static void clear_irq_vector(struct irq_data *irqd) in clear_irq_vector() argument
336 struct apic_chip_data *apicd = apic_chip_data(irqd); in clear_irq_vector()
337 bool managed = irqd_affinity_is_managed(irqd); in clear_irq_vector()
345 trace_vector_clear(irqd->irq, vector, apicd->cpu, apicd->prev_vector, in clear_irq_vector()
364 static void x86_vector_deactivate(struct irq_domain *dom, struct irq_data *irqd) in x86_vector_deactivate() argument
366 struct apic_chip_data *apicd = apic_chip_data(irqd); in x86_vector_deactivate()
369 trace_vector_deactivate(irqd->irq, apicd->is_managed, in x86_vector_deactivate()
380 clear_irq_vector(irqd); in x86_vector_deactivate()
382 reserve_irq_vector_locked(irqd); in x86_vector_deactivate()
384 vector_assign_managed_shutdown(irqd); in x86_vector_deactivate()
388 static int activate_reserved(struct irq_data *irqd) in activate_reserved() argument
390 struct apic_chip_data *apicd = apic_chip_data(irqd); in activate_reserved()
393 ret = assign_irq_vector_any_locked(irqd); in activate_reserved()
403 if (!irqd_can_reserve(irqd)) in activate_reserved()
411 if (!cpumask_subset(irq_data_get_effective_affinity_mask(irqd), in activate_reserved()
412 irq_data_get_affinity_mask(irqd))) { in activate_reserved()
414 irqd->irq); in activate_reserved()
420 static int activate_managed(struct irq_data *irqd) in activate_managed() argument
422 const struct cpumask *dest = irq_data_get_affinity_mask(irqd); in activate_managed()
428 pr_err("Managed startup for irq %u, but no CPU\n", irqd->irq); in activate_managed()
432 ret = assign_managed_vector(irqd, vector_searchmask); in activate_managed()
439 irqd->irq); in activate_managed()
444 static int x86_vector_activate(struct irq_domain *dom, struct irq_data *irqd, in x86_vector_activate() argument
447 struct apic_chip_data *apicd = apic_chip_data(irqd); in x86_vector_activate()
451 trace_vector_activate(irqd->irq, apicd->is_managed, in x86_vector_activate()
456 assign_irq_vector_any_locked(irqd); in x86_vector_activate()
457 else if (reserve || irqd_is_managed_and_shutdown(irqd)) in x86_vector_activate()
458 vector_assign_managed_shutdown(irqd); in x86_vector_activate()
460 ret = activate_managed(irqd); in x86_vector_activate()
462 ret = activate_reserved(irqd); in x86_vector_activate()
467 static void vector_free_reserved_and_managed(struct irq_data *irqd) in vector_free_reserved_and_managed() argument
469 const struct cpumask *dest = irq_data_get_affinity_mask(irqd); in vector_free_reserved_and_managed()
470 struct apic_chip_data *apicd = apic_chip_data(irqd); in vector_free_reserved_and_managed()
472 trace_vector_teardown(irqd->irq, apicd->is_managed, in vector_free_reserved_and_managed()
485 struct irq_data *irqd; in x86_vector_free_irqs() local
490 irqd = irq_domain_get_irq_data(x86_vector_domain, virq + i); in x86_vector_free_irqs()
491 if (irqd && irqd->chip_data) { in x86_vector_free_irqs()
493 clear_irq_vector(irqd); in x86_vector_free_irqs()
494 vector_free_reserved_and_managed(irqd); in x86_vector_free_irqs()
495 apicd = irqd->chip_data; in x86_vector_free_irqs()
496 irq_domain_reset_irq_data(irqd); in x86_vector_free_irqs()
503 static bool vector_configure_legacy(unsigned int virq, struct irq_data *irqd, in vector_configure_legacy() argument
517 if (irqd_is_activated(irqd)) { in vector_configure_legacy()
519 apic_update_irq_cfg(irqd, apicd->vector, apicd->cpu); in vector_configure_legacy()
523 irqd_set_can_reserve(irqd); in vector_configure_legacy()
524 clear_irq_vector(irqd); in vector_configure_legacy()
536 struct irq_data *irqd; in x86_vector_alloc_irqs() local
555 irqd = irq_domain_get_irq_data(domain, virq + i); in x86_vector_alloc_irqs()
556 BUG_ON(!irqd); in x86_vector_alloc_irqs()
557 node = irq_data_get_node(irqd); in x86_vector_alloc_irqs()
558 WARN_ON_ONCE(irqd->chip_data); in x86_vector_alloc_irqs()
566 irqd->chip = &lapic_controller; in x86_vector_alloc_irqs()
567 irqd->chip_data = apicd; in x86_vector_alloc_irqs()
568 irqd->hwirq = virq + i; in x86_vector_alloc_irqs()
569 irqd_set_single_target(irqd); in x86_vector_alloc_irqs()
575 irqd_set_handle_enforce_irqctx(irqd); in x86_vector_alloc_irqs()
578 irqd_set_affinity_on_activate(irqd); in x86_vector_alloc_irqs()
588 if (!vector_configure_legacy(virq + i, irqd, apicd)) in x86_vector_alloc_irqs()
592 err = assign_irq_vector_policy(irqd, info); in x86_vector_alloc_irqs()
595 irqd->chip_data = NULL; in x86_vector_alloc_irqs()
610 struct irq_data *irqd, int ind) in x86_vector_debug_show() argument
616 if (!irqd) { in x86_vector_debug_show()
621 irq = irqd->irq; in x86_vector_debug_show()
628 if (!irqd->chip_data) { in x86_vector_debug_show()
634 memcpy(&apicd, irqd->chip_data, sizeof(apicd)); in x86_vector_debug_show()
855 static int apic_set_affinity(struct irq_data *irqd, in apic_set_affinity() argument
860 if (WARN_ON_ONCE(!irqd_is_activated(irqd))) in apic_set_affinity()
865 if (irqd_affinity_is_managed(irqd)) in apic_set_affinity()
866 err = assign_managed_vector(irqd, vector_searchmask); in apic_set_affinity()
868 err = assign_vector_locked(irqd, vector_searchmask); in apic_set_affinity()
877 static int apic_retrigger_irq(struct irq_data *irqd) in apic_retrigger_irq() argument
879 struct apic_chip_data *apicd = apic_chip_data(irqd); in apic_retrigger_irq()
889 void apic_ack_irq(struct irq_data *irqd) in apic_ack_irq() argument
891 irq_move_irq(irqd); in apic_ack_irq()
895 void apic_ack_edge(struct irq_data *irqd) in apic_ack_edge() argument
897 irq_complete_move(irqd_cfg(irqd)); in apic_ack_edge()
898 apic_ack_irq(irqd); in apic_ack_edge()
1023 struct irq_data *irqd; in irq_force_complete_move() local
1035 irqd = irq_domain_get_irq_data(x86_vector_domain, in irq_force_complete_move()
1037 if (!irqd) in irq_force_complete_move()
1041 apicd = apic_chip_data(irqd); in irq_force_complete_move()
1101 irqd->irq, vector); in irq_force_complete_move()