gem5  v19.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
smmu_v3_defs.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013, 2018-2019 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  * Redistribution and use in source and binary forms, with or without
15  * modification, are permitted provided that the following conditions are
16  * met: redistributions of source code must retain the above copyright
17  * notice, this list of conditions and the following disclaimer;
18  * redistributions in binary form must reproduce the above copyright
19  * notice, this list of conditions and the following disclaimer in the
20  * documentation and/or other materials provided with the distribution;
21  * neither the name of the copyright holders nor the names of its
22  * contributors may be used to endorse or promote products derived from
23  * this software without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36  *
37  * Authors: Stan Czerniawski
38  */
39 
40 #ifndef __DEV_ARM_SMMU_V3_DEFS_HH__
41 #define __DEV_ARM_SMMU_V3_DEFS_HH__
42 
43 #include <stdint.h>
44 
45 #include "base/bitunion.hh"
46 
47 enum {
48  SMMU_SECURE_SZ = 0x184, // Secure regs are within page0
49  SMMU_PAGE_ZERO_SZ = 0x10000,
50  SMMU_PAGE_ONE_SZ = 0x10000,
52 };
53 
54 enum {
60 };
61 
62 enum {
66 };
67 
68 enum {
73 };
74 
75 enum {
80 };
81 
82 enum {
83  ST_BASE_ADDR_MASK = 0x0000ffffffffffe0ULL,
84  ST_CFG_SIZE_MASK = 0x000000000000003fULL,
85  ST_CFG_SPLIT_MASK = 0x00000000000007c0ULL,
86  ST_CFG_FMT_MASK = 0x0000000000030000ULL,
87  ST_CFG_FMT_LINEAR = 0x0000000000000000ULL,
88  ST_CFG_FMT_2LEVEL = 0x0000000000010000ULL,
89  ST_L2_SPAN_MASK = 0x000000000000001fULL,
90  ST_L2_ADDR_MASK = 0x0000ffffffffffe0ULL,
91 
92  VMT_BASE_ADDR_MASK = 0x0000ffffffffffe0ULL,
93  VMT_BASE_SIZE_MASK = 0x000000000000001fULL,
94 
95  Q_BASE_ADDR_MASK = 0x0000ffffffffffe0ULL,
96  Q_BASE_SIZE_MASK = 0x000000000000001fULL,
97 
98  E_BASE_ENABLE_MASK = 0x8000000000000000ULL,
99  E_BASE_ADDR_MASK = 0x0000fffffffffffcULL,
100 };
101 
102 union SMMURegs
103 {
104  uint8_t data[SMMU_REG_SIZE];
105 
106  struct
107  {
108  uint32_t idr0; // 0x0000
109  uint32_t idr1; // 0x0004
110  uint32_t idr2; // 0x0008
111  uint32_t idr3; // 0x000c
112  uint32_t idr4; // 0x0010
113  uint32_t idr5; // 0x0014
114  uint32_t iidr; // 0x0018
115  uint32_t aidr; // 0x001c
116  uint32_t cr0; // 0x0020
117  uint32_t cr0ack; // 0x0024
118  uint32_t cr1; // 0x0028
119  uint32_t cr2; // 0x002c
120  uint32_t _pad1; // 0x0030
121  uint32_t _pad2; // 0x0034
122  uint32_t _pad3; // 0x0038
123  uint32_t _pad4; // 0x003c
124  uint32_t statusr; // 0x0040
125  uint32_t gbpa; // 0x0044
126  uint32_t agbpa; // 0x0048
127  uint32_t _pad5; // 0x004c
128  uint32_t irq_ctrl; // 0x0050
129  uint32_t irq_ctrlack; // 0x0054
130  uint32_t _pad6; // 0x0058
131  uint32_t _pad7; // 0x005c
132 
133  uint32_t gerror; // 0x0060
134  uint32_t gerrorn; // 0x0064
135  uint64_t gerror_irq_cfg0; // 0x0068, 64 bit
136  uint32_t gerror_irq_cfg1; // 0x0070
137  uint32_t gerror_irq_cfg2; // 0x0074
138  uint32_t _pad_1; // 0x0078
139  uint32_t _pad_2; // 0x007c
140 
141  uint64_t strtab_base; // 0x0080, 64 bit
142  uint32_t strtab_base_cfg; // 0x0088
143 
144  uint64_t cmdq_base; // 0x0090, 64 bit
145  uint32_t cmdq_prod; // 0x0098
146  uint32_t cmdq_cons; // 0x009c
147  uint64_t eventq_base; // 0x00a0, 64 bit
148  uint32_t _pad8; // 0x00a8
149  uint32_t _pad9; // 0x00ac
150  uint64_t eventq_irq_cfg0; // 0x00b0, 64 bit
151  uint32_t eventq_irq_cfg1; // 0x00b8
152  uint32_t eventq_irq_cfg2; // 0x00bc
153  uint64_t priq_base; // 0x00c0, 64 bit
154  uint32_t _pad10; // 0x00c8
155  uint32_t _pad11; // 0x00cc
156 
157  uint64_t priq_irq_cfg0; // 0x00d0
158  uint32_t priq_irq_cfg1; // 0x00d8
159  uint32_t priq_irq_cfg2; // 0x00dc
160 
161  uint32_t _pad12[8]; // 0x00e0 - 0x0100
162  uint32_t gatos_ctrl; // 0x0100
163  uint32_t _pad13; // 0x0104
164  uint64_t gatos_sid; // 0x0108
165  uint64_t gatos_addr; // 0x0110
166  uint64_t gatos_par; // 0x0118
167  uint32_t _pad14[24]; // 0x0120
168  uint32_t vatos_sel; // 0x0180
169 
170  uint32_t _pad15[8095]; // 0x184 - 0x7ffc
171 
172  uint8_t _secure_regs[SMMU_SECURE_SZ]; // 0x8000 - 0x8180
173 
174  uint32_t _pad16[8095]; // 0x8184 - 0x10000
175 
176  // Page 1
177  uint32_t _pad17[42]; // 0x10000
178  uint32_t eventq_prod; // 0x100A8
179  uint32_t eventq_cons; // 0x100AC
180 
181  uint32_t _pad18[6]; // 0x100B0
182  uint32_t priq_prod; // 0x100C8
183  uint32_t priq_cons; // 0x100CC
184  };
185 };
186 
188 {
189  BitUnion64(DWORD0)
190  Bitfield<0> valid;
191  Bitfield<3, 1> config;
192  Bitfield<5, 4> s1fmt;
193  Bitfield<51, 6> s1ctxptr;
194  Bitfield<63, 59> s1cdmax;
195  EndBitUnion(DWORD0)
196  DWORD0 dw0;
197 
198  BitUnion64(DWORD1)
199  Bitfield<1, 0> s1dss;
200  Bitfield<3, 2> s1cir;
201  Bitfield<5, 4> s1cor;
202  Bitfield<7, 6> s1csh;
203  Bitfield<8> s2hwu59;
204  Bitfield<9> s2hwu60;
205  Bitfield<10> s2hwu61;
206  Bitfield<11> s2hwu62;
207  Bitfield<12> dre;
208  Bitfield<16, 13> cont;
209  Bitfield<17> dcp;
210  Bitfield<18> ppar;
211  Bitfield<19> mev;
212  Bitfield<27> s1stalld;
213  Bitfield<29, 28> eats;
214  Bitfield<31, 30> strw;
215  Bitfield<35, 32> memattr;
216  Bitfield<36> mtcfg;
217  Bitfield<40, 37> alloccfg;
218  Bitfield<45, 44> shcfg;
219  Bitfield<47, 46> nscfg;
220  Bitfield<49, 48> privcfg;
221  Bitfield<51, 50> instcfg;
222  EndBitUnion(DWORD1)
223  DWORD1 dw1;
224 
225  BitUnion64(DWORD2)
226  Bitfield<15, 0> s2vmid;
227  Bitfield<37, 32> s2t0sz;
228  Bitfield<39, 38> s2sl0;
229  Bitfield<41, 40> s2ir0;
230  Bitfield<43, 42> s2or0;
231  Bitfield<45, 44> s2sh0;
232  Bitfield<47, 46> s2tg;
233  Bitfield<50, 48> s2ps;
234  Bitfield<51> s2aa64;
235  Bitfield<52> s2endi;
236  Bitfield<53> s2affd;
237  Bitfield<54> s2ptw;
238  Bitfield<55> s2hd;
239  Bitfield<56> s2ha;
240  Bitfield<57> s2s;
241  Bitfield<58> s2r;
242  EndBitUnion(DWORD2)
243  DWORD2 dw2;
244 
245  BitUnion64(DWORD3)
246  Bitfield<51, 4> s2ttb;
247  EndBitUnion(DWORD3)
248  DWORD3 dw3;
249 
250  uint64_t _pad[4];
251 };
252 
254 {
255  BitUnion64(DWORD0)
256  Bitfield<5, 0> t0sz;
257  Bitfield<7, 6> tg0;
258  Bitfield<9, 8> ir0;
259  Bitfield<11, 10> or0;
260  Bitfield<13, 12> sh0;
261  Bitfield<14> epd0;
262  Bitfield<15> endi;
263  Bitfield<21, 16> t1sz;
264  Bitfield<23, 22> tg1;
265  Bitfield<25, 24> ir1;
266  Bitfield<27, 26> or1;
267  Bitfield<29, 28> sh1;
268  Bitfield<30> epd1;
269  Bitfield<31> valid;
270  Bitfield<34, 32> ips;
271  Bitfield<35> affd;
272  Bitfield<36> wxn;
273  Bitfield<37> uwxn;
274  Bitfield<39, 38> tbi;
275  Bitfield<40> pan;
276  Bitfield<41> aa64;
277  Bitfield<42> hd;
278  Bitfield<43> ha;
279  Bitfield<44> s;
280  Bitfield<45> r;
281  Bitfield<46> a;
282  Bitfield<47> aset;
283  Bitfield<63, 48> asid;
284  EndBitUnion(DWORD0)
285  DWORD0 dw0;
286 
287  BitUnion64(DWORD1)
288  Bitfield<0> nscfg0;
289  Bitfield<1> had0;
290  Bitfield<51, 4> ttb0;
291  Bitfield<60> hwu0g59;
292  Bitfield<61> hwu0g60;
293  Bitfield<62> hwu0g61;
294  Bitfield<63> hwu0g62;
295  EndBitUnion(DWORD1)
296  DWORD1 dw1;
297 
298  BitUnion64(DWORD2)
299  Bitfield<0> nscfg1;
300  Bitfield<1> had1;
301  Bitfield<51, 4> ttb1;
302  Bitfield<60> hwu1g59;
303  Bitfield<61> hwu1g60;
304  Bitfield<62> hwu1g61;
305  Bitfield<63> hwu1g62;
306  EndBitUnion(DWORD2)
307  DWORD2 dw2;
308 
309  uint64_t mair;
310  uint64_t amair;
311  uint64_t _pad[3];
312 };
313 
314 enum {
320  CR0_VMW_MASK = 0x1C0,
321 };
322 
325  CMD_PRF_ADDR = 0x02,
326  CMD_CFGI_STE = 0x03,
328  CMD_CFGI_CD = 0x05,
343  CMD_ATC_INV = 0x40,
344  CMD_PRI_RESP = 0x41,
345  CMD_RESUME = 0x44,
347  CMD_SYNC = 0x46,
348 };
349 
351 {
352  BitUnion64(DWORD0)
353  Bitfield<7, 0> type;
354  Bitfield<10> ssec;
355  Bitfield<11> ssv;
356  Bitfield<31, 12> ssid;
357  Bitfield<47, 32> vmid;
358  Bitfield<63, 48> asid;
359  Bitfield<63, 32> sid;
360  EndBitUnion(DWORD0)
361  DWORD0 dw0;
362 
363  BitUnion64(DWORD1)
364  Bitfield<0> leaf;
365  Bitfield<4, 0> size;
366  Bitfield<4, 0> range;
367  Bitfield<63, 12> address;
368  EndBitUnion(DWORD1)
369  DWORD1 dw1;
370 
371  uint64_t addr() const
372  {
373  uint64_t address = (uint64_t)(dw1.address) << 12;
374  return address;
375  }
376 };
377 
379  EVT_FAULT = 0x0001,
380 };
381 
383  EVF_WRITE = 0x0001,
384 };
385 
386 struct SMMUEvent
387 {
388  uint16_t type;
389  uint16_t stag;
390  uint32_t flags;
391  uint32_t streamId;
392  uint32_t substreamId;
393  uint64_t va;
394  uint64_t ipa;
395 };
396 
397 enum {
399 };
400 
401 #endif /* __DEV_ARM_SMMU_V3_DEFS_HH__ */
uint32_t irq_ctrl
uint32_t _pad18[6]
EndBitUnion(UserDescFlags) struct UserDesc32
Definition: process.cc:160
uint32_t idr3
uint32_t iidr
uint32_t aidr
uint32_t _pad13
uint32_t _pad_2
uint64_t eventq_base
Bitfield< 8 > a
uint32_t idr4
ip6_addr_t addr
Definition: inet.hh:335
uint32_t irq_ctrlack
uint32_t _pad9
uint32_t gatos_ctrl
uint64_t ipa
uint32_t _pad5
uint32_t priq_irq_cfg2
uint32_t _pad1
uint32_t eventq_irq_cfg2
Bitfield< 13, 12 > sh0
uint32_t _pad3
uint16_t type
uint32_t gerror_irq_cfg2
Bitfield< 51, 6 > s1ctxptr
uint32_t _pad16[8095]
Bitfield< 19, 18 > or1
uint32_t _pad12[8]
uint8_t type
Definition: inet.hh:333
Bitfield< 18, 16 > t1sz
Bitfield< 30 > tg1
uint32_t _pad17[42]
Bitfield< 14 > tg0
uint32_t priq_prod
Bitfield< 4 > s
uint32_t eventq_prod
uint32_t cr0ack
uint64_t strtab_base
uint64_t gatos_sid
uint64_t va
uint32_t _pad8
uint32_t _pad15[8095]
uint32_t _pad6
uint32_t idr5
SMMUCommandType
uint32_t cmdq_cons
uint32_t idr0
uint32_t cr2
Bitfield< 19 > wxn
SMMUEventTypes
Bitfield< 5, 4 > s1fmt
uint32_t strtab_base_cfg
Bitfield< 7 > epd0
Bitfield< 63, 59 > s1cdmax
uint8_t _secure_regs[SMMU_SECURE_SZ]
uint64_t priq_base
uint32_t _pad2
Bitfield< 39 > ha
#define ULL(N)
uint64_t constant
Definition: types.hh:50
uint64_t eventq_irq_cfg0
uint32_t cr1
Bitfield< 29, 28 > sh1
uint32_t _pad10
uint32_t substreamId
uint32_t vatos_sel
uint32_t gerror_irq_cfg1
uint16_t stag
uint32_t agbpa
uint32_t _pad7
uint32_t eventq_irq_cfg1
uint32_t eventq_cons
uint32_t _pad11
Bitfield< 3, 2 > ir1
Bitfield< 40 > hd
uint32_t cr0
uint32_t _pad14[24]
uint32_t _pad4
Bitfield< 17, 16 > or0
uint8_t data[SMMU_REG_SIZE]
uint32_t _pad_1
uint64_t priq_irq_cfg0
uint32_t idr1
Bitfield< 22 > pan
uint64_t gerror_irq_cfg0
uint32_t priq_irq_cfg1
uint32_t streamId
Bitfield< 2, 0 > t0sz
uint32_t flags
Bitfield< 3, 1 > config
Bitfield< 34, 32 > ips
uint32_t idr2
uint32_t gerror
uint32_t priq_cons
uint32_t cmdq_prod
#define BitUnion64(name)
Definition: bitunion.hh:376
SMMUEventFlags
uint32_t gbpa
uint64_t gatos_par
uint32_t statusr
Bitfield< 20 > uwxn
Bitfield< 20 > tbi
uint64_t cmdq_base
uint32_t gerrorn
uint64_t gatos_addr
Bitfield< 23 > epd1

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