gem5  [DEVELOP-FOR-23.0]
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
pagetable_walker.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021 Advanced Micro Devices, Inc.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  * this list of conditions and the following disclaimer.
10  *
11  * 2. Redistributions in binary form must reproduce the above copyright notice,
12  * this list of conditions and the following disclaimer in the documentation
13  * and/or other materials provided with the distribution.
14  *
15  * 3. Neither the name of the copyright holder nor the names of its
16  * contributors may be used to endorse or promote products derived from this
17  * software without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #ifndef __DEV_AMDGPU_PAGETABLE_WALKER_HH__
33 #define __DEV_AMDGPU_PAGETABLE_WALKER_HH__
34 
35 #include <vector>
36 
38 #include "arch/amdgpu/vega/tlb.hh"
39 #include "base/types.hh"
40 #include "debug/GPUPTWalker.hh"
41 #include "mem/packet.hh"
42 #include "params/VegaPagetableWalker.hh"
43 #include "sim/clocked_object.hh"
44 #include "sim/system.hh"
45 
46 namespace gem5
47 {
48 
49 class ThreadContext;
50 
51 namespace VegaISA
52 {
53 
54 class Walker : public ClockedObject
55 {
56  protected:
57  // Port for accessing memory
58  class WalkerPort : public RequestPort
59  {
60  public:
61  WalkerPort(const std::string &_name, Walker * _walker) :
62  RequestPort(_name), walker(_walker)
63  {}
64 
65  protected:
67 
68  bool recvTimingResp(PacketPtr pkt);
69  void recvReqRetry();
70  };
71 
72  friend class WalkerPort;
74 
75  // State to track each walk of the page table
77  {
78  friend class Walker;
79 
80  private:
81  enum State
82  {
86  };
87 
88  protected:
92  int dataSize;
93  bool enableNX;
94  VegaTlbEntry entry;
98  bool retrying;
99  bool started;
100  bool timing;
102 
103  public:
104  WalkerState(Walker *_walker, PacketPtr pkt, bool is_functional = false)
105  : walker(_walker), state(Ready), nextState(Ready), dataSize(8),
106  enableNX(true), retrying(false), started(false), tlbPkt(pkt)
107  {
108  DPRINTF(GPUPTWalker, "Walker::WalkerState %p %p %d\n",
109  this, walker, state);
110  }
111 
113  bool is_functional = false);
114  void startWalk();
116  unsigned &logBytes);
117 
118  bool isRetrying();
119  void retry();
120  std::string name() const { return walker->name(); }
121  Walker* getWalker() const { return walker; }
122 
123  private:
124  Fault stepWalk();
125  void stepTimingWalk();
126  void walkStateMachine(PageTableEntry &pte, Addr &nextRead,
127  bool &doEndWalk, Fault &fault);
128  void sendPackets();
129  void endWalk();
130  Fault pageFault(bool present);
131  uint64_t offsetFunc(Addr logicalAddr, int top, int lsb);
132  };
133 
134  friend class WalkerState;
135  // State for timing and atomic accesses (need multiple per walker in
136  // the case of multiple outstanding requests in timing mode)
138  // State for functional accesses (only need one of these per walker)
140 
142  {
145  senderWalk(_senderWalk) {}
146  };
147 
148  public:
149  // Kick off the state machine.
152  unsigned &logBytes, BaseMMU::Mode mode);
153  Fault startFunctional(Addr base, Addr &addr, unsigned &logBytes,
154  BaseMMU::Mode mode, bool &isSystem);
155 
156  Port &getPort(const std::string &if_name,
157  PortID idx=InvalidPortID) override;
158 
159  Addr getBaseAddr() const { return baseAddr; }
161 
164 
165  protected:
166  // The TLB we're supposed to load.
169 
170  // Base address set by MAP_PROCESS packet
173 
174  // Functions for dealing with packets.
175  void recvTimingResp(PacketPtr pkt);
176  void recvReqRetry();
177  bool sendTiming(WalkerState * sendingState, PacketPtr pkt);
178 
179  void walkerResponse(WalkerState *state, VegaTlbEntry& entry,
180  PacketPtr pkt);
181 
182  // System pointer for functional accesses
184 
185  public:
186  void setTLB(GpuTLB * _tlb)
187  {
188  assert(tlb == nullptr); // only set it once
189  tlb = _tlb;
190  }
191 
192  Walker(const VegaPagetableWalkerParams &p)
193  : ClockedObject(p),
194  port(name() + ".port", this),
195  funcState(this, nullptr, true), tlb(nullptr),
196  requestorId(p.system->getRequestorId(this)),
198  {
199  DPRINTF(GPUPTWalker, "Walker::Walker %p\n", this);
200  }
201 };
202 
203 } // namespace VegaISA
204 } // namespace gem5
205 
206 #endif // __DEV_AMDGPU_PAGETABLE_WALKER_HH__
gem5::VegaISA::Walker::WalkerState::name
std::string name() const
Definition: pagetable_walker.hh:120
gem5::PortID
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
Definition: types.hh:245
gem5::VegaISA::Walker::recvReqRetry
void recvReqRetry()
Definition: pagetable_walker.cc:405
gem5::VegaISA::Walker::WalkerState::started
bool started
Definition: pagetable_walker.hh:99
gem5::VegaISA::Walker::port
WalkerPort port
Definition: pagetable_walker.hh:73
gem5::VegaISA::Walker::WalkerPort::recvReqRetry
void recvReqRetry()
Called by the peer if sendTimingReq was called on this peer (causing recvTimingReq to be called on th...
Definition: pagetable_walker.cc:399
system.hh
gem5::VegaISA::Walker::getBaseAddr
Addr getBaseAddr() const
Definition: pagetable_walker.hh:159
gem5::VegaISA::Walker::Walker
Walker(const VegaPagetableWalkerParams &p)
Definition: pagetable_walker.hh:192
gem5::VegaISA::Walker::WalkerState::stepTimingWalk
void stepTimingWalk()
gem5::VegaISA::Walker::WalkerState::getWalker
Walker * getWalker() const
Definition: pagetable_walker.hh:121
gem5::VegaISA::Walker::WalkerState::stepWalk
Fault stepWalk()
Definition: pagetable_walker.cc:199
gem5::VegaISA::Walker::WalkerState::pageFault
Fault pageFault(bool present)
Definition: pagetable_walker.cc:442
gem5::VegaISA::Walker::WalkerState::walker
Walker * walker
Definition: pagetable_walker.hh:89
gem5::VegaISA::Walker::WalkerState::entry
VegaTlbEntry entry
Definition: pagetable_walker.hh:94
gem5::BaseMMU::Mode
Mode
Definition: mmu.hh:56
gem5::VegaISA::Walker::deviceRequestorId
RequestorID deviceRequestorId
Definition: pagetable_walker.hh:172
gem5::VegaISA::GpuTLB
Definition: tlb.hh:62
gem5::VegaISA::Walker::recvTimingResp
void recvTimingResp(PacketPtr pkt)
Definition: pagetable_walker.cc:386
gem5::VegaISA::Walker::funcState
WalkerState funcState
Definition: pagetable_walker.hh:139
gem5::VegaISA::Walker::WalkerState::startFunctional
Fault startFunctional(Addr base, Addr vaddr, PageTableEntry &pte, unsigned &logBytes)
Definition: pagetable_walker.cc:73
gem5::VegaISA::Walker::WalkerState::PDE0
@ PDE0
Definition: pagetable_walker.hh:85
gem5::VegaISA::Walker::WalkerState::timingFault
Fault timingFault
Definition: pagetable_walker.hh:96
top
Definition: test.h:61
gem5::VegaISA::Walker::startTiming
void startTiming(PacketPtr pkt, Addr base, Addr vaddr, BaseMMU::Mode mode)
Definition: pagetable_walker.cc:108
gem5::VegaISA::Walker::WalkerSenderState::WalkerSenderState
WalkerSenderState(WalkerState *_senderWalk)
Definition: pagetable_walker.hh:144
gem5::X86ISA::base
Bitfield< 51, 12 > base
Definition: pagetable.hh:141
gem5::InvalidPortID
const PortID InvalidPortID
Definition: types.hh:246
tlb.hh
gem5::VegaISA::Walker::WalkerState::tlbPkt
PacketPtr tlbPkt
Definition: pagetable_walker.hh:101
gem5::VegaISA::Walker::WalkerState::endWalk
void endWalk()
Definition: pagetable_walker.cc:331
gem5::VegaISA::Walker::sendTiming
bool sendTiming(WalkerState *sendingState, PacketPtr pkt)
Definition: pagetable_walker.cc:360
gem5::VegaISA::Walker::tlb
GpuTLB * tlb
Definition: pagetable_walker.hh:167
packet.hh
gem5::RequestPort
A RequestPort is a specialisation of a Port, which implements the default protocol for the three diff...
Definition: port.hh:118
gem5::VegaISA::Walker::WalkerState::state
State state
Definition: pagetable_walker.hh:90
gem5::VegaISA::Walker::startFunctional
Fault startFunctional(Addr base, Addr vaddr, PageTableEntry &pte, unsigned &logBytes, BaseMMU::Mode mode)
Definition: pagetable_walker.cc:62
gem5::VegaISA::Walker::setBaseAddr
void setBaseAddr(Addr ta)
Definition: pagetable_walker.hh:160
gem5::MipsISA::ta
Bitfield< 19, 16 > ta
Definition: pra_constants.hh:255
gem5::VegaISA::Walker::WalkerState::startWalk
void startWalk()
Definition: pagetable_walker.cc:161
gem5::VegaISA::Walker::WalkerState
Definition: pagetable_walker.hh:76
gem5::X86ISA::present
Bitfield< 7 > present
Definition: misc.hh:999
gem5::VegaISA::Walker::requestorId
RequestorID requestorId
Definition: pagetable_walker.hh:168
gem5::VegaISA::Walker::walkerResponse
void walkerResponse(WalkerState *state, VegaTlbEntry &entry, PacketPtr pkt)
Definition: pagetable_walker.cc:417
gem5::System
Definition: system.hh:74
gem5::VegaISA::Walker::WalkerPort
Definition: pagetable_walker.hh:58
gem5::VegaISA::Walker::WalkerState::dataSize
int dataSize
Definition: pagetable_walker.hh:92
gem5::Named::name
virtual std::string name() const
Definition: named.hh:47
gem5::Fault
std::shared_ptr< FaultBase > Fault
Definition: types.hh:248
gem5::VegaISA::p
Bitfield< 54 > p
Definition: pagetable.hh:70
DPRINTF
#define DPRINTF(x,...)
Definition: trace.hh:210
gem5::Packet
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition: packet.hh:294
gem5::VegaISA::Walker::WalkerState::State
State
Definition: pagetable_walker.hh:81
gem5::VegaISA::Walker::baseAddr
Addr baseAddr
Definition: pagetable_walker.hh:171
gem5::VegaISA::Walker::WalkerState::offsetFunc
uint64_t offsetFunc(Addr logicalAddr, int top, int lsb)
Definition: pagetable_walker.cc:458
gem5::VegaISA::Walker::system
System * system
Definition: pagetable_walker.hh:183
gem5::VegaISA::Walker::WalkerState::retrying
bool retrying
Definition: pagetable_walker.hh:98
gem5::VegaISA::Walker::WalkerState::read
PacketPtr read
Definition: pagetable_walker.hh:95
gem5::VegaISA::Walker::WalkerState::Ready
@ Ready
Definition: pagetable_walker.hh:83
gem5::SparcISA::PageTableEntry
Definition: pagetable.hh:68
gem5::VegaISA::Walker::WalkerState::timing
bool timing
Definition: pagetable_walker.hh:100
gem5::VegaISA::Walker::getDevRequestor
RequestorID getDevRequestor() const
Definition: pagetable_walker.hh:163
gem5::VegaISA::Walker::setTLB
void setTLB(GpuTLB *_tlb)
Definition: pagetable_walker.hh:186
gem5::VegaISA::Walker::WalkerState::nextState
State nextState
Definition: pagetable_walker.hh:91
gem5::Packet::SenderState
A virtual base opaque structure used to hold state associated with the packet (e.g....
Definition: packet.hh:468
gem5::VegaISA::Walker::WalkerPort::walker
Walker * walker
Definition: pagetable_walker.hh:66
gem5::VegaISA::Walker::currStates
std::list< WalkerState * > currStates
Definition: pagetable_walker.hh:137
gem5::Addr
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:147
gem5::ClockedObject
The ClockedObject class extends the SimObject with a clock and accessor functions to relate ticks to ...
Definition: clocked_object.hh:234
gem5::VegaISA::Walker::getPort
Port & getPort(const std::string &if_name, PortID idx=InvalidPortID) override
gem5 methods
Definition: pagetable_walker.cc:470
gem5::VegaISA::Walker::WalkerState::isRetrying
bool isRetrying()
Definition: pagetable_walker.cc:429
gem5::VegaISA::Walker::WalkerPort::WalkerPort
WalkerPort(const std::string &_name, Walker *_walker)
Definition: pagetable_walker.hh:61
state
atomic_var_t state
Definition: helpers.cc:188
gem5::VegaISA::Walker::WalkerPort::recvTimingResp
bool recvTimingResp(PacketPtr pkt)
Receive a timing response from the peer.
Definition: pagetable_walker.cc:378
gem5::Port
Ports are used to interface objects to each other.
Definition: port.hh:61
types.hh
pagetable.hh
gem5::VegaISA::Walker::WalkerState::WalkerState
WalkerState(Walker *_walker, PacketPtr pkt, bool is_functional=false)
Definition: pagetable_walker.hh:104
gem5::VegaISA::Walker::WalkerState::initState
void initState(BaseMMU::Mode _mode, Addr baseAddr, Addr vaddr, bool is_functional=false)
Definition: pagetable_walker.cc:123
clocked_object.hh
gem5::VegaISA::Walker::WalkerState::PDE2
@ PDE2
Definition: pagetable_walker.hh:85
gem5::VegaISA::Walker::WalkerState::PDE1
@ PDE1
Definition: pagetable_walker.hh:85
gem5::RequestorID
uint16_t RequestorID
Definition: request.hh:95
gem5::MipsISA::vaddr
vaddr
Definition: pra_constants.hh:278
gem5::VegaISA::Walker::WalkerState::sendPackets
void sendPackets()
Port related methods.
Definition: pagetable_walker.cc:343
gem5::VegaISA::Walker::WalkerState::mode
BaseMMU::Mode mode
Definition: pagetable_walker.hh:97
std::list
STL list class.
Definition: stl.hh:51
gem5::VegaISA::Walker::setDevRequestor
void setDevRequestor(RequestorID mid)
Definition: pagetable_walker.hh:162
gem5::VegaISA::Walker::WalkerState::enableNX
bool enableNX
Definition: pagetable_walker.hh:93
gem5
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
Definition: gpu_translation_state.hh:37
gem5::VegaISA::Walker::WalkerState::walkStateMachine
void walkStateMachine(PageTableEntry &pte, Addr &nextRead, bool &doEndWalk, Fault &fault)
Definition: pagetable_walker.cc:233
gem5::VegaISA::Walker::WalkerState::retry
void retry()
Definition: pagetable_walker.cc:435
gem5::VegaISA::Walker::WalkerState::Waiting
@ Waiting
Definition: pagetable_walker.hh:84
gem5::VegaISA::Walker::WalkerSenderState::senderWalk
WalkerState * senderWalk
Definition: pagetable_walker.hh:143
gem5::ArmISA::PTE
Definition: pagetable.hh:76
gem5::Named::_name
const std::string _name
Definition: named.hh:41
gem5::VegaISA::Walker
Definition: pagetable_walker.hh:54
gem5::ArmISA::mode
Bitfield< 4, 0 > mode
Definition: misc_types.hh:74
gem5::X86ISA::addr
Bitfield< 3 > addr
Definition: types.hh:84
gem5::VegaISA::Walker::WalkerSenderState
Definition: pagetable_walker.hh:141

Generated on Sun Jul 30 2023 01:56:47 for gem5 by doxygen 1.8.17