Deleted Added
full compact
subr_intr.c (298738) subr_intr.c (298739)
1/*-
2 * Copyright (c) 2015-2016 Svatopluk Kraus
3 * Copyright (c) 2015-2016 Michal Meloun
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 12 unchanged lines hidden (view full) ---

21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 2015-2016 Svatopluk Kraus
3 * Copyright (c) 2015-2016 Michal Meloun
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 12 unchanged lines hidden (view full) ---

21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28#include <sys/cdefs.h>
29__FBSDID("$FreeBSD: head/sys/kern/subr_intr.c 298738 2016-04-28 12:03:22Z mmel $");
29__FBSDID("$FreeBSD: head/sys/kern/subr_intr.c 298739 2016-04-28 12:04:12Z mmel $");
30
31/*
32 * New-style Interrupt Framework
33 *
34 * TODO: - to support IPI (PPI) enabling on other CPUs if already started
35 * - to complete things for removable PICs
36 */
37

--- 66 unchanged lines hidden (view full) ---

104
105static struct intr_pic *pic_lookup(device_t dev, intptr_t xref);
106
107/* Interrupt source definition. */
108static struct mtx isrc_table_lock;
109static struct intr_irqsrc *irq_sources[NIRQ];
110u_int irq_next_free;
111
30
31/*
32 * New-style Interrupt Framework
33 *
34 * TODO: - to support IPI (PPI) enabling on other CPUs if already started
35 * - to complete things for removable PICs
36 */
37

--- 66 unchanged lines hidden (view full) ---

104
105static struct intr_pic *pic_lookup(device_t dev, intptr_t xref);
106
107/* Interrupt source definition. */
108static struct mtx isrc_table_lock;
109static struct intr_irqsrc *irq_sources[NIRQ];
110u_int irq_next_free;
111
112#define IRQ_INVALID nitems(irq_sources)
113
114/*
115 * XXX - All stuff around struct intr_dev_data is considered as temporary
116 * until better place for storing struct intr_map_data will be find.
117 *
118 * For now, there are two global interrupt numbers spaces:
119 * <0, NIRQ) ... interrupts without config data
120 * managed in irq_sources[]
121 * IRQ_DDATA_BASE + <0, 2 * NIRQ) ... interrupts with config data

--- 11 unchanged lines hidden (view full) ---

133 struct intr_map_data idd_data;
134 struct intr_irqsrc * idd_isrc;
135};
136
137static struct intr_dev_data *intr_ddata_tab[2 * NIRQ];
138static u_int intr_ddata_first_unused;
139
140#define IRQ_DDATA_BASE 10000
112/*
113 * XXX - All stuff around struct intr_dev_data is considered as temporary
114 * until better place for storing struct intr_map_data will be find.
115 *
116 * For now, there are two global interrupt numbers spaces:
117 * <0, NIRQ) ... interrupts without config data
118 * managed in irq_sources[]
119 * IRQ_DDATA_BASE + <0, 2 * NIRQ) ... interrupts with config data

--- 11 unchanged lines hidden (view full) ---

131 struct intr_map_data idd_data;
132 struct intr_irqsrc * idd_isrc;
133};
134
135static struct intr_dev_data *intr_ddata_tab[2 * NIRQ];
136static u_int intr_ddata_first_unused;
137
138#define IRQ_DDATA_BASE 10000
141CTASSERT(IRQ_DDATA_BASE > IRQ_INVALID);
139CTASSERT(IRQ_DDATA_BASE > nitems(irq_sources));
142
143#ifdef SMP
144static boolean_t irq_assign_cpu = FALSE;
145#endif
146
147/*
148 * - 2 counters for each I/O interrupt.
149 * - MAXCPU counters for each IPI counters for SMP.

--- 244 unchanged lines hidden (view full) ---

394 mtx_assert(&isrc_table_lock, MA_OWNED);
395
396 if (isrc->isrc_irq >= nitems(irq_sources))
397 return (EINVAL);
398 if (irq_sources[isrc->isrc_irq] != isrc)
399 return (EINVAL);
400
401 irq_sources[isrc->isrc_irq] = NULL;
140
141#ifdef SMP
142static boolean_t irq_assign_cpu = FALSE;
143#endif
144
145/*
146 * - 2 counters for each I/O interrupt.
147 * - MAXCPU counters for each IPI counters for SMP.

--- 244 unchanged lines hidden (view full) ---

392 mtx_assert(&isrc_table_lock, MA_OWNED);
393
394 if (isrc->isrc_irq >= nitems(irq_sources))
395 return (EINVAL);
396 if (irq_sources[isrc->isrc_irq] != isrc)
397 return (EINVAL);
398
399 irq_sources[isrc->isrc_irq] = NULL;
402 isrc->isrc_irq = IRQ_INVALID; /* just to be safe */
400 isrc->isrc_irq = INTR_IRQ_INVALID; /* just to be safe */
403 return (0);
404}
405
406/*
407 * Lookup interrupt source by interrupt number (resource handle).
408 */
409static inline struct intr_irqsrc *
410isrc_lookup(u_int irq)

--- 11 unchanged lines hidden (view full) ---

422intr_isrc_register(struct intr_irqsrc *isrc, device_t dev, u_int flags,
423 const char *fmt, ...)
424{
425 int error;
426 va_list ap;
427
428 bzero(isrc, sizeof(struct intr_irqsrc));
429 isrc->isrc_dev = dev;
401 return (0);
402}
403
404/*
405 * Lookup interrupt source by interrupt number (resource handle).
406 */
407static inline struct intr_irqsrc *
408isrc_lookup(u_int irq)

--- 11 unchanged lines hidden (view full) ---

420intr_isrc_register(struct intr_irqsrc *isrc, device_t dev, u_int flags,
421 const char *fmt, ...)
422{
423 int error;
424 va_list ap;
425
426 bzero(isrc, sizeof(struct intr_irqsrc));
427 isrc->isrc_dev = dev;
430 isrc->isrc_irq = IRQ_INVALID; /* just to be safe */
428 isrc->isrc_irq = INTR_IRQ_INVALID; /* just to be safe */
431 isrc->isrc_flags = flags;
432
433 va_start(ap, fmt);
434 vsnprintf(isrc->isrc_name, INTR_ISRC_NAMELEN, fmt, ap);
435 va_end(ap);
436
437 mtx_lock(&isrc_table_lock);
438 error = isrc_alloc_irq(isrc);

--- 116 unchanged lines hidden (view full) ---

555u_int
556intr_acpi_map_irq(device_t dev, u_int irq, enum intr_polarity pol,
557 enum intr_trigger trig)
558{
559 struct intr_dev_data *ddata;
560
561 ddata = intr_ddata_alloc(0);
562 if (ddata == NULL)
429 isrc->isrc_flags = flags;
430
431 va_start(ap, fmt);
432 vsnprintf(isrc->isrc_name, INTR_ISRC_NAMELEN, fmt, ap);
433 va_end(ap);
434
435 mtx_lock(&isrc_table_lock);
436 error = isrc_alloc_irq(isrc);

--- 116 unchanged lines hidden (view full) ---

553u_int
554intr_acpi_map_irq(device_t dev, u_int irq, enum intr_polarity pol,
555 enum intr_trigger trig)
556{
557 struct intr_dev_data *ddata;
558
559 ddata = intr_ddata_alloc(0);
560 if (ddata == NULL)
563 return (0xFFFFFFFF); /* no space left */
561 return (INTR_IRQ_INVALID); /* no space left */
564
565 ddata->idd_dev = dev;
566 ddata->idd_data.type = INTR_MAP_DATA_ACPI;
567 ddata->idd_data.acpi.irq = irq;
568 ddata->idd_data.acpi.pol = pol;
569 ddata->idd_data.acpi.trig = trig;
570 return (ddata->idd_irq);
571}

--- 8 unchanged lines hidden (view full) ---

580intr_fdt_map_irq(phandle_t node, pcell_t *cells, u_int ncells)
581{
582 struct intr_dev_data *ddata;
583 u_int cellsize;
584
585 cellsize = ncells * sizeof(*cells);
586 ddata = intr_ddata_alloc(cellsize);
587 if (ddata == NULL)
562
563 ddata->idd_dev = dev;
564 ddata->idd_data.type = INTR_MAP_DATA_ACPI;
565 ddata->idd_data.acpi.irq = irq;
566 ddata->idd_data.acpi.pol = pol;
567 ddata->idd_data.acpi.trig = trig;
568 return (ddata->idd_irq);
569}

--- 8 unchanged lines hidden (view full) ---

578intr_fdt_map_irq(phandle_t node, pcell_t *cells, u_int ncells)
579{
580 struct intr_dev_data *ddata;
581 u_int cellsize;
582
583 cellsize = ncells * sizeof(*cells);
584 ddata = intr_ddata_alloc(cellsize);
585 if (ddata == NULL)
588 return (0xFFFFFFFF); /* no space left */
586 return (INTR_IRQ_INVALID); /* no space left */
589
590 ddata->idd_xref = (intptr_t)node;
591 ddata->idd_data.type = INTR_MAP_DATA_FDT;
592 ddata->idd_data.fdt.ncells = ncells;
593 ddata->idd_data.fdt.cells = (pcell_t *)(ddata + 1);
594 memcpy(ddata->idd_data.fdt.cells, cells, cellsize);
595 return (ddata->idd_irq);
596}

--- 5 unchanged lines hidden (view full) ---

602 */
603u_int
604intr_gpio_map_irq(device_t dev, u_int pin_num, u_int pin_flags, u_int intr_mode)
605{
606 struct intr_dev_data *ddata;
607
608 ddata = intr_ddata_alloc(0);
609 if (ddata == NULL)
587
588 ddata->idd_xref = (intptr_t)node;
589 ddata->idd_data.type = INTR_MAP_DATA_FDT;
590 ddata->idd_data.fdt.ncells = ncells;
591 ddata->idd_data.fdt.cells = (pcell_t *)(ddata + 1);
592 memcpy(ddata->idd_data.fdt.cells, cells, cellsize);
593 return (ddata->idd_irq);
594}

--- 5 unchanged lines hidden (view full) ---

600 */
601u_int
602intr_gpio_map_irq(device_t dev, u_int pin_num, u_int pin_flags, u_int intr_mode)
603{
604 struct intr_dev_data *ddata;
605
606 ddata = intr_ddata_alloc(0);
607 if (ddata == NULL)
610 return (0xFFFFFFFF); /* no space left */
608 return (INTR_IRQ_INVALID); /* no space left */
611
612 ddata->idd_dev = dev;
613 ddata->idd_data.type = INTR_MAP_DATA_GPIO;
614 ddata->idd_data.gpio.gpio_pin_num = pin_num;
615 ddata->idd_data.gpio.gpio_pin_flags = pin_flags;
616 ddata->idd_data.gpio.gpio_intr_mode = intr_mode;
617 return (ddata->idd_irq);
618}

--- 673 unchanged lines hidden ---
609
610 ddata->idd_dev = dev;
611 ddata->idd_data.type = INTR_MAP_DATA_GPIO;
612 ddata->idd_data.gpio.gpio_pin_num = pin_num;
613 ddata->idd_data.gpio.gpio_pin_flags = pin_flags;
614 ddata->idd_data.gpio.gpio_intr_mode = intr_mode;
615 return (ddata->idd_irq);
616}

--- 673 unchanged lines hidden ---