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 --- |