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 §ion); 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 ®Data8(Addr daddr) { return *((uint8_t *)®s + daddr); } 17210148Sandreas.hansson@arm.com uint32_t ®Data32(Addr daddr) { return *(uint32_t *)®Data8(daddr); } 17310148Sandreas.hansson@arm.com uint64_t ®Data64(Addr daddr) { return *(uint64_t *)®Data8(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 §ion); 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