gem5  v22.0.0.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 {
61 };
62 
64 {
65  TRAP_ID = 224
66 };
67 
81 constexpr uint32_t INTR_COOKIE_SIZE = 32; // in bytes
82 
83 typedef struct
84 {
85  uint32_t clientId : 8;
86  uint32_t sourceId : 8;
87  uint32_t ringId : 8;
88  uint32_t vmId : 4;
89  uint32_t reserved1 : 3;
90  uint32_t vmid_type : 1;
91  uint32_t timestamp_Lo;
92  uint32_t timestamp_Hi : 16;
93  uint32_t reserved2 : 15;
94  uint32_t timestamp_src : 1;
95  uint32_t pasid : 16;
96  uint32_t reserved3 : 15;
97  uint32_t pasid_src : 1;
98  uint32_t source_data_dw1;
99  uint32_t source_data_dw2;
100  uint32_t source_data_dw3;
101  uint32_t source_data_dw4;
103 static_assert(sizeof(AMDGPUInterruptCookie) == INTR_COOKIE_SIZE);
104 
108 typedef struct
109 {
110  uint32_t IH_Cntl;
111  uint32_t IH_Base;
112  uint32_t IH_Base_Hi;
114  uint32_t IH_Rptr;
115  uint32_t IH_Wptr;
116  uint32_t IH_Wptr_Addr_Lo;
117  uint32_t IH_Wptr_Addr_Hi;
119  uint32_t IH_Doorbell;
120 } AMDGPUIHRegs;
121 
123 {
124  public:
125  class DmaEvent : public Event
126  {
127  private:
129  uint32_t data;
130 
131  public:
134  {
136  }
137  void process();
138  const char *description() const {
139  return "AMDGPUInterruptHandler Dma";
140  }
141 
142  void setData(uint32_t _data) { data = _data; }
143  uint32_t getData() { return data; }
144  };
145 
147  {
149  : saved(sender_state), _addr(addr)
150  {
151  }
154  };
155 
156  AMDGPUInterruptHandler(const AMDGPUInterruptHandlerParams &p);
157 
158  Tick write(PacketPtr pkt) override { return 0; }
159  Tick read(PacketPtr pkt) override { return 0; }
160  AddrRangeList getAddrRanges() const override;
161  void serialize(CheckpointOut &cp) const override;
162  void unserialize(CheckpointIn &cp) override;
163 
164  void setGPUDevice(AMDGPUDevice *gpu_device) { gpuDevice = gpu_device; }
165  void prepareInterruptCookie(ContextID cntxtId, uint32_t ring_id,
166  uint32_t client_id, uint32_t source_id);
167  void submitInterruptCookie();
168  void submitWritePointer();
169  void intrPost();
170 
174  void writeMMIO(PacketPtr pkt, Addr mmio_offset);
175 
176  uint32_t getDoorbellOffset() const { return regs.IH_Doorbell; }
177  void setCntl(const uint32_t &data);
178  void setBase(const uint32_t &data);
179  void setBaseHi(const uint32_t &data);
180  void setRptr(const uint32_t &data);
181  void setWptr(const uint32_t &data);
182  void setWptrAddrLo(const uint32_t &data);
183  void setWptrAddrHi(const uint32_t &data);
184  void setDoorbellOffset(const uint32_t &data);
185  void updateRptr(const uint32_t &data);
186 
187  private:
190  std::queue<AMDGPUInterruptCookie*> interruptQueue;
192 };
193 
194 } // namespace gem5
195 
196 #endif // __DEV_AMDGPU_INTERRUPT_HANDLER__
gem5::AMDGPUIHRegs::IH_Wptr
uint32_t IH_Wptr
Definition: interrupt_handler.hh:115
gem5::ihSourceId
ihSourceId
Definition: interrupt_handler.hh:63
gem5::AMDGPUInterruptHandler::SenderState::SenderState
SenderState(Packet::SenderState *sender_state, Addr addr)
Definition: interrupt_handler.hh:148
gem5::TRAP_ID
@ TRAP_ID
Definition: interrupt_handler.hh:65
data
const char data[]
Definition: circlebuf.test.cc:48
gem5::AMDGPUInterruptCookie::reserved2
uint32_t reserved2
Definition: interrupt_handler.hh:93
gem5::AMDGPUInterruptHandler::setBase
void setBase(const uint32_t &data)
Definition: interrupt_handler.cc:189
gem5::AMDGPUInterruptCookie::sourceId
uint32_t sourceId
Definition: interrupt_handler.hh:86
gem5::AMDGPUInterruptCookie::timestamp_Lo
uint32_t timestamp_Lo
Definition: interrupt_handler.hh:91
gem5::AMDGPUInterruptHandler::SenderState::saved
Packet::SenderState * saved
Definition: interrupt_handler.hh:152
gem5::AMDGPUInterruptHandler::gpuDevice
AMDGPUDevice * gpuDevice
Definition: interrupt_handler.hh:188
gem5::AMDGPUInterruptHandler::writeMMIO
void writeMMIO(PacketPtr pkt, Addr mmio_offset)
Methods for setting the values of interrupt handler MMIO registers.
Definition: interrupt_handler.cc:145
gem5::CheckpointIn
Definition: serialize.hh:68
gem5::AMDGPUInterruptHandler::getDoorbellOffset
uint32_t getDoorbellOffset() const
Definition: interrupt_handler.hh:176
gem5::AMDGPUIHRegs::IH_Base_Hi
uint32_t IH_Base_Hi
Definition: interrupt_handler.hh:112
gem5::AMDGPUInterruptHandler::DmaEvent::getData
uint32_t getData()
Definition: interrupt_handler.hh:143
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:119
gem5::AMDGPUInterruptCookie::timestamp_src
uint32_t timestamp_src
Definition: interrupt_handler.hh:94
gem5::AMDGPUInterruptHandler::read
Tick read(PacketPtr pkt) override
Pure virtual function that the device must implement.
Definition: interrupt_handler.hh:159
gem5::AMDGPUIHRegs::IH_Cntl
uint32_t IH_Cntl
Definition: interrupt_handler.hh:110
gem5::AMDGPUInterruptHandler::submitInterruptCookie
void submitInterruptCookie()
Definition: interrupt_handler.cc:126
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:164
gem5::AMDGPUInterruptCookie::timestamp_Hi
uint32_t timestamp_Hi
Definition: interrupt_handler.hh:92
gem5::AMDGPUInterruptHandler::setWptrAddrHi
void setWptrAddrHi(const uint32_t &data)
Definition: interrupt_handler.cc:222
gem5::AMDGPUInterruptCookie::source_data_dw3
uint32_t source_data_dw3
Definition: interrupt_handler.hh:100
gem5::Event::setFlags
void setFlags(Flags _flags)
Definition: eventq.hh:328
gem5::EventBase::AutoDelete
static const FlagsType AutoDelete
Definition: eventq.hh:107
gem5::AMDGPUInterruptHandler::DmaEvent::data
uint32_t data
Definition: interrupt_handler.hh:129
gem5::AMDGPUIHRegs::IH_Rptr
uint32_t IH_Rptr
Definition: interrupt_handler.hh:114
gem5::AMDGPUInterruptCookie::vmid_type
uint32_t vmid_type
Definition: interrupt_handler.hh:90
gem5::INTR_COOKIE_SIZE
constexpr uint32_t INTR_COOKIE_SIZE
MSI-style interrupts.
Definition: interrupt_handler.hh:81
dma_device.hh
gem5::AMDGPUInterruptHandler::unserialize
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: interrupt_handler.cc:267
gem5::AMDGPUInterruptHandler
Definition: interrupt_handler.hh:122
gem5::AMDGPUInterruptHandler::updateRptr
void updateRptr(const uint32_t &data)
Definition: interrupt_handler.cc:235
gem5::AMDGPUInterruptHandler::DmaEvent
Definition: interrupt_handler.hh:125
gem5::VegaISA::p
Bitfield< 54 > p
Definition: pagetable.hh:70
gem5::AMDGPUInterruptCookie::pasid
uint32_t pasid
Definition: interrupt_handler.hh:95
gem5::Event
Definition: eventq.hh:251
amdgpu_device.hh
gem5::AMDGPUInterruptHandler::DmaEvent::DmaEvent
DmaEvent(AMDGPUInterruptHandler *deviceIh, uint32_t data)
Definition: interrupt_handler.hh:132
gem5::Packet
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition: packet.hh:291
gem5::AMDGPUInterruptHandler::SenderState::_addr
Addr _addr
Definition: interrupt_handler.hh:153
gem5::AMDGPUInterruptHandler::regs
AMDGPUIHRegs regs
Definition: interrupt_handler.hh:189
gem5::AMDGPUIHRegs::IH_Wptr_Addr_Hi
uint32_t IH_Wptr_Addr_Hi
Definition: interrupt_handler.hh:117
gem5::Tick
uint64_t Tick
Tick count type.
Definition: types.hh:58
gem5::AMDGPUInterruptCookie::ringId
uint32_t ringId
Definition: interrupt_handler.hh:87
gem5::DmaDevice
Definition: dma_device.hh:203
gem5::AMDGPUInterruptHandler::DmaEvent::setData
void setData(uint32_t _data)
Definition: interrupt_handler.hh:142
gem5::AMDGPUInterruptHandler::DmaEvent::deviceIh
AMDGPUInterruptHandler * deviceIh
Definition: interrupt_handler.hh:128
gem5::AMDGPUInterruptCookie::source_data_dw1
uint32_t source_data_dw1
Definition: interrupt_handler.hh:98
gem5::AMDGPUDevice
Device model for an AMD GPU.
Definition: amdgpu_device.hh:60
gem5::AMDGPUInterruptHandler::setWptrAddrLo
void setWptrAddrLo(const uint32_t &data)
Definition: interrupt_handler.cc:215
gem5::AMDGPUInterruptHandler::serialize
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: interrupt_handler.cc:241
gem5::Packet::SenderState
A virtual base opaque structure used to hold state associated with the packet (e.g....
Definition: packet.hh:465
gem5::AMDGPUInterruptCookie::reserved1
uint32_t reserved1
Definition: interrupt_handler.hh:89
gem5::AMDGPUInterruptCookie::source_data_dw4
uint32_t source_data_dw4
Definition: interrupt_handler.hh:101
gem5::AMDGPUInterruptHandler::setCntl
void setCntl(const uint32_t &data)
Definition: interrupt_handler.cc:183
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:88
flags.hh
gem5::AMDGPUInterruptHandler::DmaEvent::description
const char * description() const
Return a C string describing the event.
Definition: interrupt_handler.hh:138
addr_range.hh
gem5::AMDGPUIHRegs
Struct to contain all interrupt handler related registers.
Definition: interrupt_handler.hh:108
gem5::AMDGPUInterruptHandler::AMDGPUInterruptHandler
AMDGPUInterruptHandler(const AMDGPUInterruptHandlerParams &p)
Definition: interrupt_handler.cc:53
gem5::AMDGPUIHRegs::baseAddr
Addr baseAddr
Definition: interrupt_handler.hh:113
gem5::AMDGPUIHRegs::WptrAddr
Addr WptrAddr
Definition: interrupt_handler.hh:118
types.hh
gem5::AMDGPUInterruptHandler::submitWritePointer
void submitWritePointer()
Definition: interrupt_handler.cc:114
gem5::AMDGPUInterruptCookie::reserved3
uint32_t reserved3
Definition: interrupt_handler.hh:96
gem5::AMDGPUInterruptHandler::dmaEvent
AMDGPUInterruptHandler::DmaEvent * dmaEvent
Definition: interrupt_handler.hh:191
gem5::ContextID
int ContextID
Globally unique thread context ID.
Definition: types.hh:239
gem5::AMDGPUInterruptHandler::setWptr
void setWptr(const uint32_t &data)
Definition: interrupt_handler.cc:209
gem5::AMDGPUInterruptHandler::write
Tick write(PacketPtr pkt) override
Pure virtual function that the device must implement.
Definition: interrupt_handler.hh:158
gem5::AMDGPUInterruptHandler::setRptr
void setRptr(const uint32_t &data)
Definition: interrupt_handler.cc:203
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:85
gem5::AMDGPUIHRegs::IH_Base
uint32_t IH_Base
Definition: interrupt_handler.hh:111
gem5::AMDGPUInterruptCookie::source_data_dw2
uint32_t source_data_dw2
Definition: interrupt_handler.hh:99
gem5::AMDGPUInterruptHandler::SenderState
Definition: interrupt_handler.hh:146
std::list< AddrRange >
gem5::AMDGPUInterruptCookie
Definition: interrupt_handler.hh:83
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:190
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:116
gem5::AMDGPUInterruptHandler::setDoorbellOffset
void setDoorbellOffset(const uint32_t &data)
Definition: interrupt_handler.cc:229
gem5::AMDGPUInterruptHandler::DmaEvent::process
void process()
Definition: interrupt_handler.cc:100
gem5::AMDGPUInterruptCookie::pasid_src
uint32_t pasid_src
Definition: interrupt_handler.hh:97
gem5::AMDGPUInterruptHandler::setBaseHi
void setBaseHi(const uint32_t &data)
Definition: interrupt_handler.cc:196
gem5::X86ISA::addr
Bitfield< 3 > addr
Definition: types.hh:84

Generated on Thu Jun 16 2022 10:41:49 for gem5 by doxygen 1.8.17