/*-1* SPDX-License-Identifier: BSD-2-Clause2*3* Copyright (C) 2018 The FreeBSD Foundation4*5* This software was developed by Alexandru Elisei under sponsorship6* from the FreeBSD Foundation.7*8* Redistribution and use in source and binary forms, with or without9* modification, are permitted provided that the following conditions10* are met:11* 1. Redistributions of source code must retain the above copyright12* notice, this list of conditions and the following disclaimer.13* 2. Redistributions in binary form must reproduce the above copyright14* notice, this list of conditions and the following disclaimer in the15* documentation and/or other materials provided with the distribution.16*17* THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND18* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE19* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE20* ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE21* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL22* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS23* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)24* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT25* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY26* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF27* SUCH DAMAGE.28*/2930#ifndef _VGIC_V3_REG_H_31#define _VGIC_V3_REG_H_3233/* Interrupt Controller End of Interrupt Status Register */34#define ICH_EISR_EL2_STATUS_MASK 0xffff35#define ICH_EISR_EL2_EOI_NOT_HANDLED(lr) ((1 << lr) & ICH_EISR_EL2_STATUS_MASK)3637/* Interrupt Controller Empty List Register Status Register */38#define ICH_ELSR_EL2_STATUS_MASK 0xffff39#define ICH_ELSR_EL2_LR_EMPTY(x) ((1 << x) & ICH_ELSR_EL2_STATUS_MASK)4041/* Interrupt Controller Hyp Control Register */42#define ICH_HCR_EL2_EOICOUNT_SHIFT 2743#define ICH_HCR_EL2_EOICOUNT_MASK (0x1f << ICH_HCR_EL2_EOICOUNT_SHIFT)44#define ICH_HCR_EL2_TDIR (1 << 14) /* Trap non-secure EL1 writes to IC{C, V}_DIR_EL1 */45#define ICH_HCR_EL2_TSEI (1 << 14) /* Trap System Error Interupts (SEI) to EL2 */46#define ICH_HCR_EL2_TALL1 (1 << 12) /* Trap non-secure EL1 accesses to IC{C, V}_* for Group 1 interrupts */47#define ICH_HCR_EL2_TALL0 (1 << 11) /* Trap non-secure EL1 accesses to IC{C, V}_* for Group 0 interrupts */48#define ICH_HCR_EL2_TC (1 << 10) /* Trap non-secure EL1 accesses to common IC{C, V}_* registers */49#define ICH_HCR_EL2_VGRP1DIE (1 << 7) /* VM Group 1 Disabled Interrupt Enable */50#define ICH_HCR_EL2_VGRP1EIE (1 << 6) /* VM Group 1 Enabled Interrupt Enable */51#define ICH_HCR_EL2_VGRP0DIE (1 << 5) /* VM Group 0 Disabled Interrupt Enable */52#define ICH_HCR_EL2_VGRP0EIE (1 << 4) /* VM Group 0 Enabled Interrupt Enable */53#define ICH_HCR_EL2_NPIE (1 << 3) /* No Pending Interrupt Enable */54#define ICH_HCR_EL2_LRENPIE (1 << 2) /* List Register Entry Not Present Interrupt Enable */55#define ICH_HCR_EL2_UIE (1 << 1) /* Underflow Interrupt Enable */56#define ICH_HCR_EL2_En (1 << 0) /* Global enable for the virtual CPU interface */5758/* Interrupt Controller List Registers */59#define ICH_LR_EL2_VINTID_MASK 0xffffffff60#define ICH_LR_EL2_VINTID(x) ((x) & ICH_LR_EL2_VINTID_MASK)61#define ICH_LR_EL2_PINTID_SHIFT 3262#define ICH_LR_EL2_PINTID_MASK (0x3fUL << ICH_LR_EL2_PINTID_SHIFT)63/* Raise a maintanance IRQ when deactivated (only non-HW virqs) */64#define ICH_LR_EL2_EOI (1UL << 41)65#define ICH_LR_EL2_PRIO_SHIFT 4866#define ICH_LR_EL2_PRIO_MASK (0xffUL << ICH_LR_EL2_PRIO_SHIFT)67#define ICH_LR_EL2_GROUP_SHIFT 6068#define ICH_LR_EL2_GROUP1 (1UL << ICH_LR_EL2_GROUP_SHIFT)69#define ICH_LR_EL2_HW (1UL << 61)70#define ICH_LR_EL2_STATE_SHIFT 6271#define ICH_LR_EL2_STATE_MASK (0x3UL << ICH_LR_EL2_STATE_SHIFT)72#define ICH_LR_EL2_STATE(x) ((x) & ICH_LR_EL2_STATE_MASK)73#define ICH_LR_EL2_STATE_INACTIVE (0x0UL << ICH_LR_EL2_STATE_SHIFT)74#define ICH_LR_EL2_STATE_PENDING (0x1UL << ICH_LR_EL2_STATE_SHIFT)75#define ICH_LR_EL2_STATE_ACTIVE (0x2UL << ICH_LR_EL2_STATE_SHIFT)76#define ICH_LR_EL2_STATE_PENDING_ACTIVE (0x3UL << ICH_LR_EL2_STATE_SHIFT)7778/* Interrupt Controller Maintenance Interrupt State Register */79#define ICH_MISR_EL2_VGRP1D (1 << 7) /* vPE Group 1 Disabled */80#define ICH_MISR_EL2_VGRP1E (1 << 6) /* vPE Group 1 Enabled */81#define ICH_MISR_EL2_VGRP0D (1 << 5) /* vPE Group 0 Disabled */82#define ICH_MISR_EL2_VGRP0E (1 << 4) /* vPE Group 0 Enabled */83#define ICH_MISR_EL2_NP (1 << 3) /* No Pending */84#define ICH_MISR_EL2_LRENP (1 << 2) /* List Register Entry Not Present */85#define ICH_MISR_EL2_U (1 << 1) /* Underflow */86#define ICH_MISR_EL2_EOI (1 << 0) /* End Of Interrupt */8788/* Interrupt Controller Virtual Machine Control Register */89#define ICH_VMCR_EL2_VPMR_SHIFT 2490#define ICH_VMCR_EL2_VPMR_MASK (0xff << ICH_VMCR_EL2_VPMR_SHIFT)91#define ICH_VMCR_EL2_VPMR_PRIO_LOWEST (0xff << ICH_VMCR_EL2_VPMR_SHIFT)92#define ICH_VMCR_EL2_VPMR_PRIO_HIGHEST (0x00 << ICH_VMCR_EL2_VPMR_SHIFT)93#define ICH_VMCR_EL2_VBPR0_SHIFT 2194#define ICH_VMCR_EL2_VBPR0_MASK (0x7 << ICH_VMCR_EL2_VBPR0_SHIFT)95#define ICH_VMCR_EL2_VBPR0_NO_PREEMPTION \96(0x7 << ICH_VMCR_EL2_VBPR0_SHIFT)97#define ICH_VMCR_EL2_VBPR1_SHIFT 1898#define ICH_VMCR_EL2_VBPR1_MASK (0x7 << ICH_VMCR_EL2_VBPR1_SHIFT)99#define ICH_VMCR_EL2_VBPR1_NO_PREEMPTION \100(0x7 << ICH_VMCR_EL2_VBPR1_SHIFT)101#define ICH_VMCR_EL2_VEOIM (1 << 9) /* Virtual EOI mode */102#define ICH_VMCR_EL2_VCBPR (1 << 4) /* Virtual Common binary Point Register */103#define ICH_VMCR_EL2_VFIQEN (1 << 3) /* Virtual FIQ enable */104#define ICH_VMCR_EL2_VACKCTL (1 << 2) /* Virtual AckCtl */105#define ICH_VMCR_EL2_VENG1 (1 << 1) /* Virtual Group 1 Interrupt Enable */106#define ICH_VMCR_EL2_VENG0 (1 << 0) /* Virtual Group 0 Interrupt Enable */107108/* Interrupt Controller VGIC Type Register */109#define ICH_VTR_EL2_PRIBITS_SHIFT 29110#define ICH_VTR_EL2_PRIBITS_MASK (0x7 << ICH_VTR_EL2_PRIBITS_SHIFT)111#define ICH_VTR_EL2_PRIBITS(x) \112((((x) & ICH_VTR_EL2_PRIBITS_MASK) >> ICH_VTR_EL2_PRIBITS_SHIFT) + 1)113#define ICH_VTR_EL2_PREBITS_SHIFT 26114#define ICH_VTR_EL2_PREBITS_MASK (0x7 << ICH_VTR_EL2_PREBITS_SHIFT)115#define ICH_VTR_EL2_PREBITS(x) \116(((x) & ICH_VTR_EL2_PREBITS_MASK) >> ICH_VTR_EL2_PREBITS_SHIFT)117#define ICH_VTR_EL2_SEIS (1 << 22) /* System Error Interrupt (SEI) Support */118#define ICH_VTR_EL2_A3V (1 << 21) /* Affinity 3 Valid */119#define ICH_VTR_EL2_NV4 (1 << 20) /* Direct injection of virtual interrupts. RES1 for GICv3 */120#define ICH_VTR_EL2_TDS (1 << 19) /* Implementation supports ICH_HCR_EL2.TDIR */121#define ICH_VTR_EL2_LISTREGS_MASK 0x1f122/*123* ICH_VTR_EL2.ListRegs holds the number of list registers, minus one. Add one124* to get the actual number of list registers.125*/126#define ICH_VTR_EL2_LISTREGS(x) (((x) & ICH_VTR_EL2_LISTREGS_MASK) + 1)127128#endif /* !_VGIC_V3_REG_H_ */129130131