DMASequencer.hh revision 10919
16019Shines@cs.fsu.edu/* 27091Sgblack@eecs.umich.edu * Copyright (c) 2008 Mark D. Hill and David A. Wood 37091Sgblack@eecs.umich.edu * All rights reserved. 47091Sgblack@eecs.umich.edu * 57091Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 67091Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 77091Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 87091Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 97091Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 107091Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 117091Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 127091Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 137091Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 146019Shines@cs.fsu.edu * this software without specific prior written permission. 156019Shines@cs.fsu.edu * 166019Shines@cs.fsu.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 176019Shines@cs.fsu.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 186019Shines@cs.fsu.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 196019Shines@cs.fsu.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 206019Shines@cs.fsu.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 216019Shines@cs.fsu.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 226019Shines@cs.fsu.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 236019Shines@cs.fsu.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 246019Shines@cs.fsu.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 256019Shines@cs.fsu.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 266019Shines@cs.fsu.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276019Shines@cs.fsu.edu */ 286019Shines@cs.fsu.edu 296019Shines@cs.fsu.edu#ifndef __MEM_RUBY_SYSTEM_DMASEQUENCER_HH__ 306019Shines@cs.fsu.edu#define __MEM_RUBY_SYSTEM_DMASEQUENCER_HH__ 316019Shines@cs.fsu.edu 326019Shines@cs.fsu.edu#include <memory> 336019Shines@cs.fsu.edu#include <ostream> 346019Shines@cs.fsu.edu 356019Shines@cs.fsu.edu#include "mem/mem_object.hh" 366019Shines@cs.fsu.edu#include "mem/protocol/DMASequencerRequestType.hh" 376019Shines@cs.fsu.edu#include "mem/protocol/RequestStatus.hh" 386019Shines@cs.fsu.edu#include "mem/ruby/common/DataBlock.hh" 396019Shines@cs.fsu.edu#include "mem/ruby/network/MessageBuffer.hh" 406019Shines@cs.fsu.edu#include "mem/ruby/system/System.hh" 416019Shines@cs.fsu.edu#include "mem/simple_mem.hh" 426019Shines@cs.fsu.edu#include "mem/tport.hh" 436019Shines@cs.fsu.edu#include "params/DMASequencer.hh" 446019Shines@cs.fsu.edu 456019Shines@cs.fsu.educlass AbstractController; 466019Shines@cs.fsu.edu 476019Shines@cs.fsu.edustruct DMARequest 486019Shines@cs.fsu.edu{ 496019Shines@cs.fsu.edu uint64_t start_paddr; 507639Sgblack@eecs.umich.edu int len; 516019Shines@cs.fsu.edu bool write; 526019Shines@cs.fsu.edu int bytes_completed; 536019Shines@cs.fsu.edu int bytes_issued; 546019Shines@cs.fsu.edu uint8_t *data; 556312Sgblack@eecs.umich.edu PacketPtr pkt; 566312Sgblack@eecs.umich.edu}; 577720Sgblack@eecs.umich.edu 586312Sgblack@eecs.umich.educlass DMASequencer : public MemObject 597186Sgblack@eecs.umich.edu{ 607720Sgblack@eecs.umich.edu public: 617186Sgblack@eecs.umich.edu typedef DMASequencerParams Params; 627186Sgblack@eecs.umich.edu DMASequencer(const Params *); 636312Sgblack@eecs.umich.edu void init(); 647093Sgblack@eecs.umich.edu RubySystem *m_ruby_system; 656312Sgblack@eecs.umich.edu 666312Sgblack@eecs.umich.edu public: 677148Sgblack@eecs.umich.edu class MemSlavePort : public QueuedSlavePort 687148Sgblack@eecs.umich.edu { 697148Sgblack@eecs.umich.edu private: 707148Sgblack@eecs.umich.edu RespPacketQueue queue; 717184Sgblack@eecs.umich.edu RubySystem* m_ruby_system; 727184Sgblack@eecs.umich.edu bool access_backing_store; 737289Sgblack@eecs.umich.edu 747289Sgblack@eecs.umich.edu public: 757289Sgblack@eecs.umich.edu MemSlavePort(const std::string &_name, DMASequencer *_port, 767289Sgblack@eecs.umich.edu PortID id, RubySystem *_ruby_system, 777184Sgblack@eecs.umich.edu bool _access_backing_store); 787184Sgblack@eecs.umich.edu void hitCallback(PacketPtr pkt); 797184Sgblack@eecs.umich.edu void evictionCallback(const Address& address); 807184Sgblack@eecs.umich.edu 817184Sgblack@eecs.umich.edu protected: 827184Sgblack@eecs.umich.edu bool recvTimingReq(PacketPtr pkt); 836312Sgblack@eecs.umich.edu 846312Sgblack@eecs.umich.edu Tick recvAtomic(PacketPtr pkt) 856019Shines@cs.fsu.edu { panic("DMASequencer::MemSlavePort::recvAtomic() not implemented!\n"); } 867119Sgblack@eecs.umich.edu 877720Sgblack@eecs.umich.edu void recvFunctional(PacketPtr pkt) 887119Sgblack@eecs.umich.edu { panic("DMASequencer::MemSlavePort::recvFunctional() not implemented!\n"); } 897720Sgblack@eecs.umich.edu 907720Sgblack@eecs.umich.edu AddrRangeList getAddrRanges() const 917720Sgblack@eecs.umich.edu { AddrRangeList ranges; return ranges; } 927720Sgblack@eecs.umich.edu 937720Sgblack@eecs.umich.edu private: 947720Sgblack@eecs.umich.edu bool isPhysMemAddress(Addr addr) const; 957720Sgblack@eecs.umich.edu }; 967720Sgblack@eecs.umich.edu 977720Sgblack@eecs.umich.edu BaseSlavePort &getSlavePort(const std::string &if_name, 987720Sgblack@eecs.umich.edu PortID idx = InvalidPortID); 997720Sgblack@eecs.umich.edu 1007720Sgblack@eecs.umich.edu /* external interface */ 1017720Sgblack@eecs.umich.edu RequestStatus makeRequest(PacketPtr pkt); 1027720Sgblack@eecs.umich.edu bool busy() { return m_is_busy;} 1037720Sgblack@eecs.umich.edu int outstandingCount() const { return (m_is_busy ? 1 : 0); } 1047720Sgblack@eecs.umich.edu bool isDeadlockEventScheduled() const { return false; } 1057720Sgblack@eecs.umich.edu void descheduleDeadlockEvent() {} 1067720Sgblack@eecs.umich.edu 1077303Sgblack@eecs.umich.edu // Called by the controller to give the sequencer a pointer. 1087720Sgblack@eecs.umich.edu // A pointer to the controller is needed for atomic support. 1097279Sgblack@eecs.umich.edu void setController(AbstractController* _cntrl) { m_controller = _cntrl; } 1107720Sgblack@eecs.umich.edu uint32_t getId() { return m_version; } 1117720Sgblack@eecs.umich.edu DrainState drain() M5_ATTR_OVERRIDE; 1127720Sgblack@eecs.umich.edu 1137720Sgblack@eecs.umich.edu /* SLICC callback */ 1147720Sgblack@eecs.umich.edu void dataCallback(const DataBlock & dblk); 1157720Sgblack@eecs.umich.edu void ackCallback(); 1167148Sgblack@eecs.umich.edu 1177720Sgblack@eecs.umich.edu void recordRequestType(DMASequencerRequestType requestType); 1187184Sgblack@eecs.umich.edu 1197310Sgblack@eecs.umich.edu private: 1207310Sgblack@eecs.umich.edu void issueNext(); 1217720Sgblack@eecs.umich.edu void ruby_hit_callback(PacketPtr pkt); 1227720Sgblack@eecs.umich.edu void testDrainComplete(); 1237720Sgblack@eecs.umich.edu 1247186Sgblack@eecs.umich.edu /** 1257720Sgblack@eecs.umich.edu * Called by the PIO port when receiving a timing response. 1267119Sgblack@eecs.umich.edu * 1277720Sgblack@eecs.umich.edu * @param pkt Response packet 1287137Sgblack@eecs.umich.edu * @param master_port_id Port id of the PIO port 1297720Sgblack@eecs.umich.edu * 1307720Sgblack@eecs.umich.edu * @return Whether successfully sent 1317720Sgblack@eecs.umich.edu */ 1327720Sgblack@eecs.umich.edu bool recvTimingResp(PacketPtr pkt, PortID master_port_id); 1337720Sgblack@eecs.umich.edu unsigned int getChildDrainCount(); 1347720Sgblack@eecs.umich.edu 1357720Sgblack@eecs.umich.edu private: 1367720Sgblack@eecs.umich.edu uint32_t m_version; 1377720Sgblack@eecs.umich.edu AbstractController* m_controller; 1387720Sgblack@eecs.umich.edu MessageBuffer* m_mandatory_q_ptr; 1397720Sgblack@eecs.umich.edu bool m_usingRubyTester; 1407720Sgblack@eecs.umich.edu 1417720Sgblack@eecs.umich.edu MemSlavePort slave_port; 1427720Sgblack@eecs.umich.edu 1437720Sgblack@eecs.umich.edu System* system; 1447720Sgblack@eecs.umich.edu 1457720Sgblack@eecs.umich.edu bool retry; 1467720Sgblack@eecs.umich.edu bool m_is_busy; 1477720Sgblack@eecs.umich.edu uint64_t m_data_block_mask; 1487137Sgblack@eecs.umich.edu DMARequest active_request; 1497720Sgblack@eecs.umich.edu}; 1507720Sgblack@eecs.umich.edu 1517720Sgblack@eecs.umich.edu#endif // __MEM_RUBY_SYSTEM_DMASEQUENCER_HH__ 1527720Sgblack@eecs.umich.edu