gem5  v20.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
copy_engine_defs.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2008 The Regents of The University of Michigan
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
7  * met: redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer;
9  * redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution;
12  * neither the name of the copyright holders nor the names of its
13  * contributors may be used to endorse or promote products derived from
14  * this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 /* @file
30  * Register and structure descriptions for Intel's I/O AT DMA Engine
31  */
32 #include "base/bitfield.hh"
33 #include "sim/serialize.hh"
34 
35 namespace CopyEngineReg {
36 
37 
38 // General Channel independant registers, 128 bytes starting at 0x00
39 const uint32_t GEN_CHANCOUNT = 0x00;
40 const uint32_t GEN_XFERCAP = 0x01;
41 const uint32_t GEN_INTRCTRL = 0x03;
42 const uint32_t GEN_ATTNSTATUS = 0x04;
43 
44 
45 // Channel specific registers, each block is 128 bytes, starting at 0x80
46 const uint32_t CHAN_CONTROL = 0x00;
47 const uint32_t CHAN_STATUS = 0x04;
48 const uint32_t CHAN_CHAINADDR = 0x0C;
49 const uint32_t CHAN_CHAINADDR_LOW = 0x0C;
50 const uint32_t CHAN_CHAINADDR_HIGH = 0x10;
51 const uint32_t CHAN_COMMAND = 0x14;
52 const uint32_t CHAN_CMPLNADDR = 0x18;
53 const uint32_t CHAN_CMPLNADDR_LOW = 0x18;
54 const uint32_t CHAN_CMPLNADDR_HIGH = 0x1C;
55 const uint32_t CHAN_ERROR = 0x28;
56 
57 
58 const uint32_t DESC_CTRL_INT_GEN = 0x00000001;
59 const uint32_t DESC_CTRL_SRC_SN = 0x00000002;
60 const uint32_t DESC_CTRL_DST_SN = 0x00000004;
61 const uint32_t DESC_CTRL_CP_STS = 0x00000008;
62 const uint32_t DESC_CTRL_FRAME = 0x00000010;
63 const uint32_t DESC_CTRL_NULL = 0x00000020;
64 
65 struct DmaDesc {
66  uint32_t len;
67  uint32_t command;
71  uint64_t reserved1;
72  uint64_t reserved2;
73  uint64_t user1;
74  uint64_t user2;
75 };
76 
77 #define ADD_FIELD8(NAME, OFFSET, BITS) \
78  inline uint8_t NAME() { return bits(_data, OFFSET+BITS-1, OFFSET); } \
79  inline void NAME(uint8_t d) { replaceBits(_data, OFFSET+BITS-1, OFFSET,d); }
80 
81 #define ADD_FIELD16(NAME, OFFSET, BITS) \
82  inline uint16_t NAME() { return bits(_data, OFFSET+BITS-1, OFFSET); } \
83  inline void NAME(uint16_t d) { replaceBits(_data, OFFSET+BITS-1, OFFSET,d); }
84 
85 #define ADD_FIELD32(NAME, OFFSET, BITS) \
86  inline uint32_t NAME() { return bits(_data, OFFSET+BITS-1, OFFSET); } \
87  inline void NAME(uint32_t d) { replaceBits(_data, OFFSET+BITS-1, OFFSET,d); }
88 
89 #define ADD_FIELD64(NAME, OFFSET, BITS) \
90  inline uint64_t NAME() { return bits(_data, OFFSET+BITS-1, OFFSET); } \
91  inline void NAME(uint64_t d) { replaceBits(_data, OFFSET+BITS-1, OFFSET,d); }
92 
93 template<class T>
94 struct Reg {
95  T _data;
96  T operator()() { return _data; }
97  const Reg<T> &operator=(T d) { _data = d; return *this;}
98  bool operator==(T d) { return d == _data; }
99  void operator()(T d) { _data = d; }
100  Reg() { _data = 0; }
102  {
103  SERIALIZE_SCALAR(_data);
104  }
106  {
107  UNSERIALIZE_SCALAR(_data);
108  }
109 };
110 
111 
112 struct Regs : public Serializable {
113  uint8_t chanCount;
114  uint8_t xferCap;
115 
116  struct INTRCTRL : public Reg<uint8_t> { // 0x03
117  using Reg<uint8_t>::operator =;
118  ADD_FIELD8(master_int_enable,0,1);
119  ADD_FIELD8(interrupt_status,1,1);
120  ADD_FIELD8(interrupt,2,1);
121  };
123 
124  uint32_t attnStatus; // Read clears
125 
126  void serialize(CheckpointOut &cp) const override
127  {
128  SERIALIZE_SCALAR(chanCount);
129  SERIALIZE_SCALAR(xferCap);
130  paramOut(cp, "intrctrl", intrctrl._data);
131  SERIALIZE_SCALAR(attnStatus);
132  }
133 
134  void unserialize(CheckpointIn &cp) override
135  {
136  UNSERIALIZE_SCALAR(chanCount);
137  UNSERIALIZE_SCALAR(xferCap);
138  paramIn(cp, "intrctrl", intrctrl._data);
139  UNSERIALIZE_SCALAR(attnStatus);
140  }
141 
142 };
143 
144 struct ChanRegs : public Serializable {
145  struct CHANCTRL : public Reg<uint16_t> { // channelX + 0x00
146  using Reg<uint16_t>::operator =;
147  ADD_FIELD16(interrupt_disable,0,1);
148  ADD_FIELD16(error_completion_enable, 2,1);
149  ADD_FIELD16(any_error_abort_enable,3,1);
150  ADD_FIELD16(error_int_enable,4,1);
151  ADD_FIELD16(desc_addr_snoop_control,5,1);
152  ADD_FIELD16(in_use, 8,1);
153  };
155 
156  struct CHANSTS : public Reg<uint64_t> { // channelX + 0x04
157  ADD_FIELD64(dma_transfer_status, 0, 3);
158  ADD_FIELD64(unaffiliated_error, 3, 1);
159  ADD_FIELD64(soft_error, 4, 1);
160  ADD_FIELD64(compl_desc_addr, 6, 58);
161  };
163 
164  uint64_t descChainAddr;
165 
166  struct CHANCMD : public Reg<uint8_t> { // channelX + 0x14
167  ADD_FIELD8(start_dma,0,1);
168  ADD_FIELD8(append_dma,1,1);
169  ADD_FIELD8(suspend_dma,2,1);
170  ADD_FIELD8(abort_dma,3,1);
171  ADD_FIELD8(resume_dma,4,1);
172  ADD_FIELD8(reset_dma,5,1);
173  };
175 
176  uint64_t completionAddr;
177 
178  struct CHANERR : public Reg<uint32_t> { // channel X + 0x28
179  ADD_FIELD32(source_addr_error,0,1);
180  ADD_FIELD32(dest_addr_error,1,1);
181  ADD_FIELD32(ndesc_addr_error,2,1);
182  ADD_FIELD32(desc_error,3,1);
183  ADD_FIELD32(chain_addr_error,4,1);
184  ADD_FIELD32(chain_cmd_error,5,1);
185  ADD_FIELD32(chipset_parity_error,6,1);
186  ADD_FIELD32(dma_parity_error,7,1);
187  ADD_FIELD32(read_data_error,8,1);
188  ADD_FIELD32(write_data_error,9,1);
189  ADD_FIELD32(desc_control_error,10,1);
190  ADD_FIELD32(desc_len_error,11,1);
191  ADD_FIELD32(completion_addr_error,12,1);
192  ADD_FIELD32(interrupt_config_error,13,1);
193  ADD_FIELD32(soft_error,14,1);
194  ADD_FIELD32(unaffiliated_error,15,1);
195  };
197 
198  void serialize(CheckpointOut &cp) const override
199  {
200  paramOut(cp, "ctrl", ctrl._data);
201  paramOut(cp, "status", status._data);
202  SERIALIZE_SCALAR(descChainAddr);
203  paramOut(cp, "command", command._data);
204  SERIALIZE_SCALAR(completionAddr);
205  paramOut(cp, "error", error._data);
206  }
207 
208  void unserialize(CheckpointIn &cp) override
209  {
210  paramIn(cp, "ctrl", ctrl._data);
211  paramIn(cp, "status", status._data);
212  UNSERIALIZE_SCALAR(descChainAddr);
213  paramIn(cp, "command", command._data);
214  UNSERIALIZE_SCALAR(completionAddr);
215  paramIn(cp, "error", error._data);
216  }
217 
218 
219 };
220 
221 } // namespace CopyEngineReg
222 
223 
#define ADD_FIELD16(NAME, OFFSET, BITS)
const uint32_t CHAN_CHAINADDR_HIGH
const uint32_t CHAN_CHAINADDR
void unserialize(CheckpointIn &cp) override
Unserialize an object.
const uint32_t DESC_CTRL_CP_STS
const uint32_t CHAN_CMPLNADDR_HIGH
const uint32_t CHAN_CMPLNADDR_LOW
const uint32_t CHAN_STATUS
const uint32_t DESC_CTRL_FRAME
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: cprintf.cc:40
const uint32_t GEN_XFERCAP
#define UNSERIALIZE_SCALAR(scalar)
Definition: serialize.hh:770
#define ADD_FIELD32(NAME, OFFSET, BITS)
void serialize(CheckpointOut &cp) const override
Serialize an object.
void paramOut(CheckpointOut &cp, const string &name, ExtMachInst const &machInst)
Definition: types.cc:38
const uint32_t CHAN_CONTROL
Bitfield< 9 > d
#define ADD_FIELD8(NAME, OFFSET, BITS)
void serialize(CheckpointOut &cp) const
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:140
const uint32_t DESC_CTRL_NULL
Basic support for object serialization.
Definition: serialize.hh:166
const uint32_t DESC_CTRL_SRC_SN
const uint32_t CHAN_COMMAND
#define SERIALIZE_SCALAR(scalar)
Definition: serialize.hh:763
const uint32_t GEN_ATTNSTATUS
const uint32_t DESC_CTRL_DST_SN
std::ostream CheckpointOut
Definition: serialize.hh:63
const uint32_t GEN_CHANCOUNT
#define ADD_FIELD64(NAME, OFFSET, BITS)
const uint32_t CHAN_ERROR
const uint32_t GEN_INTRCTRL
void paramIn(CheckpointIn &cp, const string &name, ExtMachInst &machInst)
Definition: types.cc:69
const uint32_t DESC_CTRL_INT_GEN
const uint32_t CHAN_CHAINADDR_LOW
void unserialize(CheckpointIn &cp)
const Reg< T > & operator=(T d)
const uint32_t CHAN_CMPLNADDR
void unserialize(CheckpointIn &cp) override
Unserialize an object.

Generated on Thu May 28 2020 16:21:33 for gem5 by doxygen 1.8.13