| /* | |
| * Dynamic IRQ management | |
| * | |
| * Copyright (C) 2010 Paul Mundt | |
| * | |
| * Modelled after arch/x86/kernel/apic/io_apic.c | |
| * | |
| * This file is subject to the terms and conditions of the GNU General Public | |
| * License. See the file "COPYING" in the main directory of this archive | |
| * for more details. | |
| */ | |
| #define pr_fmt(fmt) "intc: " fmt | |
| #include <linux/irq.h> | |
| #include <linux/bitmap.h> | |
| #include <linux/spinlock.h> | |
| #include "internals.h" /* only for activate_irq() damage.. */ | |
| /* | |
| * The IRQ bitmap provides a global map of bound IRQ vectors for a | |
| * given platform. Allocation of IRQs are either static through the CPU | |
| * vector map, or dynamic in the case of board mux vectors or MSI. | |
| * | |
| * As this is a central point for all IRQ controllers on the system, | |
| * each of the available sources are mapped out here. This combined with | |
| * sparseirq makes it quite trivial to keep the vector map tightly packed | |
| * when dynamically creating IRQs, as well as tying in to otherwise | |
| * unused irq_desc positions in the sparse array. | |
| */ | |
| /* | |
| * Dynamic IRQ allocation and deallocation | |
| */ | |
| unsigned int create_irq_nr(unsigned int irq_want, int node) | |
| { | |
| int irq = irq_alloc_desc_at(irq_want, node); | |
| if (irq < 0) | |
| return 0; | |
| activate_irq(irq); | |
| return irq; | |
| } | |
| int create_irq(void) | |
| { | |
| int irq = irq_alloc_desc(numa_node_id()); | |
| if (irq >= 0) | |
| activate_irq(irq); | |
| return irq; | |
| } | |
| void destroy_irq(unsigned int irq) | |
| { | |
| irq_free_desc(irq); | |
| } | |
| void reserve_intc_vectors(struct intc_vect *vectors, unsigned int nr_vecs) | |
| { | |
| int i; | |
| for (i = 0; i < nr_vecs; i++) | |
| irq_reserve_irq(evt2irq(vectors[i].vect)); | |
| } |