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