gic_v3_cpu_interface.hh revision 13531
113531Sjairo.balart@metempsy.com/*
213531Sjairo.balart@metempsy.com * Copyright (c) 2018 Metempsy Technology Consulting
313531Sjairo.balart@metempsy.com * All rights reserved.
413531Sjairo.balart@metempsy.com *
513531Sjairo.balart@metempsy.com * Redistribution and use in source and binary forms, with or without
613531Sjairo.balart@metempsy.com * modification, are permitted provided that the following conditions are
713531Sjairo.balart@metempsy.com * met: redistributions of source code must retain the above copyright
813531Sjairo.balart@metempsy.com * notice, this list of conditions and the following disclaimer;
913531Sjairo.balart@metempsy.com * redistributions in binary form must reproduce the above copyright
1013531Sjairo.balart@metempsy.com * notice, this list of conditions and the following disclaimer in the
1113531Sjairo.balart@metempsy.com * documentation and/or other materials provided with the distribution;
1213531Sjairo.balart@metempsy.com * neither the name of the copyright holders nor the names of its
1313531Sjairo.balart@metempsy.com * contributors may be used to endorse or promote products derived from
1413531Sjairo.balart@metempsy.com * this software without specific prior written permission.
1513531Sjairo.balart@metempsy.com *
1613531Sjairo.balart@metempsy.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1713531Sjairo.balart@metempsy.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1813531Sjairo.balart@metempsy.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1913531Sjairo.balart@metempsy.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2013531Sjairo.balart@metempsy.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2113531Sjairo.balart@metempsy.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2213531Sjairo.balart@metempsy.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2313531Sjairo.balart@metempsy.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2413531Sjairo.balart@metempsy.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2513531Sjairo.balart@metempsy.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2613531Sjairo.balart@metempsy.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2713531Sjairo.balart@metempsy.com *
2813531Sjairo.balart@metempsy.com * Authors: Jairo Balart
2913531Sjairo.balart@metempsy.com */
3013531Sjairo.balart@metempsy.com
3113531Sjairo.balart@metempsy.com#ifndef __DEV_ARM_GICV3_CPU_INTERFACE_H__
3213531Sjairo.balart@metempsy.com#define __DEV_ARM_GICV3_CPU_INTERFACE_H__
3313531Sjairo.balart@metempsy.com
3413531Sjairo.balart@metempsy.com#include "arch/arm/isa_device.hh"
3513531Sjairo.balart@metempsy.com#include "dev/arm/gic_v3.hh"
3613531Sjairo.balart@metempsy.com
3713531Sjairo.balart@metempsy.comclass Gicv3Redistributor;
3813531Sjairo.balart@metempsy.comclass Gicv3Distributor;
3913531Sjairo.balart@metempsy.com
4013531Sjairo.balart@metempsy.comclass Gicv3CPUInterface : public ArmISA::BaseISADevice, public Serializable
4113531Sjairo.balart@metempsy.com{
4213531Sjairo.balart@metempsy.com  private:
4313531Sjairo.balart@metempsy.com
4413531Sjairo.balart@metempsy.com    friend class Gicv3Redistributor;
4513531Sjairo.balart@metempsy.com    friend class Gicv3Distributor;
4613531Sjairo.balart@metempsy.com
4713531Sjairo.balart@metempsy.com  protected:
4813531Sjairo.balart@metempsy.com
4913531Sjairo.balart@metempsy.com    Gicv3 * gic;
5013531Sjairo.balart@metempsy.com    Gicv3Redistributor * redistributor;
5113531Sjairo.balart@metempsy.com    Gicv3Distributor * distributor;
5213531Sjairo.balart@metempsy.com    uint32_t cpuId;
5313531Sjairo.balart@metempsy.com
5413531Sjairo.balart@metempsy.com    static const uint32_t ICC_SRE_EL1_SRE = 1 << 0;
5513531Sjairo.balart@metempsy.com    static const uint32_t ICC_SRE_EL1_DFB = 1 << 1;
5613531Sjairo.balart@metempsy.com    static const uint32_t ICC_SRE_EL1_DIB = 1 << 2;
5713531Sjairo.balart@metempsy.com
5813531Sjairo.balart@metempsy.com    static const uint32_t ICC_SRE_EL2_SRE = 1 << 0;
5913531Sjairo.balart@metempsy.com    static const uint32_t ICC_SRE_EL2_DFB = 1 << 1;
6013531Sjairo.balart@metempsy.com    static const uint32_t ICC_SRE_EL2_DIB = 1 << 2;
6113531Sjairo.balart@metempsy.com    static const uint32_t ICC_SRE_EL2_ENABLE = 1 << 3;
6213531Sjairo.balart@metempsy.com
6313531Sjairo.balart@metempsy.com    static const uint32_t ICC_SRE_EL3_SRE = 1 << 0;
6413531Sjairo.balart@metempsy.com    static const uint32_t ICC_SRE_EL3_DFB = 1 << 1;
6513531Sjairo.balart@metempsy.com    static const uint32_t ICC_SRE_EL3_DIB = 1 << 2;
6613531Sjairo.balart@metempsy.com    static const uint32_t ICC_SRE_EL3_ENABLE = 1 << 3;
6713531Sjairo.balart@metempsy.com
6813531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL3_CBPR_EL1S = 1 << 0;
6913531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL3_CBPR_EL1NS = 1 << 1;
7013531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL3_EOIMODE_EL3 = 1 << 2;
7113531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL3_EOIMODE_EL1S = 1 << 3;
7213531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL3_EOIMODE_EL1NS = 1 << 4;
7313531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL3_RM = 1 << 5;
7413531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL3_PMHE = 1 << 6;
7513531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL3_PRIBITS_SHIFT = 8;
7613531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL3_IDBITS_SHIFT = 11;
7713531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL3_SEIS = 1 << 14;
7813531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL3_A3V = 1 << 15;
7913531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL3_nDS = 1 << 17;
8013531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL3_RSS = 1 << 18;
8113531Sjairo.balart@metempsy.com
8213531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL1_CBPR = 1 << 0;
8313531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL1_EOIMODE = 1 << 1;
8413531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL1_PMHE = 1 << 6;
8513531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL1_SEIS = 1 << 14;
8613531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL1_A3V = 1 << 15;
8713531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL1_RSS = 1 << 18;
8813531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL1_PRIBITS_SHIFT = 8;
8913531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL1_PRIBITS_MASK =
9013531Sjairo.balart@metempsy.com        7U << ICC_CTLR_EL1_PRIBITS_SHIFT;
9113531Sjairo.balart@metempsy.com    static const uint32_t ICC_CTLR_EL1_IDBITS_SHIFT = 11;
9213531Sjairo.balart@metempsy.com
9313531Sjairo.balart@metempsy.com    static const uint32_t ICC_IGRPEN0_EL1_ENABLE = 1 << 0;
9413531Sjairo.balart@metempsy.com    static const uint32_t ICC_IGRPEN1_EL1_ENABLE = 1 << 0;
9513531Sjairo.balart@metempsy.com
9613531Sjairo.balart@metempsy.com    static const uint32_t ICC_IGRPEN1_EL3_ENABLEGRP1NS = 1 << 0;
9713531Sjairo.balart@metempsy.com    static const uint32_t ICC_IGRPEN1_EL3_ENABLEGRP1S = 1 << 1;
9813531Sjairo.balart@metempsy.com
9913531Sjairo.balart@metempsy.com    static const uint8_t PRIORITY_BITS = 5;
10013531Sjairo.balart@metempsy.com
10113531Sjairo.balart@metempsy.com    /* Minimum BPR for Secure, or when security not enabled */
10213531Sjairo.balart@metempsy.com    static const uint8_t GIC_MIN_BPR = 2;
10313531Sjairo.balart@metempsy.com    /* Minimum BPR for Nonsecure when security is enabled */
10413531Sjairo.balart@metempsy.com    static const uint8_t GIC_MIN_BPR_NS = GIC_MIN_BPR + 1;
10513531Sjairo.balart@metempsy.com
10613531Sjairo.balart@metempsy.com    static const uint8_t VIRTUAL_PRIORITY_BITS = 5;
10713531Sjairo.balart@metempsy.com    static const uint8_t VIRTUAL_PREEMPTION_BITS = 5;
10813531Sjairo.balart@metempsy.com    static const uint8_t VIRTUAL_NUM_LIST_REGS = 16;
10913531Sjairo.balart@metempsy.com
11013531Sjairo.balart@metempsy.com    static const uint8_t GIC_MIN_VBPR = 7 - VIRTUAL_PREEMPTION_BITS;
11113531Sjairo.balart@metempsy.com
11213531Sjairo.balart@metempsy.com    typedef struct {
11313531Sjairo.balart@metempsy.com        uint32_t intid;
11413531Sjairo.balart@metempsy.com        uint8_t prio;
11513531Sjairo.balart@metempsy.com        Gicv3::GroupId group;
11613531Sjairo.balart@metempsy.com    } hppi_t;
11713531Sjairo.balart@metempsy.com
11813531Sjairo.balart@metempsy.com    hppi_t hppi;
11913531Sjairo.balart@metempsy.com
12013531Sjairo.balart@metempsy.com    // GIC CPU interface memory mapped control registers (legacy)
12113531Sjairo.balart@metempsy.com    enum {
12213531Sjairo.balart@metempsy.com        GICC_CTLR = 0x0000,
12313531Sjairo.balart@metempsy.com        GICC_PMR = 0x0004,
12413531Sjairo.balart@metempsy.com        GICC_BPR = 0x0008,
12513531Sjairo.balart@metempsy.com        GICC_IAR = 0x000C,
12613531Sjairo.balart@metempsy.com        GICC_EOIR = 0x0010,
12713531Sjairo.balart@metempsy.com        GICC_RPR = 0x0014,
12813531Sjairo.balart@metempsy.com        GICC_HPPI = 0x0018,
12913531Sjairo.balart@metempsy.com        GICC_ABPR = 0x001C,
13013531Sjairo.balart@metempsy.com        GICC_AIAR = 0x0020,
13113531Sjairo.balart@metempsy.com        GICC_AEOIR = 0x0024,
13213531Sjairo.balart@metempsy.com        GICC_AHPPIR = 0x0028,
13313531Sjairo.balart@metempsy.com        GICC_STATUSR = 0x002C,
13413531Sjairo.balart@metempsy.com        GICC_IIDR = 0x00FC,
13513531Sjairo.balart@metempsy.com    };
13613531Sjairo.balart@metempsy.com
13713531Sjairo.balart@metempsy.com    static const AddrRange GICC_APR;
13813531Sjairo.balart@metempsy.com    static const AddrRange GICC_NSAPR;
13913531Sjairo.balart@metempsy.com
14013531Sjairo.balart@metempsy.com    // GIC CPU virtual interface memory mapped control registers (legacy)
14113531Sjairo.balart@metempsy.com    enum {
14213531Sjairo.balart@metempsy.com        GICH_HCR = 0x0000,
14313531Sjairo.balart@metempsy.com        GICH_VTR = 0x0004,
14413531Sjairo.balart@metempsy.com        GICH_VMCR = 0x0008,
14513531Sjairo.balart@metempsy.com        GICH_MISR = 0x0010,
14613531Sjairo.balart@metempsy.com        GICH_EISR = 0x0020,
14713531Sjairo.balart@metempsy.com        GICH_ELRSR = 0x0030,
14813531Sjairo.balart@metempsy.com    };
14913531Sjairo.balart@metempsy.com
15013531Sjairo.balart@metempsy.com    static const AddrRange GICH_APR;
15113531Sjairo.balart@metempsy.com    static const AddrRange GICH_LR;
15213531Sjairo.balart@metempsy.com
15313531Sjairo.balart@metempsy.com    static const uint32_t ICH_HCR_EL2_EN = 1 << 0;
15413531Sjairo.balart@metempsy.com    static const uint32_t ICH_HCR_EL2_UIE = 1 << 1;
15513531Sjairo.balart@metempsy.com    static const uint32_t ICH_HCR_EL2_LRENPIE = 1 << 2;
15613531Sjairo.balart@metempsy.com    static const uint32_t ICH_HCR_EL2_NPIE = 1 << 3;
15713531Sjairo.balart@metempsy.com    static const uint32_t ICH_HCR_EL2_VGRP0EIE = 1 << 4;
15813531Sjairo.balart@metempsy.com    static const uint32_t ICH_HCR_EL2_VGRP0DIE = 1 << 5;
15913531Sjairo.balart@metempsy.com    static const uint32_t ICH_HCR_EL2_VGRP1EIE = 1 << 6;
16013531Sjairo.balart@metempsy.com    static const uint32_t ICH_HCR_EL2_VGRP1DIE = 1 << 7;
16113531Sjairo.balart@metempsy.com    static const uint32_t ICH_HCR_EL2_TC = 1 << 10;
16213531Sjairo.balart@metempsy.com    static const uint32_t ICH_HCR_EL2_TALL0 = 1 << 11;
16313531Sjairo.balart@metempsy.com    static const uint32_t ICH_HCR_EL2_TALL1 = 1 << 12;
16413531Sjairo.balart@metempsy.com    static const uint32_t ICH_HCR_EL2_TSEI = 1 << 13;
16513531Sjairo.balart@metempsy.com    static const uint32_t ICH_HCR_EL2_TDIR = 1 << 14;
16613531Sjairo.balart@metempsy.com    static const uint32_t ICH_HCR_EL2_EOICOUNT_MASK = 0x1fU << 27;
16713531Sjairo.balart@metempsy.com
16813531Sjairo.balart@metempsy.com    static const uint64_t ICH_LR_EL2_VINTID_SHIFT = 0;
16913531Sjairo.balart@metempsy.com    static const uint64_t ICH_LR_EL2_VINTID_LENGTH = 32;
17013531Sjairo.balart@metempsy.com    static const uint64_t ICH_LR_EL2_VINTID_MASK =
17113531Sjairo.balart@metempsy.com        (0xffffffffULL << ICH_LR_EL2_VINTID_SHIFT);
17213531Sjairo.balart@metempsy.com    static const uint64_t ICH_LR_EL2_PINTID_SHIFT = 32;
17313531Sjairo.balart@metempsy.com    static const uint64_t ICH_LR_EL2_PINTID_LENGTH = 10;
17413531Sjairo.balart@metempsy.com    static const uint64_t ICH_LR_EL2_PINTID_MASK =
17513531Sjairo.balart@metempsy.com        (0x3ffULL << ICH_LR_EL2_PINTID_SHIFT);
17613531Sjairo.balart@metempsy.com    /* Note that EOI shares with the top bit of the pINTID field */
17713531Sjairo.balart@metempsy.com    static const uint64_t ICH_LR_EL2_EOI = (1ULL << 41);
17813531Sjairo.balart@metempsy.com    static const uint64_t ICH_LR_EL2_PRIORITY_SHIFT = 48;
17913531Sjairo.balart@metempsy.com    static const uint64_t ICH_LR_EL2_PRIORITY_LENGTH = 8;
18013531Sjairo.balart@metempsy.com    static const uint64_t ICH_LR_EL2_PRIORITY_MASK =
18113531Sjairo.balart@metempsy.com        (0xffULL << ICH_LR_EL2_PRIORITY_SHIFT);
18213531Sjairo.balart@metempsy.com    static const uint64_t ICH_LR_EL2_GROUP = (1ULL << 60);
18313531Sjairo.balart@metempsy.com    static const uint64_t ICH_LR_EL2_HW = (1ULL << 61);
18413531Sjairo.balart@metempsy.com    static const uint64_t ICH_LR_EL2_STATE_SHIFT = 62;
18513531Sjairo.balart@metempsy.com    static const uint64_t ICH_LR_EL2_STATE_LENGTH = 2;
18613531Sjairo.balart@metempsy.com    static const uint64_t ICH_LR_EL2_STATE_MASK =
18713531Sjairo.balart@metempsy.com        (3ULL << ICH_LR_EL2_STATE_SHIFT);
18813531Sjairo.balart@metempsy.com    /* values for the state field: */
18913531Sjairo.balart@metempsy.com    static const uint64_t ICH_LR_EL2_STATE_INVALID = 0;
19013531Sjairo.balart@metempsy.com    static const uint64_t ICH_LR_EL2_STATE_PENDING = 1;
19113531Sjairo.balart@metempsy.com    static const uint64_t ICH_LR_EL2_STATE_ACTIVE = 2;
19213531Sjairo.balart@metempsy.com    static const uint64_t ICH_LR_EL2_STATE_ACTIVE_PENDING = 3;
19313531Sjairo.balart@metempsy.com    static const uint64_t ICH_LR_EL2_STATE_PENDING_BIT =
19413531Sjairo.balart@metempsy.com        (1ULL << ICH_LR_EL2_STATE_SHIFT);
19513531Sjairo.balart@metempsy.com    static const uint64_t ICH_LR_EL2_STATE_ACTIVE_BIT =
19613531Sjairo.balart@metempsy.com        (2ULL << ICH_LR_EL2_STATE_SHIFT);
19713531Sjairo.balart@metempsy.com
19813531Sjairo.balart@metempsy.com    static const uint64_t ICH_LRC_PRIORITY_SHIFT =
19913531Sjairo.balart@metempsy.com        ICH_LR_EL2_PRIORITY_SHIFT - 32;
20013531Sjairo.balart@metempsy.com    static const uint64_t ICH_LRC_PRIORITY_LENGTH =
20113531Sjairo.balart@metempsy.com        ICH_LR_EL2_PRIORITY_LENGTH;
20213531Sjairo.balart@metempsy.com
20313531Sjairo.balart@metempsy.com    static const uint32_t ICH_MISR_EL2_EOI = (1 << 0);
20413531Sjairo.balart@metempsy.com    static const uint32_t ICH_MISR_EL2_U = (1 << 1);
20513531Sjairo.balart@metempsy.com    static const uint32_t ICH_MISR_EL2_LRENP = (1 << 2);
20613531Sjairo.balart@metempsy.com    static const uint32_t ICH_MISR_EL2_NP = (1 << 3);
20713531Sjairo.balart@metempsy.com    static const uint32_t ICH_MISR_EL2_VGRP0E = (1 << 4);
20813531Sjairo.balart@metempsy.com    static const uint32_t ICH_MISR_EL2_VGRP0D = (1 << 5);
20913531Sjairo.balart@metempsy.com    static const uint32_t ICH_MISR_EL2_VGRP1E = (1 << 6);
21013531Sjairo.balart@metempsy.com    static const uint32_t ICH_MISR_EL2_VGRP1D = (1 << 7);
21113531Sjairo.balart@metempsy.com
21213531Sjairo.balart@metempsy.com    static const uint32_t ICH_VMCR_EL2_VENG0_SHIFT = 0;
21313531Sjairo.balart@metempsy.com    static const uint32_t ICH_VMCR_EL2_VENG0 =
21413531Sjairo.balart@metempsy.com        (1 << ICH_VMCR_EL2_VENG0_SHIFT);
21513531Sjairo.balart@metempsy.com    static const uint32_t ICH_VMCR_EL2_VENG1_SHIFT = 1;
21613531Sjairo.balart@metempsy.com    static const uint32_t ICH_VMCR_EL2_VENG1 =
21713531Sjairo.balart@metempsy.com        (1 << ICH_VMCR_EL2_VENG1_SHIFT);
21813531Sjairo.balart@metempsy.com    static const uint32_t ICH_VMCR_EL2_VACKCTL = (1 << 2);
21913531Sjairo.balart@metempsy.com    static const uint32_t ICH_VMCR_EL2_VFIQEN = (1 << 3);
22013531Sjairo.balart@metempsy.com    static const uint32_t ICH_VMCR_EL2_VCBPR_SHIFT = 4;
22113531Sjairo.balart@metempsy.com    static const uint32_t ICH_VMCR_EL2_VCBPR =
22213531Sjairo.balart@metempsy.com        (1 << ICH_VMCR_EL2_VCBPR_SHIFT);
22313531Sjairo.balart@metempsy.com    static const uint32_t ICH_VMCR_EL2_VEOIM_SHIFT = 9;
22413531Sjairo.balart@metempsy.com    static const uint32_t ICH_VMCR_EL2_VEOIM =
22513531Sjairo.balart@metempsy.com        (1 << ICH_VMCR_EL2_VEOIM_SHIFT);
22613531Sjairo.balart@metempsy.com    static const uint32_t ICH_VMCR_EL2_VBPR1_SHIFT = 18;
22713531Sjairo.balart@metempsy.com    static const uint32_t ICH_VMCR_EL2_VBPR1_LENGTH = 3;
22813531Sjairo.balart@metempsy.com    static const uint32_t ICH_VMCR_EL2_VBPR1_MASK =
22913531Sjairo.balart@metempsy.com        (0x7U << ICH_VMCR_EL2_VBPR1_SHIFT);
23013531Sjairo.balart@metempsy.com    static const uint32_t ICH_VMCR_EL2_VBPR0_SHIFT = 21;
23113531Sjairo.balart@metempsy.com    static const uint32_t ICH_VMCR_EL2_VBPR0_LENGTH = 3;
23213531Sjairo.balart@metempsy.com    static const uint32_t ICH_VMCR_EL2_VBPR0_MASK =
23313531Sjairo.balart@metempsy.com        (0x7U << ICH_VMCR_EL2_VBPR0_SHIFT);
23413531Sjairo.balart@metempsy.com    static const uint32_t ICH_VMCR_EL2_VPMR_SHIFT = 24;
23513531Sjairo.balart@metempsy.com    static const uint32_t ICH_VMCR_EL2_VPMR_LENGTH = 8;
23613531Sjairo.balart@metempsy.com    static const uint32_t ICH_VMCR_EL2_VPMR_MASK =
23713531Sjairo.balart@metempsy.com        (0xffU << ICH_VMCR_EL2_VPMR_SHIFT);
23813531Sjairo.balart@metempsy.com
23913531Sjairo.balart@metempsy.com    static const uint32_t ICH_VTR_EL2_LISTREGS_SHIFT = 0;
24013531Sjairo.balart@metempsy.com    static const uint32_t ICH_VTR_EL2_TDS = 1 << 19;
24113531Sjairo.balart@metempsy.com    static const uint32_t ICH_VTR_EL2_NV4 = 1 << 20;
24213531Sjairo.balart@metempsy.com    static const uint32_t ICH_VTR_EL2_A3V = 1 << 21;
24313531Sjairo.balart@metempsy.com    static const uint32_t ICH_VTR_EL2_SEIS = 1 << 22;
24413531Sjairo.balart@metempsy.com    static const uint32_t ICH_VTR_EL2_IDBITS_SHIFT = 23;
24513531Sjairo.balart@metempsy.com    static const uint32_t ICH_VTR_EL2_PREBITS_SHIFT = 26;
24613531Sjairo.balart@metempsy.com    static const uint32_t ICH_VTR_EL2_PRIBITS_SHIFT = 29;
24713531Sjairo.balart@metempsy.com
24813531Sjairo.balart@metempsy.com  public:
24913531Sjairo.balart@metempsy.com
25013531Sjairo.balart@metempsy.com    Gicv3CPUInterface(Gicv3 * gic, uint32_t cpu_id);
25113531Sjairo.balart@metempsy.com    ~Gicv3CPUInterface();
25213531Sjairo.balart@metempsy.com    void init();
25313531Sjairo.balart@metempsy.com    void initState();
25413531Sjairo.balart@metempsy.com
25513531Sjairo.balart@metempsy.com    ArmISA::MiscReg readMiscReg(int misc_reg) override;
25613531Sjairo.balart@metempsy.com    void setMiscReg(int misc_reg, ArmISA::MiscReg val) override;
25713531Sjairo.balart@metempsy.com    void update();
25813531Sjairo.balart@metempsy.com    void virtualUpdate();
25913531Sjairo.balart@metempsy.com
26013531Sjairo.balart@metempsy.com    void serialize(CheckpointOut & cp) const override;
26113531Sjairo.balart@metempsy.com    void unserialize(CheckpointIn & cp) override;
26213531Sjairo.balart@metempsy.com
26313531Sjairo.balart@metempsy.com  protected:
26413531Sjairo.balart@metempsy.com
26513531Sjairo.balart@metempsy.com    void reset();
26613531Sjairo.balart@metempsy.com    bool hppiCanPreempt();
26713531Sjairo.balart@metempsy.com    bool hppviCanPreempt(int lrIdx);
26813531Sjairo.balart@metempsy.com    bool groupEnabled(Gicv3::GroupId group);
26913531Sjairo.balart@metempsy.com    uint8_t highestActivePriority();
27013531Sjairo.balart@metempsy.com    uint8_t virtualHighestActivePriority();
27113531Sjairo.balart@metempsy.com    bool inSecureState();
27213531Sjairo.balart@metempsy.com    int currEL();
27313531Sjairo.balart@metempsy.com    bool haveEL(ArmISA::ExceptionLevel el);
27413531Sjairo.balart@metempsy.com    void activateIRQ(uint32_t intid, Gicv3::GroupId group);
27513531Sjairo.balart@metempsy.com    void virtualActivateIRQ(uint32_t lrIdx);
27613531Sjairo.balart@metempsy.com    void deactivateIRQ(uint32_t intid, Gicv3::GroupId group);
27713531Sjairo.balart@metempsy.com    void virtualDeactivateIRQ(int lrIdx);
27813531Sjairo.balart@metempsy.com    uint32_t groupPriorityMask(Gicv3::GroupId group);
27913531Sjairo.balart@metempsy.com    uint32_t virtualGroupPriorityMask(Gicv3::GroupId group);
28013531Sjairo.balart@metempsy.com    void dropPriority(Gicv3::GroupId group);
28113531Sjairo.balart@metempsy.com    uint8_t virtualDropPriority();
28213531Sjairo.balart@metempsy.com    ArmISA::InterruptTypes intSignalType(Gicv3::GroupId group);
28313531Sjairo.balart@metempsy.com    bool isEOISplitMode();
28413531Sjairo.balart@metempsy.com    bool virtualIsEOISplitMode();
28513531Sjairo.balart@metempsy.com    bool isSecureBelowEL3();
28613531Sjairo.balart@metempsy.com    bool inSecureState2();
28713531Sjairo.balart@metempsy.com    uint32_t eoiMaintenanceInterruptStatus(uint32_t * misr);
28813531Sjairo.balart@metempsy.com    uint32_t maintenanceInterruptStatus();
28913531Sjairo.balart@metempsy.com    int highestActiveGroup();
29013531Sjairo.balart@metempsy.com    bool getHCREL2FMO();
29113531Sjairo.balart@metempsy.com    bool getHCREL2IMO();
29213531Sjairo.balart@metempsy.com    uint32_t getHPPIR1();
29313531Sjairo.balart@metempsy.com    uint32_t getHPPIR0();
29413531Sjairo.balart@metempsy.com    int getHPPVILR();
29513531Sjairo.balart@metempsy.com    int virtualFindActive(uint32_t intid);
29613531Sjairo.balart@metempsy.com    void virtualIncrementEOICount();
29713531Sjairo.balart@metempsy.com    bool isEL3OrMon();
29813531Sjairo.balart@metempsy.com    bool isAA64();
29913531Sjairo.balart@metempsy.com};
30013531Sjairo.balart@metempsy.com
30113531Sjairo.balart@metempsy.com#endif //__DEV_ARM_GICV3_CPU_INTERFACE_H__
302