Lines Matching refs:irqd
89 static struct apic_chip_data *apic_chip_data(struct irq_data *irqd) in apic_chip_data() argument
91 if (!irqd) in apic_chip_data()
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()
100 struct irq_cfg *irqd_cfg(struct irq_data *irqd) in irqd_cfg() argument
102 struct apic_chip_data *apicd = apic_chip_data(irqd); in irqd_cfg()
128 static void apic_update_irq_cfg(struct irq_data *irqd, unsigned int vector, in apic_update_irq_cfg() argument
131 struct apic_chip_data *apicd = apic_chip_data(irqd); in apic_update_irq_cfg()
137 irq_data_update_effective_affinity(irqd, cpumask_of(cpu)); in apic_update_irq_cfg()
138 trace_vector_config(irqd->irq, vector, cpu, in apic_update_irq_cfg()
142 static void apic_update_vector(struct irq_data *irqd, unsigned int newvec, in apic_update_vector() argument
145 struct apic_chip_data *apicd = apic_chip_data(irqd); in apic_update_vector()
146 struct irq_desc *desc = irq_data_to_desc(irqd); in apic_update_vector()
147 bool managed = irqd_affinity_is_managed(irqd); in apic_update_vector()
151 trace_vector_update(irqd->irq, newvec, newcpu, apicd->vector, in apic_update_vector()
186 apic_update_irq_cfg(irqd, newvec, newcpu); in apic_update_vector()
189 static void vector_assign_managed_shutdown(struct irq_data *irqd) in vector_assign_managed_shutdown() argument
193 apic_update_irq_cfg(irqd, MANAGED_IRQ_SHUTDOWN_VECTOR, cpu); in vector_assign_managed_shutdown()
196 static int reserve_managed_vector(struct irq_data *irqd) in reserve_managed_vector() argument
198 const struct cpumask *affmsk = irq_data_get_affinity_mask(irqd); in reserve_managed_vector()
199 struct apic_chip_data *apicd = apic_chip_data(irqd); in reserve_managed_vector()
207 trace_vector_reserve_managed(irqd->irq, ret); in reserve_managed_vector()
211 static void reserve_irq_vector_locked(struct irq_data *irqd) in reserve_irq_vector_locked() argument
213 struct apic_chip_data *apicd = apic_chip_data(irqd); in reserve_irq_vector_locked()
218 irqd_set_can_reserve(irqd); in reserve_irq_vector_locked()
219 trace_vector_reserve(irqd->irq, 0); in reserve_irq_vector_locked()
220 vector_assign_managed_shutdown(irqd); in reserve_irq_vector_locked()
223 static int reserve_irq_vector(struct irq_data *irqd) in reserve_irq_vector() argument
228 reserve_irq_vector_locked(irqd); in reserve_irq_vector()
234 assign_vector_locked(struct irq_data *irqd, const struct cpumask *dest) in assign_vector_locked() argument
236 struct apic_chip_data *apicd = apic_chip_data(irqd); in assign_vector_locked()
261 trace_vector_alloc(irqd->irq, vector, resvd, vector); in assign_vector_locked()
264 apic_update_vector(irqd, vector, cpu); in assign_vector_locked()
269 static int assign_irq_vector(struct irq_data *irqd, const struct cpumask *dest) in assign_irq_vector() argument
276 ret = assign_vector_locked(irqd, vector_searchmask); in assign_irq_vector()
281 static int assign_irq_vector_any_locked(struct irq_data *irqd) in assign_irq_vector_any_locked() argument
284 const struct cpumask *affmsk = irq_data_get_affinity_mask(irqd); in assign_irq_vector_any_locked()
285 int node = irq_data_get_node(irqd); in assign_irq_vector_any_locked()
290 if (!assign_vector_locked(irqd, vector_searchmask)) in assign_irq_vector_any_locked()
296 if (!assign_vector_locked(irqd, vector_searchmask)) in assign_irq_vector_any_locked()
301 if (!assign_vector_locked(irqd, cpumask_of_node(node))) in assign_irq_vector_any_locked()
306 return assign_vector_locked(irqd, cpu_online_mask); in assign_irq_vector_any_locked()
310 assign_irq_vector_policy(struct irq_data *irqd, struct irq_alloc_info *info) in assign_irq_vector_policy() argument
312 if (irqd_affinity_is_managed(irqd)) in assign_irq_vector_policy()
313 return reserve_managed_vector(irqd); in assign_irq_vector_policy()
315 return assign_irq_vector(irqd, info->mask); in assign_irq_vector_policy()
320 return reserve_irq_vector(irqd); in assign_irq_vector_policy()
324 assign_managed_vector(struct irq_data *irqd, const struct cpumask *dest) in assign_managed_vector() argument
326 const struct cpumask *affmsk = irq_data_get_affinity_mask(irqd); in assign_managed_vector()
327 struct apic_chip_data *apicd = apic_chip_data(irqd); in assign_managed_vector()
337 trace_vector_alloc_managed(irqd->irq, vector, vector); in assign_managed_vector()
340 apic_update_vector(irqd, vector, cpu); in assign_managed_vector()
345 static void clear_irq_vector(struct irq_data *irqd) in clear_irq_vector() argument
347 struct apic_chip_data *apicd = apic_chip_data(irqd); in clear_irq_vector()
348 bool managed = irqd_affinity_is_managed(irqd); in clear_irq_vector()
356 trace_vector_clear(irqd->irq, vector, apicd->cpu, apicd->prev_vector, in clear_irq_vector()
375 static void x86_vector_deactivate(struct irq_domain *dom, struct irq_data *irqd) in x86_vector_deactivate() argument
377 struct apic_chip_data *apicd = apic_chip_data(irqd); in x86_vector_deactivate()
380 trace_vector_deactivate(irqd->irq, apicd->is_managed, in x86_vector_deactivate()
391 clear_irq_vector(irqd); in x86_vector_deactivate()
393 reserve_irq_vector_locked(irqd); in x86_vector_deactivate()
395 vector_assign_managed_shutdown(irqd); in x86_vector_deactivate()
399 static int activate_reserved(struct irq_data *irqd) in activate_reserved() argument
401 struct apic_chip_data *apicd = apic_chip_data(irqd); in activate_reserved()
404 ret = assign_irq_vector_any_locked(irqd); in activate_reserved()
414 if (!irqd_can_reserve(irqd)) in activate_reserved()
422 if (!cpumask_subset(irq_data_get_effective_affinity_mask(irqd), in activate_reserved()
423 irq_data_get_affinity_mask(irqd))) { in activate_reserved()
425 irqd->irq); in activate_reserved()
431 static int activate_managed(struct irq_data *irqd) in activate_managed() argument
433 const struct cpumask *dest = irq_data_get_affinity_mask(irqd); in activate_managed()
439 pr_err("Managed startup for irq %u, but no CPU\n", irqd->irq); in activate_managed()
443 ret = assign_managed_vector(irqd, vector_searchmask); in activate_managed()
450 irqd->irq); in activate_managed()
455 static int x86_vector_activate(struct irq_domain *dom, struct irq_data *irqd, in x86_vector_activate() argument
458 struct apic_chip_data *apicd = apic_chip_data(irqd); in x86_vector_activate()
462 trace_vector_activate(irqd->irq, apicd->is_managed, in x86_vector_activate()
467 assign_irq_vector_any_locked(irqd); in x86_vector_activate()
468 else if (reserve || irqd_is_managed_and_shutdown(irqd)) in x86_vector_activate()
469 vector_assign_managed_shutdown(irqd); in x86_vector_activate()
471 ret = activate_managed(irqd); in x86_vector_activate()
473 ret = activate_reserved(irqd); in x86_vector_activate()
478 static void vector_free_reserved_and_managed(struct irq_data *irqd) in vector_free_reserved_and_managed() argument
480 const struct cpumask *dest = irq_data_get_affinity_mask(irqd); in vector_free_reserved_and_managed()
481 struct apic_chip_data *apicd = apic_chip_data(irqd); in vector_free_reserved_and_managed()
483 trace_vector_teardown(irqd->irq, apicd->is_managed, in vector_free_reserved_and_managed()
496 struct irq_data *irqd; in x86_vector_free_irqs() local
501 irqd = irq_domain_get_irq_data(x86_vector_domain, virq + i); in x86_vector_free_irqs()
502 if (irqd && irqd->chip_data) { in x86_vector_free_irqs()
504 clear_irq_vector(irqd); in x86_vector_free_irqs()
505 vector_free_reserved_and_managed(irqd); in x86_vector_free_irqs()
506 apicd = irqd->chip_data; in x86_vector_free_irqs()
507 irq_domain_reset_irq_data(irqd); in x86_vector_free_irqs()
514 static bool vector_configure_legacy(unsigned int virq, struct irq_data *irqd, in vector_configure_legacy() argument
528 if (irqd_is_activated(irqd)) { in vector_configure_legacy()
530 apic_update_irq_cfg(irqd, apicd->vector, apicd->cpu); in vector_configure_legacy()
534 irqd_set_can_reserve(irqd); in vector_configure_legacy()
535 clear_irq_vector(irqd); in vector_configure_legacy()
547 struct irq_data *irqd; in x86_vector_alloc_irqs() local
562 irqd = irq_domain_get_irq_data(domain, virq + i); in x86_vector_alloc_irqs()
563 BUG_ON(!irqd); in x86_vector_alloc_irqs()
564 node = irq_data_get_node(irqd); in x86_vector_alloc_irqs()
565 WARN_ON_ONCE(irqd->chip_data); in x86_vector_alloc_irqs()
573 irqd->chip = &lapic_controller; in x86_vector_alloc_irqs()
574 irqd->chip_data = apicd; in x86_vector_alloc_irqs()
575 irqd->hwirq = virq + i; in x86_vector_alloc_irqs()
576 irqd_set_single_target(irqd); in x86_vector_alloc_irqs()
582 irqd_set_handle_enforce_irqctx(irqd); in x86_vector_alloc_irqs()
585 irqd_set_affinity_on_activate(irqd); in x86_vector_alloc_irqs()
595 if (!vector_configure_legacy(virq + i, irqd, apicd)) in x86_vector_alloc_irqs()
599 err = assign_irq_vector_policy(irqd, info); in x86_vector_alloc_irqs()
602 irqd->chip_data = NULL; in x86_vector_alloc_irqs()
617 struct irq_data *irqd, int ind) in x86_vector_debug_show() argument
623 if (!irqd) { in x86_vector_debug_show()
628 irq = irqd->irq; in x86_vector_debug_show()
635 if (!irqd->chip_data) { in x86_vector_debug_show()
641 memcpy(&apicd, irqd->chip_data, sizeof(apicd)); in x86_vector_debug_show()
873 static int apic_set_affinity(struct irq_data *irqd, in apic_set_affinity() argument
878 if (WARN_ON_ONCE(!irqd_is_activated(irqd))) in apic_set_affinity()
883 if (irqd_affinity_is_managed(irqd)) in apic_set_affinity()
884 err = assign_managed_vector(irqd, vector_searchmask); in apic_set_affinity()
886 err = assign_vector_locked(irqd, vector_searchmask); in apic_set_affinity()
918 static void apic_force_complete_move(struct irq_data *irqd) in apic_force_complete_move() argument
925 apicd = apic_chip_data(irqd); in apic_force_complete_move()
986 irqd->irq, vector); in apic_force_complete_move()
996 static int apic_retrigger_irq(struct irq_data *irqd) in apic_retrigger_irq() argument
998 struct apic_chip_data *apicd = apic_chip_data(irqd); in apic_retrigger_irq()
1008 void apic_ack_irq(struct irq_data *irqd) in apic_ack_irq() argument
1010 irq_move_irq(irqd); in apic_ack_irq()
1014 void apic_ack_edge(struct irq_data *irqd) in apic_ack_edge() argument
1016 irq_complete_move(irqd_cfg(irqd)); in apic_ack_edge()
1017 apic_ack_irq(irqd); in apic_ack_edge()