gem5  [DEVELOP-FOR-23.0]
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
interrupt_handler.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 
33 #ifndef __DEV_AMDGPU_INTERRUPT_HANDLER__
34 #define __DEV_AMDGPU_INTERRUPT_HANDLER__
35 
36 #include <bitset>
37 #include <iostream>
38 #include <queue>
39 #include <vector>
40 
41 #include "base/addr_range.hh"
42 #include "base/flags.hh"
43 #include "base/types.hh"
45 #include "dev/dma_device.hh"
46 #include "params/AMDGPUInterruptHandler.hh"
47 
48 namespace gem5
49 {
50 
57 {
68 };
69 
71 {
72  CP_EOP = 181,
73  TRAP_ID = 224
74 };
75 
89 constexpr uint32_t INTR_COOKIE_SIZE = 32; // in bytes
90 
91 typedef struct
92 {
93  uint32_t clientId : 8;
94  uint32_t sourceId : 8;
95  uint32_t ringId : 8;
96  uint32_t vmId : 4;
97  uint32_t reserved1 : 3;
98  uint32_t vmid_type : 1;
99  uint32_t timestamp_Lo;
100  uint32_t timestamp_Hi : 16;
101  uint32_t reserved2 : 15;
102  uint32_t timestamp_src : 1;
103  uint32_t pasid : 16;
104  uint32_t reserved3 : 15;
105  uint32_t pasid_src : 1;
106  uint32_t source_data_dw1;
107  uint32_t source_data_dw2;
108  uint32_t source_data_dw3;
109  uint32_t source_data_dw4;
111 static_assert(sizeof(AMDGPUInterruptCookie) == INTR_COOKIE_SIZE);
112 
116 typedef struct
117 {
118  uint32_t IH_Cntl;
119  uint32_t IH_Base;
120  uint32_t IH_Base_Hi;
122  uint32_t IH_Rptr;
123  uint32_t IH_Wptr;
124  uint32_t IH_Wptr_Addr_Lo;
125  uint32_t IH_Wptr_Addr_Hi;
127  uint32_t IH_Doorbell;
128 } AMDGPUIHRegs;
129 
131 {
132  public:
133  class DmaEvent : public Event
134  {
135  private:
137  uint32_t data;
138 
139  public:
142  {
144  }
145  void process();
146  const char *description() const {
147  return "AMDGPUInterruptHandler Dma";
148  }
149 
150  void setData(uint32_t _data) { data = _data; }
151  uint32_t getData() { return data; }
152  };
153 
155  {
157  : saved(sender_state), _addr(addr)
158  {
159  }
162  };
163 
164  AMDGPUInterruptHandler(const AMDGPUInterruptHandlerParams &p);
165 
166  Tick write(PacketPtr pkt) override { return 0; }
167  Tick read(PacketPtr pkt) override { return 0; }
168  AddrRangeList getAddrRanges() const override;
169  void serialize(CheckpointOut &cp) const override;
170  void unserialize(CheckpointIn &cp) override;
171 
172  void setGPUDevice(AMDGPUDevice *gpu_device) { gpuDevice = gpu_device; }
173  void prepareInterruptCookie(ContextID cntxtId, uint32_t ring_id,
174  uint32_t client_id, uint32_t source_id);
175  void submitInterruptCookie();
176  void submitWritePointer();
177  void intrPost();
178 
182  void writeMMIO(PacketPtr pkt, Addr mmio_offset);
183 
184  uint32_t getDoorbellOffset() const { return regs.IH_Doorbell; }
185  void setCntl(const uint32_t &data);
186  void setBase(const uint32_t &data);
187  void setBaseHi(const uint32_t &data);
188  void setRptr(const uint32_t &data);
189  void setWptr(const uint32_t &data);
190  void setWptrAddrLo(const uint32_t &data);
191  void setWptrAddrHi(const uint32_t &data);
192  void setDoorbellOffset(const uint32_t &data);
193  void updateRptr(const uint32_t &data);
194 
195  private:
198  std::queue<AMDGPUInterruptCookie*> interruptQueue;
200 };
201 
202 } // namespace gem5
203 
204 #endif // __DEV_AMDGPU_INTERRUPT_HANDLER__
gem5::AMDGPUIHRegs::IH_Wptr
uint32_t IH_Wptr
Definition: interrupt_handler.hh:123
gem5::ihSourceId
ihSourceId
Definition: interrupt_handler.hh:70
gem5::AMDGPUInterruptHandler::SenderState::SenderState
SenderState(Packet::SenderState *sender_state, Addr addr)
Definition: interrupt_handler.hh:156
gem5::TRAP_ID
@ TRAP_ID
Definition: interrupt_handler.hh:73
gem5::SOC15_IH_CLIENTID_SDMA6
@ SOC15_IH_CLIENTID_SDMA6
Definition: interrupt_handler.hh:65
data
const char data[]
Definition: circlebuf.test.cc:48
gem5::AMDGPUInterruptCookie::reserved2
uint32_t reserved2
Definition: interrupt_handler.hh:101
gem5::AMDGPUInterruptHandler::setBase
void setBase(const uint32_t &data)
Definition: interrupt_handler.cc:209
gem5::AMDGPUInterruptCookie::sourceId
uint32_t sourceId
Definition: interrupt_handler.hh:94
gem5::AMDGPUInterruptCookie::timestamp_Lo
uint32_t timestamp_Lo
Definition: interrupt_handler.hh:99
gem5::AMDGPUInterruptHandler::SenderState::saved
Packet::SenderState * saved
Definition: interrupt_handler.hh:160
gem5::AMDGPUInterruptHandler::gpuDevice
AMDGPUDevice * gpuDevice
Definition: interrupt_handler.hh:196
gem5::AMDGPUInterruptHandler::writeMMIO
void writeMMIO(PacketPtr pkt, Addr mmio_offset)
Methods for setting the values of interrupt handler MMIO registers.
Definition: interrupt_handler.cc:165
gem5::CheckpointIn
Definition: serialize.hh:68
gem5::AMDGPUInterruptHandler::getDoorbellOffset
uint32_t getDoorbellOffset() const
Definition: interrupt_handler.hh:184
gem5::AMDGPUIHRegs::IH_Base_Hi
uint32_t IH_Base_Hi
Definition: interrupt_handler.hh:120
gem5::AMDGPUInterruptHandler::DmaEvent::getData
uint32_t getData()
Definition: interrupt_handler.hh:151
gem5::SOC15_IH_CLIENTID_SDMA0
@ SOC15_IH_CLIENTID_SDMA0
Definition: interrupt_handler.hh:59
gem5::SOC15_IH_CLIENTID_SDMA1
@ SOC15_IH_CLIENTID_SDMA1
Definition: interrupt_handler.hh:60
gem5::AMDGPUIHRegs::IH_Doorbell
uint32_t IH_Doorbell
Definition: interrupt_handler.hh:127
gem5::AMDGPUInterruptCookie::timestamp_src
uint32_t timestamp_src
Definition: interrupt_handler.hh:102
gem5::AMDGPUInterruptHandler::read
Tick read(PacketPtr pkt) override
Pure virtual function that the device must implement.
Definition: interrupt_handler.hh:167
gem5::AMDGPUIHRegs::IH_Cntl
uint32_t IH_Cntl
Definition: interrupt_handler.hh:118
gem5::AMDGPUInterruptHandler::submitInterruptCookie
void submitInterruptCookie()
Definition: interrupt_handler.cc:146
gem5::AMDGPUInterruptHandler::getAddrRanges
AddrRangeList getAddrRanges() const override
Every PIO device is obliged to provide an implementation that returns the address ranges the device r...
Definition: interrupt_handler.cc:61
gem5::AMDGPUInterruptHandler::setGPUDevice
void setGPUDevice(AMDGPUDevice *gpu_device)
Definition: interrupt_handler.hh:172
gem5::AMDGPUInterruptCookie::timestamp_Hi
uint32_t timestamp_Hi
Definition: interrupt_handler.hh:100
gem5::AMDGPUInterruptHandler::setWptrAddrHi
void setWptrAddrHi(const uint32_t &data)
Definition: interrupt_handler.cc:241
gem5::AMDGPUInterruptCookie::source_data_dw3
uint32_t source_data_dw3
Definition: interrupt_handler.hh:108
gem5::Event::setFlags
void setFlags(Flags _flags)
Definition: eventq.hh:331
gem5::EventBase::AutoDelete
static const FlagsType AutoDelete
Definition: eventq.hh:110
gem5::AMDGPUInterruptHandler::DmaEvent::data
uint32_t data
Definition: interrupt_handler.hh:137
gem5::AMDGPUIHRegs::IH_Rptr
uint32_t IH_Rptr
Definition: interrupt_handler.hh:122
gem5::AMDGPUInterruptCookie::vmid_type
uint32_t vmid_type
Definition: interrupt_handler.hh:98
gem5::INTR_COOKIE_SIZE
constexpr uint32_t INTR_COOKIE_SIZE
MSI-style interrupts.
Definition: interrupt_handler.hh:89
dma_device.hh
gem5::AMDGPUInterruptHandler::unserialize
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: interrupt_handler.cc:286
gem5::AMDGPUInterruptHandler
Definition: interrupt_handler.hh:130
gem5::AMDGPUInterruptHandler::updateRptr
void updateRptr(const uint32_t &data)
Definition: interrupt_handler.cc:254
gem5::AMDGPUInterruptHandler::DmaEvent
Definition: interrupt_handler.hh:133
gem5::VegaISA::p
Bitfield< 54 > p
Definition: pagetable.hh:70
gem5::AMDGPUInterruptCookie::pasid
uint32_t pasid
Definition: interrupt_handler.hh:103
gem5::Event
Definition: eventq.hh:254
amdgpu_device.hh
gem5::AMDGPUInterruptHandler::DmaEvent::DmaEvent
DmaEvent(AMDGPUInterruptHandler *deviceIh, uint32_t data)
Definition: interrupt_handler.hh:140
gem5::Packet
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition: packet.hh:294
gem5::AMDGPUInterruptHandler::SenderState::_addr
Addr _addr
Definition: interrupt_handler.hh:161
gem5::AMDGPUInterruptHandler::regs
AMDGPUIHRegs regs
Definition: interrupt_handler.hh:197
gem5::SOC15_IH_CLIENTID_SDMA4
@ SOC15_IH_CLIENTID_SDMA4
Definition: interrupt_handler.hh:63
gem5::AMDGPUIHRegs::IH_Wptr_Addr_Hi
uint32_t IH_Wptr_Addr_Hi
Definition: interrupt_handler.hh:125
gem5::Tick
uint64_t Tick
Tick count type.
Definition: types.hh:58
gem5::AMDGPUInterruptCookie::ringId
uint32_t ringId
Definition: interrupt_handler.hh:95
gem5::DmaDevice
Definition: dma_device.hh:218
gem5::AMDGPUInterruptHandler::DmaEvent::setData
void setData(uint32_t _data)
Definition: interrupt_handler.hh:150
gem5::AMDGPUInterruptHandler::DmaEvent::deviceIh
AMDGPUInterruptHandler * deviceIh
Definition: interrupt_handler.hh:136
gem5::AMDGPUInterruptCookie::source_data_dw1
uint32_t source_data_dw1
Definition: interrupt_handler.hh:106
gem5::AMDGPUDevice
Device model for an AMD GPU.
Definition: amdgpu_device.hh:62
gem5::AMDGPUInterruptHandler::setWptrAddrLo
void setWptrAddrLo(const uint32_t &data)
Definition: interrupt_handler.cc:234
gem5::AMDGPUInterruptHandler::serialize
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: interrupt_handler.cc:260
gem5::Packet::SenderState
A virtual base opaque structure used to hold state associated with the packet (e.g....
Definition: packet.hh:468
gem5::AMDGPUInterruptCookie::reserved1
uint32_t reserved1
Definition: interrupt_handler.hh:97
gem5::AMDGPUInterruptCookie::source_data_dw4
uint32_t source_data_dw4
Definition: interrupt_handler.hh:109
gem5::AMDGPUInterruptHandler::setCntl
void setCntl(const uint32_t &data)
Definition: interrupt_handler.cc:203
gem5::SOC15_IH_CLIENTID_SDMA2
@ SOC15_IH_CLIENTID_SDMA2
Definition: interrupt_handler.hh:61
gem5::Addr
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:147
gem5::SOC15_IH_CLIENTID_RLC
@ SOC15_IH_CLIENTID_RLC
Definition: interrupt_handler.hh:58
gem5::AMDGPUInterruptCookie::vmId
uint32_t vmId
Definition: interrupt_handler.hh:96
flags.hh
gem5::AMDGPUInterruptHandler::DmaEvent::description
const char * description() const
Return a C string describing the event.
Definition: interrupt_handler.hh:146
addr_range.hh
gem5::AMDGPUIHRegs
Struct to contain all interrupt handler related registers.
Definition: interrupt_handler.hh:116
gem5::AMDGPUInterruptHandler::AMDGPUInterruptHandler
AMDGPUInterruptHandler(const AMDGPUInterruptHandlerParams &p)
Definition: interrupt_handler.cc:53
gem5::CP_EOP
@ CP_EOP
Definition: interrupt_handler.hh:72
gem5::AMDGPUIHRegs::baseAddr
Addr baseAddr
Definition: interrupt_handler.hh:121
gem5::SOC15_IH_CLIENTID_SDMA3
@ SOC15_IH_CLIENTID_SDMA3
Definition: interrupt_handler.hh:62
gem5::AMDGPUIHRegs::WptrAddr
Addr WptrAddr
Definition: interrupt_handler.hh:126
types.hh
gem5::AMDGPUInterruptHandler::submitWritePointer
void submitWritePointer()
Definition: interrupt_handler.cc:134
gem5::AMDGPUInterruptCookie::reserved3
uint32_t reserved3
Definition: interrupt_handler.hh:104
gem5::AMDGPUInterruptHandler::dmaEvent
AMDGPUInterruptHandler::DmaEvent * dmaEvent
Definition: interrupt_handler.hh:199
gem5::ContextID
int ContextID
Globally unique thread context ID.
Definition: types.hh:239
gem5::SOC15_IH_CLIENTID_SDMA5
@ SOC15_IH_CLIENTID_SDMA5
Definition: interrupt_handler.hh:64
gem5::AMDGPUInterruptHandler::setWptr
void setWptr(const uint32_t &data)
Definition: interrupt_handler.cc:228
gem5::AMDGPUInterruptHandler::write
Tick write(PacketPtr pkt) override
Pure virtual function that the device must implement.
Definition: interrupt_handler.hh:166
gem5::AMDGPUInterruptHandler::setRptr
void setRptr(const uint32_t &data)
Definition: interrupt_handler.cc:222
gem5::AMDGPUInterruptHandler::intrPost
void intrPost()
Definition: interrupt_handler.cc:68
gem5::CheckpointOut
std::ostream CheckpointOut
Definition: serialize.hh:66
gem5::AMDGPUInterruptCookie::clientId
uint32_t clientId
Definition: interrupt_handler.hh:93
gem5::AMDGPUIHRegs::IH_Base
uint32_t IH_Base
Definition: interrupt_handler.hh:119
gem5::AMDGPUInterruptCookie::source_data_dw2
uint32_t source_data_dw2
Definition: interrupt_handler.hh:107
gem5::AMDGPUInterruptHandler::SenderState
Definition: interrupt_handler.hh:154
std::list< AddrRange >
gem5::AMDGPUInterruptCookie
Definition: interrupt_handler.hh:91
gem5
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
Definition: gpu_translation_state.hh:37
gem5::AMDGPUInterruptHandler::interruptQueue
std::queue< AMDGPUInterruptCookie * > interruptQueue
Definition: interrupt_handler.hh:198
gem5::soc15_ih_clientid
soc15_ih_clientid
Defines from driver code.
Definition: interrupt_handler.hh:56
gem5::AMDGPUInterruptHandler::prepareInterruptCookie
void prepareInterruptCookie(ContextID cntxtId, uint32_t ring_id, uint32_t client_id, uint32_t source_id)
Definition: interrupt_handler.cc:75
gem5::AMDGPUIHRegs::IH_Wptr_Addr_Lo
uint32_t IH_Wptr_Addr_Lo
Definition: interrupt_handler.hh:124
gem5::AMDGPUInterruptHandler::setDoorbellOffset
void setDoorbellOffset(const uint32_t &data)
Definition: interrupt_handler.cc:248
gem5::SOC15_IH_CLIENTID_SDMA7
@ SOC15_IH_CLIENTID_SDMA7
Definition: interrupt_handler.hh:66
gem5::AMDGPUInterruptHandler::DmaEvent::process
void process()
Definition: interrupt_handler.cc:120
gem5::SOC15_IH_CLIENTID_GRBM_CP
@ SOC15_IH_CLIENTID_GRBM_CP
Definition: interrupt_handler.hh:67
gem5::AMDGPUInterruptCookie::pasid_src
uint32_t pasid_src
Definition: interrupt_handler.hh:105
gem5::AMDGPUInterruptHandler::setBaseHi
void setBaseHi(const uint32_t &data)
Definition: interrupt_handler.cc:216
gem5::X86ISA::addr
Bitfield< 3 > addr
Definition: types.hh:84

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