gem5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups 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();
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();
120 
121  void fetchNextAddr(Addr address);
122  void fetchAddrComplete();
125 
126  void readCopyBytes();
127  void readCopyBytesComplete();
130 
131  void writeCopyBytes();
132  void writeCopyBytesComplete();
135 
136  void writeCompletionStatus();
137  void writeStatusComplete();
140 
141 
142  void continueProcessing();
143  void recvCommand();
144  bool inDrain();
145  void restartStateMachine();
146  inline void anBegin(const char *s)
147  {
149  channelId, "CopyEngine", s);
150  }
151 
152  inline void anWait()
153  {
155  channelId, "CopyEngine", "DMAUnusedDescQ", channelId);
156  }
157 
158  inline void anDq()
159  {
161  channelId, "CopyEngine", "DMAUnusedDescQ", channelId);
162  }
163 
164  inline void anPq()
165  {
167  channelId, "CopyEngine", "DMAUnusedDescQ", channelId);
168  }
169 
170  inline void anQ(const char * s, uint64_t id, int size = 1)
171  {
173  "CopyEngine", s, id, NULL, size);
174  }
175 
176  };
177 
178  private:
179 
182 
183  // device registers
185 
186  // Array of channels each one with regs/dma port/etc
188 
189  public:
190  typedef CopyEngineParams Params;
191  const Params *
192  params() const
193  {
194  return dynamic_cast<const Params *>(_params);
195  }
196  CopyEngine(const Params *params);
197  ~CopyEngine();
198 
199  void regStats() override;
200 
201  BaseMasterPort &getMasterPort(const std::string &if_name,
202  PortID idx = InvalidPortID) override;
203 
204  Tick read(PacketPtr pkt) override;
205  Tick write(PacketPtr pkt) override;
206 
207  void serialize(CheckpointOut &cp) const override;
208  void unserialize(CheckpointIn &cp) override;
209 };
210 
211 #endif //__DEV_PCI_COPY_ENGINE_HH__
212 
void anBegin(const char *s)
Definition: copy_engine.hh:146
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
const Params * params() const
Definition: copy_engine.hh:192
const PortID InvalidPortID
Definition: types.hh:182
void fetchDescriptor(Addr address)
Definition: copy_engine.cc:446
DrainState
Object drain/handover states.
Definition: drain.hh:71
#define panic(...)
Definition: misc.hh:153
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:364
EventWrapper< CopyEngineChannel,&CopyEngineChannel::fetchAddrComplete > addrCompleteEvent
Definition: copy_engine.hh:124
CopyEngineParams Params
Definition: copy_engine.hh:190
void anQ(const char *s, uint64_t id, int size=1)
Definition: copy_engine.hh:170
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: copy_engine.cc:661
A vector of scalar stats.
Definition: statistics.hh:2499
virtual Tick read(PacketPtr pkt)
Definition: copy_engine.hh:101
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: copy_engine.cc:679
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
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: copy_engine.cc:696
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
BaseMasterPort & getMasterPort(const std::string &if_name, PortID idx=InvalidPortID) override
Get a master port with a given name and index.
Definition: copy_engine.cc:115
Interface for objects that might require draining before checkpointing.
Definition: drain.hh:223
virtual Tick write(PacketPtr pkt)
Definition: copy_engine.hh:103
EventWrapper< CopyEngineChannel,&CopyEngineChannel::fetchDescComplete > fetchCompleteEvent
Definition: copy_engine.hh:119
Stats::Vector copiesProcessed
Definition: copy_engine.hh:181
std::string csprintf(const char *format, const Args &...args)
Definition: cprintf.hh:161
Bitfield< 4 > s
Definition: miscregs.hh:1738
static CPA * cpa()
Definition: cp_annotate.hh:84
DmaDeviceParams Params
Definition: dma_device.hh:160
uint64_t Tick
Tick count type.
Definition: types.hh:63
CopyEngineReg::Regs regs
Definition: copy_engine.hh:184
void channelRead(PacketPtr pkt, Addr daddr, int size)
Definition: copy_engine.cc:240
Tick read(PacketPtr pkt) override
Pure virtual function that the device must implement.
Definition: copy_engine.cc:167
Tick write(PacketPtr pkt) override
Pure virtual function that the device must implement.
Definition: copy_engine.cc:290
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:187
System * sys
Definition: io_device.hh:87
CopyEngineReg::ChanRegs cr
Definition: copy_engine.hh:68
EventWrapper< CopyEngineChannel,&CopyEngineChannel::writeCopyBytesComplete > writeCompleteEvent
Definition: copy_engine.hh:134
A Packet is used to encapsulate a transfer between two objects in the memory system (e...
Definition: packet.hh:245
Basic support for object serialization.
Definition: serialize.hh:220
CopyEngineReg::DmaDesc * curDmaDesc
Definition: copy_engine.hh:70
void regStats() override
Register statistics for this object.
Definition: copy_engine.cc:426
EventWrapper< CopyEngineChannel,&CopyEngineChannel::readCopyBytesComplete > readCompleteEvent
Definition: copy_engine.hh:129
CopyEngineChannel(CopyEngine *_ce, int cid)
Definition: copy_engine.cc:81
void drainResume() override
Resume execution after a successful drain.
Definition: copy_engine.cc:741
int size()
Definition: pagetable.hh:146
virtual const std::string name() const
Definition: sim_object.hh:117
std::ostream CheckpointOut
Definition: serialize.hh:67
A BaseMasterPort is a protocol-agnostic master port, responsible only for the structural connection t...
Definition: port.hh:115
BaseMasterPort & getMasterPort()
Definition: copy_engine.cc:131
Stats::Vector bytesCopied
Definition: copy_engine.hh:180
const SimObjectParams * _params
Cached copy of the object parameters.
Definition: sim_object.hh:107
EventWrapper< CopyEngineChannel,&CopyEngineChannel::writeStatusComplete > statusCompleteEvent
Definition: copy_engine.hh:139
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
Definition: types.hh:181
CopyEngine(const Params *params)
Definition: copy_engine.cc:63
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: copy_engine.cc:670
DrainState drain() override
Notify an object that it needs to drain its state.
Definition: copy_engine.cc:650
void fetchNextAddr(Addr address)
Definition: copy_engine.cc:607

Generated on Fri Jun 9 2017 13:03:46 for gem5 by doxygen 1.8.6