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
2912492Sodanrc@yahoo.com.br#ifndef __MEM_RUBY_SLICC_INTERFACE_RUBYREQUEST_HH__
3012492Sodanrc@yahoo.com.br#define __MEM_RUBY_SLICC_INTERFACE_RUBYREQUEST_HH__
318092Snilay@cs.wisc.edu
328092Snilay@cs.wisc.edu#include <ostream>
3311305Sblake.hechtman@amd.com#include <vector>
348092Snilay@cs.wisc.edu
358092Snilay@cs.wisc.edu#include "mem/ruby/common/Address.hh"
3611305Sblake.hechtman@amd.com#include "mem/ruby/common/DataBlock.hh"
3711307Santhony.gutierrez@amd.com#include "mem/ruby/common/WriteMask.hh"
3814184Sgabeblack@google.com#include "mem/ruby/protocol/HSAScope.hh"
3914184Sgabeblack@google.com#include "mem/ruby/protocol/HSASegment.hh"
4014184Sgabeblack@google.com#include "mem/ruby/protocol/Message.hh"
4114184Sgabeblack@google.com#include "mem/ruby/protocol/PrefetchBit.hh"
4214184Sgabeblack@google.com#include "mem/ruby/protocol/RubyAccessMode.hh"
4314184Sgabeblack@google.com#include "mem/ruby/protocol/RubyRequestType.hh"
448092Snilay@cs.wisc.edu
458174Snilay@cs.wisc.educlass RubyRequest : public Message
468092Snilay@cs.wisc.edu{
478092Snilay@cs.wisc.edu  public:
4811025Snilay@cs.wisc.edu    Addr m_PhysicalAddress;
4911025Snilay@cs.wisc.edu    Addr m_LineAddress;
508174Snilay@cs.wisc.edu    RubyRequestType m_Type;
5111025Snilay@cs.wisc.edu    Addr m_ProgramCounter;
528174Snilay@cs.wisc.edu    RubyAccessMode m_AccessMode;
538174Snilay@cs.wisc.edu    int m_Size;
548174Snilay@cs.wisc.edu    PrefetchBit m_Prefetch;
558092Snilay@cs.wisc.edu    uint8_t* data;
5611459Smatthew.poremba@amd.com    PacketPtr m_pkt;
5711005Sandreas.sandberg@arm.com    ContextID m_contextId;
5811307Santhony.gutierrez@amd.com    WriteMask m_writeMask;
5911307Santhony.gutierrez@amd.com    DataBlock m_WTData;
6011305Sblake.hechtman@amd.com    int m_wfid;
6111305Sblake.hechtman@amd.com    HSAScope m_scope;
6211305Sblake.hechtman@amd.com    HSASegment m_segment;
6311305Sblake.hechtman@amd.com
648092Snilay@cs.wisc.edu
659508Snilay@cs.wisc.edu    RubyRequest(Tick curTime, uint64_t _paddr, uint8_t* _data, int _len,
669466Snilay@cs.wisc.edu        uint64_t _pc, RubyRequestType _type, RubyAccessMode _access_mode,
679466Snilay@cs.wisc.edu        PacketPtr _pkt, PrefetchBit _pb = PrefetchBit_No,
6811305Sblake.hechtman@amd.com        ContextID _proc_id = 100, ContextID _core_id = 99,
6911305Sblake.hechtman@amd.com        HSAScope _scope = HSAScope_UNSPECIFIED,
7011305Sblake.hechtman@amd.com        HSASegment _segment = HSASegment_GLOBAL)
719466Snilay@cs.wisc.edu        : Message(curTime),
729466Snilay@cs.wisc.edu          m_PhysicalAddress(_paddr),
738174Snilay@cs.wisc.edu          m_Type(_type),
748174Snilay@cs.wisc.edu          m_ProgramCounter(_pc),
758174Snilay@cs.wisc.edu          m_AccessMode(_access_mode),
768174Snilay@cs.wisc.edu          m_Size(_len),
778174Snilay@cs.wisc.edu          m_Prefetch(_pb),
788092Snilay@cs.wisc.edu          data(_data),
7911459Smatthew.poremba@amd.com          m_pkt(_pkt),
8011305Sblake.hechtman@amd.com          m_contextId(_core_id),
8111305Sblake.hechtman@amd.com          m_scope(_scope),
8211305Sblake.hechtman@amd.com          m_segment(_segment)
838174Snilay@cs.wisc.edu    {
8411305Sblake.hechtman@amd.com        m_LineAddress = makeLineAddress(m_PhysicalAddress);
858174Snilay@cs.wisc.edu    }
868174Snilay@cs.wisc.edu
8711305Sblake.hechtman@amd.com    RubyRequest(Tick curTime, uint64_t _paddr, uint8_t* _data, int _len,
8811305Sblake.hechtman@amd.com        uint64_t _pc, RubyRequestType _type,
8911305Sblake.hechtman@amd.com        RubyAccessMode _access_mode, PacketPtr _pkt, PrefetchBit _pb,
9011305Sblake.hechtman@amd.com        unsigned _proc_id, unsigned _core_id,
9111305Sblake.hechtman@amd.com        int _wm_size, std::vector<bool> & _wm_mask,
9211305Sblake.hechtman@amd.com        DataBlock & _Data,
9311305Sblake.hechtman@amd.com        HSAScope _scope = HSAScope_UNSPECIFIED,
9411305Sblake.hechtman@amd.com        HSASegment _segment = HSASegment_GLOBAL)
9511305Sblake.hechtman@amd.com        : Message(curTime),
9611305Sblake.hechtman@amd.com          m_PhysicalAddress(_paddr),
9711305Sblake.hechtman@amd.com          m_Type(_type),
9811305Sblake.hechtman@amd.com          m_ProgramCounter(_pc),
9911305Sblake.hechtman@amd.com          m_AccessMode(_access_mode),
10011305Sblake.hechtman@amd.com          m_Size(_len),
10111305Sblake.hechtman@amd.com          m_Prefetch(_pb),
10211305Sblake.hechtman@amd.com          data(_data),
10311459Smatthew.poremba@amd.com          m_pkt(_pkt),
10411305Sblake.hechtman@amd.com          m_contextId(_core_id),
10511307Santhony.gutierrez@amd.com          m_writeMask(_wm_size,_wm_mask),
10611307Santhony.gutierrez@amd.com          m_WTData(_Data),
10711305Sblake.hechtman@amd.com          m_wfid(_proc_id),
10811305Sblake.hechtman@amd.com          m_scope(_scope),
10911305Sblake.hechtman@amd.com          m_segment(_segment)
11011305Sblake.hechtman@amd.com    {
11111305Sblake.hechtman@amd.com        m_LineAddress = makeLineAddress(m_PhysicalAddress);
11211305Sblake.hechtman@amd.com    }
11311305Sblake.hechtman@amd.com
11411305Sblake.hechtman@amd.com    RubyRequest(Tick curTime, uint64_t _paddr, uint8_t* _data, int _len,
11511305Sblake.hechtman@amd.com        uint64_t _pc, RubyRequestType _type,
11611305Sblake.hechtman@amd.com        RubyAccessMode _access_mode, PacketPtr _pkt, PrefetchBit _pb,
11711305Sblake.hechtman@amd.com        unsigned _proc_id, unsigned _core_id,
11811305Sblake.hechtman@amd.com        int _wm_size, std::vector<bool> & _wm_mask,
11911305Sblake.hechtman@amd.com        DataBlock & _Data,
12011305Sblake.hechtman@amd.com        std::vector< std::pair<int,AtomicOpFunctor*> > _atomicOps,
12111305Sblake.hechtman@amd.com        HSAScope _scope = HSAScope_UNSPECIFIED,
12211305Sblake.hechtman@amd.com        HSASegment _segment = HSASegment_GLOBAL)
12311305Sblake.hechtman@amd.com        : Message(curTime),
12411305Sblake.hechtman@amd.com          m_PhysicalAddress(_paddr),
12511305Sblake.hechtman@amd.com          m_Type(_type),
12611305Sblake.hechtman@amd.com          m_ProgramCounter(_pc),
12711305Sblake.hechtman@amd.com          m_AccessMode(_access_mode),
12811305Sblake.hechtman@amd.com          m_Size(_len),
12911305Sblake.hechtman@amd.com          m_Prefetch(_pb),
13011305Sblake.hechtman@amd.com          data(_data),
13111459Smatthew.poremba@amd.com          m_pkt(_pkt),
13211305Sblake.hechtman@amd.com          m_contextId(_core_id),
13311307Santhony.gutierrez@amd.com          m_writeMask(_wm_size,_wm_mask,_atomicOps),
13411307Santhony.gutierrez@amd.com          m_WTData(_Data),
13511305Sblake.hechtman@amd.com          m_wfid(_proc_id),
13611305Sblake.hechtman@amd.com          m_scope(_scope),
13711305Sblake.hechtman@amd.com          m_segment(_segment)
13811305Sblake.hechtman@amd.com    {
13911305Sblake.hechtman@amd.com        m_LineAddress = makeLineAddress(m_PhysicalAddress);
14011305Sblake.hechtman@amd.com    }
14111305Sblake.hechtman@amd.com
14211305Sblake.hechtman@amd.com
1439508Snilay@cs.wisc.edu    RubyRequest(Tick curTime) : Message(curTime) {}
14410472Sandreas.hansson@arm.com    MsgPtr clone() const
14510472Sandreas.hansson@arm.com    { return std::shared_ptr<Message>(new RubyRequest(*this)); }
1468174Snilay@cs.wisc.edu
14711025Snilay@cs.wisc.edu    Addr getLineAddress() const { return m_LineAddress; }
14811025Snilay@cs.wisc.edu    Addr getPhysicalAddress() const { return m_PhysicalAddress; }
1499508Snilay@cs.wisc.edu    const RubyRequestType& getType() const { return m_Type; }
15011025Snilay@cs.wisc.edu    Addr getProgramCounter() const { return m_ProgramCounter; }
1519508Snilay@cs.wisc.edu    const RubyAccessMode& getAccessMode() const { return m_AccessMode; }
1529508Snilay@cs.wisc.edu    const int& getSize() const { return m_Size; }
1539508Snilay@cs.wisc.edu    const PrefetchBit& getPrefetch() const { return m_Prefetch; }
1548092Snilay@cs.wisc.edu
1558092Snilay@cs.wisc.edu    void print(std::ostream& out) const;
1569302Snilay@cs.wisc.edu    bool functionalRead(Packet *pkt);
1579302Snilay@cs.wisc.edu    bool functionalWrite(Packet *pkt);
1588092Snilay@cs.wisc.edu};
1598092Snilay@cs.wisc.edu
1608174Snilay@cs.wisc.eduinline std::ostream&
1618174Snilay@cs.wisc.eduoperator<<(std::ostream& out, const RubyRequest& obj)
1628174Snilay@cs.wisc.edu{
1638174Snilay@cs.wisc.edu  obj.print(out);
1648174Snilay@cs.wisc.edu  out << std::flush;
1658174Snilay@cs.wisc.edu  return out;
1668174Snilay@cs.wisc.edu}
1678092Snilay@cs.wisc.edu
16812492Sodanrc@yahoo.com.br#endif  //__MEM_RUBY_SLICC_INTERFACE_RUBYREQUEST_HH__
169