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 §ion); 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 §ion); 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