gem5  v19.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
copy_engine.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012 ARM Limited
3  * All rights reserved
4  *
5  * The license below extends only to copyright in the software and shall
6  * not be construed as granting a license to any other intellectual
7  * property including but not limited to intellectual property relating
8  * to a hardware implementation of the functionality of the software
9  * licensed hereunder. You may use the software subject to the license
10  * terms below provided that you ensure that this notice is replicated
11  * unmodified and in its entirety in all distributions of the software,
12  * modified or unmodified, in source code or in binary form.
13  *
14  * Copyright (c) 2008 The Regents of The University of Michigan
15  * All rights reserved.
16  *
17  * Redistribution and use in source and binary forms, with or without
18  * modification, are permitted provided that the following conditions are
19  * met: redistributions of source code must retain the above copyright
20  * notice, this list of conditions and the following disclaimer;
21  * redistributions in binary form must reproduce the above copyright
22  * notice, this list of conditions and the following disclaimer in the
23  * documentation and/or other materials provided with the distribution;
24  * neither the name of the copyright holders nor the names of its
25  * contributors may be used to endorse or promote products derived from
26  * this software without specific prior written permission.
27  *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39  *
40  * Authors: Ali Saidi
41  */
42 
43 /* @file
44  * Device model for Intel's I/O Acceleration Technology (I/OAT).
45  * A DMA asyncronous copy engine
46  */
47 
48 #ifndef __DEV_PCI_COPY_ENGINE_HH__
49 #define __DEV_PCI_COPY_ENGINE_HH__
50 
51 #include <vector>
52 
53 #include "base/cp_annotate.hh"
54 #include "base/statistics.hh"
56 #include "dev/pci/device.hh"
57 #include "params/CopyEngine.hh"
58 #include "sim/drain.hh"
59 #include "sim/eventq.hh"
60 
61 class CopyEngine : public PciDevice
62 {
63  class CopyEngineChannel : public Drainable, public Serializable
64  {
65  private:
69  int channelId;
71  uint8_t *copyBuffer;
72 
73  bool busy;
74  bool underReset;
78 
81 
83 
84  enum ChannelState {
91  };
92 
94 
95  public:
96  CopyEngineChannel(CopyEngine *_ce, int cid);
97  virtual ~CopyEngineChannel();
98  Port &getPort();
99 
100  std::string name() { assert(ce); return ce->name() + csprintf("-chan%d", channelId); }
101  virtual Tick read(PacketPtr pkt)
102  { panic("CopyEngineChannel has no I/O access\n");}
103  virtual Tick write(PacketPtr pkt)
104  { panic("CopyEngineChannel has no I/O access\n"); }
105 
106  void channelRead(PacketPtr pkt, Addr daddr, int size);
107  void channelWrite(PacketPtr pkt, Addr daddr, int size);
108 
109  DrainState drain() override;
110  void drainResume() override;
111 
112  void serialize(CheckpointOut &cp) const override;
113  void unserialize(CheckpointIn &cp) override;
114 
115  private:
116  void fetchDescriptor(Addr address);
117  void fetchDescComplete();
119 
120  void fetchNextAddr(Addr address);
121  void fetchAddrComplete();
123 
124  void readCopyBytes();
125  void readCopyBytesComplete();
127 
128  void writeCopyBytes();
129  void writeCopyBytesComplete();
131 
132  void writeCompletionStatus();
133  void writeStatusComplete();
135 
136 
137  void continueProcessing();
138  void recvCommand();
139  bool inDrain();
140  void restartStateMachine();
141  inline void anBegin(const char *s)
142  {
144  channelId, "CopyEngine", s);
145  }
146 
147  inline void anWait()
148  {
149  CPA::cpa()->hwWe(CPA::FL_NONE, ce->sys,
150  channelId, "CopyEngine", "DMAUnusedDescQ", channelId);
151  }
152 
153  inline void anDq()
154  {
155  CPA::cpa()->hwDq(CPA::FL_NONE, ce->sys,
156  channelId, "CopyEngine", "DMAUnusedDescQ", channelId);
157  }
158 
159  inline void anPq()
160  {
161  CPA::cpa()->hwDq(CPA::FL_NONE, ce->sys,
162  channelId, "CopyEngine", "DMAUnusedDescQ", channelId);
163  }
164 
165  inline void anQ(const char * s, uint64_t id, int size = 1)
166  {
167  CPA::cpa()->hwQ(CPA::FL_NONE, ce->sys, channelId,
168  "CopyEngine", s, id, NULL, size);
169  }
170 
171  };
172 
173  private:
174 
177 
178  // device registers
180 
181  // Array of channels each one with regs/dma port/etc
183 
184  public:
185  typedef CopyEngineParams Params;
186  const Params *
187  params() const
188  {
189  return dynamic_cast<const Params *>(_params);
190  }
191  CopyEngine(const Params *params);
192  ~CopyEngine();
193 
194  void regStats() override;
195 
196  Port &getPort(const std::string &if_name,
197  PortID idx = InvalidPortID) override;
198 
199  Tick read(PacketPtr pkt) override;
200  Tick write(PacketPtr pkt) override;
201 
202  void serialize(CheckpointOut &cp) const override;
203  void unserialize(CheckpointIn &cp) override;
204 };
205 
206 #endif //__DEV_PCI_COPY_ENGINE_HH__
207 
#define panic(...)
This implements a cprintf based panic() function.
Definition: logging.hh:167
EventFunctionWrapper fetchCompleteEvent
Definition: copy_engine.hh:118
void anBegin(const char *s)
Definition: copy_engine.hh:141
Ports are used to interface objects to each other.
Definition: port.hh:60
void hwDq(flags f, System *sys, uint64_t frame, std::string sm, std::string q, uint64_t qid, System *q_sys=NULL, int32_t count=1)
Definition: cp_annotate.hh:109
EventFunctionWrapper statusCompleteEvent
Definition: copy_engine.hh:134
const PortID InvalidPortID
Definition: types.hh:238
void fetchDescriptor(Addr address)
Definition: copy_engine.cc:452
DrainState
Object drain/handover states.
Definition: drain.hh:71
PCI device, base implementation is only config space.
Definition: device.hh:70
void hwQ(flags f, System *sys, uint64_t frame, std::string sm, std::string q, uint64_t qid, System *q_sys=NULL, int32_t count=1)
Definition: cp_annotate.hh:106
void channelWrite(PacketPtr pkt, Addr daddr, int size)
Definition: copy_engine.cc:370
CopyEngineParams Params
Definition: copy_engine.hh:185
void anQ(const char *s, uint64_t id, int size=1)
Definition: copy_engine.hh:165
EventFunctionWrapper readCompleteEvent
Definition: copy_engine.hh:126
A vector of scalar stats.
Definition: statistics.hh:2550
virtual Tick read(PacketPtr pkt)
Definition: copy_engine.hh:101
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: copy_engine.cc:685
void hwWe(flags f, System *sys, uint64_t frame, std::string sm, std::string q, uint64_t qid, System *q_sys=NULL, int32_t count=1)
Definition: cp_annotate.hh:121
Definition: cprintf.cc:42
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: copy_engine.cc:702
Declaration of Statistics objects.
STL vector class.
Definition: stl.hh:40
void hwBegin(flags f, System *sys, uint64_t frame, std::string sm, std::string st)
Definition: cp_annotate.hh:104
Interface for objects that might require draining before checkpointing.
Definition: drain.hh:223
virtual Tick write(PacketPtr pkt)
Definition: copy_engine.hh:103
Stats::Vector copiesProcessed
Definition: copy_engine.hh:176
std::string csprintf(const char *format, const Args &...args)
Definition: cprintf.hh:162
Bitfield< 4 > s
static CPA * cpa()
Definition: cp_annotate.hh:84
uint64_t Tick
Tick count type.
Definition: types.hh:63
CopyEngineReg::Regs regs
Definition: copy_engine.hh:179
void channelRead(PacketPtr pkt, Addr daddr, int size)
Definition: copy_engine.cc:242
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
std::vector< CopyEngineChannel * > chan
Definition: copy_engine.hh:182
System * sys
Definition: io_device.hh:105
CopyEngineReg::ChanRegs cr
Definition: copy_engine.hh:68
virtual const std::string name() const
Definition: sim_object.hh:120
A Packet is used to encapsulate a transfer between two objects in the memory system (e...
Definition: packet.hh:255
Basic support for object serialization.
Definition: serialize.hh:153
CopyEngineReg::DmaDesc * curDmaDesc
Definition: copy_engine.hh:70
void regStats() override
Callback to set stat parameters.
Definition: copy_engine.cc:432
CopyEngineChannel(CopyEngine *_ce, int cid)
Definition: copy_engine.cc:81
void drainResume() override
Resume execution after a successful drain.
Definition: copy_engine.cc:747
EventFunctionWrapper writeCompleteEvent
Definition: copy_engine.hh:130
std::ostream CheckpointOut
Definition: serialize.hh:68
Stats::Vector bytesCopied
Definition: copy_engine.hh:175
const SimObjectParams * _params
Cached copy of the object parameters.
Definition: sim_object.hh:110
EventFunctionWrapper addrCompleteEvent
Definition: copy_engine.hh:122
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
Definition: types.hh:237
CopyEngine(const Params *params)
Definition: copy_engine.cc:63
DrainState drain() override
Notify an object that it needs to drain its state.
Definition: copy_engine.cc:656
const Params * params() const
Definition: copy_engine.hh:187
void fetchNextAddr(Addr address)
Definition: copy_engine.cc:613

Generated on Fri Feb 28 2020 16:27:01 for gem5 by doxygen 1.8.13