RubyRequest.hh revision 11305
18092Snilay@cs.wisc.edu/*
28092Snilay@cs.wisc.edu * Copyright (c) 2009 Mark D. Hill and David A. Wood
38092Snilay@cs.wisc.edu * All rights reserved.
48092Snilay@cs.wisc.edu *
58092Snilay@cs.wisc.edu * Redistribution and use in source and binary forms, with or without
68092Snilay@cs.wisc.edu * modification, are permitted provided that the following conditions are
78092Snilay@cs.wisc.edu * met: redistributions of source code must retain the above copyright
88092Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer;
98092Snilay@cs.wisc.edu * redistributions in binary form must reproduce the above copyright
108092Snilay@cs.wisc.edu * notice, this list of conditions and the following disclaimer in the
118092Snilay@cs.wisc.edu * documentation and/or other materials provided with the distribution;
128092Snilay@cs.wisc.edu * neither the name of the copyright holders nor the names of its
138092Snilay@cs.wisc.edu * contributors may be used to endorse or promote products derived from
148092Snilay@cs.wisc.edu * this software without specific prior written permission.
158092Snilay@cs.wisc.edu *
168092Snilay@cs.wisc.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
178092Snilay@cs.wisc.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
188092Snilay@cs.wisc.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
198092Snilay@cs.wisc.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
208092Snilay@cs.wisc.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
218092Snilay@cs.wisc.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
228092Snilay@cs.wisc.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
238092Snilay@cs.wisc.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
248092Snilay@cs.wisc.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258092Snilay@cs.wisc.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
268092Snilay@cs.wisc.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278092Snilay@cs.wisc.edu */
288092Snilay@cs.wisc.edu
298092Snilay@cs.wisc.edu#ifndef __MEM_RUBY_SLICC_INTERFACE_RUBY_REQUEST_HH__
308092Snilay@cs.wisc.edu#define __MEM_RUBY_SLICC_INTERFACE_RUBY_REQUEST_HH__
318092Snilay@cs.wisc.edu
328092Snilay@cs.wisc.edu#include <ostream>
3311305Sblake.hechtman@amd.com#include <vector>
348092Snilay@cs.wisc.edu
3511305Sblake.hechtman@amd.com#include "mem/protocol/HSAScope.hh"
3611305Sblake.hechtman@amd.com#include "mem/protocol/HSASegment.hh"
378229Snate@binkert.org#include "mem/protocol/Message.hh"
388229Snate@binkert.org#include "mem/protocol/PrefetchBit.hh"
398164Snilay@cs.wisc.edu#include "mem/protocol/RubyAccessMode.hh"
408165Snilay@cs.wisc.edu#include "mem/protocol/RubyRequestType.hh"
418092Snilay@cs.wisc.edu#include "mem/ruby/common/Address.hh"
4211305Sblake.hechtman@amd.com#include "mem/ruby/common/DataBlock.hh"
438092Snilay@cs.wisc.edu
448174Snilay@cs.wisc.educlass RubyRequest : public Message
458092Snilay@cs.wisc.edu{
468092Snilay@cs.wisc.edu  public:
4711025Snilay@cs.wisc.edu    Addr m_PhysicalAddress;
4811025Snilay@cs.wisc.edu    Addr m_LineAddress;
498174Snilay@cs.wisc.edu    RubyRequestType m_Type;
5011025Snilay@cs.wisc.edu    Addr m_ProgramCounter;
518174Snilay@cs.wisc.edu    RubyAccessMode m_AccessMode;
528174Snilay@cs.wisc.edu    int m_Size;
538174Snilay@cs.wisc.edu    PrefetchBit m_Prefetch;
548092Snilay@cs.wisc.edu    uint8_t* data;
558092Snilay@cs.wisc.edu    PacketPtr pkt;
5611005Sandreas.sandberg@arm.com    ContextID m_contextId;
5711305Sblake.hechtman@amd.com    int m_wfid;
5811305Sblake.hechtman@amd.com    HSAScope m_scope;
5911305Sblake.hechtman@amd.com    HSASegment m_segment;
6011305Sblake.hechtman@amd.com
618092Snilay@cs.wisc.edu
629508Snilay@cs.wisc.edu    RubyRequest(Tick curTime, uint64_t _paddr, uint8_t* _data, int _len,
639466Snilay@cs.wisc.edu        uint64_t _pc, RubyRequestType _type, RubyAccessMode _access_mode,
649466Snilay@cs.wisc.edu        PacketPtr _pkt, PrefetchBit _pb = PrefetchBit_No,
6511305Sblake.hechtman@amd.com        ContextID _proc_id = 100, ContextID _core_id = 99,
6611305Sblake.hechtman@amd.com        HSAScope _scope = HSAScope_UNSPECIFIED,
6711305Sblake.hechtman@amd.com        HSASegment _segment = HSASegment_GLOBAL)
689466Snilay@cs.wisc.edu        : Message(curTime),
699466Snilay@cs.wisc.edu          m_PhysicalAddress(_paddr),
708174Snilay@cs.wisc.edu          m_Type(_type),
718174Snilay@cs.wisc.edu          m_ProgramCounter(_pc),
728174Snilay@cs.wisc.edu          m_AccessMode(_access_mode),
738174Snilay@cs.wisc.edu          m_Size(_len),
748174Snilay@cs.wisc.edu          m_Prefetch(_pb),
758092Snilay@cs.wisc.edu          data(_data),
768092Snilay@cs.wisc.edu          pkt(_pkt),
7711305Sblake.hechtman@amd.com          m_contextId(_core_id),
7811305Sblake.hechtman@amd.com          m_scope(_scope),
7911305Sblake.hechtman@amd.com          m_segment(_segment)
808174Snilay@cs.wisc.edu    {
8111305Sblake.hechtman@amd.com        m_LineAddress = makeLineAddress(m_PhysicalAddress);
828174Snilay@cs.wisc.edu    }
838174Snilay@cs.wisc.edu
8411305Sblake.hechtman@amd.com    RubyRequest(Tick curTime, uint64_t _paddr, uint8_t* _data, int _len,
8511305Sblake.hechtman@amd.com        uint64_t _pc, RubyRequestType _type,
8611305Sblake.hechtman@amd.com        RubyAccessMode _access_mode, PacketPtr _pkt, PrefetchBit _pb,
8711305Sblake.hechtman@amd.com        unsigned _proc_id, unsigned _core_id,
8811305Sblake.hechtman@amd.com        int _wm_size, std::vector<bool> & _wm_mask,
8911305Sblake.hechtman@amd.com        DataBlock & _Data,
9011305Sblake.hechtman@amd.com        HSAScope _scope = HSAScope_UNSPECIFIED,
9111305Sblake.hechtman@amd.com        HSASegment _segment = HSASegment_GLOBAL)
9211305Sblake.hechtman@amd.com        : Message(curTime),
9311305Sblake.hechtman@amd.com          m_PhysicalAddress(_paddr),
9411305Sblake.hechtman@amd.com          m_Type(_type),
9511305Sblake.hechtman@amd.com          m_ProgramCounter(_pc),
9611305Sblake.hechtman@amd.com          m_AccessMode(_access_mode),
9711305Sblake.hechtman@amd.com          m_Size(_len),
9811305Sblake.hechtman@amd.com          m_Prefetch(_pb),
9911305Sblake.hechtman@amd.com          data(_data),
10011305Sblake.hechtman@amd.com          pkt(_pkt),
10111305Sblake.hechtman@amd.com          m_contextId(_core_id),
10211305Sblake.hechtman@amd.com          m_wfid(_proc_id),
10311305Sblake.hechtman@amd.com          m_scope(_scope),
10411305Sblake.hechtman@amd.com          m_segment(_segment)
10511305Sblake.hechtman@amd.com    {
10611305Sblake.hechtman@amd.com        m_LineAddress = makeLineAddress(m_PhysicalAddress);
10711305Sblake.hechtman@amd.com    }
10811305Sblake.hechtman@amd.com
10911305Sblake.hechtman@amd.com    RubyRequest(Tick curTime, uint64_t _paddr, uint8_t* _data, int _len,
11011305Sblake.hechtman@amd.com        uint64_t _pc, RubyRequestType _type,
11111305Sblake.hechtman@amd.com        RubyAccessMode _access_mode, PacketPtr _pkt, PrefetchBit _pb,
11211305Sblake.hechtman@amd.com        unsigned _proc_id, unsigned _core_id,
11311305Sblake.hechtman@amd.com        int _wm_size, std::vector<bool> & _wm_mask,
11411305Sblake.hechtman@amd.com        DataBlock & _Data,
11511305Sblake.hechtman@amd.com        std::vector< std::pair<int,AtomicOpFunctor*> > _atomicOps,
11611305Sblake.hechtman@amd.com        HSAScope _scope = HSAScope_UNSPECIFIED,
11711305Sblake.hechtman@amd.com        HSASegment _segment = HSASegment_GLOBAL)
11811305Sblake.hechtman@amd.com        : Message(curTime),
11911305Sblake.hechtman@amd.com          m_PhysicalAddress(_paddr),
12011305Sblake.hechtman@amd.com          m_Type(_type),
12111305Sblake.hechtman@amd.com          m_ProgramCounter(_pc),
12211305Sblake.hechtman@amd.com          m_AccessMode(_access_mode),
12311305Sblake.hechtman@amd.com          m_Size(_len),
12411305Sblake.hechtman@amd.com          m_Prefetch(_pb),
12511305Sblake.hechtman@amd.com          data(_data),
12611305Sblake.hechtman@amd.com          pkt(_pkt),
12711305Sblake.hechtman@amd.com          m_contextId(_core_id),
12811305Sblake.hechtman@amd.com          m_wfid(_proc_id),
12911305Sblake.hechtman@amd.com          m_scope(_scope),
13011305Sblake.hechtman@amd.com          m_segment(_segment)
13111305Sblake.hechtman@amd.com    {
13211305Sblake.hechtman@amd.com        m_LineAddress = makeLineAddress(m_PhysicalAddress);
13311305Sblake.hechtman@amd.com    }
13411305Sblake.hechtman@amd.com
13511305Sblake.hechtman@amd.com
1369508Snilay@cs.wisc.edu    RubyRequest(Tick curTime) : Message(curTime) {}
13710472Sandreas.hansson@arm.com    MsgPtr clone() const
13810472Sandreas.hansson@arm.com    { return std::shared_ptr<Message>(new RubyRequest(*this)); }
1398174Snilay@cs.wisc.edu
14011025Snilay@cs.wisc.edu    Addr getLineAddress() const { return m_LineAddress; }
14111025Snilay@cs.wisc.edu    Addr getPhysicalAddress() const { return m_PhysicalAddress; }
1429508Snilay@cs.wisc.edu    const RubyRequestType& getType() const { return m_Type; }
14311025Snilay@cs.wisc.edu    Addr getProgramCounter() const { return m_ProgramCounter; }
1449508Snilay@cs.wisc.edu    const RubyAccessMode& getAccessMode() const { return m_AccessMode; }
1459508Snilay@cs.wisc.edu    const int& getSize() const { return m_Size; }
1469508Snilay@cs.wisc.edu    const PrefetchBit& getPrefetch() const { return m_Prefetch; }
1478092Snilay@cs.wisc.edu
1488092Snilay@cs.wisc.edu    void print(std::ostream& out) const;
1499302Snilay@cs.wisc.edu    bool functionalRead(Packet *pkt);
1509302Snilay@cs.wisc.edu    bool functionalWrite(Packet *pkt);
1518092Snilay@cs.wisc.edu};
1528092Snilay@cs.wisc.edu
1538174Snilay@cs.wisc.eduinline std::ostream&
1548174Snilay@cs.wisc.eduoperator<<(std::ostream& out, const RubyRequest& obj)
1558174Snilay@cs.wisc.edu{
1568174Snilay@cs.wisc.edu  obj.print(out);
1578174Snilay@cs.wisc.edu  out << std::flush;
1588174Snilay@cs.wisc.edu  return out;
1598174Snilay@cs.wisc.edu}
1608092Snilay@cs.wisc.edu
16111025Snilay@cs.wisc.edu#endif  // __MEM_RUBY_SLICC_INTERFACE_RUBY_REQUEST_HH__
162