2004-05-14 11:46:45 +00:00
|
|
|
/* $NetBSD: intr.h,v 1.7 2003/06/16 20:01:00 thorpej Exp $ */
|
|
|
|
|
2005-01-05 21:58:49 +00:00
|
|
|
/*-
|
2004-05-14 11:46:45 +00:00
|
|
|
* Copyright (c) 1997 Mark Brinicombe.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* 3. All advertising materials mentioning features or use of this software
|
|
|
|
* must display the following acknowledgement:
|
|
|
|
* This product includes software developed by Mark Brinicombe
|
|
|
|
* for the NetBSD Project.
|
|
|
|
* 4. The name of the company nor the name of the author may be used to
|
|
|
|
* endorse or promote products derived from this software without specific
|
|
|
|
* prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
|
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
|
|
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
|
|
* IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
|
|
|
* INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
|
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
|
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
|
|
|
*
|
|
|
|
* $FreeBSD$
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _MACHINE_INTR_H_
|
|
|
|
#define _MACHINE_INTR_H_
|
|
|
|
|
2014-12-21 21:27:12 +00:00
|
|
|
#ifdef FDT
|
|
|
|
#include <dev/ofw/openfirm.h>
|
|
|
|
#endif
|
|
|
|
|
Import ARM_INTRNG, the "next generation" interrupt architecture for arm
and armv6 architecures. The primary enhancement over the old design is
support for hierarchical interrupt controllers (such as a gpio driver
which can receive interrupts from a root PIC and act as a PIC itself for
clients interested in handling a change of gpio pin state as an
interrupt). The new code also provides an infrastructure for mapping
interrupts described in metadata in the form of a "controller reference
plus interrupt number" tuple into the simple "0-n" flat numeric space
understood by rman and the bus resource mechanisms.
Use of the new code is enabled by setting the ARM_INTRNG option, and by
making a few simple changes to the platform's support code. In addition
each existing PIC driver needs changes to be ready for INTRNG; this commit
contains the changes for the arm/gic driver, which most armv6 SoCs use, but
it does not enable the new code yet on any platform.
This project has been many years in the making, starting as a GSoC project
by Jakub Klama (jceel@) in 2012. That didn't get committed right away and
the source base evolved out from under it to some degree. In 2014 I rebased
the diffs to then -current and did some enhancements in the area of mapping
interrupt numbers and storing associated fdt data, then the project went
cold again for a while. Eventually Svata Kraus took that work in progress
and did another big round of work on it, removing most of the remaining
rough edges. Finally I took that and made one more pass through it, mostly
disabling the "INTR_SOLO" feature for now, pending further design
discussions on how to most efficiently dispatch a pending interrupt through
more than one layer of PIC. The current code with the INTR_SOLO feature
disabled uses approximate 100 extra cpu cycles for each cascaded PIC the
interrupt has to be passed to, so what's left to do is about efficiency, not
correct operation.
Differential Revision: https://reviews.freebsd.org/D2047
2015-10-18 18:26:19 +00:00
|
|
|
#ifdef ARM_INTRNG
|
|
|
|
|
|
|
|
#ifndef NIRQ
|
|
|
|
#define NIRQ 1024 /* XXX - It should be an option. */
|
|
|
|
#endif
|
|
|
|
|
2016-02-10 04:43:08 +00:00
|
|
|
#include <sys/intr.h>
|
Import ARM_INTRNG, the "next generation" interrupt architecture for arm
and armv6 architecures. The primary enhancement over the old design is
support for hierarchical interrupt controllers (such as a gpio driver
which can receive interrupts from a root PIC and act as a PIC itself for
clients interested in handling a change of gpio pin state as an
interrupt). The new code also provides an infrastructure for mapping
interrupts described in metadata in the form of a "controller reference
plus interrupt number" tuple into the simple "0-n" flat numeric space
understood by rman and the bus resource mechanisms.
Use of the new code is enabled by setting the ARM_INTRNG option, and by
making a few simple changes to the platform's support code. In addition
each existing PIC driver needs changes to be ready for INTRNG; this commit
contains the changes for the arm/gic driver, which most armv6 SoCs use, but
it does not enable the new code yet on any platform.
This project has been many years in the making, starting as a GSoC project
by Jakub Klama (jceel@) in 2012. That didn't get committed right away and
the source base evolved out from under it to some degree. In 2014 I rebased
the diffs to then -current and did some enhancements in the area of mapping
interrupt numbers and storing associated fdt data, then the project went
cold again for a while. Eventually Svata Kraus took that work in progress
and did another big round of work on it, removing most of the remaining
rough edges. Finally I took that and made one more pass through it, mostly
disabling the "INTR_SOLO" feature for now, pending further design
discussions on how to most efficiently dispatch a pending interrupt through
more than one layer of PIC. The current code with the INTR_SOLO feature
disabled uses approximate 100 extra cpu cycles for each cascaded PIC the
interrupt has to be passed to, so what's left to do is about efficiency, not
correct operation.
Differential Revision: https://reviews.freebsd.org/D2047
2015-10-18 18:26:19 +00:00
|
|
|
|
2016-02-27 12:03:07 +00:00
|
|
|
#ifdef SMP
|
2016-04-04 09:15:25 +00:00
|
|
|
typedef void intr_ipi_send_t(void *, cpuset_t, u_int);
|
2016-03-24 09:55:11 +00:00
|
|
|
typedef void intr_ipi_handler_t(void *);
|
2016-02-27 12:03:07 +00:00
|
|
|
|
2016-03-24 09:55:11 +00:00
|
|
|
void intr_ipi_dispatch(u_int, struct trapframe *);
|
|
|
|
void intr_ipi_send(cpuset_t, u_int);
|
2016-02-27 12:03:07 +00:00
|
|
|
|
2016-03-24 09:55:11 +00:00
|
|
|
void intr_ipi_setup(u_int, const char *, intr_ipi_handler_t *, void *,
|
|
|
|
intr_ipi_send_t *, void *);
|
2016-02-27 12:03:07 +00:00
|
|
|
|
2016-03-24 09:55:11 +00:00
|
|
|
int intr_pic_ipi_setup(u_int, const char *, intr_ipi_handler_t *, void *);
|
|
|
|
#endif
|
Import ARM_INTRNG, the "next generation" interrupt architecture for arm
and armv6 architecures. The primary enhancement over the old design is
support for hierarchical interrupt controllers (such as a gpio driver
which can receive interrupts from a root PIC and act as a PIC itself for
clients interested in handling a change of gpio pin state as an
interrupt). The new code also provides an infrastructure for mapping
interrupts described in metadata in the form of a "controller reference
plus interrupt number" tuple into the simple "0-n" flat numeric space
understood by rman and the bus resource mechanisms.
Use of the new code is enabled by setting the ARM_INTRNG option, and by
making a few simple changes to the platform's support code. In addition
each existing PIC driver needs changes to be ready for INTRNG; this commit
contains the changes for the arm/gic driver, which most armv6 SoCs use, but
it does not enable the new code yet on any platform.
This project has been many years in the making, starting as a GSoC project
by Jakub Klama (jceel@) in 2012. That didn't get committed right away and
the source base evolved out from under it to some degree. In 2014 I rebased
the diffs to then -current and did some enhancements in the area of mapping
interrupt numbers and storing associated fdt data, then the project went
cold again for a while. Eventually Svata Kraus took that work in progress
and did another big round of work on it, removing most of the remaining
rough edges. Finally I took that and made one more pass through it, mostly
disabling the "INTR_SOLO" feature for now, pending further design
discussions on how to most efficiently dispatch a pending interrupt through
more than one layer of PIC. The current code with the INTR_SOLO feature
disabled uses approximate 100 extra cpu cycles for each cascaded PIC the
interrupt has to be passed to, so what's left to do is about efficiency, not
correct operation.
Differential Revision: https://reviews.freebsd.org/D2047
2015-10-18 18:26:19 +00:00
|
|
|
#else /* ARM_INTRNG */
|
|
|
|
|
2008-12-13 01:21:37 +00:00
|
|
|
/* XXX move to std.* files? */
|
2007-06-16 15:03:33 +00:00
|
|
|
#ifdef CPU_XSCALE_81342
|
|
|
|
#define NIRQ 128
|
2008-06-06 05:08:09 +00:00
|
|
|
#elif defined(CPU_XSCALE_PXA2X0)
|
|
|
|
#include <arm/xscale/pxa/pxareg.h>
|
|
|
|
#define NIRQ IRQ_GPIO_MAX
|
2008-10-13 20:07:13 +00:00
|
|
|
#elif defined(SOC_MV_DISCOVERY)
|
|
|
|
#define NIRQ 96
|
2008-12-13 01:21:37 +00:00
|
|
|
#elif defined(CPU_ARM9) || defined(SOC_MV_KIRKWOOD) || \
|
|
|
|
defined(CPU_XSCALE_IXP435)
|
2005-02-13 18:26:31 +00:00
|
|
|
#define NIRQ 64
|
2012-08-15 03:03:03 +00:00
|
|
|
#elif defined(CPU_CORTEXA)
|
2014-08-31 17:40:19 +00:00
|
|
|
#define NIRQ 1020
|
2013-12-20 00:56:23 +00:00
|
|
|
#elif defined(CPU_KRAIT)
|
|
|
|
#define NIRQ 288
|
2015-03-29 21:12:59 +00:00
|
|
|
#elif defined(CPU_ARM1176)
|
2012-08-25 20:13:19 +00:00
|
|
|
#define NIRQ 128
|
2012-09-14 09:55:19 +00:00
|
|
|
#elif defined(SOC_MV_ARMADAXP)
|
2012-09-14 10:05:01 +00:00
|
|
|
#define MAIN_IRQ_NUM 116
|
|
|
|
#define ERR_IRQ_NUM 32
|
|
|
|
#define ERR_IRQ (MAIN_IRQ_NUM)
|
|
|
|
#define MSI_IRQ_NUM 32
|
|
|
|
#define MSI_IRQ (ERR_IRQ + ERR_IRQ_NUM)
|
|
|
|
#define NIRQ (MAIN_IRQ_NUM + ERR_IRQ_NUM + MSI_IRQ_NUM)
|
2005-02-13 18:26:31 +00:00
|
|
|
#else
|
2004-09-23 22:09:57 +00:00
|
|
|
#define NIRQ 32
|
2005-02-13 18:26:31 +00:00
|
|
|
#endif
|
2004-05-14 11:46:45 +00:00
|
|
|
|
2009-06-09 18:18:41 +00:00
|
|
|
int arm_get_next_irq(int);
|
2005-06-09 12:26:20 +00:00
|
|
|
void arm_mask_irq(uintptr_t);
|
|
|
|
void arm_unmask_irq(uintptr_t);
|
2013-01-19 00:50:12 +00:00
|
|
|
void arm_intrnames_init(void);
|
2012-06-13 05:02:51 +00:00
|
|
|
void arm_setup_irqhandler(const char *, int (*)(void*), void (*)(void*),
|
|
|
|
void *, int, int, void **);
|
2008-09-11 12:36:13 +00:00
|
|
|
int arm_remove_irqhandler(int, void *);
|
2008-04-20 23:29:06 +00:00
|
|
|
extern void (*arm_post_filter)(void *);
|
2014-01-01 20:03:48 +00:00
|
|
|
extern int (*arm_config_irq)(int irq, enum intr_trigger trig,
|
|
|
|
enum intr_polarity pol);
|
2012-08-15 03:03:03 +00:00
|
|
|
|
2015-12-18 05:43:59 +00:00
|
|
|
void intr_pic_init_secondary(void);
|
2012-08-15 03:03:03 +00:00
|
|
|
|
2014-12-21 21:27:12 +00:00
|
|
|
#ifdef FDT
|
2015-10-18 20:37:10 +00:00
|
|
|
int gic_decode_fdt(phandle_t, pcell_t *, int *, int *, int *);
|
2015-12-18 05:43:59 +00:00
|
|
|
int intr_fdt_map_irq(phandle_t, pcell_t *, int);
|
2014-12-21 21:27:12 +00:00
|
|
|
#endif
|
|
|
|
|
Import ARM_INTRNG, the "next generation" interrupt architecture for arm
and armv6 architecures. The primary enhancement over the old design is
support for hierarchical interrupt controllers (such as a gpio driver
which can receive interrupts from a root PIC and act as a PIC itself for
clients interested in handling a change of gpio pin state as an
interrupt). The new code also provides an infrastructure for mapping
interrupts described in metadata in the form of a "controller reference
plus interrupt number" tuple into the simple "0-n" flat numeric space
understood by rman and the bus resource mechanisms.
Use of the new code is enabled by setting the ARM_INTRNG option, and by
making a few simple changes to the platform's support code. In addition
each existing PIC driver needs changes to be ready for INTRNG; this commit
contains the changes for the arm/gic driver, which most armv6 SoCs use, but
it does not enable the new code yet on any platform.
This project has been many years in the making, starting as a GSoC project
by Jakub Klama (jceel@) in 2012. That didn't get committed right away and
the source base evolved out from under it to some degree. In 2014 I rebased
the diffs to then -current and did some enhancements in the area of mapping
interrupt numbers and storing associated fdt data, then the project went
cold again for a while. Eventually Svata Kraus took that work in progress
and did another big round of work on it, removing most of the remaining
rough edges. Finally I took that and made one more pass through it, mostly
disabling the "INTR_SOLO" feature for now, pending further design
discussions on how to most efficiently dispatch a pending interrupt through
more than one layer of PIC. The current code with the INTR_SOLO feature
disabled uses approximate 100 extra cpu cycles for each cascaded PIC the
interrupt has to be passed to, so what's left to do is about efficiency, not
correct operation.
Differential Revision: https://reviews.freebsd.org/D2047
2015-10-18 18:26:19 +00:00
|
|
|
#endif /* ARM_INTRNG */
|
|
|
|
|
|
|
|
void arm_irq_memory_barrier(uintptr_t);
|
|
|
|
|
2004-05-14 11:46:45 +00:00
|
|
|
#endif /* _MACHINE_INTR_H */
|