113531Sjairo.balart@metempsy.com/*
214258Sgiacomo.travaglini@arm.com * Copyright (c) 2019 ARM Limited
314258Sgiacomo.travaglini@arm.com * All rights reserved
414258Sgiacomo.travaglini@arm.com *
514258Sgiacomo.travaglini@arm.com * The license below extends only to copyright in the software and shall
614258Sgiacomo.travaglini@arm.com * not be construed as granting a license to any other intellectual
714258Sgiacomo.travaglini@arm.com * property including but not limited to intellectual property relating
814258Sgiacomo.travaglini@arm.com * to a hardware implementation of the functionality of the software
914258Sgiacomo.travaglini@arm.com * licensed hereunder.  You may use the software subject to the license
1014258Sgiacomo.travaglini@arm.com * terms below provided that you ensure that this notice is replicated
1114258Sgiacomo.travaglini@arm.com * unmodified and in its entirety in all distributions of the software,
1214258Sgiacomo.travaglini@arm.com * modified or unmodified, in source code or in binary form.
1314258Sgiacomo.travaglini@arm.com *
1413531Sjairo.balart@metempsy.com * Copyright (c) 2018 Metempsy Technology Consulting
1513531Sjairo.balart@metempsy.com * All rights reserved.
1613531Sjairo.balart@metempsy.com *
1713531Sjairo.balart@metempsy.com * Redistribution and use in source and binary forms, with or without
1813531Sjairo.balart@metempsy.com * modification, are permitted provided that the following conditions are
1913531Sjairo.balart@metempsy.com * met: redistributions of source code must retain the above copyright
2013531Sjairo.balart@metempsy.com * notice, this list of conditions and the following disclaimer;
2113531Sjairo.balart@metempsy.com * redistributions in binary form must reproduce the above copyright
2213531Sjairo.balart@metempsy.com * notice, this list of conditions and the following disclaimer in the
2313531Sjairo.balart@metempsy.com * documentation and/or other materials provided with the distribution;
2413531Sjairo.balart@metempsy.com * neither the name of the copyright holders nor the names of its
2513531Sjairo.balart@metempsy.com * contributors may be used to endorse or promote products derived from
2613531Sjairo.balart@metempsy.com * this software without specific prior written permission.
2713531Sjairo.balart@metempsy.com *
2813531Sjairo.balart@metempsy.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2913531Sjairo.balart@metempsy.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3013531Sjairo.balart@metempsy.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3113531Sjairo.balart@metempsy.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3213531Sjairo.balart@metempsy.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3313531Sjairo.balart@metempsy.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3413531Sjairo.balart@metempsy.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3513531Sjairo.balart@metempsy.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3613531Sjairo.balart@metempsy.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3713531Sjairo.balart@metempsy.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3813531Sjairo.balart@metempsy.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3913531Sjairo.balart@metempsy.com *
4013531Sjairo.balart@metempsy.com * Authors: Jairo Balart
4113531Sjairo.balart@metempsy.com */
4213531Sjairo.balart@metempsy.com
4313531Sjairo.balart@metempsy.com#ifndef __DEV_ARM_GICV3_H__
4413531Sjairo.balart@metempsy.com#define __DEV_ARM_GICV3_H__
4513531Sjairo.balart@metempsy.com
4613531Sjairo.balart@metempsy.com#include "dev/arm/base_gic.hh"
4713531Sjairo.balart@metempsy.com#include "params/Gicv3.hh"
4813531Sjairo.balart@metempsy.com
4913756Sjairo.balart@metempsy.comclass Gicv3CPUInterface;
5013531Sjairo.balart@metempsy.comclass Gicv3Distributor;
5113531Sjairo.balart@metempsy.comclass Gicv3Redistributor;
5213996Sgiacomo.travaglini@arm.comclass Gicv3Its;
5313531Sjairo.balart@metempsy.com
5413531Sjairo.balart@metempsy.comclass Gicv3 : public BaseGic
5513531Sjairo.balart@metempsy.com{
5613531Sjairo.balart@metempsy.com  protected:
5713826Sgiacomo.travaglini@arm.com    friend class Gicv3CPUInterface;
5813878Sgiacomo.travaglini@arm.com    friend class Gicv3Redistributor;
5913531Sjairo.balart@metempsy.com
6013756Sjairo.balart@metempsy.com    typedef Gicv3Params Params;
6113531Sjairo.balart@metempsy.com    Gicv3Distributor * distributor;
6213531Sjairo.balart@metempsy.com    std::vector<Gicv3Redistributor *> redistributors;
6313531Sjairo.balart@metempsy.com    std::vector<Gicv3CPUInterface *> cpuInterfaces;
6413996Sgiacomo.travaglini@arm.com    Gicv3Its * its;
6513531Sjairo.balart@metempsy.com    AddrRange distRange;
6613531Sjairo.balart@metempsy.com    AddrRange redistRange;
6713531Sjairo.balart@metempsy.com    AddrRangeList addrRanges;
6813878Sgiacomo.travaglini@arm.com    uint64_t redistSize;
6913531Sjairo.balart@metempsy.com
7013531Sjairo.balart@metempsy.com  public:
7113531Sjairo.balart@metempsy.com
7213756Sjairo.balart@metempsy.com    // Special interrupt IDs, as per SPEC 2.2.1 section
7313531Sjairo.balart@metempsy.com    static const int INTID_SECURE = 1020;
7413531Sjairo.balart@metempsy.com    static const int INTID_NONSECURE = 1021;
7513531Sjairo.balart@metempsy.com    static const int INTID_SPURIOUS = 1023;
7613531Sjairo.balart@metempsy.com
7713531Sjairo.balart@metempsy.com    // Number of Software Generated Interrupts
7813531Sjairo.balart@metempsy.com    static const int SGI_MAX = 16;
7913531Sjairo.balart@metempsy.com    // Number of Private Peripheral Interrupts
8013531Sjairo.balart@metempsy.com    static const int PPI_MAX = 16;
8113531Sjairo.balart@metempsy.com
8213756Sjairo.balart@metempsy.com    // Interrupt states for PPIs, SGIs and SPIs, as per SPEC 4.1.2 section
8313531Sjairo.balart@metempsy.com    typedef enum {
8413531Sjairo.balart@metempsy.com        INT_INACTIVE,
8513531Sjairo.balart@metempsy.com        INT_PENDING,
8613531Sjairo.balart@metempsy.com        INT_ACTIVE,
8713531Sjairo.balart@metempsy.com        INT_ACTIVE_PENDING,
8813531Sjairo.balart@metempsy.com    } IntStatus;
8913531Sjairo.balart@metempsy.com
9013756Sjairo.balart@metempsy.com    // Interrupt groups, as per SPEC section 4.6
9113531Sjairo.balart@metempsy.com    typedef enum {
9213531Sjairo.balart@metempsy.com        G0S,
9313531Sjairo.balart@metempsy.com        G1S,
9413531Sjairo.balart@metempsy.com        G1NS,
9513531Sjairo.balart@metempsy.com    } GroupId;
9613531Sjairo.balart@metempsy.com
9713531Sjairo.balart@metempsy.com    typedef enum {
9813531Sjairo.balart@metempsy.com        INT_LEVEL_SENSITIVE,
9913531Sjairo.balart@metempsy.com        INT_EDGE_TRIGGERED,
10013531Sjairo.balart@metempsy.com    } IntTriggerType;
10113531Sjairo.balart@metempsy.com
10213756Sjairo.balart@metempsy.com  protected:
10313756Sjairo.balart@metempsy.com
10413756Sjairo.balart@metempsy.com    void clearInt(uint32_t int_id) override;
10513756Sjairo.balart@metempsy.com    void clearPPInt(uint32_t int_id, uint32_t cpu) override;
10613756Sjairo.balart@metempsy.com
10713756Sjairo.balart@metempsy.com    inline AddrRangeList
10813756Sjairo.balart@metempsy.com    getAddrRanges() const override
10913756Sjairo.balart@metempsy.com    {
11013756Sjairo.balart@metempsy.com        return addrRanges;
11113756Sjairo.balart@metempsy.com    }
11213756Sjairo.balart@metempsy.com
11313756Sjairo.balart@metempsy.com    void init() override;
11413531Sjairo.balart@metempsy.com
11513531Sjairo.balart@metempsy.com    const Params *
11613531Sjairo.balart@metempsy.com    params() const
11713531Sjairo.balart@metempsy.com    {
11813531Sjairo.balart@metempsy.com        return dynamic_cast<const Params *>(_params);
11913531Sjairo.balart@metempsy.com    }
12013531Sjairo.balart@metempsy.com
12113531Sjairo.balart@metempsy.com    Tick read(PacketPtr pkt) override;
12213756Sjairo.balart@metempsy.com    void reset();
12313531Sjairo.balart@metempsy.com    void sendInt(uint32_t int_id) override;
12413531Sjairo.balart@metempsy.com    void sendPPInt(uint32_t int_id, uint32_t cpu) override;
12513531Sjairo.balart@metempsy.com    void serialize(CheckpointOut & cp) const override;
12613531Sjairo.balart@metempsy.com    void unserialize(CheckpointIn & cp) override;
12713756Sjairo.balart@metempsy.com    Tick write(PacketPtr pkt) override;
12813531Sjairo.balart@metempsy.com
12913756Sjairo.balart@metempsy.com  public:
13013531Sjairo.balart@metempsy.com
13113756Sjairo.balart@metempsy.com    Gicv3(const Params * p);
13213756Sjairo.balart@metempsy.com    void deassertInt(uint32_t cpu, ArmISA::InterruptTypes int_type);
13313756Sjairo.balart@metempsy.com
13413756Sjairo.balart@metempsy.com    inline Gicv3CPUInterface *
13513531Sjairo.balart@metempsy.com    getCPUInterface(int cpu_id) const
13613531Sjairo.balart@metempsy.com    {
13713531Sjairo.balart@metempsy.com        assert(cpu_id < cpuInterfaces.size() and cpuInterfaces[cpu_id]);
13813531Sjairo.balart@metempsy.com        return cpuInterfaces[cpu_id];
13913531Sjairo.balart@metempsy.com    }
14013531Sjairo.balart@metempsy.com
14113756Sjairo.balart@metempsy.com    inline Gicv3Distributor *
14213756Sjairo.balart@metempsy.com    getDistributor() const
14313756Sjairo.balart@metempsy.com    {
14413756Sjairo.balart@metempsy.com        return distributor;
14513756Sjairo.balart@metempsy.com    }
14613756Sjairo.balart@metempsy.com
14713756Sjairo.balart@metempsy.com    inline Gicv3Redistributor *
14813531Sjairo.balart@metempsy.com    getRedistributor(ContextID context_id) const
14913531Sjairo.balart@metempsy.com    {
15013531Sjairo.balart@metempsy.com        assert(context_id < redistributors.size() and
15113531Sjairo.balart@metempsy.com               redistributors[context_id]);
15213531Sjairo.balart@metempsy.com        return redistributors[context_id];
15313531Sjairo.balart@metempsy.com    }
15413531Sjairo.balart@metempsy.com
15513756Sjairo.balart@metempsy.com    Gicv3Redistributor *
15613756Sjairo.balart@metempsy.com    getRedistributorByAffinity(uint32_t affinity) const;
15713925Sgiacomo.travaglini@arm.com
15813925Sgiacomo.travaglini@arm.com    Gicv3Redistributor *
15913925Sgiacomo.travaglini@arm.com    getRedistributorByAddr(Addr address) const;
16013925Sgiacomo.travaglini@arm.com
16113531Sjairo.balart@metempsy.com    void postInt(uint32_t cpu, ArmISA::InterruptTypes int_type);
16213531Sjairo.balart@metempsy.com};
16313531Sjairo.balart@metempsy.com
16413531Sjairo.balart@metempsy.com#endif //__DEV_ARM_GICV3_H__
165