copy_engine.hh revision 5999
15086Sgblack@eecs.umich.edu/*
25086Sgblack@eecs.umich.edu * Copyright (c) 2008 The Regents of The University of Michigan
35086Sgblack@eecs.umich.edu * All rights reserved.
45086Sgblack@eecs.umich.edu *
55086Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
65086Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
75086Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
85086Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
95086Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
105086Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
115086Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
125086Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
135086Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
145086Sgblack@eecs.umich.edu * this software without specific prior written permission.
155086Sgblack@eecs.umich.edu *
165086Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
175086Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
185086Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
195086Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
205086Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
215086Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
225086Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
235086Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245086Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
255086Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
265086Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
275086Sgblack@eecs.umich.edu *
285086Sgblack@eecs.umich.edu * Authors: Ali Saidi
295086Sgblack@eecs.umich.edu */
305086Sgblack@eecs.umich.edu
315086Sgblack@eecs.umich.edu/* @file
325086Sgblack@eecs.umich.edu * Device model for Intel's I/O Acceleration Technology (I/OAT).
335086Sgblack@eecs.umich.edu * A DMA asyncronous copy engine
345086Sgblack@eecs.umich.edu */
355086Sgblack@eecs.umich.edu
365086Sgblack@eecs.umich.edu#ifndef __DEV_COPY_ENGINE_HH__
375086Sgblack@eecs.umich.edu#define __DEV_COPY_ENGINE_HH__
385086Sgblack@eecs.umich.edu
395086Sgblack@eecs.umich.edu#include <vector>
405086Sgblack@eecs.umich.edu
415086Sgblack@eecs.umich.edu#include "base/statistics.hh"
425086Sgblack@eecs.umich.edu#include "dev/copy_engine_defs.hh"
435086Sgblack@eecs.umich.edu#include "dev/pcidev.hh"
445086Sgblack@eecs.umich.edu#include "params/CopyEngine.hh"
455086Sgblack@eecs.umich.edu#include "sim/eventq.hh"
465086Sgblack@eecs.umich.edu
475086Sgblack@eecs.umich.educlass CopyEngine : public PciDev
485086Sgblack@eecs.umich.edu{
495086Sgblack@eecs.umich.edu    class CopyEngineChannel
505086Sgblack@eecs.umich.edu    {
515086Sgblack@eecs.umich.edu      private:
525086Sgblack@eecs.umich.edu        DmaPort *cePort;
535086Sgblack@eecs.umich.edu        CopyEngine *ce;
545086Sgblack@eecs.umich.edu        CopyEngineReg::ChanRegs  cr;
555086Sgblack@eecs.umich.edu        int channelId;
565086Sgblack@eecs.umich.edu        CopyEngineReg::DmaDesc *curDmaDesc;
575086Sgblack@eecs.umich.edu        uint8_t *copyBuffer;
585647Sgblack@eecs.umich.edu
595647Sgblack@eecs.umich.edu        bool busy;
605647Sgblack@eecs.umich.edu        bool underReset;
615647Sgblack@eecs.umich.edu        bool refreshNext;
625647Sgblack@eecs.umich.edu        Addr lastDescriptorAddr;
635135Sgblack@eecs.umich.edu        Addr fetchAddress;
645135Sgblack@eecs.umich.edu
655135Sgblack@eecs.umich.edu        Tick latBeforeBegin;
665086Sgblack@eecs.umich.edu        Tick latAfterCompletion;
675135Sgblack@eecs.umich.edu
685647Sgblack@eecs.umich.edu        uint64_t completionDataReg;
695234Sgblack@eecs.umich.edu
705086Sgblack@eecs.umich.edu        enum ChannelState {
715086Sgblack@eecs.umich.edu            Idle,
725086Sgblack@eecs.umich.edu            AddressFetch,
735086Sgblack@eecs.umich.edu            DescriptorFetch,
745086Sgblack@eecs.umich.edu            DMARead,
755086Sgblack@eecs.umich.edu            DMAWrite,
765086Sgblack@eecs.umich.edu            CompletionWrite
775086Sgblack@eecs.umich.edu        };
785086Sgblack@eecs.umich.edu
795086Sgblack@eecs.umich.edu        ChannelState nextState;
805086Sgblack@eecs.umich.edu
815135Sgblack@eecs.umich.edu        Event *drainEvent;
825135Sgblack@eecs.umich.edu      public:
835135Sgblack@eecs.umich.edu        CopyEngineChannel(CopyEngine *_ce, int cid);
845135Sgblack@eecs.umich.edu        virtual ~CopyEngineChannel();
856048Sgblack@eecs.umich.edu        void init();
866048Sgblack@eecs.umich.edu
876048Sgblack@eecs.umich.edu        std::string name() { assert(ce); return ce->name() + csprintf("-chan%d", channelId); }
886048Sgblack@eecs.umich.edu        virtual void addressRanges(AddrRangeList &range_list) { range_list.clear(); }
896048Sgblack@eecs.umich.edu        virtual Tick read(PacketPtr pkt)
906048Sgblack@eecs.umich.edu                        { panic("CopyEngineChannel has no I/O access\n");}
916048Sgblack@eecs.umich.edu        virtual Tick write(PacketPtr pkt)
926048Sgblack@eecs.umich.edu                        { panic("CopyEngineChannel has no I/O access\n"); }
935135Sgblack@eecs.umich.edu
945135Sgblack@eecs.umich.edu        void channelRead(PacketPtr pkt, Addr daddr, int size);
955135Sgblack@eecs.umich.edu        void channelWrite(PacketPtr pkt, Addr daddr, int size);
965135Sgblack@eecs.umich.edu
975135Sgblack@eecs.umich.edu        unsigned int drain(Event *de);
985135Sgblack@eecs.umich.edu        void resume();
995135Sgblack@eecs.umich.edu        void serialize(std::ostream &os);
1005135Sgblack@eecs.umich.edu        void unserialize(Checkpoint *cp, const std::string &section);
1015135Sgblack@eecs.umich.edu
1025135Sgblack@eecs.umich.edu      private:
1035135Sgblack@eecs.umich.edu        void fetchDescriptor(Addr address);
1045135Sgblack@eecs.umich.edu        void fetchDescComplete();
1055135Sgblack@eecs.umich.edu        EventWrapper<CopyEngineChannel, &CopyEngineChannel::fetchDescComplete>
1065135Sgblack@eecs.umich.edu            fetchCompleteEvent;
1075135Sgblack@eecs.umich.edu
1085135Sgblack@eecs.umich.edu        void fetchNextAddr(Addr address);
1095135Sgblack@eecs.umich.edu        void fetchAddrComplete();
1105264Sgblack@eecs.umich.edu        EventWrapper<CopyEngineChannel, &CopyEngineChannel::fetchAddrComplete>
1115135Sgblack@eecs.umich.edu            addrCompleteEvent;
1125135Sgblack@eecs.umich.edu
1135135Sgblack@eecs.umich.edu        void readCopyBytes();
1145135Sgblack@eecs.umich.edu        void readCopyBytesComplete();
1155141Sgblack@eecs.umich.edu        EventWrapper<CopyEngineChannel, &CopyEngineChannel::readCopyBytesComplete>
1165141Sgblack@eecs.umich.edu            readCompleteEvent;
1175141Sgblack@eecs.umich.edu
1185141Sgblack@eecs.umich.edu        void writeCopyBytes();
1195141Sgblack@eecs.umich.edu        void writeCopyBytesComplete();
1205141Sgblack@eecs.umich.edu        EventWrapper <CopyEngineChannel, &CopyEngineChannel::writeCopyBytesComplete>
1215141Sgblack@eecs.umich.edu            writeCompleteEvent;
1225141Sgblack@eecs.umich.edu
1235141Sgblack@eecs.umich.edu        void writeCompletionStatus();
1245182Sgblack@eecs.umich.edu        void writeStatusComplete();
1255141Sgblack@eecs.umich.edu        EventWrapper <CopyEngineChannel, &CopyEngineChannel::writeStatusComplete>
1265141Sgblack@eecs.umich.edu            statusCompleteEvent;
1275141Sgblack@eecs.umich.edu
1285141Sgblack@eecs.umich.edu
1295141Sgblack@eecs.umich.edu        void continueProcessing();
1305141Sgblack@eecs.umich.edu        void recvCommand();
1315135Sgblack@eecs.umich.edu        bool inDrain();
1325141Sgblack@eecs.umich.edu        void restartStateMachine();
1335141Sgblack@eecs.umich.edu        inline void anBegin(const char *s)
1345141Sgblack@eecs.umich.edu        {
1355141Sgblack@eecs.umich.edu            CPA::cpa()->hwBegin(CPA::FL_NONE, ce->sys,
1365141Sgblack@eecs.umich.edu                         channelId, "CopyEngine", s);
1375141Sgblack@eecs.umich.edu        }
1385141Sgblack@eecs.umich.edu
1395141Sgblack@eecs.umich.edu        inline void anWait()
1405141Sgblack@eecs.umich.edu        {
1415141Sgblack@eecs.umich.edu            CPA::cpa()->hwWe(CPA::FL_NONE, ce->sys,
1425141Sgblack@eecs.umich.edu                     channelId, "CopyEngine", "DMAUnusedDescQ", channelId);
1435141Sgblack@eecs.umich.edu        }
1445135Sgblack@eecs.umich.edu
1455141Sgblack@eecs.umich.edu        inline void anDq()
1465141Sgblack@eecs.umich.edu        {
1475135Sgblack@eecs.umich.edu            CPA::cpa()->hwDq(CPA::FL_NONE, ce->sys,
1485141Sgblack@eecs.umich.edu                      channelId, "CopyEngine", "DMAUnusedDescQ", channelId);
1495141Sgblack@eecs.umich.edu        }
1505141Sgblack@eecs.umich.edu
1515141Sgblack@eecs.umich.edu        inline void anPq()
1525135Sgblack@eecs.umich.edu        {
1535141Sgblack@eecs.umich.edu            CPA::cpa()->hwDq(CPA::FL_NONE, ce->sys,
1545141Sgblack@eecs.umich.edu                      channelId, "CopyEngine", "DMAUnusedDescQ", channelId);
1555141Sgblack@eecs.umich.edu        }
1565141Sgblack@eecs.umich.edu
1575141Sgblack@eecs.umich.edu        inline void anQ(const char * s, uint64_t id, int size = 1)
1585141Sgblack@eecs.umich.edu        {
1595141Sgblack@eecs.umich.edu            CPA::cpa()->hwQ(CPA::FL_NONE, ce->sys, channelId,
1605141Sgblack@eecs.umich.edu                    "CopyEngine", s, id, NULL, size);
1615141Sgblack@eecs.umich.edu        }
1625141Sgblack@eecs.umich.edu
1635141Sgblack@eecs.umich.edu    };
1645141Sgblack@eecs.umich.edu
1655264Sgblack@eecs.umich.edu  private:
1665141Sgblack@eecs.umich.edu
1675141Sgblack@eecs.umich.edu    Stats::Vector bytesCopied;
1685141Sgblack@eecs.umich.edu    Stats::Vector copiesProcessed;
1695141Sgblack@eecs.umich.edu
1705141Sgblack@eecs.umich.edu    // device registers
1715141Sgblack@eecs.umich.edu    CopyEngineReg::Regs regs;
1725141Sgblack@eecs.umich.edu
1735141Sgblack@eecs.umich.edu    // Array of channels each one with regs/dma port/etc
1745141Sgblack@eecs.umich.edu    std::vector<CopyEngineChannel*> chan;
1755141Sgblack@eecs.umich.edu
1765141Sgblack@eecs.umich.edu  public:
1775141Sgblack@eecs.umich.edu    typedef CopyEngineParams Params;
1785141Sgblack@eecs.umich.edu    const Params *
1795141Sgblack@eecs.umich.edu    params() const
1805141Sgblack@eecs.umich.edu    {
1815141Sgblack@eecs.umich.edu        return dynamic_cast<const Params *>(_params);
1825141Sgblack@eecs.umich.edu    }
1835135Sgblack@eecs.umich.edu    CopyEngine(const Params *params);
1845135Sgblack@eecs.umich.edu    ~CopyEngine();
1855135Sgblack@eecs.umich.edu
1865360Sgblack@eecs.umich.edu    void regStats();
1875360Sgblack@eecs.umich.edu    void init();
1885360Sgblack@eecs.umich.edu
1895360Sgblack@eecs.umich.edu    virtual Tick read(PacketPtr pkt);
1905360Sgblack@eecs.umich.edu    virtual Tick write(PacketPtr pkt);
1915360Sgblack@eecs.umich.edu
1925647Sgblack@eecs.umich.edu    virtual void serialize(std::ostream &os);
1935647Sgblack@eecs.umich.edu    virtual void unserialize(Checkpoint *cp, const std::string &section);
1945647Sgblack@eecs.umich.edu    virtual unsigned int drain(Event *de);
1955360Sgblack@eecs.umich.edu    virtual void resume();
1965647Sgblack@eecs.umich.edu};
1975647Sgblack@eecs.umich.edu
1985647Sgblack@eecs.umich.edu#endif //__DEV_COPY_ENGINE_HH__
1995648Sgblack@eecs.umich.edu
2005648Sgblack@eecs.umich.edu