xen/arm: Add support for GIC v3

Add support for GIC v3 specification System register access(SRE)
is enabled to access cpu and virtual interface registers based
on kernel GICv3 driver.

This patch adds only basic v3 support.
Does not support Interrupt Translation support (ITS)

Signed-off-by: Vijaya Kumar K <Vijaya.Kumar@caviumnetworks.com>
Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
This commit is contained in:
Vijaya Kumar K authored and Ian Campbell committed 2014-09-15 22:55:56 +01:00
1 parent 4218cde887
commit bc183a0235
7 files changed
+1449

No files matched your search

+1
View File
@@ -11,6 +11,7 @@ obj-y += domctl.o
obj-y += sysctl.o
obj-y += domain_build.o
obj-y += gic.o gic-v2.o
obj-$(CONFIG_ARM_64) += gic-v3.o
obj-y += io.o
obj-y += irq.o
obj-y += kernel.o
File diff suppressed because it is too large. Load diff
+8
View File
@@ -99,6 +99,14 @@ struct arch_domain
/* Base address for guest GIC */
paddr_t dbase; /* Distributor base address */
paddr_t cbase; /* CPU base address */
#ifdef CONFIG_ARM_64
/* GIC V3 addressing */
paddr_t dbase_size; /* Distributor base size */
paddr_t rbase[MAX_RDIST_COUNT]; /* Re-Distributor base address */
paddr_t rbase_size[MAX_RDIST_COUNT]; /* Re-Distributor size */
uint32_t rdist_stride; /* Re-Distributor stride */
int rdist_count; /* No. of Re-Distributors */
#endif
} vgic;
struct vuart {
+20
View File
@@ -18,6 +18,10 @@
#ifndef __ASM_ARM_GIC_H__
#define __ASM_ARM_GIC_H__
#define NR_GIC_LOCAL_IRQS NR_LOCAL_IRQS
#define NR_GIC_SGI 16
#define MAX_RDIST_COUNT 4
#define GICD_CTLR (0x000)
#define GICD_TYPER (0x004)
#define GICD_IIDR (0x008)
@@ -154,6 +158,20 @@
#define DT_MATCH_GIC_V2 DT_MATCH_COMPATIBLE(DT_COMPAT_GIC_CORTEX_A15), \
DT_MATCH_COMPATIBLE(DT_COMPAT_GIC_CORTEX_A7)
#define DT_COMPAT_GIC_V3 "arm,gic-v3"
#define DT_MATCH_GIC_V3 DT_MATCH_COMPATIBLE(DT_COMPAT_GIC_V3)
/*
* GICv3 registers that needs to be saved/restored
*/
struct gic_v3 {
uint32_t hcr, vmcr, sre_el1;
uint32_t apr0[4];
uint32_t apr1[4];
uint64_t lr[16];
};
/*
* GICv2 register that needs to be saved/restored
* on VCPU context switch
@@ -170,6 +188,7 @@ struct gic_v2 {
*/
union gic_state_data {
struct gic_v2 v2;
struct gic_v3 v3;
};
/*
@@ -189,6 +208,7 @@ struct gic_lr {
enum gic_version {
GIC_V2,
GIC_V3,
};
extern enum gic_version gic_hw_version(void);
+154
View File
@@ -0,0 +1,154 @@
/*
* ARM Generic Interrupt Controller v3 definitions
*
* Vijaya Kumar K <vijaya.kumar@caviumnetworks.com>
* Copyright (c) 2014 Cavium Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* 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.
*/
#ifndef __ASM_ARM_GIC_V3_DEFS_H__
#define __ASM_ARM_GIC_V3_DEFS_H__
/*
* Additional registers defined in GIC v3.
* Common GICD registers are defined in gic.h
*/
#define GICD_STATUSR (0x010)
#define GICD_SETSPI_NSR (0x040)
#define GICD_CLRSPI_NSR (0x048)
#define GICD_SETSPI_SR (0x050)
#define GICD_CLRSPI_SR (0x058)
#define GICD_IROUTER (0x6000)
#define GICD_IROUTER31 (0x60F8)
#define GICD_IROUTER32 (0x6100)
#define GICD_IROUTERN (0x7FF8)
#define GICD_PIDR0 (0xFFE0)
#define GICD_PIDR1 (0xFFE4)
#define GICD_PIDR2 (0xFFE8)
#define GICD_PIDR3 (0xFFEC)
#define GICD_PIDR4 (0xFFD0)
#define GICD_PIDR5 (0xFFD4)
#define GICD_PIDR7 (0xFFDC)
#define GICC_SRE_EL2_SRE (1UL << 0)
#define GICC_SRE_EL2_DFB (1UL << 1)
#define GICC_SRE_EL2_DIB (1UL << 2)
#define GICC_SRE_EL2_ENEL1 (1UL << 3)
#define GICD_CTLR_RWP (1UL << 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_ANY (1UL << 31)
#define GICC_CTLR_EL1_EOImode_drop (1U << 1)
#define GICR_WAKER_ProcessorSleep (1U << 1)
#define GICR_WAKER_ChildrenAsleep (1U << 2)
#define GICD_PIDR2_ARCH_REV_MASK (0xf0)
#define GICD_PIDR2_ARCH_REV_SHIFT (0x4)
#define GICD_PIDR2_ARCH_GICV3 (0x3)
#define GICR_PIDR2_ARCH_REV_MASK GICD_PIDR2_ARCH_REV_MASK
#define GICR_PIDR2_ARCH_REV_SHIFT GICD_PIDR2_ARCH_REV_SHIFT
#define GICR_PIDR2_ARCH_GICV3 GICD_PIDR2_ARCH_GICV3
#define GICR_SYNCR_NOT_BUSY 1
/*
* Implementation defined value JEP106?
* use physical hw value for now
*/
#define GICV3_GICD_IIDR_VAL 0x34c
#define GICV3_GICR_IIDR_VAL GICV3_GICD_IIDR_VAL
#define GICR_CTLR (0x0000)
#define GICR_IIDR (0x0004)
#define GICR_TYPER (0x0008)
#define GICR_STATUSR (0x0010)
#define GICR_WAKER (0x0014)
#define GICR_SETLPIR (0x0040)
#define GICR_CLRLPIR (0x0048)
#define GICR_PROPBASER (0x0070)
#define GICR_PENDBASER (0x0078)
#define GICR_INVLPIR (0x00A0)
#define GICR_INVALLR (0x00B0)
#define GICR_SYNCR (0x00C0)
#define GICR_MOVLPIR (0x100)
#define GICR_MOVALLR (0x0110)
#define GICR_PIDR0 GICD_PIDR0
#define GICR_PIDR1 GICD_PIDR1
#define GICR_PIDR2 GICD_PIDR2
#define GICR_PIDR3 GICD_PIDR3
#define GICR_PIDR4 GICD_PIDR4
#define GICR_PIDR5 GICD_PIDR5
#define GICR_PIDR7 GICD_PIDR7
/* GICR for SGI's & PPI's */
#define GICR_IGROUPR0 (0x0080)
#define GICR_IGRPMODR0 (0x0F80)
#define GICR_ISENABLER0 (0x0100)
#define GICR_ICENABLER0 (0x0180)
#define GICR_ISPENDR0 (0x0200)
#define GICR_ICPENDR0 (0x0280)
#define GICR_ISACTIVER0 (0x0300)
#define GICR_ICACTIVER0 (0x0380)
#define GICR_IPRIORITYR0 (0x0400)
#define GICR_IPRIORITYR7 (0x041C)
#define GICR_ICFGR0 (0x0C00)
#define GICR_ICFGR1 (0x0C04)
#define GICR_NSACR (0x0E00)
#define GICR_TYPER_PLPIS (1U << 0)
#define GICR_TYPER_VLPIS (1U << 1)
#define GICR_TYPER_LAST (1U << 4)
#define DEFAULT_PMR_VALUE 0xff
#define GICH_VMCR_EOI (1 << 9)
#define GICH_VMCR_VENG1 (1 << 1)
#define GICH_LR_VIRTUAL_MASK 0xffff
#define GICH_LR_VIRTUAL_SHIFT 0
#define GICH_LR_PHYSICAL_MASK 0x3ff
#define GICH_LR_PHYSICAL_SHIFT 32
#define GICH_LR_STATE_MASK 0x3
#define GICH_LR_STATE_SHIFT 62
#define GICH_LR_PRIORITY_MASK 0xff
#define GICH_LR_PRIORITY_SHIFT 48
#define GICH_LR_HW_MASK 0x1
#define GICH_LR_HW_SHIFT 61
#define GICH_LR_GRP_MASK 0x1
#define GICH_LR_GRP_SHIFT 60
#define GICH_LR_MAINTENANCE_IRQ (1UL<<41)
#define GICH_LR_GRP1 (1UL<<60)
#define GICH_LR_HW (1UL<<61)
#define GICH_VTR_NRLRGS 0x3f
#define GICH_VTR_PRIBITS_MASK 0x7
#define GICH_VTR_PRIBITS_SHIFT 29
#define GICH_VMCR_PRIORITY_MASK 0xff
#define GICH_VMCR_PRIORITY_SHIFT 24
#endif /* __ASM_ARM_GIC_V3_DEFS_H__ */
/*
* Local variables:
* mode: C
* c-file-style: "BSD"
* c-basic-offset: 4
* indent-tabs-mode: nil
* End:
*/
+13
View File
@@ -20,6 +20,19 @@
#define AFFINITY_MASK(level) ~((_AC(0x1,U) << ((level) * MPIDR_LEVEL_BITS)) - 1)
/*
* Macros to extract affinity level. picked from kernel
*/
#define MPIDR_LEVEL_BITS_SHIFT 3
#define MPIDR_LEVEL_MASK ((1 << MPIDR_LEVEL_BITS) - 1)
#define MPIDR_LEVEL_SHIFT(level) \
(((1 << level) >> 1) << MPIDR_LEVEL_BITS_SHIFT)
#define MPIDR_AFFINITY_LEVEL(mpidr, level) \
((mpidr >> MPIDR_LEVEL_SHIFT(level)) & MPIDR_LEVEL_MASK)
/* TTBCR Translation Table Base Control Register */
#define TTBCR_EAE _AC(0x80000000,U)
#define TTBCR_N_MASK _AC(0x07,U)
+53
View File
@@ -100,6 +100,59 @@
#define HSR_SYSREG_CNTP_CTL_EL0 HSR_SYSREG(3,3,c14,c2,1)
#define HSR_SYSREG_CNTP_TVAL_EL0 HSR_SYSREG(3,3,c14,c2,0)
/*
* GIC System register assembly aliases picked from kernel
*/
#define ICC_PMR_EL1 S3_0_C4_C6_0
#define ICC_DIR_EL1 S3_0_C12_C11_1
#define ICC_SGI1R_EL1 S3_0_C12_C11_5
#define ICC_EOIR1_EL1 S3_0_C12_C12_1
#define ICC_IAR1_EL1 S3_0_C12_C12_0
#define ICC_BPR1_EL1 S3_0_C12_C12_3
#define ICC_CTLR_EL1 S3_0_C12_C12_4
#define ICC_SRE_EL1 S3_0_C12_C12_5
#define ICC_IGRPEN1_EL1 S3_0_C12_C12_7
#define ICH_VSEIR_EL2 S3_4_C12_C9_4
#define ICC_SRE_EL2 S3_4_C12_C9_5
#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)
#endif
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.