ns_gige.hh revision 1762
19243SN/A/* 210206Sandreas.hansson@arm.com * Copyright (c) 2004-2005 The Regents of The University of Michigan 39243SN/A * All rights reserved. 49243SN/A * 59243SN/A * Redistribution and use in source and binary forms, with or without 69243SN/A * modification, are permitted provided that the following conditions are 79243SN/A * met: redistributions of source code must retain the above copyright 89243SN/A * notice, this list of conditions and the following disclaimer; 99243SN/A * redistributions in binary form must reproduce the above copyright 109243SN/A * notice, this list of conditions and the following disclaimer in the 119243SN/A * documentation and/or other materials provided with the distribution; 129243SN/A * neither the name of the copyright holders nor the names of its 139243SN/A * contributors may be used to endorse or promote products derived from 149831SN/A * this software without specific prior written permission. 159831SN/A * 169831SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179243SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189243SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 199243SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209243SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 219243SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 229243SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239243SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249243SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259243SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 269243SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279243SN/A */ 289243SN/A 299243SN/A/** @file 309243SN/A * Device module for modelling the National Semiconductor 319243SN/A * DP83820 ethernet controller 329243SN/A */ 339243SN/A 349243SN/A#ifndef __DEV_NS_GIGE_HH__ 359243SN/A#define __DEV_NS_GIGE_HH__ 369243SN/A 379243SN/A#include "base/inet.hh" 389243SN/A#include "base/statistics.hh" 399243SN/A#include "dev/etherint.hh" 409243SN/A#include "dev/etherpkt.hh" 419243SN/A#include "dev/io_device.hh" 429967SN/A#include "dev/ns_gige_reg.h" 439243SN/A#include "dev/pcidev.hh" 449243SN/A#include "dev/pktfifo.hh" 459243SN/A#include "mem/bus/bus.hh" 469243SN/A#include "sim/eventq.hh" 4710146Sandreas.hansson@arm.com 489243SN/A/** 499243SN/A * Ethernet device registers 5010146Sandreas.hansson@arm.com */ 5110146Sandreas.hansson@arm.comstruct dp_regs { 529243SN/A uint32_t command; 539488SN/A uint32_t config; 549488SN/A uint32_t mear; 559243SN/A uint32_t ptscr; 569243SN/A uint32_t isr; 579243SN/A uint32_t imr; 589243SN/A uint32_t ier; 599243SN/A uint32_t ihr; 609243SN/A uint32_t txdp; 6110146Sandreas.hansson@arm.com uint32_t txdp_hi; 629243SN/A uint32_t txcfg; 639243SN/A uint32_t gpior; 649243SN/A uint32_t rxdp; 6510146Sandreas.hansson@arm.com uint32_t rxdp_hi; 6610146Sandreas.hansson@arm.com uint32_t rxcfg; 6710146Sandreas.hansson@arm.com uint32_t pqcr; 689243SN/A uint32_t wcsr; 699243SN/A uint32_t pcr; 709243SN/A uint32_t rfcr; 719243SN/A uint32_t rfdr; 729243SN/A uint32_t srr; 739243SN/A uint32_t mibc; 749243SN/A uint32_t vrcr; 759243SN/A uint32_t vtcr; 769243SN/A uint32_t vdr; 779243SN/A uint32_t ccsr; 789243SN/A uint32_t tbicr; 799243SN/A uint32_t tbisr; 809243SN/A uint32_t tanar; 819243SN/A uint32_t tanlpar; 829243SN/A uint32_t taner; 8310146Sandreas.hansson@arm.com uint32_t tesr; 849243SN/A}; 859243SN/A 869243SN/Astruct dp_rom { 879243SN/A /** 889243SN/A * for perfect match memory. 899243SN/A * the linux driver doesn't use any other ROM 909243SN/A */ 919243SN/A uint8_t perfectMatch[ETH_ADDR_LEN]; 929243SN/A}; 939243SN/A 9410146Sandreas.hansson@arm.comclass NSGigEInt; 959243SN/Aclass PhysicalMemory; 969243SN/Aclass BaseInterface; 979243SN/Aclass HierParams; 9810146Sandreas.hansson@arm.comclass Bus; 999243SN/Aclass PciConfigAll; 1009243SN/A 1019243SN/A/** 1029243SN/A * NS DP82830 Ethernet device model 1039243SN/A */ 1049243SN/Aclass NSGigE : public PciDev 1059243SN/A{ 1069243SN/A public: 1079243SN/A /** Transmit State Machine states */ 1089243SN/A enum TxState 1099243SN/A { 1109243SN/A txIdle, 1119243SN/A txDescRefr, 1129243SN/A txDescRead, 1139243SN/A txFifoBlock, 1149243SN/A txFragRead, 1159243SN/A txDescWrite, 1169243SN/A txAdvance 1179243SN/A }; 1189243SN/A 1199243SN/A /** Receive State Machine States */ 1209243SN/A enum RxState 1219243SN/A { 1229243SN/A rxIdle, 1239243SN/A rxDescRefr, 1249243SN/A rxDescRead, 12510206Sandreas.hansson@arm.com rxFifoBlock, 12610206Sandreas.hansson@arm.com rxFragWrite, 1279243SN/A rxDescWrite, 12810206Sandreas.hansson@arm.com rxAdvance 12910206Sandreas.hansson@arm.com }; 13010206Sandreas.hansson@arm.com 13110206Sandreas.hansson@arm.com enum DmaState 13210206Sandreas.hansson@arm.com { 13310206Sandreas.hansson@arm.com dmaIdle, 13410206Sandreas.hansson@arm.com dmaReading, 13510206Sandreas.hansson@arm.com dmaWriting, 1369243SN/A dmaReadWaiting, 1379488SN/A dmaWriteWaiting 1389969SN/A }; 1399488SN/A 1409243SN/A private: 14110210Sandreas.hansson@arm.com Addr addr; 14210210Sandreas.hansson@arm.com static const Addr size = sizeof(dp_regs); 14310211Sandreas.hansson@arm.com 14410211Sandreas.hansson@arm.com protected: 14510210Sandreas.hansson@arm.com typedef std::deque<PacketPtr> pktbuf_t; 14610210Sandreas.hansson@arm.com typedef pktbuf_t::iterator pktiter_t; 14710210Sandreas.hansson@arm.com 1489243SN/A /** device register file */ 1499243SN/A dp_regs regs; 1509243SN/A dp_rom rom; 1519243SN/A 1529243SN/A /** pci settings */ 1539243SN/A bool ioEnable; 15410207Sandreas.hansson@arm.com#if 0 1559243SN/A bool memEnable; 1569243SN/A bool bmEnable; 15710246Sandreas.hansson@arm.com#endif 15810246Sandreas.hansson@arm.com 1599243SN/A /*** BASIC STRUCTURES FOR TX/RX ***/ 16010211Sandreas.hansson@arm.com /* Data FIFOs */ 16110210Sandreas.hansson@arm.com PacketFifo txFifo; 1629969SN/A PacketFifo rxFifo; 1639243SN/A 16410141SN/A /** various helper vars */ 1659727SN/A PacketPtr txPacket; 1669727SN/A PacketPtr rxPacket; 1679727SN/A uint8_t *txPacketBufPtr; 16810246Sandreas.hansson@arm.com uint8_t *rxPacketBufPtr; 16910246Sandreas.hansson@arm.com uint32_t txXferLen; 17010141SN/A uint32_t rxXferLen; 1719243SN/A bool rxDmaFree; 1729243SN/A bool txDmaFree; 1739243SN/A 1749243SN/A /** DescCaches */ 1759831SN/A ns_desc txDescCache; 1769831SN/A ns_desc rxDescCache; 1779831SN/A 1789831SN/A /* state machine cycle time */ 1799831SN/A Tick clock; 1809831SN/A inline Tick cycles(int numCycles) const { return numCycles * clock; } 1819831SN/A 1829831SN/A /* tx State Machine */ 1839831SN/A TxState txState; 1849831SN/A bool txEnable; 1859831SN/A 1869831SN/A /** Current Transmit Descriptor Done */ 1879831SN/A bool CTDD; 1889831SN/A /** halt the tx state machine after next packet */ 1899831SN/A bool txHalt; 1909831SN/A /** ptr to the next byte in the current fragment */ 1919831SN/A Addr txFragPtr; 1929831SN/A /** count of bytes remaining in the current descriptor */ 1939831SN/A uint32_t txDescCnt; 1949831SN/A DmaState txDmaState; 1959831SN/A 1969243SN/A /** rx State Machine */ 1979243SN/A RxState rxState; 1989243SN/A bool rxEnable; 1999243SN/A 2009243SN/A /** Current Receive Descriptor Done */ 2019243SN/A bool CRDD; 2029243SN/A /** num of bytes in the current packet being drained from rxDataFifo */ 2039243SN/A uint32_t rxPktBytes; 2049243SN/A /** halt the rx state machine after current packet */ 2059243SN/A bool rxHalt; 2069243SN/A /** ptr to the next byte in current fragment */ 2079243SN/A Addr rxFragPtr; 2089243SN/A /** count of bytes remaining in the current descriptor */ 2099243SN/A uint32_t rxDescCnt; 2109243SN/A DmaState rxDmaState; 2119243SN/A 2129966SN/A bool extstsEnable; 2139966SN/A 2149243SN/A protected: 2159243SN/A Tick dmaReadDelay; 2169967SN/A Tick dmaWriteDelay; 21710245Sandreas.hansson@arm.com 2189831SN/A Tick dmaReadFactor; 2199831SN/A Tick dmaWriteFactor; 2209967SN/A 2219967SN/A void *rxDmaData; 2229967SN/A Addr rxDmaAddr; 2239967SN/A int rxDmaLen; 2249967SN/A bool doRxDmaRead(); 2259967SN/A bool doRxDmaWrite(); 2269967SN/A void rxDmaReadCopy(); 2279831SN/A void rxDmaWriteCopy(); 2289831SN/A 2299831SN/A void *txDmaData; 2309831SN/A Addr txDmaAddr; 2319831SN/A int txDmaLen; 2329832SN/A bool doTxDmaRead(); 2339831SN/A bool doTxDmaWrite(); 2349831SN/A void txDmaReadCopy(); 2359831SN/A void txDmaWriteCopy(); 2369831SN/A 2379831SN/A void rxDmaReadDone(); 2389832SN/A friend class EventWrapper<NSGigE, &NSGigE::rxDmaReadDone>; 2399831SN/A EventWrapper<NSGigE, &NSGigE::rxDmaReadDone> rxDmaReadEvent; 2409831SN/A 2419831SN/A void rxDmaWriteDone(); 2429831SN/A friend class EventWrapper<NSGigE, &NSGigE::rxDmaWriteDone>; 2439831SN/A EventWrapper<NSGigE, &NSGigE::rxDmaWriteDone> rxDmaWriteEvent; 2449831SN/A 2459967SN/A void txDmaReadDone(); 2469243SN/A friend class EventWrapper<NSGigE, &NSGigE::txDmaReadDone>; 2479967SN/A EventWrapper<NSGigE, &NSGigE::txDmaReadDone> txDmaReadEvent; 24810245Sandreas.hansson@arm.com 2499967SN/A void txDmaWriteDone(); 2509243SN/A friend class EventWrapper<NSGigE, &NSGigE::txDmaWriteDone>; 2519967SN/A EventWrapper<NSGigE, &NSGigE::txDmaWriteDone> txDmaWriteEvent; 2529967SN/A 2539967SN/A bool dmaDescFree; 2549243SN/A bool dmaDataFree; 2559243SN/A 2569243SN/A 2579243SN/A protected: 2589243SN/A Tick txDelay; 2599243SN/A Tick rxDelay; 26010206Sandreas.hansson@arm.com 26110206Sandreas.hansson@arm.com void txReset(); 2629243SN/A void rxReset(); 2639243SN/A void regsReset(); 26410208Sandreas.hansson@arm.com 26510208Sandreas.hansson@arm.com void rxKick(); 26610208Sandreas.hansson@arm.com Tick rxKickTick; 2679243SN/A typedef EventWrapper<NSGigE, &NSGigE::rxKick> RxKickEvent; 26810146Sandreas.hansson@arm.com friend void RxKickEvent::process(); 2699243SN/A 27010208Sandreas.hansson@arm.com void txKick(); 27110208Sandreas.hansson@arm.com Tick txKickTick; 27210208Sandreas.hansson@arm.com typedef EventWrapper<NSGigE, &NSGigE::txKick> TxKickEvent; 27310208Sandreas.hansson@arm.com friend void TxKickEvent::process(); 27410208Sandreas.hansson@arm.com 27510208Sandreas.hansson@arm.com /** 2769243SN/A * Retransmit event 27710146Sandreas.hansson@arm.com */ 2789243SN/A void transmit(); 27910208Sandreas.hansson@arm.com void txEventTransmit() 28010208Sandreas.hansson@arm.com { 2819243SN/A transmit(); 2829243SN/A if (txState == txFifoBlock) 2839243SN/A txKick(); 2849243SN/A } 2859831SN/A typedef EventWrapper<NSGigE, &NSGigE::txEventTransmit> TxEvent; 2869243SN/A friend void TxEvent::process(); 2879243SN/A TxEvent txEvent; 2889831SN/A 2899243SN/A void txDump() const; 2909243SN/A void rxDump() const; 2919243SN/A 2929243SN/A /** 2939831SN/A * receive address filter 2949243SN/A */ 2959243SN/A bool rxFilterEnable; 2969831SN/A bool rxFilter(const PacketPtr &packet); 2979243SN/A bool acceptBroadcast; 2989243SN/A bool acceptMulticast; 2999243SN/A bool acceptUnicast; 3009243SN/A bool acceptPerfect; 3019831SN/A bool acceptArp; 3029831SN/A 3039831SN/A PhysicalMemory *physmem; 3049243SN/A 3059243SN/A /** 3069243SN/A * Interrupt management 3079243SN/A */ 3089831SN/A void devIntrPost(uint32_t interrupts); 3099831SN/A void devIntrClear(uint32_t interrupts); 3109831SN/A void devIntrChangeMask(); 3119243SN/A 3129831SN/A Tick intrDelay; 3139243SN/A Tick intrTick; 3149243SN/A bool cpuPendingIntr; 3159243SN/A void cpuIntrPost(Tick when); 3169243SN/A void cpuInterrupt(); 3179243SN/A void cpuIntrClear(); 3189243SN/A 3199243SN/A typedef EventWrapper<NSGigE, &NSGigE::cpuInterrupt> IntrEvent; 3209243SN/A friend void IntrEvent::process(); 3219831SN/A IntrEvent *intrEvent; 3229831SN/A NSGigEInt *interface; 3239831SN/A 3249243SN/A public: 3259831SN/A struct Params : public PciDev::Params 3269243SN/A { 3279243SN/A PhysicalMemory *pmem; 3289243SN/A HierParams *hier; 3299243SN/A Bus *header_bus; 3309243SN/A Bus *payload_bus; 3319243SN/A Tick clock; 3329243SN/A Tick intr_delay; 3339243SN/A Tick tx_delay; 3349243SN/A Tick rx_delay; 3359243SN/A Tick pio_latency; 3369243SN/A bool dma_desc_free; 3379243SN/A bool dma_data_free; 3389243SN/A Tick dma_read_delay; 3399243SN/A Tick dma_write_delay; 3409243SN/A Tick dma_read_factor; 3419243SN/A Tick dma_write_factor; 3429243SN/A bool rx_filter; 3439243SN/A Net::EthAddr eaddr; 3449243SN/A uint32_t tx_fifo_size; 3459243SN/A uint32_t rx_fifo_size; 3469726SN/A uint32_t m5reg; 3479243SN/A bool dma_no_allocate; 3489726SN/A }; 3499243SN/A 3509243SN/A NSGigE(Params *params); 3519243SN/A ~NSGigE(); 3529831SN/A const Params *params() const { return (const Params *)_params; } 3539831SN/A 3549831SN/A virtual void WriteConfig(int offset, int size, uint32_t data); 3559243SN/A virtual void ReadConfig(int offset, int size, uint8_t *data); 3569243SN/A 3579831SN/A virtual Fault read(MemReqPtr &req, uint8_t *data); 3589831SN/A virtual Fault write(MemReqPtr &req, const uint8_t *data); 3599966SN/A 3609243SN/A bool cpuIntrPending() const; 3619243SN/A void cpuIntrAck() { cpuIntrClear(); } 36210143SN/A 36310143SN/A bool recvPacket(PacketPtr packet); 3649243SN/A void transferDone(); 3659243SN/A 36610206Sandreas.hansson@arm.com void setInterface(NSGigEInt *i) { assert(!interface); interface = i; } 3679567SN/A 36810206Sandreas.hansson@arm.com virtual void serialize(std::ostream &os); 3699243SN/A virtual void unserialize(Checkpoint *cp, const std::string §ion); 37010206Sandreas.hansson@arm.com 3719243SN/A public: 3729243SN/A void regStats(); 3739974SN/A 3749974SN/A private: 3759974SN/A Stats::Scalar<> txBytes; 3769974SN/A Stats::Scalar<> rxBytes; 3779974SN/A Stats::Scalar<> txPackets; 3789974SN/A Stats::Scalar<> rxPackets; 37910211Sandreas.hansson@arm.com Stats::Scalar<> txIpChecksums; 38010211Sandreas.hansson@arm.com Stats::Scalar<> rxIpChecksums; 3819967SN/A Stats::Scalar<> txTcpChecksums; 3829967SN/A Stats::Scalar<> rxTcpChecksums; 3839967SN/A Stats::Scalar<> txUdpChecksums; 3849967SN/A Stats::Scalar<> rxUdpChecksums; 38510211Sandreas.hansson@arm.com Stats::Scalar<> descDmaReads; 3869488SN/A Stats::Scalar<> descDmaWrites; 3879488SN/A Stats::Scalar<> descDmaRdBytes; 3889488SN/A Stats::Scalar<> descDmaWrBytes; 3899488SN/A Stats::Formula totBandwidth; 3909488SN/A Stats::Formula totPackets; 3919488SN/A Stats::Formula totBytes; 39210210Sandreas.hansson@arm.com Stats::Formula totPacketRate; 39310246Sandreas.hansson@arm.com Stats::Formula txBandwidth; 39410210Sandreas.hansson@arm.com Stats::Formula rxBandwidth; 39510210Sandreas.hansson@arm.com Stats::Formula txPacketRate; 3969488SN/A Stats::Formula rxPacketRate; 39710246Sandreas.hansson@arm.com Stats::Scalar<> postedSwi; 39810207Sandreas.hansson@arm.com Stats::Formula coalescedSwi; 39910207Sandreas.hansson@arm.com Stats::Scalar<> totalSwi; 40010207Sandreas.hansson@arm.com Stats::Scalar<> postedRxIdle; 40110207Sandreas.hansson@arm.com Stats::Formula coalescedRxIdle; 40210207Sandreas.hansson@arm.com Stats::Scalar<> totalRxIdle; 40310207Sandreas.hansson@arm.com Stats::Scalar<> postedRxOk; 40410207Sandreas.hansson@arm.com Stats::Formula coalescedRxOk; 40510211Sandreas.hansson@arm.com Stats::Scalar<> totalRxOk; 40610207Sandreas.hansson@arm.com Stats::Scalar<> postedRxDesc; 40710211Sandreas.hansson@arm.com Stats::Formula coalescedRxDesc; 4089488SN/A Stats::Scalar<> totalRxDesc; 40910143SN/A Stats::Scalar<> postedTxOk; 41010143SN/A Stats::Formula coalescedTxOk; 41110143SN/A Stats::Scalar<> totalTxOk; 4129243SN/A Stats::Scalar<> postedTxIdle; 4139243SN/A Stats::Formula coalescedTxIdle; 4149243SN/A Stats::Scalar<> totalTxIdle; 4159243SN/A Stats::Scalar<> postedTxDesc; 4169243SN/A Stats::Formula coalescedTxDesc; 4179833SN/A Stats::Scalar<> totalTxDesc; 4189833SN/A Stats::Scalar<> postedRxOrn; 4199243SN/A Stats::Formula coalescedRxOrn; 4209243SN/A Stats::Scalar<> totalRxOrn; 4219243SN/A Stats::Formula coalescedTotal; 4229567SN/A Stats::Scalar<> postedInterrupts; 4239567SN/A Stats::Scalar<> droppedPackets; 4249567SN/A 4259567SN/A public: 4269567SN/A Tick cacheAccess(MemReqPtr &req); 4279243SN/A}; 4289833SN/A 4299243SN/A/* 4309567SN/A * Ethernet Interface for an Ethernet Device 4319567SN/A */ 4329567SN/Aclass NSGigEInt : public EtherInt 4339243SN/A{ 4349342SN/A private: 4359243SN/A NSGigE *dev; 4369243SN/A 4379243SN/A public: 4389243SN/A NSGigEInt(const std::string &name, NSGigE *d) 4399243SN/A : EtherInt(name), dev(d) { dev->setInterface(this); } 4409243SN/A 4419243SN/A virtual bool recvPacket(PacketPtr pkt) { return dev->recvPacket(pkt); } 4429243SN/A virtual void sendDone() { dev->transferDone(); } 4439243SN/A}; 4449831SN/A 4459831SN/A#endif // __DEV_NS_GIGE_HH__ 4469831SN/A