Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
179c1e3c
Commit
179c1e3c
authored
Jul 11, 2014
by
Christoffer Dall
Browse files
Options
Browse Files
Download
Plain Diff
Merge tag 'deps-irqchip-gic-3.17' of
git://git.infradead.org/users/jcooper/linux.git
parents
1df08ba0
021f6537
Changes
10
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
1065 additions
and
56 deletions
+1065
-56
arch/arm64/Kconfig
arch/arm64/Kconfig
+1
-0
arch/arm64/kernel/head.S
arch/arm64/kernel/head.S
+18
-0
arch/arm64/kernel/hyp-stub.S
arch/arm64/kernel/hyp-stub.S
+1
-0
drivers/irqchip/Kconfig
drivers/irqchip/Kconfig
+5
-0
drivers/irqchip/Makefile
drivers/irqchip/Makefile
+2
-1
drivers/irqchip/irq-gic-common.c
drivers/irqchip/irq-gic-common.c
+115
-0
drivers/irqchip/irq-gic-common.h
drivers/irqchip/irq-gic-common.h
+29
-0
drivers/irqchip/irq-gic-v3.c
drivers/irqchip/irq-gic-v3.c
+692
-0
drivers/irqchip/irq-gic.c
drivers/irqchip/irq-gic.c
+4
-55
include/linux/irqchip/arm-gic-v3.h
include/linux/irqchip/arm-gic-v3.h
+198
-0
No files found.
arch/arm64/Kconfig
View file @
179c1e3c
...
...
@@ -9,6 +9,7 @@ config ARM64
select ARM_AMBA
select ARM_ARCH_TIMER
select ARM_GIC
select ARM_GIC_V3
select BUILDTIME_EXTABLE_SORT
select CLONE_BACKWARDS
select COMMON_CLK
...
...
arch/arm64/kernel/head.S
View file @
179c1e3c
...
...
@@ -22,6 +22,7 @@
#include <linux/linkage.h>
#include <linux/init.h>
#include <linux/irqchip/arm-gic-v3.h>
#include <asm/assembler.h>
#include <asm/ptrace.h>
...
...
@@ -296,6 +297,23 @@ CPU_LE( bic x0, x0, #(3 << 24) ) // Clear the EE and E0E bits for EL1
msr
cnthctl_el2
,
x0
msr
cntvoff_el2
,
xzr
//
Clear
virtual
offset
#ifdef CONFIG_ARM_GIC_V3
/
*
GICv3
system
register
access
*/
mrs
x0
,
id_aa64pfr0_el1
ubfx
x0
,
x0
,
#
24
,
#
4
cmp
x0
,
#
1
b.ne
3
f
mrs
x0
,
ICC_SRE_EL2
orr
x0
,
x0
,
#
ICC_SRE_EL2_SRE
//
Set
ICC_SRE_EL2
.
SRE
==
1
orr
x0
,
x0
,
#
ICC_SRE_EL2_ENABLE
//
Set
ICC_SRE_EL2
.
Enable
==
1
msr
ICC_SRE_EL2
,
x0
isb
//
Make
sure
SRE
is
now
set
msr
ICH_HCR_EL2
,
xzr
//
Reset
ICC_HCR_EL2
to
defaults
3
:
#endif
/
*
Populate
ID
registers
.
*/
mrs
x0
,
midr_el1
mrs
x1
,
mpidr_el1
...
...
arch/arm64/kernel/hyp-stub.S
View file @
179c1e3c
...
...
@@ -19,6 +19,7 @@
#include <linux/init.h>
#include <linux/linkage.h>
#include <linux/irqchip/arm-gic-v3.h>
#include <asm/assembler.h>
#include <asm/ptrace.h>
...
...
drivers/irqchip/Kconfig
View file @
179c1e3c
...
...
@@ -10,6 +10,11 @@ config ARM_GIC
config GIC_NON_BANKED
bool
config ARM_GIC_V3
bool
select IRQ_DOMAIN
select MULTI_IRQ_HANDLER
config ARM_NVIC
bool
select IRQ_DOMAIN
...
...
drivers/irqchip/Makefile
View file @
179c1e3c
...
...
@@ -15,7 +15,8 @@ obj-$(CONFIG_ORION_IRQCHIP) += irq-orion.o
obj-$(CONFIG_ARCH_SUNXI)
+=
irq-sun4i.o
obj-$(CONFIG_ARCH_SUNXI)
+=
irq-sunxi-nmi.o
obj-$(CONFIG_ARCH_SPEAR3XX)
+=
spear-shirq.o
obj-$(CONFIG_ARM_GIC)
+=
irq-gic.o
obj-$(CONFIG_ARM_GIC)
+=
irq-gic.o irq-gic-common.o
obj-$(CONFIG_ARM_GIC_V3)
+=
irq-gic-v3.o irq-gic-common.o
obj-$(CONFIG_ARM_NVIC)
+=
irq-nvic.o
obj-$(CONFIG_ARM_VIC)
+=
irq-vic.o
obj-$(CONFIG_IMGPDC_IRQ)
+=
irq-imgpdc.o
...
...
drivers/irqchip/irq-gic-common.c
0 → 100644
View file @
179c1e3c
/*
* Copyright (C) 2002 ARM Limited, All Rights Reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/irq.h>
#include <linux/irqchip/arm-gic.h>
#include "irq-gic-common.h"
void
gic_configure_irq
(
unsigned
int
irq
,
unsigned
int
type
,
void
__iomem
*
base
,
void
(
*
sync_access
)(
void
))
{
u32
enablemask
=
1
<<
(
irq
%
32
);
u32
enableoff
=
(
irq
/
32
)
*
4
;
u32
confmask
=
0x2
<<
((
irq
%
16
)
*
2
);
u32
confoff
=
(
irq
/
16
)
*
4
;
bool
enabled
=
false
;
u32
val
;
/*
* Read current configuration register, and insert the config
* for "irq", depending on "type".
*/
val
=
readl_relaxed
(
base
+
GIC_DIST_CONFIG
+
confoff
);
if
(
type
==
IRQ_TYPE_LEVEL_HIGH
)
val
&=
~
confmask
;
else
if
(
type
==
IRQ_TYPE_EDGE_RISING
)
val
|=
confmask
;
/*
* As recommended by the spec, disable the interrupt before changing
* the configuration
*/
if
(
readl_relaxed
(
base
+
GIC_DIST_ENABLE_SET
+
enableoff
)
&
enablemask
)
{
writel_relaxed
(
enablemask
,
base
+
GIC_DIST_ENABLE_CLEAR
+
enableoff
);
if
(
sync_access
)
sync_access
();
enabled
=
true
;
}
/*
* Write back the new configuration, and possibly re-enable
* the interrupt.
*/
writel_relaxed
(
val
,
base
+
GIC_DIST_CONFIG
+
confoff
);
if
(
enabled
)
writel_relaxed
(
enablemask
,
base
+
GIC_DIST_ENABLE_SET
+
enableoff
);
if
(
sync_access
)
sync_access
();
}
void
__init
gic_dist_config
(
void
__iomem
*
base
,
int
gic_irqs
,
void
(
*
sync_access
)(
void
))
{
unsigned
int
i
;
/*
* Set all global interrupts to be level triggered, active low.
*/
for
(
i
=
32
;
i
<
gic_irqs
;
i
+=
16
)
writel_relaxed
(
0
,
base
+
GIC_DIST_CONFIG
+
i
/
4
);
/*
* Set priority on all global interrupts.
*/
for
(
i
=
32
;
i
<
gic_irqs
;
i
+=
4
)
writel_relaxed
(
0xa0a0a0a0
,
base
+
GIC_DIST_PRI
+
i
);
/*
* Disable all interrupts. Leave the PPI and SGIs alone
* as they are enabled by redistributor registers.
*/
for
(
i
=
32
;
i
<
gic_irqs
;
i
+=
32
)
writel_relaxed
(
0xffffffff
,
base
+
GIC_DIST_ENABLE_CLEAR
+
i
/
8
);
if
(
sync_access
)
sync_access
();
}
void
gic_cpu_config
(
void
__iomem
*
base
,
void
(
*
sync_access
)(
void
))
{
int
i
;
/*
* Deal with the banked PPI and SGI interrupts - disable all
* PPI interrupts, ensure all SGI interrupts are enabled.
*/
writel_relaxed
(
0xffff0000
,
base
+
GIC_DIST_ENABLE_CLEAR
);
writel_relaxed
(
0x0000ffff
,
base
+
GIC_DIST_ENABLE_SET
);
/*
* Set priority on PPI and SGI interrupts
*/
for
(
i
=
0
;
i
<
32
;
i
+=
4
)
writel_relaxed
(
0xa0a0a0a0
,
base
+
GIC_DIST_PRI
+
i
*
4
/
4
);
if
(
sync_access
)
sync_access
();
}
drivers/irqchip/irq-gic-common.h
0 → 100644
View file @
179c1e3c
/*
* Copyright (C) 2002 ARM Limited, All Rights Reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _IRQ_GIC_COMMON_H
#define _IRQ_GIC_COMMON_H
#include <linux/of.h>
#include <linux/irqdomain.h>
void
gic_configure_irq
(
unsigned
int
irq
,
unsigned
int
type
,
void
__iomem
*
base
,
void
(
*
sync_access
)(
void
));
void
gic_dist_config
(
void
__iomem
*
base
,
int
gic_irqs
,
void
(
*
sync_access
)(
void
));
void
gic_cpu_config
(
void
__iomem
*
base
,
void
(
*
sync_access
)(
void
));
#endif
/* _IRQ_GIC_COMMON_H */
drivers/irqchip/irq-gic-v3.c
0 → 100644
View file @
179c1e3c
This diff is collapsed.
Click to expand it.
drivers/irqchip/irq-gic.c
View file @
179c1e3c
...
...
@@ -46,6 +46,7 @@
#include <asm/exception.h>
#include <asm/smp_plat.h>
#include "irq-gic-common.h"
#include "irqchip.h"
union
gic_base
{
...
...
@@ -188,12 +189,6 @@ static int gic_set_type(struct irq_data *d, unsigned int type)
{
void
__iomem
*
base
=
gic_dist_base
(
d
);
unsigned
int
gicirq
=
gic_irq
(
d
);
u32
enablemask
=
1
<<
(
gicirq
%
32
);
u32
enableoff
=
(
gicirq
/
32
)
*
4
;
u32
confmask
=
0x2
<<
((
gicirq
%
16
)
*
2
);
u32
confoff
=
(
gicirq
/
16
)
*
4
;
bool
enabled
=
false
;
u32
val
;
/* Interrupt configuration for SGIs can't be changed */
if
(
gicirq
<
16
)
...
...
@@ -207,25 +202,7 @@ static int gic_set_type(struct irq_data *d, unsigned int type)
if
(
gic_arch_extn
.
irq_set_type
)
gic_arch_extn
.
irq_set_type
(
d
,
type
);
val
=
readl_relaxed
(
base
+
GIC_DIST_CONFIG
+
confoff
);
if
(
type
==
IRQ_TYPE_LEVEL_HIGH
)
val
&=
~
confmask
;
else
if
(
type
==
IRQ_TYPE_EDGE_RISING
)
val
|=
confmask
;
/*
* As recommended by the spec, disable the interrupt before changing
* the configuration
*/
if
(
readl_relaxed
(
base
+
GIC_DIST_ENABLE_SET
+
enableoff
)
&
enablemask
)
{
writel_relaxed
(
enablemask
,
base
+
GIC_DIST_ENABLE_CLEAR
+
enableoff
);
enabled
=
true
;
}
writel_relaxed
(
val
,
base
+
GIC_DIST_CONFIG
+
confoff
);
if
(
enabled
)
writel_relaxed
(
enablemask
,
base
+
GIC_DIST_ENABLE_SET
+
enableoff
);
gic_configure_irq
(
gicirq
,
type
,
base
,
NULL
);
raw_spin_unlock
(
&
irq_controller_lock
);
...
...
@@ -386,12 +363,6 @@ static void __init gic_dist_init(struct gic_chip_data *gic)
writel_relaxed
(
0
,
base
+
GIC_DIST_CTRL
);
/*
* Set all global interrupts to be level triggered, active low.
*/
for
(
i
=
32
;
i
<
gic_irqs
;
i
+=
16
)
writel_relaxed
(
0
,
base
+
GIC_DIST_CONFIG
+
i
*
4
/
16
);
/*
* Set all global interrupts to this CPU only.
*/
...
...
@@ -401,18 +372,7 @@ static void __init gic_dist_init(struct gic_chip_data *gic)
for
(
i
=
32
;
i
<
gic_irqs
;
i
+=
4
)
writel_relaxed
(
cpumask
,
base
+
GIC_DIST_TARGET
+
i
*
4
/
4
);
/*
* Set priority on all global interrupts.
*/
for
(
i
=
32
;
i
<
gic_irqs
;
i
+=
4
)
writel_relaxed
(
0xa0a0a0a0
,
base
+
GIC_DIST_PRI
+
i
*
4
/
4
);
/*
* Disable all interrupts. Leave the PPI and SGIs alone
* as these enables are banked registers.
*/
for
(
i
=
32
;
i
<
gic_irqs
;
i
+=
32
)
writel_relaxed
(
0xffffffff
,
base
+
GIC_DIST_ENABLE_CLEAR
+
i
*
4
/
32
);
gic_dist_config
(
base
,
gic_irqs
,
NULL
);
writel_relaxed
(
1
,
base
+
GIC_DIST_CTRL
);
}
...
...
@@ -439,18 +399,7 @@ static void gic_cpu_init(struct gic_chip_data *gic)
if
(
i
!=
cpu
)
gic_cpu_map
[
i
]
&=
~
cpu_mask
;
/*
* Deal with the banked PPI and SGI interrupts - disable all
* PPI interrupts, ensure all SGI interrupts are enabled.
*/
writel_relaxed
(
0xffff0000
,
dist_base
+
GIC_DIST_ENABLE_CLEAR
);
writel_relaxed
(
0x0000ffff
,
dist_base
+
GIC_DIST_ENABLE_SET
);
/*
* Set priority on PPI and SGI interrupts
*/
for
(
i
=
0
;
i
<
32
;
i
+=
4
)
writel_relaxed
(
0xa0a0a0a0
,
dist_base
+
GIC_DIST_PRI
+
i
*
4
/
4
);
gic_cpu_config
(
dist_base
,
NULL
);
writel_relaxed
(
0xf0
,
base
+
GIC_CPU_PRIMASK
);
writel_relaxed
(
1
,
base
+
GIC_CPU_CTRL
);
...
...
include/linux/irqchip/arm-gic-v3.h
0 → 100644
View file @
179c1e3c
/*
* Copyright (C) 2013, 2014 ARM Limited, All Rights Reserved.
* Author: Marc Zyngier <marc.zyngier@arm.com>
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __LINUX_IRQCHIP_ARM_GIC_V3_H
#define __LINUX_IRQCHIP_ARM_GIC_V3_H
/*
* Distributor registers. We assume we're running non-secure, with ARE
* being set. Secure-only and non-ARE registers are not described.
*/
#define GICD_CTLR 0x0000
#define GICD_TYPER 0x0004
#define GICD_IIDR 0x0008
#define GICD_STATUSR 0x0010
#define GICD_SETSPI_NSR 0x0040
#define GICD_CLRSPI_NSR 0x0048
#define GICD_SETSPI_SR 0x0050
#define GICD_CLRSPI_SR 0x0058
#define GICD_SEIR 0x0068
#define GICD_ISENABLER 0x0100
#define GICD_ICENABLER 0x0180
#define GICD_ISPENDR 0x0200
#define GICD_ICPENDR 0x0280
#define GICD_ISACTIVER 0x0300
#define GICD_ICACTIVER 0x0380
#define GICD_IPRIORITYR 0x0400
#define GICD_ICFGR 0x0C00
#define GICD_IROUTER 0x6000
#define GICD_PIDR2 0xFFE8
#define GICD_CTLR_RWP (1U << 31)
#define GICD_CTLR_ARE_NS (1U << 4)
#define GICD_CTLR_ENABLE_G1A (1U << 1)
#define GICD_CTLR_ENABLE_G1 (1U << 0)
#define GICD_IROUTER_SPI_MODE_ONE (0U << 31)
#define GICD_IROUTER_SPI_MODE_ANY (1U << 31)
#define GIC_PIDR2_ARCH_MASK 0xf0
#define GIC_PIDR2_ARCH_GICv3 0x30
#define GIC_PIDR2_ARCH_GICv4 0x40
/*
* Re-Distributor registers, offsets from RD_base
*/
#define GICR_CTLR GICD_CTLR
#define GICR_IIDR 0x0004
#define GICR_TYPER 0x0008
#define GICR_STATUSR GICD_STATUSR
#define GICR_WAKER 0x0014
#define GICR_SETLPIR 0x0040
#define GICR_CLRLPIR 0x0048
#define GICR_SEIR GICD_SEIR
#define GICR_PROPBASER 0x0070
#define GICR_PENDBASER 0x0078
#define GICR_INVLPIR 0x00A0
#define GICR_INVALLR 0x00B0
#define GICR_SYNCR 0x00C0
#define GICR_MOVLPIR 0x0100
#define GICR_MOVALLR 0x0110
#define GICR_PIDR2 GICD_PIDR2
#define GICR_WAKER_ProcessorSleep (1U << 1)
#define GICR_WAKER_ChildrenAsleep (1U << 2)
/*
* Re-Distributor registers, offsets from SGI_base
*/
#define GICR_ISENABLER0 GICD_ISENABLER
#define GICR_ICENABLER0 GICD_ICENABLER
#define GICR_ISPENDR0 GICD_ISPENDR
#define GICR_ICPENDR0 GICD_ICPENDR
#define GICR_ISACTIVER0 GICD_ISACTIVER
#define GICR_ICACTIVER0 GICD_ICACTIVER
#define GICR_IPRIORITYR0 GICD_IPRIORITYR
#define GICR_ICFGR0 GICD_ICFGR
#define GICR_TYPER_VLPIS (1U << 1)
#define GICR_TYPER_LAST (1U << 4)
/*
* CPU interface registers
*/
#define ICC_CTLR_EL1_EOImode_drop_dir (0U << 1)
#define ICC_CTLR_EL1_EOImode_drop (1U << 1)
#define ICC_SRE_EL1_SRE (1U << 0)
/*
* Hypervisor interface registers (SRE only)
*/
#define ICH_LR_VIRTUAL_ID_MASK ((1UL << 32) - 1)
#define ICH_LR_EOI (1UL << 41)
#define ICH_LR_GROUP (1UL << 60)
#define ICH_LR_STATE (3UL << 62)
#define ICH_LR_PENDING_BIT (1UL << 62)
#define ICH_LR_ACTIVE_BIT (1UL << 63)
#define ICH_MISR_EOI (1 << 0)
#define ICH_MISR_U (1 << 1)
#define ICH_HCR_EN (1 << 0)
#define ICH_HCR_UIE (1 << 1)
#define ICH_VMCR_CTLR_SHIFT 0
#define ICH_VMCR_CTLR_MASK (0x21f << ICH_VMCR_CTLR_SHIFT)
#define ICH_VMCR_BPR1_SHIFT 18
#define ICH_VMCR_BPR1_MASK (7 << ICH_VMCR_BPR1_SHIFT)
#define ICH_VMCR_BPR0_SHIFT 21
#define ICH_VMCR_BPR0_MASK (7 << ICH_VMCR_BPR0_SHIFT)
#define ICH_VMCR_PMR_SHIFT 24
#define ICH_VMCR_PMR_MASK (0xffUL << ICH_VMCR_PMR_SHIFT)
#define ICC_EOIR1_EL1 S3_0_C12_C12_1
#define ICC_IAR1_EL1 S3_0_C12_C12_0
#define ICC_SGI1R_EL1 S3_0_C12_C11_5
#define ICC_PMR_EL1 S3_0_C4_C6_0
#define ICC_CTLR_EL1 S3_0_C12_C12_4
#define ICC_SRE_EL1 S3_0_C12_C12_5
#define ICC_GRPEN1_EL1 S3_0_C12_C12_7
#define ICC_IAR1_EL1_SPURIOUS 0x3ff
#define ICC_SRE_EL2 S3_4_C12_C9_5
#define ICC_SRE_EL2_SRE (1 << 0)
#define ICC_SRE_EL2_ENABLE (1 << 3)
/*
* System register definitions
*/
#define ICH_VSEIR_EL2 S3_4_C12_C9_4
#define ICH_HCR_EL2 S3_4_C12_C11_0
#define ICH_VTR_EL2 S3_4_C12_C11_1
#define ICH_MISR_EL2 S3_4_C12_C11_2
#define ICH_EISR_EL2 S3_4_C12_C11_3
#define ICH_ELSR_EL2 S3_4_C12_C11_5
#define ICH_VMCR_EL2 S3_4_C12_C11_7
#define __LR0_EL2(x) S3_4_C12_C12_ ## x
#define __LR8_EL2(x) S3_4_C12_C13_ ## x
#define ICH_LR0_EL2 __LR0_EL2(0)
#define ICH_LR1_EL2 __LR0_EL2(1)
#define ICH_LR2_EL2 __LR0_EL2(2)
#define ICH_LR3_EL2 __LR0_EL2(3)
#define ICH_LR4_EL2 __LR0_EL2(4)
#define ICH_LR5_EL2 __LR0_EL2(5)
#define ICH_LR6_EL2 __LR0_EL2(6)
#define ICH_LR7_EL2 __LR0_EL2(7)
#define ICH_LR8_EL2 __LR8_EL2(0)
#define ICH_LR9_EL2 __LR8_EL2(1)
#define ICH_LR10_EL2 __LR8_EL2(2)
#define ICH_LR11_EL2 __LR8_EL2(3)
#define ICH_LR12_EL2 __LR8_EL2(4)
#define ICH_LR13_EL2 __LR8_EL2(5)
#define ICH_LR14_EL2 __LR8_EL2(6)
#define ICH_LR15_EL2 __LR8_EL2(7)
#define __AP0Rx_EL2(x) S3_4_C12_C8_ ## x
#define ICH_AP0R0_EL2 __AP0Rx_EL2(0)
#define ICH_AP0R1_EL2 __AP0Rx_EL2(1)
#define ICH_AP0R2_EL2 __AP0Rx_EL2(2)
#define ICH_AP0R3_EL2 __AP0Rx_EL2(3)
#define __AP1Rx_EL2(x) S3_4_C12_C9_ ## x
#define ICH_AP1R0_EL2 __AP1Rx_EL2(0)
#define ICH_AP1R1_EL2 __AP1Rx_EL2(1)
#define ICH_AP1R2_EL2 __AP1Rx_EL2(2)
#define ICH_AP1R3_EL2 __AP1Rx_EL2(3)
#ifndef __ASSEMBLY__
#include <linux/stringify.h>
static
inline
void
gic_write_eoir
(
u64
irq
)
{
asm
volatile
(
"msr "
__stringify
(
ICC_EOIR1_EL1
)
", %0"
:
:
"r"
(
irq
));
isb
();
}
#endif
#endif
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment