⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ns_gige.hh

📁 M5,一个功能强大的多处理器系统模拟器.很多针对处理器架构,性能的研究都使用它作为模拟平台
💻 HH
字号:
/* * Copyright (c) 2004, 2005 * The Regents of The University of Michigan * All Rights Reserved * * This code is part of the M5 simulator. * * Permission is granted to use, copy, create derivative works and * redistribute this software and such derivative works for any * purpose, so long as the copyright notice above, this grant of * permission, and the disclaimer below appear in all copies made; and * so long as the name of The University of Michigan is not used in * any advertising or publicity pertaining to the use or distribution * of this software without specific, written prior authorization. * * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND * WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE * LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT, * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM * ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH * DAMAGES. * * Authors: Nathan L. Binkert *          Lisa R. Hsu *//** @file * Device module for modelling the National Semiconductor * DP83820 ethernet controller */#ifndef __DEV_NS_GIGE_HH__#define __DEV_NS_GIGE_HH__#include "base/inet.hh"#include "base/statistics.hh"#include "dev/etherdevice.hh"#include "dev/etherint.hh"#include "dev/etherpkt.hh"#include "dev/io_device.hh"#include "dev/ns_gige_reg.h"#include "dev/pktfifo.hh"#include "params/NSGigE.hh"#include "sim/eventq.hh"// Hash filtering constantsconst uint16_t FHASH_ADDR  = 0x100;const uint16_t FHASH_SIZE  = 0x100;// EEPROM constantsconst uint8_t  EEPROM_READ = 0x2;const uint8_t  EEPROM_SIZE = 64; // Size in words of NSC93C46 EEPROMconst uint8_t  EEPROM_PMATCH2_ADDR = 0xA; // EEPROM Address of PMATCH word 2const uint8_t  EEPROM_PMATCH1_ADDR = 0xB; // EEPROM Address of PMATCH word 1const uint8_t  EEPROM_PMATCH0_ADDR = 0xC; // EEPROM Address of PMATCH word 0/** * Ethernet device registers */struct dp_regs {    uint32_t	command;    uint32_t	config;    uint32_t	mear;    uint32_t	ptscr;    uint32_t    isr;    uint32_t    imr;    uint32_t    ier;    uint32_t    ihr;    uint32_t    txdp;    uint32_t    txdp_hi;    uint32_t    txcfg;    uint32_t    gpior;    uint32_t    rxdp;    uint32_t    rxdp_hi;    uint32_t    rxcfg;    uint32_t    pqcr;    uint32_t    wcsr;    uint32_t    pcr;    uint32_t    rfcr;    uint32_t    rfdr;    uint32_t    brar;    uint32_t    brdr;    uint32_t    srr;    uint32_t    mibc;    uint32_t    vrcr;    uint32_t    vtcr;    uint32_t    vdr;    uint32_t    ccsr;    uint32_t    tbicr;    uint32_t    tbisr;    uint32_t    tanar;    uint32_t    tanlpar;    uint32_t    taner;    uint32_t    tesr;};struct dp_rom {    /**     * for perfect match memory.     * the linux driver doesn't use any other ROM     */    uint8_t perfectMatch[ETH_ADDR_LEN];    /**     * for hash table memory.     * used by the freebsd driver     */    uint8_t filterHash[FHASH_SIZE];};class NSGigEInt;class Packet;/** * NS DP83820 Ethernet device model */class NSGigE : public EtherDevice{  public:    /** Transmit State Machine states */    enum TxState    {        txIdle,        txDescRefr,        txDescRead,        txFifoBlock,        txFragRead,        txDescWrite,        txAdvance    };    /** Receive State Machine States */    enum RxState    {        rxIdle,        rxDescRefr,        rxDescRead,        rxFifoBlock,        rxFragWrite,        rxDescWrite,        rxAdvance    };    enum DmaState    {        dmaIdle,        dmaReading,        dmaWriting,        dmaReadWaiting,        dmaWriteWaiting    };    /** EEPROM State Machine States */    enum EEPROMState    {        eepromStart,        eepromGetOpcode,        eepromGetAddress,        eepromRead    };  protected:    /** device register file */    dp_regs regs;    dp_rom rom;    /** pci settings */    bool ioEnable;#if 0    bool memEnable;    bool bmEnable;#endif    /*** BASIC STRUCTURES FOR TX/RX ***/    /* Data FIFOs */    PacketFifo txFifo;    PacketFifo rxFifo;    /** various helper vars */    EthPacketPtr txPacket;    EthPacketPtr rxPacket;    uint8_t *txPacketBufPtr;    uint8_t *rxPacketBufPtr;    uint32_t txXferLen;    uint32_t rxXferLen;    bool rxDmaFree;    bool txDmaFree;    /** DescCaches */    ns_desc32 txDesc32;    ns_desc32 rxDesc32;    ns_desc64 txDesc64;    ns_desc64 rxDesc64;    /* state machine cycle time */    Tick clock;    inline Tick ticks(int numCycles) const { return numCycles * clock; }    /* tx State Machine */    TxState txState;    bool txEnable;    /** Current Transmit Descriptor Done */    bool CTDD;    /** halt the tx state machine after next packet */    bool txHalt;    /** ptr to the next byte in the current fragment */    Addr txFragPtr;    /** count of bytes remaining in the current descriptor */    uint32_t txDescCnt;    DmaState txDmaState;    /** rx State Machine */    RxState rxState;    bool rxEnable;    /** Current Receive Descriptor Done */    bool CRDD;    /** num of bytes in the current packet being drained from rxDataFifo */    uint32_t rxPktBytes;    /** halt the rx state machine after current packet */    bool rxHalt;    /** ptr to the next byte in current fragment */    Addr rxFragPtr;    /** count of bytes remaining in the current descriptor */    uint32_t rxDescCnt;    DmaState rxDmaState;    bool extstsEnable;    /** EEPROM State Machine */    EEPROMState eepromState;    bool eepromClk;    uint8_t eepromBitsToRx;    uint8_t eepromOpcode;    uint8_t eepromAddress;    uint16_t eepromData;  protected:    Tick dmaReadDelay;    Tick dmaWriteDelay;    Tick dmaReadFactor;    Tick dmaWriteFactor;    void *rxDmaData;    Addr  rxDmaAddr;    int   rxDmaLen;    bool  doRxDmaRead();    bool  doRxDmaWrite();    void *txDmaData;    Addr  txDmaAddr;    int   txDmaLen;    bool  doTxDmaRead();    bool  doTxDmaWrite();    void rxDmaReadDone();    friend class EventWrapper<NSGigE, &NSGigE::rxDmaReadDone>;    EventWrapper<NSGigE, &NSGigE::rxDmaReadDone> rxDmaReadEvent;    void rxDmaWriteDone();    friend class EventWrapper<NSGigE, &NSGigE::rxDmaWriteDone>;    EventWrapper<NSGigE, &NSGigE::rxDmaWriteDone> rxDmaWriteEvent;    void txDmaReadDone();    friend class EventWrapper<NSGigE, &NSGigE::txDmaReadDone>;    EventWrapper<NSGigE, &NSGigE::txDmaReadDone> txDmaReadEvent;    void txDmaWriteDone();    friend class EventWrapper<NSGigE, &NSGigE::txDmaWriteDone>;    EventWrapper<NSGigE, &NSGigE::txDmaWriteDone> txDmaWriteEvent;    bool dmaDescFree;    bool dmaDataFree;  protected:    Tick txDelay;    Tick rxDelay;    void txReset();    void rxReset();    void regsReset();    void rxKick();    Tick rxKickTick;    typedef EventWrapper<NSGigE, &NSGigE::rxKick> RxKickEvent;    friend void RxKickEvent::process();    RxKickEvent rxKickEvent;    void txKick();    Tick txKickTick;    typedef EventWrapper<NSGigE, &NSGigE::txKick> TxKickEvent;    friend void TxKickEvent::process();    TxKickEvent txKickEvent;    void eepromKick();    /**     * Retransmit event     */    void transmit();    void txEventTransmit()    {        transmit();        if (txState == txFifoBlock)            txKick();    }    typedef EventWrapper<NSGigE, &NSGigE::txEventTransmit> TxEvent;    friend void TxEvent::process();    TxEvent txEvent;    void txDump() const;    void rxDump() const;    /**     * receive address filter     */    bool rxFilterEnable;    bool rxFilter(const EthPacketPtr &packet);    bool acceptBroadcast;    bool acceptMulticast;    bool acceptUnicast;    bool acceptPerfect;    bool acceptArp;    bool multicastHashEnable;    /**     * Interrupt management     */    void devIntrPost(uint32_t interrupts);    void devIntrClear(uint32_t interrupts);    void devIntrChangeMask();    Tick intrDelay;    Tick intrTick;    bool cpuPendingIntr;    void cpuIntrPost(Tick when);    void cpuInterrupt();    void cpuIntrClear();    typedef EventWrapper<NSGigE, &NSGigE::cpuInterrupt> IntrEvent;    friend void IntrEvent::process();    IntrEvent *intrEvent;    NSGigEInt *interface;  public:    typedef NSGigEParams Params;    const Params *params() const { return (const Params *)_params; }    NSGigE(Params *params);    ~NSGigE();    virtual EtherInt *getEthPort(const std::string &if_name, int idx);    virtual Tick writeConfig(PacketPtr pkt);    virtual Tick read(PacketPtr pkt);    virtual Tick write(PacketPtr pkt);    bool cpuIntrPending() const;    void cpuIntrAck() { cpuIntrClear(); }    bool recvPacket(EthPacketPtr packet);    void transferDone();    virtual void serialize(std::ostream &os);    virtual void unserialize(Checkpoint *cp, const std::string &section);    virtual void resume();  public:    void regStats();  private:    Stats::Scalar<> txBytes;    Stats::Scalar<> rxBytes;    Stats::Scalar<> txPackets;    Stats::Scalar<> rxPackets;    Stats::Scalar<> txIpChecksums;    Stats::Scalar<> rxIpChecksums;    Stats::Scalar<> txTcpChecksums;    Stats::Scalar<> rxTcpChecksums;    Stats::Scalar<> txUdpChecksums;    Stats::Scalar<> rxUdpChecksums;    Stats::Scalar<> descDmaReads;    Stats::Scalar<> descDmaWrites;    Stats::Scalar<> descDmaRdBytes;    Stats::Scalar<> descDmaWrBytes;    Stats::Formula totBandwidth;    Stats::Formula totPackets;    Stats::Formula totBytes;    Stats::Formula totPacketRate;    Stats::Formula txBandwidth;    Stats::Formula rxBandwidth;    Stats::Formula txPacketRate;    Stats::Formula rxPacketRate;    Stats::Scalar<> postedSwi;    Stats::Formula coalescedSwi;    Stats::Scalar<> totalSwi;    Stats::Scalar<> postedRxIdle;    Stats::Formula coalescedRxIdle;    Stats::Scalar<> totalRxIdle;    Stats::Scalar<> postedRxOk;    Stats::Formula coalescedRxOk;    Stats::Scalar<> totalRxOk;    Stats::Scalar<> postedRxDesc;    Stats::Formula coalescedRxDesc;    Stats::Scalar<> totalRxDesc;    Stats::Scalar<> postedTxOk;    Stats::Formula coalescedTxOk;    Stats::Scalar<> totalTxOk;    Stats::Scalar<> postedTxIdle;    Stats::Formula coalescedTxIdle;    Stats::Scalar<> totalTxIdle;    Stats::Scalar<> postedTxDesc;    Stats::Formula coalescedTxDesc;    Stats::Scalar<> totalTxDesc;    Stats::Scalar<> postedRxOrn;    Stats::Formula coalescedRxOrn;    Stats::Scalar<> totalRxOrn;    Stats::Formula coalescedTotal;    Stats::Scalar<> postedInterrupts;    Stats::Scalar<> droppedPackets;};/* * Ethernet Interface for an Ethernet Device */class NSGigEInt : public EtherInt{  private:    NSGigE *dev;  public:    NSGigEInt(const std::string &name, NSGigE *d)        : EtherInt(name), dev(d)    { }    virtual bool recvPacket(EthPacketPtr pkt) { return dev->recvPacket(pkt); }    virtual void sendDone() { dev->transferDone(); }};#endif // __DEV_NS_GIGE_HH__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -