sinic.hh revision 6227
17860SN/A/*
27860SN/A * Copyright (c) 2004-2005 The Regents of The University of Michigan
310812Snilay@cs.wisc.edu * All rights reserved.
410812Snilay@cs.wisc.edu *
510812Snilay@cs.wisc.edu * Redistribution and use in source and binary forms, with or without
67860SN/A * modification, are permitted provided that the following conditions are
710812Snilay@cs.wisc.edu * met: redistributions of source code must retain the above copyright
810812Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer;
910812Snilay@cs.wisc.edu * redistributions in binary form must reproduce the above copyright
1010812Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer in the
1110812Snilay@cs.wisc.edu * documentation and/or other materials provided with the distribution;
1210812Snilay@cs.wisc.edu * neither the name of the copyright holders nor the names of its
1310812Snilay@cs.wisc.edu * contributors may be used to endorse or promote products derived from
1410036SAli.Saidi@ARM.com * this software without specific prior written permission.
1510036SAli.Saidi@ARM.com *
1610812Snilay@cs.wisc.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1710812Snilay@cs.wisc.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1810812Snilay@cs.wisc.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1910812Snilay@cs.wisc.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2010812Snilay@cs.wisc.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2110812Snilay@cs.wisc.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2210812Snilay@cs.wisc.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2310812Snilay@cs.wisc.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2410812Snilay@cs.wisc.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2510812Snilay@cs.wisc.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2610812Snilay@cs.wisc.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2710812Snilay@cs.wisc.edu *
2810812Snilay@cs.wisc.edu * Authors: Nathan Binkert
2910812Snilay@cs.wisc.edu */
3010812Snilay@cs.wisc.edu
3110812Snilay@cs.wisc.edu#ifndef __DEV_SINIC_HH__
3210812Snilay@cs.wisc.edu#define __DEV_SINIC_HH__
3310812Snilay@cs.wisc.edu
3410812Snilay@cs.wisc.edu#include "base/inet.hh"
3510812Snilay@cs.wisc.edu#include "base/statistics.hh"
3610812Snilay@cs.wisc.edu#include "dev/etherint.hh"
379978Sandreas.hansson@arm.com#include "dev/etherpkt.hh"
3810812Snilay@cs.wisc.edu#include "dev/io_device.hh"
399978Sandreas.hansson@arm.com#include "dev/pcidev.hh"
4010812Snilay@cs.wisc.edu#include "dev/pktfifo.hh"
419978Sandreas.hansson@arm.com#include "dev/sinicreg.hh"
429978Sandreas.hansson@arm.com#include "params/Sinic.hh"
4310812Snilay@cs.wisc.edu#include "sim/eventq.hh"
449978Sandreas.hansson@arm.com
459978Sandreas.hansson@arm.comnamespace Sinic {
469978Sandreas.hansson@arm.com
4710409Sandreas.hansson@arm.comclass Interface;
4810628Sandreas.hansson@arm.comclass Base : public PciDev
4910628Sandreas.hansson@arm.com{
5010628Sandreas.hansson@arm.com  protected:
5110726Sandreas.hansson@arm.com    bool rxEnable;
5210628Sandreas.hansson@arm.com    bool txEnable;
5310628Sandreas.hansson@arm.com    Tick clock;
5410812Snilay@cs.wisc.edu    inline Tick ticks(int numCycles) const { return numCycles * clock; }
5510812Snilay@cs.wisc.edu
5610628Sandreas.hansson@arm.com  protected:
5710726Sandreas.hansson@arm.com    Tick intrDelay;
5810726Sandreas.hansson@arm.com    Tick intrTick;
5910628Sandreas.hansson@arm.com    bool cpuIntrEnable;
6010812Snilay@cs.wisc.edu    bool cpuPendingIntr;
6110628Sandreas.hansson@arm.com    void cpuIntrPost(Tick when);
6210628Sandreas.hansson@arm.com    void cpuInterrupt();
6310628Sandreas.hansson@arm.com    void cpuIntrClear();
649978Sandreas.hansson@arm.com
659978Sandreas.hansson@arm.com    typedef EventWrapper<Base, &Base::cpuInterrupt> IntrEvent;
669978Sandreas.hansson@arm.com    friend void IntrEvent::process();
679978Sandreas.hansson@arm.com    IntrEvent *intrEvent;
689978Sandreas.hansson@arm.com    Interface *interface;
699978Sandreas.hansson@arm.com
709978Sandreas.hansson@arm.com    bool cpuIntrPending() const;
719978Sandreas.hansson@arm.com    void cpuIntrAck() { cpuIntrClear(); }
729978Sandreas.hansson@arm.com
739978Sandreas.hansson@arm.com/**
749978Sandreas.hansson@arm.com * Serialization stuff
759978Sandreas.hansson@arm.com */
769978Sandreas.hansson@arm.com  public:
779978Sandreas.hansson@arm.com    virtual void serialize(std::ostream &os);
789978Sandreas.hansson@arm.com    virtual void unserialize(Checkpoint *cp, const std::string &section);
799978Sandreas.hansson@arm.com
809978Sandreas.hansson@arm.com/**
819978Sandreas.hansson@arm.com * Construction/Destruction/Parameters
8210812Snilay@cs.wisc.edu */
839978Sandreas.hansson@arm.com  public:
849978Sandreas.hansson@arm.com    typedef SinicParams Params;
859978Sandreas.hansson@arm.com    const Params *params() const { return (const Params *)_params; }
869978Sandreas.hansson@arm.com    Base(const Params *p);
879978Sandreas.hansson@arm.com};
889978Sandreas.hansson@arm.com
8910812Snilay@cs.wisc.educlass Device : public Base
909978Sandreas.hansson@arm.com{
919978Sandreas.hansson@arm.com  protected:
929978Sandreas.hansson@arm.com    /** Receive State Machine States */
939978Sandreas.hansson@arm.com    enum RxState {
949978Sandreas.hansson@arm.com        rxIdle,
959978Sandreas.hansson@arm.com        rxFifoBlock,
969978Sandreas.hansson@arm.com        rxBeginCopy,
9710812Snilay@cs.wisc.edu        rxCopy,
9810812Snilay@cs.wisc.edu        rxCopyDone
9910812Snilay@cs.wisc.edu    };
10010812Snilay@cs.wisc.edu
10110812Snilay@cs.wisc.edu    /** Transmit State Machine states */
10210812Snilay@cs.wisc.edu    enum TxState {
10310812Snilay@cs.wisc.edu        txIdle,
10410812Snilay@cs.wisc.edu        txFifoBlock,
10510812Snilay@cs.wisc.edu        txBeginCopy,
10610812Snilay@cs.wisc.edu        txCopy,
10710812Snilay@cs.wisc.edu        txCopyDone
10810812Snilay@cs.wisc.edu    };
10910812Snilay@cs.wisc.edu
11010812Snilay@cs.wisc.edu    /** device register file */
11110812Snilay@cs.wisc.edu    struct {
11210812Snilay@cs.wisc.edu        uint32_t Config;       // 0x00
1139312Sandreas.hansson@arm.com        uint32_t Command;      // 0x04
1149312Sandreas.hansson@arm.com        uint32_t IntrStatus;   // 0x08
1159312Sandreas.hansson@arm.com        uint32_t IntrMask;     // 0x0c
1169312Sandreas.hansson@arm.com        uint32_t RxMaxCopy;    // 0x10
1179312Sandreas.hansson@arm.com        uint32_t TxMaxCopy;    // 0x14
1189312Sandreas.hansson@arm.com        uint32_t ZeroCopySize; // 0x18
1199312Sandreas.hansson@arm.com        uint32_t ZeroCopyMark; // 0x1c
1209312Sandreas.hansson@arm.com        uint32_t VirtualCount; // 0x20
1219312Sandreas.hansson@arm.com        uint32_t RxMaxIntr;    // 0x24
1229312Sandreas.hansson@arm.com        uint32_t RxFifoSize;   // 0x28
1239312Sandreas.hansson@arm.com        uint32_t TxFifoSize;   // 0x2c
1249312Sandreas.hansson@arm.com        uint32_t RxFifoLow;    // 0x30
1259312Sandreas.hansson@arm.com        uint32_t TxFifoLow;    // 0x34
1269312Sandreas.hansson@arm.com        uint32_t RxFifoHigh;   // 0x38
1279312Sandreas.hansson@arm.com        uint32_t TxFifoHigh;   // 0x3c
1289312Sandreas.hansson@arm.com        uint64_t RxData;       // 0x40
1299312Sandreas.hansson@arm.com        uint64_t RxDone;       // 0x48
1309312Sandreas.hansson@arm.com        uint64_t RxWait;       // 0x50
1319312Sandreas.hansson@arm.com        uint64_t TxData;       // 0x58
1329312Sandreas.hansson@arm.com        uint64_t TxDone;       // 0x60
1339312Sandreas.hansson@arm.com        uint64_t TxWait;       // 0x68
1349312Sandreas.hansson@arm.com        uint64_t HwAddr;       // 0x70
1359312Sandreas.hansson@arm.com        uint64_t RxStatus;     // 0x78
1369312Sandreas.hansson@arm.com    } regs;
1379312Sandreas.hansson@arm.com
1389312Sandreas.hansson@arm.com    struct VirtualReg {
1399312Sandreas.hansson@arm.com        uint64_t RxData;
1409312Sandreas.hansson@arm.com        uint64_t RxDone;
1419312Sandreas.hansson@arm.com        uint64_t TxData;
1429312Sandreas.hansson@arm.com        uint64_t TxDone;
1439312Sandreas.hansson@arm.com
1449312Sandreas.hansson@arm.com        PacketFifo::iterator rxIndex;
1459312Sandreas.hansson@arm.com        unsigned rxPacketOffset;
1469312Sandreas.hansson@arm.com        unsigned rxPacketBytes;
1479312Sandreas.hansson@arm.com        uint64_t rxDoneData;
1489312Sandreas.hansson@arm.com
1499312Sandreas.hansson@arm.com        Counter rxUnique;
1509312Sandreas.hansson@arm.com        Counter txUnique;
1519312Sandreas.hansson@arm.com
1529312Sandreas.hansson@arm.com        VirtualReg()
1539312Sandreas.hansson@arm.com            : RxData(0), RxDone(0), TxData(0), TxDone(0),
1549312Sandreas.hansson@arm.com              rxPacketOffset(0), rxPacketBytes(0), rxDoneData(0)
1559312Sandreas.hansson@arm.com        { }
1569312Sandreas.hansson@arm.com    };
1579312Sandreas.hansson@arm.com    typedef std::vector<VirtualReg> VirtualRegs;
1589312Sandreas.hansson@arm.com    typedef std::list<unsigned> VirtualList;
1599312Sandreas.hansson@arm.com    Counter rxUnique;
1609312Sandreas.hansson@arm.com    Counter txUnique;
16110148Sandreas.hansson@arm.com    VirtualRegs virtualRegs;
16210148Sandreas.hansson@arm.com    VirtualList rxList;
16310148Sandreas.hansson@arm.com    VirtualList rxBusy;
16410148Sandreas.hansson@arm.com    int rxActive;
16510148Sandreas.hansson@arm.com    VirtualList txList;
16610148Sandreas.hansson@arm.com
16710148Sandreas.hansson@arm.com    int rxBusyCount;
16810148Sandreas.hansson@arm.com    int rxMappedCount;
16910148Sandreas.hansson@arm.com    int rxDirtyCount;
17010148Sandreas.hansson@arm.com
17110148Sandreas.hansson@arm.com    uint8_t  &regData8(Addr daddr) { return *((uint8_t *)&regs + daddr); }
17210148Sandreas.hansson@arm.com    uint32_t &regData32(Addr daddr) { return *(uint32_t *)&regData8(daddr); }
17310148Sandreas.hansson@arm.com    uint64_t &regData64(Addr daddr) { return *(uint64_t *)&regData8(daddr); }
17410148Sandreas.hansson@arm.com
17510148Sandreas.hansson@arm.com  protected:
17610148Sandreas.hansson@arm.com    RxState rxState;
17710148Sandreas.hansson@arm.com    PacketFifo rxFifo;
17810148Sandreas.hansson@arm.com    PacketFifo::iterator rxFifoPtr;
17910148Sandreas.hansson@arm.com    bool rxEmpty;
18010148Sandreas.hansson@arm.com    bool rxLow;
18110148Sandreas.hansson@arm.com    Addr rxDmaAddr;
18210148Sandreas.hansson@arm.com    uint8_t *rxDmaData;
18310148Sandreas.hansson@arm.com    unsigned rxDmaLen;
18410148Sandreas.hansson@arm.com
18510148Sandreas.hansson@arm.com    TxState txState;
18610148Sandreas.hansson@arm.com    PacketFifo txFifo;
18710148Sandreas.hansson@arm.com    bool txFull;
18810148Sandreas.hansson@arm.com    EthPacketPtr txPacket;
18910148Sandreas.hansson@arm.com    int txPacketOffset;
19010148Sandreas.hansson@arm.com    int txPacketBytes;
19110148Sandreas.hansson@arm.com    Addr txDmaAddr;
19210148Sandreas.hansson@arm.com    uint8_t *txDmaData;
19310812Snilay@cs.wisc.edu    int txDmaLen;
19410812Snilay@cs.wisc.edu
19510812Snilay@cs.wisc.edu  protected:
19610812Snilay@cs.wisc.edu    void reset();
19710812Snilay@cs.wisc.edu
19810812Snilay@cs.wisc.edu    void rxKick();
19910812Snilay@cs.wisc.edu    Tick rxKickTick;
20010812Snilay@cs.wisc.edu    typedef EventWrapper<Device, &Device::rxKick> RxKickEvent;
20110812Snilay@cs.wisc.edu    friend void RxKickEvent::process();
20210812Snilay@cs.wisc.edu
20310812Snilay@cs.wisc.edu    void txKick();
20410812Snilay@cs.wisc.edu    Tick txKickTick;
20510812Snilay@cs.wisc.edu    typedef EventWrapper<Device, &Device::txKick> TxKickEvent;
20610812Snilay@cs.wisc.edu    friend void TxKickEvent::process();
20710812Snilay@cs.wisc.edu
20810812Snilay@cs.wisc.edu    /**
20910812Snilay@cs.wisc.edu     * Retransmit event
21010812Snilay@cs.wisc.edu     */
2119978Sandreas.hansson@arm.com    void transmit();
21210812Snilay@cs.wisc.edu    void txEventTransmit()
21310812Snilay@cs.wisc.edu    {
2149978Sandreas.hansson@arm.com        transmit();
21510812Snilay@cs.wisc.edu        if (txState == txFifoBlock)
2169978Sandreas.hansson@arm.com            txKick();
2179978Sandreas.hansson@arm.com    }
21810628Sandreas.hansson@arm.com    typedef EventWrapper<Device, &Device::txEventTransmit> TxEvent;
21910628Sandreas.hansson@arm.com    friend void TxEvent::process();
2209978Sandreas.hansson@arm.com    TxEvent txEvent;
22110812Snilay@cs.wisc.edu
2229978Sandreas.hansson@arm.com    void txDump() const;
22310812Snilay@cs.wisc.edu    void rxDump() const;
2249312Sandreas.hansson@arm.com
22510812Snilay@cs.wisc.edu    /**
2269312Sandreas.hansson@arm.com     * receive address filter
22710812Snilay@cs.wisc.edu     */
22810812Snilay@cs.wisc.edu    bool rxFilter(const EthPacketPtr &packet);
22910812Snilay@cs.wisc.edu
23010812Snilay@cs.wisc.edu/**
23110812Snilay@cs.wisc.edu * device configuration
23210628Sandreas.hansson@arm.com */
23310726Sandreas.hansson@arm.com    void changeConfig(uint32_t newconfig);
23410812Snilay@cs.wisc.edu    void command(uint32_t command);
23510812Snilay@cs.wisc.edu
23610812Snilay@cs.wisc.edu/**
23710812Snilay@cs.wisc.edu * device ethernet interface
23810812Snilay@cs.wisc.edu */
23910726Sandreas.hansson@arm.com  public:
24010628Sandreas.hansson@arm.com    bool recvPacket(EthPacketPtr packet);
24110812Snilay@cs.wisc.edu    void transferDone();
24210628Sandreas.hansson@arm.com    virtual EtherInt *getEthPort(const std::string &if_name, int idx);
24310812Snilay@cs.wisc.edu
24410812Snilay@cs.wisc.edu/**
24510812Snilay@cs.wisc.edu * DMA parameters
24610628Sandreas.hansson@arm.com */
24710726Sandreas.hansson@arm.com  protected:
24810812Snilay@cs.wisc.edu    void rxDmaDone();
24910812Snilay@cs.wisc.edu    friend class EventWrapper<Device, &Device::rxDmaDone>;
25010812Snilay@cs.wisc.edu    EventWrapper<Device, &Device::rxDmaDone> rxDmaEvent;
25110812Snilay@cs.wisc.edu
25210812Snilay@cs.wisc.edu    void txDmaDone();
25310726Sandreas.hansson@arm.com    friend class EventWrapper<Device, &Device::txDmaDone>;
25410628Sandreas.hansson@arm.com    EventWrapper<Device, &Device::txDmaDone> txDmaEvent;
25510812Snilay@cs.wisc.edu
25610628Sandreas.hansson@arm.com    Tick dmaReadDelay;
25710812Snilay@cs.wisc.edu    Tick dmaReadFactor;
25810812Snilay@cs.wisc.edu    Tick dmaWriteDelay;
25910812Snilay@cs.wisc.edu    Tick dmaWriteFactor;
26010812Snilay@cs.wisc.edu
26110812Snilay@cs.wisc.edu/**
26210628Sandreas.hansson@arm.com * Interrupt management
26310812Snilay@cs.wisc.edu */
26410812Snilay@cs.wisc.edu  protected:
26510726Sandreas.hansson@arm.com    void devIntrPost(uint32_t interrupts);
26610036SAli.Saidi@ARM.com    void devIntrClear(uint32_t interrupts = Regs::Intr_All);
26710628Sandreas.hansson@arm.com    void devIntrChangeMask(uint32_t newmask);
26810628Sandreas.hansson@arm.com
26910628Sandreas.hansson@arm.com/**
27010628Sandreas.hansson@arm.com * Memory Interface
27110628Sandreas.hansson@arm.com */
27210628Sandreas.hansson@arm.com  public:
27310628Sandreas.hansson@arm.com    virtual Tick read(PacketPtr pkt);
27410628Sandreas.hansson@arm.com    virtual Tick write(PacketPtr pkt);
27510038SAli.Saidi@ARM.com    virtual void resume();
27610038SAli.Saidi@ARM.com
27710038SAli.Saidi@ARM.com    void prepareIO(int cpu, int index);
27810038SAli.Saidi@ARM.com    void prepareRead(int cpu, int index);
27910038SAli.Saidi@ARM.com    void prepareWrite(int cpu, int index);
28010038SAli.Saidi@ARM.com //   Fault iprRead(Addr daddr, int cpu, uint64_t &result);
28110038SAli.Saidi@ARM.com
28210038SAli.Saidi@ARM.com/**
28310038SAli.Saidi@ARM.com * Statistics
28410038SAli.Saidi@ARM.com */
28510038SAli.Saidi@ARM.com  private:
28610038SAli.Saidi@ARM.com    Stats::Scalar rxBytes;
28710038SAli.Saidi@ARM.com    Stats::Formula  rxBandwidth;
28810038SAli.Saidi@ARM.com    Stats::Scalar rxPackets;
28910038SAli.Saidi@ARM.com    Stats::Formula  rxPacketRate;
29010038SAli.Saidi@ARM.com    Stats::Scalar rxIpPackets;
29110038SAli.Saidi@ARM.com    Stats::Scalar rxTcpPackets;
29210038SAli.Saidi@ARM.com    Stats::Scalar rxUdpPackets;
29310038SAli.Saidi@ARM.com    Stats::Scalar rxIpChecksums;
29410038SAli.Saidi@ARM.com    Stats::Scalar rxTcpChecksums;
29510038SAli.Saidi@ARM.com    Stats::Scalar rxUdpChecksums;
29610628Sandreas.hansson@arm.com
29710628Sandreas.hansson@arm.com    Stats::Scalar txBytes;
29810628Sandreas.hansson@arm.com    Stats::Formula  txBandwidth;
29910628Sandreas.hansson@arm.com    Stats::Formula totBandwidth;
30010628Sandreas.hansson@arm.com    Stats::Formula totPackets;
30110628Sandreas.hansson@arm.com    Stats::Formula totBytes;
30210628Sandreas.hansson@arm.com    Stats::Formula totPacketRate;
30310628Sandreas.hansson@arm.com    Stats::Scalar txPackets;
3048317SN/A    Stats::Formula  txPacketRate;
3058317SN/A    Stats::Scalar txIpPackets;
3068317SN/A    Stats::Scalar txTcpPackets;
3078317SN/A    Stats::Scalar txUdpPackets;
3088317SN/A    Stats::Scalar txIpChecksums;
3098317SN/A    Stats::Scalar txTcpChecksums;
3107860SN/A    Stats::Scalar txUdpChecksums;
3117860SN/A
3127860SN/A    Stats::Scalar totalVnicDistance;
3138317SN/A    Stats::Scalar numVnicDistance;
3148317SN/A    Stats::Scalar maxVnicDistance;
3158317SN/A    Stats::Formula avgVnicDistance;
3168317SN/A
3178317SN/A    int _maxVnicDistance;
3188317SN/A
3198317SN/A  public:
3208317SN/A    virtual void regStats();
3218317SN/A    virtual void resetStats();
3227860SN/A
3237860SN/A/**
3248317SN/A * Serialization stuff
32510628Sandreas.hansson@arm.com */
32610628Sandreas.hansson@arm.com  public:
32710628Sandreas.hansson@arm.com    virtual void serialize(std::ostream &os);
32810628Sandreas.hansson@arm.com    virtual void unserialize(Checkpoint *cp, const std::string &section);
32910628Sandreas.hansson@arm.com
33010628Sandreas.hansson@arm.com  public:
33110628Sandreas.hansson@arm.com    Device(const Params *p);
33210628Sandreas.hansson@arm.com    ~Device();
33310038SAli.Saidi@ARM.com};
33410038SAli.Saidi@ARM.com
33510038SAli.Saidi@ARM.com/*
33610038SAli.Saidi@ARM.com * Ethernet Interface for an Ethernet Device
33710038SAli.Saidi@ARM.com */
33810038SAli.Saidi@ARM.comclass Interface : public EtherInt
33910038SAli.Saidi@ARM.com{
34010038SAli.Saidi@ARM.com  private:
34110038SAli.Saidi@ARM.com    Device *dev;
34210038SAli.Saidi@ARM.com
34310038SAli.Saidi@ARM.com  public:
34410038SAli.Saidi@ARM.com    Interface(const std::string &name, Device *d)
34510038SAli.Saidi@ARM.com        : EtherInt(name), dev(d)
34610038SAli.Saidi@ARM.com    { }
34710038SAli.Saidi@ARM.com
34810038SAli.Saidi@ARM.com    virtual bool recvPacket(EthPacketPtr pkt) { return dev->recvPacket(pkt); }
34910038SAli.Saidi@ARM.com    virtual void sendDone() { dev->transferDone(); }
35010038SAli.Saidi@ARM.com};
35110038SAli.Saidi@ARM.com
35210038SAli.Saidi@ARM.com/* namespace Sinic */ }
35310038SAli.Saidi@ARM.com
35410628Sandreas.hansson@arm.com#endif // __DEV_SINIC_HH__
35510628Sandreas.hansson@arm.com