2004-05-14 11:46:45 +00:00
|
|
|
/* $FreeBSD$ */
|
|
|
|
|
|
|
|
#ifndef _MACHINE_SMP_H_
|
|
|
|
#define _MACHINE_SMP_H_
|
|
|
|
|
2012-08-15 03:03:03 +00:00
|
|
|
#include <sys/_cpuset.h>
|
2013-07-29 12:55:37 +00:00
|
|
|
#include <machine/pcb.h>
|
2012-08-15 03:03:03 +00:00
|
|
|
|
2016-04-15 16:05:41 +00:00
|
|
|
#ifdef INTRNG
|
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
|
|
|
enum {
|
|
|
|
IPI_AST,
|
|
|
|
IPI_PREEMPT,
|
|
|
|
IPI_RENDEZVOUS,
|
|
|
|
IPI_STOP,
|
|
|
|
IPI_STOP_HARD = IPI_STOP, /* These are synonyms on arm. */
|
|
|
|
IPI_HARDCLOCK,
|
2016-01-30 13:11:13 +00:00
|
|
|
IPI_TLB, /* Not used now, but keep it reserved. */
|
|
|
|
IPI_CACHE, /* Not used now, but keep it reserved. */
|
2015-12-18 05:43:59 +00:00
|
|
|
INTR_IPI_COUNT
|
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
|
2012-08-15 03:03:03 +00:00
|
|
|
#define IPI_AST 0
|
|
|
|
#define IPI_PREEMPT 2
|
|
|
|
#define IPI_RENDEZVOUS 3
|
|
|
|
#define IPI_STOP 4
|
2014-04-27 20:01:59 +00:00
|
|
|
#define IPI_STOP_HARD 4
|
2012-08-15 03:03:03 +00:00
|
|
|
#define IPI_HARDCLOCK 6
|
2016-01-30 13:11:13 +00:00
|
|
|
#define IPI_TLB 7 /* Not used now, but keep it reserved. */
|
|
|
|
#define IPI_CACHE 8 /* Not used now, but keep it reserved. */
|
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 /* INTRNG */
|
2012-08-15 03:03:03 +00:00
|
|
|
|
|
|
|
void init_secondary(int cpu);
|
2014-02-23 22:35:18 +00:00
|
|
|
void mpentry(void);
|
2012-08-15 03:03:03 +00:00
|
|
|
|
|
|
|
void ipi_all_but_self(u_int ipi);
|
|
|
|
void ipi_cpu(int cpu, u_int ipi);
|
|
|
|
void ipi_selected(cpuset_t cpus, u_int ipi);
|
|
|
|
|
|
|
|
/* PIC interface */
|
2016-04-15 16:05:41 +00:00
|
|
|
#ifndef INTRNG
|
2016-03-24 09:55:11 +00:00
|
|
|
void pic_ipi_send(cpuset_t cpus, u_int ipi);
|
2012-08-15 03:03:03 +00:00
|
|
|
void pic_ipi_clear(int ipi);
|
2014-12-24 15:25:18 +00:00
|
|
|
int pic_ipi_read(int arg);
|
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
|
2012-08-15 03:03:03 +00:00
|
|
|
|
|
|
|
/* Platform interface */
|
|
|
|
void platform_mp_setmaxid(void);
|
|
|
|
void platform_mp_start_ap(void);
|
|
|
|
|
2013-07-29 08:07:35 +00:00
|
|
|
/* global data in mp_machdep.c */
|
|
|
|
extern struct pcb stoppcbs[];
|
|
|
|
|
2004-05-14 11:46:45 +00:00
|
|
|
#endif /* !_MACHINE_SMP_H_ */
|