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 &section);
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