gem5  v21.0.1.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
smmu_v3.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013, 2018-2020 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 
38 #include "dev/arm/smmu_v3.hh"
39 
40 #include <cstddef>
41 #include <cstring>
42 
43 #include "base/bitfield.hh"
44 #include "base/cast.hh"
45 #include "base/logging.hh"
46 #include "base/trace.hh"
47 #include "base/types.hh"
48 #include "debug/Checkpoint.hh"
49 #include "debug/SMMUv3.hh"
51 #include "mem/packet_access.hh"
52 #include "sim/system.hh"
53 
54 SMMUv3::SMMUv3(const SMMUv3Params &params) :
55  ClockedObject(params),
56  system(*params.system),
57  requestorId(params.system->getRequestorId(this)),
58  requestPort(name() + ".request", *this),
59  tableWalkPort(name() + ".walker", *this),
60  controlPort(name() + ".control", *this, params.reg_map),
61  irqInterfaceEnable(params.irq_interface_enable),
62  tlb(params.tlb_entries, params.tlb_assoc, params.tlb_policy, this),
63  configCache(params.cfg_entries, params.cfg_assoc, params.cfg_policy, this),
64  ipaCache(params.ipa_entries, params.ipa_assoc, params.ipa_policy, this),
65  walkCache({ { params.walk_S1L0, params.walk_S1L1,
66  params.walk_S1L2, params.walk_S1L3,
67  params.walk_S2L0, params.walk_S2L1,
68  params.walk_S2L2, params.walk_S2L3 } },
69  params.walk_assoc, params.walk_policy, this),
70  tlbEnable(params.tlb_enable),
71  configCacheEnable(params.cfg_enable),
72  ipaCacheEnable(params.ipa_enable),
73  walkCacheEnable(params.walk_enable),
74  tableWalkPortEnable(false),
75  walkCacheNonfinalEnable(params.wc_nonfinal_enable),
76  walkCacheS1Levels(params.wc_s1_levels),
77  walkCacheS2Levels(params.wc_s2_levels),
78  requestPortWidth(params.request_port_width),
79  tlbSem(params.tlb_slots),
80  ifcSmmuSem(1),
81  smmuIfcSem(1),
82  configSem(params.cfg_slots),
83  ipaSem(params.ipa_slots),
84  walkSem(params.walk_slots),
85  requestPortSem(1),
86  transSem(params.xlate_slots),
87  ptwSem(params.ptw_slots),
88  cycleSem(1),
89  tlbLat(params.tlb_lat),
90  ifcSmmuLat(params.ifc_smmu_lat),
91  smmuIfcLat(params.smmu_ifc_lat),
92  configLat(params.cfg_lat),
93  ipaLat(params.ipa_lat),
94  walkLat(params.walk_lat),
95  stats(this),
96  deviceInterfaces(params.device_interfaces),
97  commandExecutor(name() + ".cmd_exec", *this),
98  regsMap(params.reg_map),
99  processCommandsEvent(this)
100 {
101  fatal_if(regsMap.size() != SMMU_REG_SIZE,
102  "Invalid register map size: %#x different than SMMU_REG_SIZE = %#x\n",
103  regsMap.size(), SMMU_REG_SIZE);
104 
105  // Init smmu registers to 0
106  memset(&regs, 0, sizeof(regs));
107 
108  // Setup RO ID registers
109  regs.idr0 = params.smmu_idr0;
110  regs.idr1 = params.smmu_idr1;
111  regs.idr2 = params.smmu_idr2;
112  regs.idr3 = params.smmu_idr3;
113  regs.idr4 = params.smmu_idr4;
114  regs.idr5 = params.smmu_idr5;
115  regs.iidr = params.smmu_iidr;
116  regs.aidr = params.smmu_aidr;
117 
118  // TODO: At the moment it possible to set the ID registers to hold
119  // any possible value. It would be nice to have a sanity check here
120  // at construction time in case some idx registers are programmed to
121  // store an unallowed values or if the are configuration conflicts.
122  warn("SMMUv3 IDx register values unchecked\n");
123 
124  for (auto ifc : deviceInterfaces)
125  ifc->setSMMU(this);
126 }
127 
128 bool
130 {
131  DPRINTF(SMMUv3, "[t] requestor resp addr=%#x size=%#x\n",
132  pkt->getAddr(), pkt->getSize());
133 
134  // @todo: We need to pay for this and not just zero it out
135  pkt->headerDelay = pkt->payloadDelay = 0;
136 
137  SMMUProcess *proc =
138  safe_cast<SMMUProcess *>(pkt->popSenderState());
139 
140  runProcessTiming(proc, pkt);
141 
142  return true;
143 }
144 
145 void
147 {
148  assert(!packetsToRetry.empty());
149 
150  while (!packetsToRetry.empty()) {
151  SMMUAction a = packetsToRetry.front();
152 
153  assert(a.type==ACTION_SEND_REQ || a.type==ACTION_SEND_REQ_FINAL);
154 
155  DPRINTF(SMMUv3, "[t] requestor retr addr=%#x size=%#x\n",
156  a.pkt->getAddr(), a.pkt->getSize());
157 
158  if (!requestPort.sendTimingReq(a.pkt))
159  break;
160 
161  packetsToRetry.pop();
162 
163  /*
164  * ACTION_SEND_REQ_FINAL means that we have just forwarded the packet
165  * on the requestor interface; this means that we no longer hold on to
166  * that transaction and therefore can accept a new one.
167  * If the response port was stalled then unstall it (send retry).
168  */
169  if (a.type == ACTION_SEND_REQ_FINAL)
171  }
172 }
173 
174 bool
176 {
177  DPRINTF(SMMUv3, "[t] requestor HWTW resp addr=%#x size=%#x\n",
178  pkt->getAddr(), pkt->getSize());
179 
180  // @todo: We need to pay for this and not just zero it out
181  pkt->headerDelay = pkt->payloadDelay = 0;
182 
183  SMMUProcess *proc =
184  safe_cast<SMMUProcess *>(pkt->popSenderState());
185 
186  runProcessTiming(proc, pkt);
187 
188  return true;
189 }
190 
191 void
193 {
194  assert(tableWalkPortEnable);
195  assert(!packetsTableWalkToRetry.empty());
196 
197  while (!packetsTableWalkToRetry.empty()) {
199 
200  assert(a.type==ACTION_SEND_REQ);
201 
202  DPRINTF(SMMUv3, "[t] requestor HWTW retr addr=%#x size=%#x\n",
203  a.pkt->getAddr(), a.pkt->getSize());
204 
205  if (!tableWalkPort.sendTimingReq(a.pkt))
206  break;
207 
209  }
210 }
211 
212 void
214 {
215  for (auto ifc : deviceInterfaces) {
216  ifc->scheduleDeviceRetry();
217  }
218 }
219 
222 {
223  if (system.isAtomicMode()) {
224  return runProcessAtomic(proc, pkt);
225  } else if (system.isTimingMode()) {
226  return runProcessTiming(proc, pkt);
227  } else {
228  panic("Not in timing or atomic mode!");
229  }
230 }
231 
234 {
235  SMMUAction action;
236  Tick delay = 0;
237  bool finished = false;
238 
239  do {
240  action = proc->run(pkt);
241 
242  switch (action.type) {
243  case ACTION_SEND_REQ:
244  // Send an MMU initiated request on the table walk port if
245  // it is enabled. Otherwise, fall through and handle same
246  // as the final ACTION_SEND_REQ_FINAL request.
247  if (tableWalkPortEnable) {
248  delay += tableWalkPort.sendAtomic(action.pkt);
249  pkt = action.pkt;
250  break;
251  }
254  delay += requestPort.sendAtomic(action.pkt);
255  pkt = action.pkt;
256  break;
257 
258  case ACTION_SEND_RESP:
260  case ACTION_SLEEP:
261  finished = true;
262  break;
263 
264  case ACTION_DELAY:
265  delay += action.delay;
266  break;
267 
268  case ACTION_TERMINATE:
269  panic("ACTION_TERMINATE in atomic mode\n");
270 
271  default:
272  panic("Unknown action\n");
273  }
274  } while (!finished);
275 
276  action.delay = delay;
277 
278  return action;
279 }
280 
283 {
284  SMMUAction action = proc->run(pkt);
285 
286  switch (action.type) {
287  case ACTION_SEND_REQ:
288  // Send an MMU initiated request on the table walk port if it is
289  // enabled. Otherwise, fall through and handle same as the final
290  // ACTION_SEND_REQ_FINAL request.
291  if (tableWalkPortEnable) {
292  action.pkt->pushSenderState(proc);
293 
294  DPRINTF(SMMUv3, "[t] requestor HWTW req addr=%#x size=%#x\n",
295  action.pkt->getAddr(), action.pkt->getSize());
296 
297  if (packetsTableWalkToRetry.empty()
298  && tableWalkPort.sendTimingReq(action.pkt)) {
300  } else {
301  DPRINTF(SMMUv3, "[t] requestor HWTW req needs retry,"
302  " qlen=%d\n", packetsTableWalkToRetry.size());
303  packetsTableWalkToRetry.push(action);
304  }
305 
306  break;
307  }
310  action.pkt->pushSenderState(proc);
311 
312  DPRINTF(SMMUv3, "[t] requestor req addr=%#x size=%#x\n",
313  action.pkt->getAddr(), action.pkt->getSize());
314 
315  if (packetsToRetry.empty() &&
316  requestPort.sendTimingReq(action.pkt)) {
318  } else {
319  DPRINTF(SMMUv3, "[t] requestor req needs retry, qlen=%d\n",
320  packetsToRetry.size());
321  packetsToRetry.push(action);
322  }
323 
324  break;
325 
326  case ACTION_SEND_RESP:
327  // @todo: We need to pay for this and not just zero it out
328  action.pkt->headerDelay = action.pkt->payloadDelay = 0;
329 
330  DPRINTF(SMMUv3, "[t] responder resp addr=%#x size=%#x\n",
331  action.pkt->getAddr(),
332  action.pkt->getSize());
333 
334  assert(action.ifc);
335  action.ifc->schedTimingResp(action.pkt);
336 
337  delete proc;
338  break;
339 
341  // @todo: We need to pay for this and not just zero it out
342  action.pkt->headerDelay = action.pkt->payloadDelay = 0;
343 
344  DPRINTF(SMMUv3, "[t] ATS responder resp addr=%#x size=%#x\n",
345  action.pkt->getAddr(), action.pkt->getSize());
346 
347  assert(action.ifc);
348  action.ifc->schedAtsTimingResp(action.pkt);
349 
350  delete proc;
351  break;
352 
353  case ACTION_DELAY:
354  case ACTION_SLEEP:
355  break;
356 
357  case ACTION_TERMINATE:
358  delete proc;
359  break;
360 
361  default:
362  panic("Unknown action\n");
363  }
364 
365  return action;
366 }
367 
368 void
370 {
371  DPRINTF(SMMUv3, "processCommands()\n");
372 
373  if (system.isAtomicMode()) {
375  (void) a;
376  } else if (system.isTimingMode()) {
377  if (!commandExecutor.isBusy())
379  } else {
380  panic("Not in timing or atomic mode!");
381  }
382 }
383 
384 void
386 {
387  switch (cmd.dw0.type) {
388  case CMD_PRF_CONFIG:
389  DPRINTF(SMMUv3, "CMD_PREFETCH_CONFIG - ignored\n");
390  break;
391 
392  case CMD_PRF_ADDR:
393  DPRINTF(SMMUv3, "CMD_PREFETCH_ADDR - ignored\n");
394  break;
395 
396  case CMD_CFGI_STE: {
397  DPRINTF(SMMUv3, "CMD_CFGI_STE sid=%#x\n", cmd.dw0.sid);
398  configCache.invalidateSID(cmd.dw0.sid);
399 
400  for (auto dev_interface : deviceInterfaces) {
401  dev_interface->microTLB->invalidateSID(cmd.dw0.sid);
402  dev_interface->mainTLB->invalidateSID(cmd.dw0.sid);
403  }
404  break;
405  }
406 
407  case CMD_CFGI_STE_RANGE: {
408  const auto range = cmd.dw1.range;
409  if (range == 31) {
410  // CMD_CFGI_ALL is an alias of CMD_CFGI_STE_RANGE with
411  // range = 31
412  DPRINTF(SMMUv3, "CMD_CFGI_ALL\n");
414 
415  for (auto dev_interface : deviceInterfaces) {
416  dev_interface->microTLB->invalidateAll();
417  dev_interface->mainTLB->invalidateAll();
418  }
419  } else {
420  DPRINTF(SMMUv3, "CMD_CFGI_STE_RANGE\n");
421  const auto start_sid = cmd.dw0.sid & ~((1 << (range + 1)) - 1);
422  const auto end_sid = start_sid + (1 << (range + 1)) - 1;
423  for (auto sid = start_sid; sid <= end_sid; sid++) {
425 
426  for (auto dev_interface : deviceInterfaces) {
427  dev_interface->microTLB->invalidateSID(sid);
428  dev_interface->mainTLB->invalidateSID(sid);
429  }
430  }
431  }
432  break;
433  }
434 
435  case CMD_CFGI_CD: {
436  DPRINTF(SMMUv3, "CMD_CFGI_CD sid=%#x ssid=%#x\n",
437  cmd.dw0.sid, cmd.dw0.ssid);
438  configCache.invalidateSSID(cmd.dw0.sid, cmd.dw0.ssid);
439 
440  for (auto dev_interface : deviceInterfaces) {
441  dev_interface->microTLB->invalidateSSID(
442  cmd.dw0.sid, cmd.dw0.ssid);
443  dev_interface->mainTLB->invalidateSSID(
444  cmd.dw0.sid, cmd.dw0.ssid);
445  }
446  break;
447  }
448 
449  case CMD_CFGI_CD_ALL: {
450  DPRINTF(SMMUv3, "CMD_CFGI_CD_ALL sid=%#x\n", cmd.dw0.sid);
451  configCache.invalidateSID(cmd.dw0.sid);
452 
453  for (auto dev_interface : deviceInterfaces) {
454  dev_interface->microTLB->invalidateSID(cmd.dw0.sid);
455  dev_interface->mainTLB->invalidateSID(cmd.dw0.sid);
456  }
457  break;
458  }
459 
460  case CMD_TLBI_NH_ALL: {
461  DPRINTF(SMMUv3, "CMD_TLBI_NH_ALL vmid=%#x\n", cmd.dw0.vmid);
462  for (auto dev_interface : deviceInterfaces) {
463  dev_interface->microTLB->invalidateVMID(cmd.dw0.vmid);
464  dev_interface->mainTLB->invalidateVMID(cmd.dw0.vmid);
465  }
466  tlb.invalidateVMID(cmd.dw0.vmid);
467  walkCache.invalidateVMID(cmd.dw0.vmid);
468  break;
469  }
470 
471  case CMD_TLBI_NH_ASID: {
472  DPRINTF(SMMUv3, "CMD_TLBI_NH_ASID asid=%#x vmid=%#x\n",
473  cmd.dw0.asid, cmd.dw0.vmid);
474  for (auto dev_interface : deviceInterfaces) {
475  dev_interface->microTLB->invalidateASID(
476  cmd.dw0.asid, cmd.dw0.vmid);
477  dev_interface->mainTLB->invalidateASID(
478  cmd.dw0.asid, cmd.dw0.vmid);
479  }
480  tlb.invalidateASID(cmd.dw0.asid, cmd.dw0.vmid);
481  walkCache.invalidateASID(cmd.dw0.asid, cmd.dw0.vmid);
482  break;
483  }
484 
485  case CMD_TLBI_NH_VAA: {
486  const Addr addr = cmd.addr();
487  DPRINTF(SMMUv3, "CMD_TLBI_NH_VAA va=%#08x vmid=%#x\n",
488  addr, cmd.dw0.vmid);
489  for (auto dev_interface : deviceInterfaces) {
490  dev_interface->microTLB->invalidateVAA(
491  addr, cmd.dw0.vmid);
492  dev_interface->mainTLB->invalidateVAA(
493  addr, cmd.dw0.vmid);
494  }
495  tlb.invalidateVAA(addr, cmd.dw0.vmid);
496  const bool leaf_only = cmd.dw1.leaf ? true : false;
497  walkCache.invalidateVAA(addr, cmd.dw0.vmid, leaf_only);
498  break;
499  }
500 
501  case CMD_TLBI_NH_VA: {
502  const Addr addr = cmd.addr();
503  DPRINTF(SMMUv3, "CMD_TLBI_NH_VA va=%#08x asid=%#x vmid=%#x\n",
504  addr, cmd.dw0.asid, cmd.dw0.vmid);
505  for (auto dev_interface : deviceInterfaces) {
506  dev_interface->microTLB->invalidateVA(
507  addr, cmd.dw0.asid, cmd.dw0.vmid);
508  dev_interface->mainTLB->invalidateVA(
509  addr, cmd.dw0.asid, cmd.dw0.vmid);
510  }
511  tlb.invalidateVA(addr, cmd.dw0.asid, cmd.dw0.vmid);
512  const bool leaf_only = cmd.dw1.leaf ? true : false;
513  walkCache.invalidateVA(addr, cmd.dw0.asid, cmd.dw0.vmid,
514  leaf_only);
515  break;
516  }
517 
518  case CMD_TLBI_S2_IPA: {
519  const Addr addr = cmd.addr();
520  DPRINTF(SMMUv3, "CMD_TLBI_S2_IPA ipa=%#08x vmid=%#x\n",
521  addr, cmd.dw0.vmid);
522  // This does not invalidate TLBs containing
523  // combined Stage1 + Stage2 translations, as per the spec.
524  ipaCache.invalidateIPA(addr, cmd.dw0.vmid);
525 
526  if (!cmd.dw1.leaf)
527  walkCache.invalidateVMID(cmd.dw0.vmid);
528  break;
529  }
530 
531  case CMD_TLBI_S12_VMALL: {
532  DPRINTF(SMMUv3, "CMD_TLBI_S12_VMALL vmid=%#x\n", cmd.dw0.vmid);
533  for (auto dev_interface : deviceInterfaces) {
534  dev_interface->microTLB->invalidateVMID(cmd.dw0.vmid);
535  dev_interface->mainTLB->invalidateVMID(cmd.dw0.vmid);
536  }
537  tlb.invalidateVMID(cmd.dw0.vmid);
538  ipaCache.invalidateVMID(cmd.dw0.vmid);
539  walkCache.invalidateVMID(cmd.dw0.vmid);
540  break;
541  }
542 
543  case CMD_TLBI_NSNH_ALL: {
544  DPRINTF(SMMUv3, "CMD_TLBI_NSNH_ALL\n");
545  for (auto dev_interface : deviceInterfaces) {
546  dev_interface->microTLB->invalidateAll();
547  dev_interface->mainTLB->invalidateAll();
548  }
549  tlb.invalidateAll();
552  break;
553  }
554 
555  case CMD_RESUME:
556  DPRINTF(SMMUv3, "CMD_RESUME\n");
557  panic("resume unimplemented");
558  break;
559 
560  default:
561  warn("Unimplemented command %#x\n", cmd.dw0.type);
562  break;
563  }
564 }
565 
566 const PageTableOps*
567 SMMUv3::getPageTableOps(uint8_t trans_granule)
568 {
569  static V8PageTableOps4k ptOps4k;
570  static V8PageTableOps16k ptOps16k;
571  static V8PageTableOps64k ptOps64k;
572 
573  switch (trans_granule) {
574  case TRANS_GRANULE_4K: return &ptOps4k;
575  case TRANS_GRANULE_16K: return &ptOps16k;
576  case TRANS_GRANULE_64K: return &ptOps64k;
577  default:
578  panic("Unknown translation granule size %d", trans_granule);
579  }
580 }
581 
582 Tick
584 {
585  DPRINTF(SMMUv3, "readControl: addr=%08x size=%d\n",
586  pkt->getAddr(), pkt->getSize());
587 
588  int offset = pkt->getAddr() - regsMap.start();
589  assert(offset >= 0 && offset < SMMU_REG_SIZE);
590 
591  if (inSecureBlock(offset)) {
592  warn("smmu: secure registers (0x%x) are not implemented\n",
593  offset);
594  }
595 
596  auto reg_ptr = regs.data + offset;
597 
598  switch (pkt->getSize()) {
599  case sizeof(uint32_t):
600  pkt->setLE<uint32_t>(*reinterpret_cast<uint32_t *>(reg_ptr));
601  break;
602  case sizeof(uint64_t):
603  pkt->setLE<uint64_t>(*reinterpret_cast<uint64_t *>(reg_ptr));
604  break;
605  default:
606  panic("smmu: unallowed access size: %d bytes\n", pkt->getSize());
607  break;
608  }
609 
610  pkt->makeAtomicResponse();
611 
612  return 0;
613 }
614 
615 Tick
617 {
618  int offset = pkt->getAddr() - regsMap.start();
619  assert(offset >= 0 && offset < SMMU_REG_SIZE);
620 
621  DPRINTF(SMMUv3, "writeControl: addr=%08x size=%d data=%16x\n",
622  pkt->getAddr(), pkt->getSize(),
623  pkt->getSize() == sizeof(uint64_t) ?
624  pkt->getLE<uint64_t>() : pkt->getLE<uint32_t>());
625 
626  switch (offset) {
627  case offsetof(SMMURegs, cr0):
628  assert(pkt->getSize() == sizeof(uint32_t));
629  regs.cr0 = regs.cr0ack = pkt->getLE<uint32_t>();
630  break;
631  case offsetof(SMMURegs, irq_ctrl):
632  assert(pkt->getSize() == sizeof(uint32_t));
633  if (irqInterfaceEnable) {
634  warn("SMMUv3::%s No support for interrupt sources", __func__);
635  regs.irq_ctrl = regs.irq_ctrlack = pkt->getLE<uint32_t>();
636  }
637  break;
638 
639  case offsetof(SMMURegs, cr1):
640  case offsetof(SMMURegs, cr2):
641  case offsetof(SMMURegs, strtab_base_cfg):
642  case offsetof(SMMURegs, eventq_cons):
643  case offsetof(SMMURegs, eventq_irq_cfg1):
644  case offsetof(SMMURegs, priq_cons):
645  assert(pkt->getSize() == sizeof(uint32_t));
646  *reinterpret_cast<uint32_t *>(regs.data + offset) =
647  pkt->getLE<uint32_t>();
648  break;
649 
650  case offsetof(SMMURegs, cmdq_cons):
651  assert(pkt->getSize() == sizeof(uint32_t));
652  if (regs.cr0 & CR0_CMDQEN_MASK) {
653  warn("CMDQ is enabled: ignoring write to CMDQ_CONS\n");
654  } else {
655  *reinterpret_cast<uint32_t *>(regs.data + offset) =
656  pkt->getLE<uint32_t>();
657  }
658  break;
659 
660  case offsetof(SMMURegs, cmdq_prod):
661  assert(pkt->getSize() == sizeof(uint32_t));
662  *reinterpret_cast<uint32_t *>(regs.data + offset) =
663  pkt->getLE<uint32_t>();
665  break;
666 
667  case offsetof(SMMURegs, strtab_base):
668  case offsetof(SMMURegs, eventq_irq_cfg0):
669  assert(pkt->getSize() == sizeof(uint64_t));
670  *reinterpret_cast<uint64_t *>(regs.data + offset) =
671  pkt->getLE<uint64_t>();
672  break;
673 
674  case offsetof(SMMURegs, cmdq_base):
675  assert(pkt->getSize() == sizeof(uint64_t));
676  if (regs.cr0 & CR0_CMDQEN_MASK) {
677  warn("CMDQ is enabled: ignoring write to CMDQ_BASE\n");
678  } else {
679  *reinterpret_cast<uint64_t *>(regs.data + offset) =
680  pkt->getLE<uint64_t>();
681  regs.cmdq_cons = 0;
682  regs.cmdq_prod = 0;
683  }
684  break;
685 
686  case offsetof(SMMURegs, eventq_base):
687  assert(pkt->getSize() == sizeof(uint64_t));
688  *reinterpret_cast<uint64_t *>(regs.data + offset) =
689  pkt->getLE<uint64_t>();
690  regs.eventq_cons = 0;
691  regs.eventq_prod = 0;
692  break;
693 
694  case offsetof(SMMURegs, priq_base):
695  assert(pkt->getSize() == sizeof(uint64_t));
696  *reinterpret_cast<uint64_t *>(regs.data + offset) =
697  pkt->getLE<uint64_t>();
698  regs.priq_cons = 0;
699  regs.priq_prod = 0;
700  break;
701 
702  default:
703  if (inSecureBlock(offset)) {
704  warn("smmu: secure registers (0x%x) are not implemented\n",
705  offset);
706  } else {
707  warn("smmu: write to read-only/undefined register at 0x%x\n",
708  offset);
709  }
710  }
711 
712  pkt->makeAtomicResponse();
713 
714  return 0;
715 }
716 
717 bool
718 SMMUv3::inSecureBlock(uint32_t offs) const
719 {
720  if (offs >= offsetof(SMMURegs, _secure_regs) && offs < SMMU_SECURE_SZ)
721  return true;
722  else
723  return false;
724 }
725 
726 void
728 {
729  // make sure both sides are connected and have the same block size
730  if (!requestPort.isConnected())
731  fatal("Request port is not connected.\n");
732 
733  // If the second request port is connected for the table walks, enable
734  // the mode to send table walks through this port instead
736  tableWalkPortEnable = true;
737 
738  // notify the request side of our address ranges
739  for (auto ifc : deviceInterfaces) {
740  ifc->sendRange();
741  }
742 
743  if (controlPort.isConnected())
745 }
746 
748  : Stats::Group(parent),
749  ADD_STAT(steL1Fetches, UNIT_COUNT, "STE L1 fetches"),
750  ADD_STAT(steFetches, UNIT_COUNT, "STE fetches"),
751  ADD_STAT(cdL1Fetches, UNIT_COUNT, "CD L1 fetches"),
752  ADD_STAT(cdFetches, UNIT_COUNT, "CD fetches"),
753  ADD_STAT(translationTimeDist, UNIT_TICK, "Time to translate address"),
754  ADD_STAT(ptwTimeDist, UNIT_TICK, "Time to walk page tables")
755 {
756  using namespace Stats;
757 
759  .flags(pdf);
760 
761  steFetches
762  .flags(pdf);
763 
765  .flags(pdf);
766 
767  cdFetches
768  .flags(pdf);
769 
771  .init(0, 2000000, 2000)
772  .flags(pdf);
773 
775  .init(0, 2000000, 2000)
776  .flags(pdf);
777 }
778 
781 {
782  // Wait until the Command Executor is not busy
783  if (commandExecutor.isBusy()) {
784  return DrainState::Draining;
785  }
786  return DrainState::Drained;
787 }
788 
789 void
791 {
792  DPRINTF(Checkpoint, "Serializing SMMUv3\n");
793 
794  SERIALIZE_ARRAY(regs.data, sizeof(regs.data) / sizeof(regs.data[0]));
795 }
796 
797 void
799 {
800  DPRINTF(Checkpoint, "Unserializing SMMUv3\n");
801 
802  UNSERIALIZE_ARRAY(regs.data, sizeof(regs.data) / sizeof(regs.data[0]));
803 }
804 
805 Port&
806 SMMUv3::getPort(const std::string &name, PortID id)
807 {
808  if (name == "request") {
809  return requestPort;
810  } else if (name == "walker") {
811  return tableWalkPort;
812  } else if (name == "control") {
813  return controlPort;
814  } else {
815  return ClockedObject::getPort(name, id);
816  }
817 }
SMMUAction::delay
Tick delay
Definition: smmu_v3_proc.hh:71
fatal
#define fatal(...)
This implements a cprintf based fatal() function.
Definition: logging.hh:183
CMD_CFGI_STE_RANGE
@ CMD_CFGI_STE_RANGE
Definition: smmu_v3_defs.hh:325
Packet::makeAtomicResponse
void makeAtomicResponse()
Definition: packet.hh:1017
SMMU_REG_SIZE
@ SMMU_REG_SIZE
Definition: smmu_v3_defs.hh:49
TRANS_GRANULE_64K
@ TRANS_GRANULE_64K
Definition: smmu_v3_defs.hh:75
warn
#define warn(...)
Definition: logging.hh:239
SMMUv3DeviceInterface::schedTimingResp
void schedTimingResp(PacketPtr pkt)
Definition: smmu_v3_deviceifc.cc:108
SMMUv3::SMMUv3Stats::steL1Fetches
Stats::Scalar steL1Fetches
Definition: smmu_v3.hh:139
system.hh
SMMURegs::eventq_cons
uint32_t eventq_cons
Definition: smmu_v3_defs.hh:177
PowerISA::cr1
cr1
Definition: miscregs.hh:51
ConfigCache::invalidateSSID
void invalidateSSID(uint32_t sid, uint32_t ssid)
Definition: smmu_v3_caches.cc:889
SMMUv3::processCommandsEvent
EventWrapper< SMMUv3, &SMMUv3::processCommands > processCommandsEvent
Definition: smmu_v3.hh:167
System::isTimingMode
bool isTimingMode() const
Is the system in timing mode?
Definition: system.hh:264
SMMUv3::regsMap
const AddrRange regsMap
Definition: smmu_v3.hh:151
Packet::getAddr
Addr getAddr() const
Definition: packet.hh:755
CMD_TLBI_S12_VMALL
@ CMD_TLBI_S12_VMALL
Definition: smmu_v3_defs.hh:339
Packet::payloadDelay
uint32_t payloadDelay
The extra pipelining delay from seeing the packet until the end of payload is transmitted by the comp...
Definition: packet.hh:413
SMMUProcess
Definition: smmu_v3_proc.hh:93
ACTION_TERMINATE
@ ACTION_TERMINATE
Definition: smmu_v3_proc.hh:63
SMMUv3::SMMUv3Stats::SMMUv3Stats
SMMUv3Stats(Stats::Group *parent)
Definition: smmu_v3.cc:747
IPACache::invalidateIPA
void invalidateIPA(Addr ipa, uint16_t vmid)
Definition: smmu_v3_caches.cc:710
SMMUv3::recvTimingResp
bool recvTimingResp(PacketPtr pkt)
Definition: smmu_v3.cc:129
CMD_CFGI_CD
@ CMD_CFGI_CD
Definition: smmu_v3_defs.hh:326
SMMUv3::irqInterfaceEnable
const bool irqInterfaceEnable
Definition: smmu_v3.hh:97
SMMUv3::ipaCache
IPACache ipaCache
Definition: smmu_v3.hh:101
smmu_v3_transl.hh
SMMUv3::regs
SMMURegs regs
Definition: smmu_v3.hh:152
SMMUv3::getPageTableOps
const PageTableOps * getPageTableOps(uint8_t trans_granule)
Definition: smmu_v3.cc:567
UNIT_TICK
#define UNIT_TICK
Definition: units.hh:40
Tick
uint64_t Tick
Tick count type.
Definition: types.hh:59
SMMURegs::cmdq_prod
uint32_t cmdq_prod
Definition: smmu_v3_defs.hh:143
SMMUAction::ifc
SMMUv3DeviceInterface * ifc
Definition: smmu_v3_proc.hh:70
PortID
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
Definition: types.hh:243
SMMUv3::runProcess
SMMUAction runProcess(SMMUProcess *proc, PacketPtr pkt)
Definition: smmu_v3.cc:221
cast.hh
SMMUv3::SMMUv3Stats::cdL1Fetches
Stats::Scalar cdL1Fetches
Definition: smmu_v3.hh:141
CMD_TLBI_NH_ASID
@ CMD_TLBI_NH_ASID
Definition: smmu_v3_defs.hh:329
SMMUv3::scheduleDeviceRetries
void scheduleDeviceRetries()
Definition: smmu_v3.cc:213
WalkCache::invalidateAll
void invalidateAll()
Definition: smmu_v3_caches.cc:1152
SMMUCommand::range
Bitfield< 4, 0 > range
Definition: smmu_v3_defs.hh:364
SMMUProcess::run
SMMUAction run(PacketPtr pkt)
Definition: smmu_v3_proc.cc:206
SMMUv3::runProcessTiming
SMMUAction runProcessTiming(SMMUProcess *proc, PacketPtr pkt)
Definition: smmu_v3.cc:282
ACTION_SLEEP
@ ACTION_SLEEP
Definition: smmu_v3_proc.hh:62
Packet::getSize
unsigned getSize() const
Definition: packet.hh:765
SMMURegs::cmdq_cons
uint32_t cmdq_cons
Definition: smmu_v3_defs.hh:144
SMMUAction::pkt
PacketPtr pkt
Definition: smmu_v3_proc.hh:69
SMMUv3::tlb
ARMArchTLB tlb
Definition: smmu_v3.hh:99
SMMUv3::packetsTableWalkToRetry
std::queue< SMMUAction > packetsTableWalkToRetry
Definition: smmu_v3.hh:157
SMMUv3::walkCache
WalkCache walkCache
Definition: smmu_v3.hh:102
SMMUv3::requestPort
SMMURequestPort requestPort
Definition: smmu_v3.hh:93
Packet::headerDelay
uint32_t headerDelay
The extra delay from seeing the packet until the header is transmitted.
Definition: packet.hh:395
ClockedObject
The ClockedObject class extends the SimObject with a clock and accessor functions to relate ticks to ...
Definition: clocked_object.hh:231
CMD_TLBI_NH_VA
@ CMD_TLBI_NH_VA
Definition: smmu_v3_defs.hh:331
SMMUCommand
Definition: smmu_v3_defs.hh:348
Stats::DataWrap::flags
Derived & flags(Flags _flags)
Set the flags and marks this stat to print at the end of simulation.
Definition: statistics.hh:339
SMMUv3::configCache
ConfigCache configCache
Definition: smmu_v3.hh:100
DrainState::Drained
@ Drained
Buffers drained, ready for serialization/handover.
WalkCache::invalidateVAA
void invalidateVAA(Addr va, uint16_t vmid, const bool leaf_only)
Definition: smmu_v3_caches.cc:1104
DrainState
DrainState
Object drain/handover states.
Definition: drain.hh:71
SMMUv3::runProcessAtomic
SMMUAction runProcessAtomic(SMMUProcess *proc, PacketPtr pkt)
Definition: smmu_v3.cc:233
X86ISA::system
Bitfield< 15 > system
Definition: misc.hh:997
SMMURegs::priq_cons
uint32_t priq_cons
Definition: smmu_v3_defs.hh:181
ACTION_DELAY
@ ACTION_DELAY
Definition: smmu_v3_proc.hh:61
SMMUCommand::type
type
Definition: smmu_v3_defs.hh:351
cp
Definition: cprintf.cc:37
WalkCache::invalidateVA
void invalidateVA(Addr va, uint16_t asid, uint16_t vmid, const bool leaf_only)
Definition: smmu_v3_caches.cc:1085
EventManager::schedule
void schedule(Event &event, Tick when)
Definition: eventq.hh:1016
ArmISA::a
Bitfield< 8 > a
Definition: miscregs_types.hh:62
CMD_TLBI_S2_IPA
@ CMD_TLBI_S2_IPA
Definition: smmu_v3_defs.hh:338
bitfield.hh
ACTION_SEND_REQ_FINAL
@ ACTION_SEND_REQ_FINAL
Definition: smmu_v3_proc.hh:58
RequestPort::sendTimingReq
bool sendTimingReq(PacketPtr pkt)
Attempt to send a timing request to the responder port by calling its corresponding receive function.
Definition: port.hh:492
SimObject::getPort
virtual Port & getPort(const std::string &if_name, PortID idx=InvalidPortID)
Get a port with a given name and index.
Definition: sim_object.cc:120
CR0_CMDQEN_MASK
@ CR0_CMDQEN_MASK
Definition: smmu_v3_defs.hh:316
SMMURegs
Definition: smmu_v3_defs.hh:100
DPRINTF
#define DPRINTF(x,...)
Definition: trace.hh:237
ADD_STAT
#define ADD_STAT(n,...)
Convenience macro to add a stat to a statistics group.
Definition: group.hh:71
SMMURegs::irq_ctrl
uint32_t irq_ctrl
Definition: smmu_v3_defs.hh:126
SMMUv3::SMMUv3
SMMUv3(const SMMUv3Params &p)
Definition: smmu_v3.cc:54
SMMUCommand::sid
Bitfield< 63, 32 > sid
Definition: smmu_v3_defs.hh:357
SMMUv3::inSecureBlock
bool inSecureBlock(uint32_t offs) const
Definition: smmu_v3.cc:718
SMMUv3::SMMUv3Stats::cdFetches
Stats::Scalar cdFetches
Definition: smmu_v3.hh:142
Port
Ports are used to interface objects to each other.
Definition: port.hh:56
SMMUAction
Definition: smmu_v3_proc.hh:66
IPACache::invalidateAll
void invalidateAll()
Definition: smmu_v3_caches.cc:753
CMD_TLBI_NH_ALL
@ CMD_TLBI_NH_ALL
Definition: smmu_v3_defs.hh:328
SMMUv3::commandExecutor
SMMUCommandExecProcess commandExecutor
Definition: smmu_v3.hh:149
M5_FALLTHROUGH
#define M5_FALLTHROUGH
Definition: compiler.hh:59
ACTION_SEND_RESP_ATS
@ ACTION_SEND_RESP_ATS
Definition: smmu_v3_proc.hh:60
SMMUv3::tableWalkPort
SMMUTableWalkPort tableWalkPort
Definition: smmu_v3.hh:94
SERIALIZE_ARRAY
#define SERIALIZE_ARRAY(member, size)
Definition: serialize.hh:626
SMMUv3::readControl
Tick readControl(PacketPtr pkt)
Definition: smmu_v3.cc:583
SMMUv3::system
const System & system
Definition: smmu_v3.hh:90
SMMUv3::deviceInterfaces
std::vector< SMMUv3DeviceInterface * > deviceInterfaces
Definition: smmu_v3.hh:147
SMMUv3::packetsToRetry
std::queue< SMMUAction > packetsToRetry
Definition: smmu_v3.hh:156
SMMUCommand::asid
Bitfield< 63, 48 > asid
Definition: smmu_v3_defs.hh:356
UNIT_COUNT
#define UNIT_COUNT
Definition: units.hh:49
Addr
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:148
SMMUv3::processCommands
void processCommands()
Definition: smmu_v3.cc:369
SMMUv3::controlPort
SMMUControlPort controlPort
Definition: smmu_v3.hh:95
SMMUAction::type
SMMUActionType type
Definition: smmu_v3_proc.hh:68
SMMURegs::priq_prod
uint32_t priq_prod
Definition: smmu_v3_defs.hh:180
name
const std::string & name()
Definition: trace.cc:48
SMMURegs::irq_ctrlack
uint32_t irq_ctrlack
Definition: smmu_v3_defs.hh:127
packet_access.hh
SMMUv3::serialize
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: smmu_v3.cc:790
IPACache::invalidateVMID
void invalidateVMID(uint16_t vmid)
Definition: smmu_v3_caches.cc:738
V8PageTableOps16k
Definition: smmu_v3_ptops.hh:86
SMMUv3::SMMUv3Stats::translationTimeDist
Stats::Distribution translationTimeDist
Definition: smmu_v3.hh:143
SMMUv3::recvReqRetry
void recvReqRetry()
Definition: smmu_v3.cc:146
WalkCache::invalidateASID
void invalidateASID(uint16_t asid, uint16_t vmid)
Definition: smmu_v3_caches.cc:1122
X86ISA::addr
Bitfield< 3 > addr
Definition: types.hh:80
SMMURegs::data
uint8_t data[SMMU_REG_SIZE]
Definition: smmu_v3_defs.hh:102
SimObject::name
virtual const std::string name() const
Definition: sim_object.hh:182
ACTION_SEND_REQ
@ ACTION_SEND_REQ
Definition: smmu_v3_proc.hh:57
ConfigCache::invalidateSID
void invalidateSID(uint32_t sid)
Definition: smmu_v3_caches.cc:902
SMMUv3::drain
DrainState drain() override
Draining is the process of clearing out the states of SimObjects.These are the SimObjects that are pa...
Definition: smmu_v3.cc:780
ARMArchTLB::invalidateASID
void invalidateASID(uint16_t asid, uint16_t vmid)
Definition: smmu_v3_caches.cc:543
SMMUv3DeviceInterface::schedAtsTimingResp
void schedAtsTimingResp(PacketPtr pkt)
Definition: smmu_v3_deviceifc.cc:114
ConfigCache::invalidateAll
void invalidateAll()
Definition: smmu_v3_caches.cc:917
smmu_v3.hh
SMMUv3::tableWalkRecvReqRetry
void tableWalkRecvReqRetry()
Definition: smmu_v3.cc:192
Packet::getLE
T getLE() const
Get the data in the packet byte swapped from little endian to host endian.
Definition: packet_access.hh:75
Packet::pushSenderState
void pushSenderState(SenderState *sender_state)
Push a new sender state to the packet and make the current sender state the predecessor of the new on...
Definition: packet.cc:332
SMMURegs::cr0ack
uint32_t cr0ack
Definition: smmu_v3_defs.hh:115
AddrRange::start
Addr start() const
Get the start address of the range.
Definition: addr_range.hh:314
V8PageTableOps64k
Definition: smmu_v3_ptops.hh:99
UNSERIALIZE_ARRAY
#define UNSERIALIZE_ARRAY(member, size)
Definition: serialize.hh:634
types.hh
SMMUCommand::addr
uint64_t addr() const
Definition: smmu_v3_defs.hh:369
Stats::Distribution::init
Distribution & init(Counter min, Counter max, Counter bkt)
Set the parameters of this distribution.
Definition: statistics.hh:2113
Stats::pdf
const FlagsType pdf
Print the percent of the total that this entry represents.
Definition: info.hh:52
Packet
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition: packet.hh:258
SMMURegs::cr0
uint32_t cr0
Definition: smmu_v3_defs.hh:114
Stats::Group
Statistics container.
Definition: group.hh:87
ARMArchTLB::invalidateVAA
void invalidateVAA(Addr va, uint16_t vmid)
Definition: smmu_v3_caches.cc:528
CMD_RESUME
@ CMD_RESUME
Definition: smmu_v3_defs.hh:343
SMMUv3::writeControl
Tick writeControl(PacketPtr pkt)
Definition: smmu_v3.cc:616
Packet::popSenderState
SenderState * popSenderState()
Pop the top of the state stack and return a pointer to it.
Definition: packet.cc:340
Port::isConnected
bool isConnected() const
Is this port currently connected to a peer?
Definition: port.hh:128
logging.hh
CMD_TLBI_NSNH_ALL
@ CMD_TLBI_NSNH_ALL
Definition: smmu_v3_defs.hh:340
Clocked::nextCycle
Tick nextCycle() const
Based on the clock of the object, determine the start tick of the first cycle that is at least one cy...
Definition: clocked_object.hh:210
SMMUv3::getPort
virtual Port & getPort(const std::string &name, PortID id=InvalidPortID) override
Get a port with a given name and index.
Definition: smmu_v3.cc:806
CMD_CFGI_CD_ALL
@ CMD_CFGI_CD_ALL
Definition: smmu_v3_defs.hh:327
SMMUv3::tableWalkPortEnable
bool tableWalkPortEnable
Definition: smmu_v3.hh:108
Packet::setLE
void setLE(T v)
Set the value in the data pointer to v as little endian.
Definition: packet_access.hh:105
ARMArchTLB::invalidateAll
void invalidateAll()
Definition: smmu_v3_caches.cc:573
CheckpointOut
std::ostream CheckpointOut
Definition: serialize.hh:64
CMD_PRF_CONFIG
@ CMD_PRF_CONFIG
Definition: smmu_v3_defs.hh:322
CMD_CFGI_STE
@ CMD_CFGI_STE
Definition: smmu_v3_defs.hh:324
Stats
Definition: statistics.cc:53
ARMArchTLB::invalidateVMID
void invalidateVMID(uint16_t vmid)
Definition: smmu_v3_caches.cc:558
SMMUv3
Definition: smmu_v3.hh:81
trace.hh
PageTableOps
Definition: smmu_v3_ptops.hh:45
SimObject::params
const Params & params() const
Definition: sim_object.hh:168
SMMUv3::init
virtual void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
Definition: smmu_v3.cc:727
SMMUv3::tableWalkRecvTimingResp
bool tableWalkRecvTimingResp(PacketPtr pkt)
Definition: smmu_v3.cc:175
RequestPort::sendAtomic
Tick sendAtomic(PacketPtr pkt)
Send an atomic request packet, where the data is moved and the state is updated in zero time,...
Definition: port.hh:461
ARMArchTLB::invalidateVA
void invalidateVA(Addr va, uint16_t asid, uint16_t vmid)
Definition: smmu_v3_caches.cc:512
fatal_if
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
Definition: logging.hh:219
SMMUv3::SMMUv3Stats::steFetches
Stats::Scalar steFetches
Definition: smmu_v3.hh:140
CheckpointIn
Definition: serialize.hh:68
SMMUv3::SMMUv3Stats::ptwTimeDist
Stats::Distribution ptwTimeDist
Definition: smmu_v3.hh:144
SMMUv3::unserialize
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: smmu_v3.cc:798
ResponsePort::sendRangeChange
void sendRangeChange() const
Called by the owner to send a range change.
Definition: port.hh:293
SMMUv3::processCommand
void processCommand(const SMMUCommand &cmd)
Definition: smmu_v3.cc:385
System::isAtomicMode
bool isAtomicMode() const
Is the system in atomic mode?
Definition: system.hh:253
ArmISA::tlb
Bitfield< 59, 56 > tlb
Definition: miscregs_types.hh:88
SMMUCommand::vmid
Bitfield< 47, 32 > vmid
Definition: smmu_v3_defs.hh:355
CMD_PRF_ADDR
@ CMD_PRF_ADDR
Definition: smmu_v3_defs.hh:323
SMMU_SECURE_SZ
@ SMMU_SECURE_SZ
Definition: smmu_v3_defs.hh:46
SMMUCommand::ssid
Bitfield< 31, 12 > ssid
Definition: smmu_v3_defs.hh:354
ACTION_SEND_RESP
@ ACTION_SEND_RESP
Definition: smmu_v3_proc.hh:59
TRANS_GRANULE_16K
@ TRANS_GRANULE_16K
Definition: smmu_v3_defs.hh:76
V8PageTableOps4k
Definition: smmu_v3_ptops.hh:73
CMD_TLBI_NH_VAA
@ CMD_TLBI_NH_VAA
Definition: smmu_v3_defs.hh:330
DrainState::Draining
@ Draining
Draining buffers pending serialization/handover.
SMMURegs::eventq_prod
uint32_t eventq_prod
Definition: smmu_v3_defs.hh:176
SMMUCommandExecProcess::isBusy
bool isBusy() const
Definition: smmu_v3_cmdexec.hh:65
WalkCache::invalidateVMID
void invalidateVMID(uint16_t vmid)
Definition: smmu_v3_caches.cc:1137
panic
#define panic(...)
This implements a cprintf based panic() function.
Definition: logging.hh:171
ArmISA::offset
Bitfield< 23, 0 > offset
Definition: types.hh:153
TRANS_GRANULE_4K
@ TRANS_GRANULE_4K
Definition: smmu_v3_defs.hh:74

Generated on Tue Jun 22 2021 15:28:27 for gem5 by doxygen 1.8.17