gem5  v21.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
gic_v3_its.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 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 
38 #include "dev/arm/gic_v3_its.hh"
39 
40 #include <cassert>
41 #include <functional>
42 
43 #include "base/logging.hh"
44 #include "base/trace.hh"
45 #include "debug/AddrRanges.hh"
46 #include "debug/Drain.hh"
47 #include "debug/GIC.hh"
48 #include "debug/ITS.hh"
49 #include "dev/arm/gic_v3.hh"
52 #include "mem/packet_access.hh"
53 
54 #define COMMAND(x, method) { x, DispatchEntry(#x, method) }
55 
56 const AddrRange Gicv3Its::GITS_BASER(0x0100, 0x0140);
57 
58 const uint32_t Gicv3Its::CTLR_QUIESCENT = 0x80000000;
59 
61  : its(_its), coroutine(nullptr)
62 {
63 }
64 
66 {
67 }
68 
69 void
71 {
72  coroutine.reset(new Coroutine(
73  std::bind(&ItsProcess::main, this, std::placeholders::_1)));
74 }
75 
76 const std::string
78 {
79  return its.name();
80 }
81 
84 {
85  assert(coroutine != nullptr);
86  assert(*coroutine);
87  return (*coroutine)(pkt).get();
88 }
89 
90 void
91 ItsProcess::doRead(Yield &yield, Addr addr, void *ptr, size_t size)
92 {
93  ItsAction a;
95 
96  RequestPtr req = std::make_shared<Request>(
97  addr, size, 0, its.requestorId);
98 
99  req->taskId(ContextSwitchTaskId::DMA);
100 
101  a.pkt = new Packet(req, MemCmd::ReadReq);
102  a.pkt->dataStatic(ptr);
103 
104  a.delay = 0;
105 
106  PacketPtr pkt = yield(a).get();
107 
108  assert(pkt);
109  assert(pkt->getSize() >= size);
110 
111  delete pkt;
112 }
113 
114 void
115 ItsProcess::doWrite(Yield &yield, Addr addr, void *ptr, size_t size)
116 {
117  ItsAction a;
118  a.type = ItsActionType::SEND_REQ;
119 
120  RequestPtr req = std::make_shared<Request>(
121  addr, size, 0, its.requestorId);
122 
123  req->taskId(ContextSwitchTaskId::DMA);
124 
125  a.pkt = new Packet(req, MemCmd::WriteReq);
126  a.pkt->dataStatic(ptr);
127 
128  a.delay = 0;
129 
130  PacketPtr pkt = yield(a).get();
131 
132  assert(pkt);
133  assert(pkt->getSize() >= size);
134 
135  delete pkt;
136 }
137 
138 void
140 {
141  ItsAction a;
143  a.pkt = NULL;
144  a.delay = 0;
145  yield(a);
146 }
147 
148 void
149 ItsProcess::writeDeviceTable(Yield &yield, uint32_t device_id, DTE dte)
150 {
152  const Addr address = base + (device_id * sizeof(dte));
153 
154  DPRINTF(ITS, "Writing DTE at address %#x: %#x\n", address, dte);
155 
156  doWrite(yield, address, &dte, sizeof(dte));
157 }
158 
159 void
161  Yield &yield, const Addr itt_base, uint32_t event_id, ITTE itte)
162 {
163  const Addr address = itt_base + (event_id * sizeof(itte));
164 
165  doWrite(yield, address, &itte, sizeof(itte));
166 
167  DPRINTF(ITS, "Writing ITTE at address %#x: %#x\n", address, itte);
168 }
169 
170 void
172  Yield &yield, uint32_t collection_id, CTE cte)
173 {
175  const Addr address = base + (collection_id * sizeof(cte));
176 
177  doWrite(yield, address, &cte, sizeof(cte));
178 
179  DPRINTF(ITS, "Writing CTE at address %#x: %#x\n", address, cte);
180 }
181 
182 uint64_t
183 ItsProcess::readDeviceTable(Yield &yield, uint32_t device_id)
184 {
185  uint64_t dte;
187  const Addr address = base + (device_id * sizeof(dte));
188 
189  doRead(yield, address, &dte, sizeof(dte));
190 
191  DPRINTF(ITS, "Reading DTE at address %#x: %#x\n", address, dte);
192  return dte;
193 }
194 
195 uint64_t
197  Yield &yield, const Addr itt_base, uint32_t event_id)
198 {
199  uint64_t itte;
200  const Addr address = itt_base + (event_id * sizeof(itte));
201 
202  doRead(yield, address, &itte, sizeof(itte));
203 
204  DPRINTF(ITS, "Reading ITTE at address %#x: %#x\n", address, itte);
205  return itte;
206 }
207 
208 uint64_t
209 ItsProcess::readIrqCollectionTable(Yield &yield, uint32_t collection_id)
210 {
211  uint64_t cte;
213  const Addr address = base + (collection_id * sizeof(cte));
214 
215  doRead(yield, address, &cte, sizeof(cte));
216 
217  DPRINTF(ITS, "Reading CTE at address %#x: %#x\n", address, cte);
218  return cte;
219 }
220 
222  : ItsProcess(_its)
223 {
224  reinit();
226  its.gitsControl.quiescent = 0;
227 }
228 
230 {
231  assert(its.pendingTranslations >= 1);
234  its.gitsControl.quiescent = 1;
235 }
236 
237 void
239 {
240  PacketPtr pkt = yield.get();
241 
242  const uint32_t device_id = pkt->req->streamId();
243  const uint32_t event_id = pkt->getLE<uint32_t>();
244 
245  auto result = translateLPI(yield, device_id, event_id);
246 
247  uint32_t intid = result.first;
248  Gicv3Redistributor *redist = result.second;
249 
250  // Set the LPI in the redistributor
251  redist->setClrLPI(intid, true);
252 
253  // Update the value in GITS_TRANSLATER only once we know
254  // there was no error in the tranlation process (before
255  // terminating the translation
256  its.gitsTranslater = event_id;
257 
258  terminate(yield);
259 }
260 
262 ItsTranslation::translateLPI(Yield &yield, uint32_t device_id,
263  uint32_t event_id)
264 {
265  if (its.deviceOutOfRange(device_id)) {
266  terminate(yield);
267  }
268 
269  DTE dte = readDeviceTable(yield, device_id);
270 
271  if (!dte.valid || its.idOutOfRange(event_id, dte.ittRange)) {
272  terminate(yield);
273  }
274 
275  ITTE itte = readIrqTranslationTable(yield, dte.ittAddress, event_id);
276  const auto collection_id = itte.icid;
277 
278  if (!itte.valid || its.collectionOutOfRange(collection_id)) {
279  terminate(yield);
280  }
281 
282  CTE cte = readIrqCollectionTable(yield, collection_id);
283 
284  if (!cte.valid) {
285  terminate(yield);
286  }
287 
288  // Returning the INTID and the target Redistributor
289  return std::make_pair(itte.intNum, its.getRedistributor(cte));
290 }
291 
293 {
294  COMMAND(CLEAR, &ItsCommand::clear),
295  COMMAND(DISCARD, &ItsCommand::discard),
296  COMMAND(INT, &ItsCommand::doInt),
297  COMMAND(INV, &ItsCommand::inv),
298  COMMAND(INVALL, &ItsCommand::invall),
299  COMMAND(MAPC, &ItsCommand::mapc),
300  COMMAND(MAPD, &ItsCommand::mapd),
301  COMMAND(MAPI, &ItsCommand::mapi),
302  COMMAND(MAPTI, &ItsCommand::mapti),
303  COMMAND(MOVALL, &ItsCommand::movall),
304  COMMAND(MOVI, &ItsCommand::movi),
305  COMMAND(SYNC, &ItsCommand::sync),
306  COMMAND(VINVALL, &ItsCommand::vinvall),
307  COMMAND(VMAPI, &ItsCommand::vmapi),
308  COMMAND(VMAPP, &ItsCommand::vmapp),
309  COMMAND(VMAPTI, &ItsCommand::vmapti),
310  COMMAND(VMOVI, &ItsCommand::vmovi),
311  COMMAND(VMOVP, &ItsCommand::vmovp),
312  COMMAND(VSYNC, &ItsCommand::vsync),
313 };
314 
316  : ItsProcess(_its)
317 {
318  reinit();
319  its.pendingCommands = true;
320 
321  its.gitsControl.quiescent = 0;
322 }
323 
325 {
326  its.pendingCommands = false;
327 
329  its.gitsControl.quiescent = 1;
330 }
331 
332 std::string
334 {
335  const auto entry = cmdDispatcher.find(cmd);
336  return entry != cmdDispatcher.end() ? entry->second.name : "INVALID";
337 }
338 
339 void
341 {
342  ItsAction a;
344  a.pkt = nullptr;
345  a.delay = 0;
346  yield(a);
347 
348  while (its.gitsCwriter.offset != its.gitsCreadr.offset) {
349  CommandEntry command;
350 
351  // Reading the command from CMDQ
352  readCommand(yield, command);
353 
354  processCommand(yield, command);
355 
357  }
358 
359  terminate(yield);
360 }
361 
362 void
364 {
365  // read the command pointed by GITS_CREADR
366  const Addr cmd_addr =
367  (its.gitsCbaser.physAddr << 12) + (its.gitsCreadr.offset << 5);
368 
369  doRead(yield, cmd_addr, &command, sizeof(command));
370 
371  DPRINTF(ITS, "Command %s read from queue at address: %#x\n",
372  commandName(command.type), cmd_addr);
373  DPRINTF(ITS, "dw0: %#x dw1: %#x dw2: %#x dw3: %#x\n",
374  command.raw[0], command.raw[1], command.raw[2], command.raw[3]);
375 }
376 
377 void
379 {
380  const auto entry = cmdDispatcher.find(command.type);
381 
382  if (entry != cmdDispatcher.end()) {
383  // Execute the command
384  entry->second.exec(this, yield, command);
385  } else {
386  panic("Unrecognized command type: %u", command.type);
387  }
388 }
389 
390 void
392 {
393  if (deviceOutOfRange(command)) {
395  terminate(yield);
396  }
397 
398  DTE dte = readDeviceTable(yield, command.deviceId);
399 
400  if (!dte.valid || idOutOfRange(command, dte)) {
402  terminate(yield);
403  }
404 
406  yield, dte.ittAddress, command.eventId);
407 
408  if (!itte.valid) {
410  terminate(yield);
411  }
412 
413  const auto collection_id = itte.icid;
414  CTE cte = readIrqCollectionTable(yield, collection_id);
415 
416  if (!cte.valid) {
418  terminate(yield);
419  }
420 
421  // Clear the LPI in the redistributor
422  its.getRedistributor(cte)->setClrLPI(itte.intNum, false);
423 }
424 
425 void
427 {
428  if (deviceOutOfRange(command)) {
430  terminate(yield);
431  }
432 
433  DTE dte = readDeviceTable(yield, command.deviceId);
434 
435  if (!dte.valid || idOutOfRange(command, dte)) {
437  terminate(yield);
438  }
439 
441  yield, dte.ittAddress, command.eventId);
442 
443  if (!itte.valid) {
445  terminate(yield);
446  }
447 
448  const auto collection_id = itte.icid;
449  Gicv3Its::CTE cte = readIrqCollectionTable(yield, collection_id);
450 
451  if (!cte.valid) {
453  terminate(yield);
454  }
455 
456  its.getRedistributor(cte)->setClrLPI(itte.intNum, false);
457 
458  // Then removes the mapping from the ITT (invalidating)
459  itte.valid = 0;
461  yield, dte.ittAddress, command.eventId, itte);
462 }
463 
464 void
466 {
467  if (deviceOutOfRange(command)) {
469  terminate(yield);
470  }
471 
472  DTE dte = readDeviceTable(yield, command.deviceId);
473 
474  if (!dte.valid || idOutOfRange(command, dte)) {
476  terminate(yield);
477  }
478 
480  yield, dte.ittAddress, command.eventId);
481 
482  if (!itte.valid) {
484  terminate(yield);
485  }
486 
487  const auto collection_id = itte.icid;
488  CTE cte = readIrqCollectionTable(yield, collection_id);
489 
490  if (!cte.valid) {
492  terminate(yield);
493  }
494 
495  // Set the LPI in the redistributor
496  its.getRedistributor(cte)->setClrLPI(itte.intNum, true);
497 }
498 
499 void
501 {
502  if (deviceOutOfRange(command)) {
504  terminate(yield);
505  }
506 
507  DTE dte = readDeviceTable(yield, command.deviceId);
508 
509  if (!dte.valid || idOutOfRange(command, dte)) {
511  terminate(yield);
512  }
513 
515  yield, dte.ittAddress, command.eventId);
516 
517  if (!itte.valid) {
519  terminate(yield);
520  }
521 
522  const auto collection_id = itte.icid;
523  CTE cte = readIrqCollectionTable(yield, collection_id);
524 
525  if (!cte.valid) {
527  terminate(yield);
528  }
529  // Do nothing since caching is currently not supported in
530  // Redistributor
531 }
532 
533 void
535 {
536  if (collectionOutOfRange(command)) {
538  terminate(yield);
539  }
540 
541  const auto icid = bits(command.raw[2], 15, 0);
542 
543  CTE cte = readIrqCollectionTable(yield, icid);
544 
545  if (!cte.valid) {
547  terminate(yield);
548  }
549  // Do nothing since caching is currently not supported in
550  // Redistributor
551 }
552 
553 void
555 {
556  if (collectionOutOfRange(command)) {
558  terminate(yield);
559  }
560 
561  CTE cte = 0;
562  cte.valid = bits(command.raw[2], 63);
563  cte.rdBase = bits(command.raw[2], 50, 16);
564 
565  const auto icid = bits(command.raw[2], 15, 0);
566 
567  writeIrqCollectionTable(yield, icid, cte);
568 }
569 
570 void
572 {
573  if (deviceOutOfRange(command) || sizeOutOfRange(command)) {
575  terminate(yield);
576  }
577 
578  DTE dte = 0;
579  dte.valid = bits(command.raw[2], 63);
580  dte.ittAddress = mbits(command.raw[2], 51, 8);
581  dte.ittRange = bits(command.raw[1], 4, 0);
582 
583  writeDeviceTable(yield, command.deviceId, dte);
584 }
585 
586 void
588 {
589  if (deviceOutOfRange(command)) {
591  terminate(yield);
592  }
593 
594  if (collectionOutOfRange(command)) {
596  terminate(yield);
597  }
598 
599  DTE dte = readDeviceTable(yield, command.deviceId);
600 
601  if (!dte.valid || idOutOfRange(command, dte) ||
602  its.lpiOutOfRange(command.eventId)) {
603 
605  terminate(yield);
606  }
607 
608  Gicv3Its::ITTE itte = readIrqTranslationTable(
609  yield, dte.ittAddress, command.eventId);
610 
611  itte.valid = 1;
612  itte.intType = Gicv3Its::PHYSICAL_INTERRUPT;
613  itte.intNum = command.eventId;
614  itte.icid = bits(command.raw[2], 15, 0);
615 
617  yield, dte.ittAddress, command.eventId, itte);
618 }
619 
620 void
622 {
623  if (deviceOutOfRange(command)) {
625  terminate(yield);
626  }
627 
628  if (collectionOutOfRange(command)) {
630  terminate(yield);
631  }
632 
633  DTE dte = readDeviceTable(yield, command.deviceId);
634 
635  const auto pintid = bits(command.raw[1], 63, 32);
636 
637  if (!dte.valid || idOutOfRange(command, dte) ||
638  its.lpiOutOfRange(pintid)) {
639 
641  terminate(yield);
642  }
643 
645  yield, dte.ittAddress, command.eventId);
646 
647  itte.valid = 1;
648  itte.intType = Gicv3Its::PHYSICAL_INTERRUPT;
649  itte.intNum = pintid;
650  itte.icid = bits(command.raw[2], 15, 0);
651 
653  yield, dte.ittAddress, command.eventId, itte);
654 }
655 
656 void
658 {
659  const uint64_t rd1 = bits(command.raw[2], 50, 16);
660  const uint64_t rd2 = bits(command.raw[3], 50, 16);
661 
662  if (rd1 != rd2) {
663  Gicv3Redistributor * redist1 = its.getRedistributor(rd1);
664  Gicv3Redistributor * redist2 = its.getRedistributor(rd2);
665 
666  its.moveAllPendingState(redist1, redist2);
667  }
668 }
669 
670 void
672 {
673  if (deviceOutOfRange(command)) {
675  terminate(yield);
676  }
677 
678  if (collectionOutOfRange(command)) {
680  terminate(yield);
681  }
682 
683  DTE dte = readDeviceTable(yield, command.deviceId);
684 
685  if (!dte.valid || idOutOfRange(command, dte)) {
687  terminate(yield);
688  }
689 
691  yield, dte.ittAddress, command.eventId);
692 
693  if (!itte.valid || itte.intType == Gicv3Its::VIRTUAL_INTERRUPT) {
695  terminate(yield);
696  }
697 
698  const auto collection_id1 = itte.icid;
699  CTE cte1 = readIrqCollectionTable(yield, collection_id1);
700 
701  if (!cte1.valid) {
703  terminate(yield);
704  }
705 
706  const auto collection_id2 = bits(command.raw[2], 15, 0);
707  CTE cte2 = readIrqCollectionTable(yield, collection_id2);
708 
709  if (!cte2.valid) {
711  terminate(yield);
712  }
713 
714  Gicv3Redistributor *first_redist = its.getRedistributor(cte1);
715  Gicv3Redistributor *second_redist = its.getRedistributor(cte2);
716 
717  if (second_redist != first_redist) {
718  // move pending state of the interrupt from one redistributor
719  // to the other.
720  if (first_redist->isPendingLPI(itte.intNum)) {
721  first_redist->setClrLPI(itte.intNum, false);
722  second_redist->setClrLPI(itte.intNum, true);
723  }
724  }
725 
726  itte.icid = collection_id2;
728  yield, dte.ittAddress, command.eventId, itte);
729 }
730 
731 void
733 {
734  warn("ITS %s command unimplemented", __func__);
735 }
736 
737 void
739 {
740  panic("ITS %s command unimplemented", __func__);
741 }
742 
743 void
745 {
746  panic("ITS %s command unimplemented", __func__);
747 }
748 
749 void
751 {
752  panic("ITS %s command unimplemented", __func__);
753 }
754 
755 void
757 {
758  panic("ITS %s command unimplemented", __func__);
759 }
760 
761 void
763 {
764  panic("ITS %s command unimplemented", __func__);
765 }
766 
767 void
769 {
770  panic("ITS %s command unimplemented", __func__);
771 }
772 
773 void
775 {
776  panic("ITS %s command unimplemented", __func__);
777 }
778 
779 Gicv3Its::Gicv3Its(const Gicv3ItsParams &params)
780  : BasicPioDevice(params, params.pio_size),
781  dmaPort(name() + ".dma", *this),
782  gitsControl(CTLR_QUIESCENT),
783  gitsTyper(params.gits_typer),
784  gitsCbaser(0), gitsCreadr(0),
785  gitsCwriter(0), gitsIidr(0),
787  requestorId(params.system->getRequestorId(this)),
788  gic(nullptr),
789  commandEvent([this] { checkCommandQueue(); }, name()),
790  pendingCommands(false),
792 {
793  BASER device_baser = 0;
794  device_baser.type = DEVICE_TABLE;
795  device_baser.entrySize = sizeof(uint64_t) - 1;
796  tableBases[0] = device_baser;
797 
798  BASER icollect_baser = 0;
799  icollect_baser.type = COLLECTION_TABLE;
800  icollect_baser.entrySize = sizeof(uint64_t) - 1;
801  tableBases[1] = icollect_baser;
802 }
803 
804 void
806 {
807  assert(!gic);
808  gic = _gic;
809 }
810 
813 {
814  assert(pioSize != 0);
815  AddrRangeList ranges;
816  DPRINTF(AddrRanges, "registering range: %#x-%#x\n", pioAddr, pioSize);
817  ranges.push_back(RangeSize(pioAddr, pioSize));
818  return ranges;
819 }
820 
821 Tick
823 {
824  const Addr addr = pkt->getAddr() - pioAddr;
825  uint64_t value = 0;
826 
827  DPRINTF(GIC, "%s register at addr: %#x\n", __func__, addr);
828 
829  switch (addr) {
830  case GITS_CTLR:
831  value = gitsControl;
832  break;
833 
834  case GITS_IIDR:
835  value = gitsIidr;
836  break;
837 
838  case GITS_TYPER:
839  value = gitsTyper;
840  break;
841 
842  case GITS_TYPER + 4:
843  value = gitsTyper.high;
844  break;
845 
846  case GITS_CBASER:
847  value = gitsCbaser;
848  break;
849 
850  case GITS_CBASER + 4:
851  value = gitsCbaser.high;
852  break;
853 
854  case GITS_CWRITER:
855  value = gitsCwriter;
856  break;
857 
858  case GITS_CWRITER + 4:
859  value = gitsCwriter.high;
860  break;
861 
862  case GITS_CREADR:
863  value = gitsCreadr;
864  break;
865 
866  case GITS_CREADR + 4:
867  value = gitsCreadr.high;
868  break;
869 
870  case GITS_PIDR2:
871  value = gic->getDistributor()->gicdPidr2;
872  break;
873 
874  case GITS_TRANSLATER:
875  value = gitsTranslater;
876  break;
877 
878  default:
879  if (GITS_BASER.contains(addr)) {
880  auto relative_addr = addr - GITS_BASER.start();
881  auto baser_index = relative_addr / sizeof(uint64_t);
882 
883  value = tableBases[baser_index];
884  break;
885  } else {
886  panic("Unrecognized register access\n");
887  }
888  }
889 
890  pkt->setUintX(value, ByteOrder::little);
891  pkt->makeAtomicResponse();
892  return pioDelay;
893 }
894 
895 Tick
897 {
898  Addr addr = pkt->getAddr() - pioAddr;
899 
900  DPRINTF(GIC, "%s register at addr: %#x\n", __func__, addr);
901 
902  switch (addr) {
903  case GITS_CTLR:
904  assert(pkt->getSize() == sizeof(uint32_t));
905  gitsControl = (pkt->getLE<uint32_t>() & ~CTLR_QUIESCENT);
906  // We should check here if the ITS has been disabled, and if
907  // that's the case, flush GICv3 caches to external memory.
908  // This is not happening now, since LPI caching is not
909  // currently implemented in gem5.
910  break;
911 
912  case GITS_IIDR:
913  panic("GITS_IIDR is Read Only\n");
914 
915  case GITS_TYPER:
916  panic("GITS_TYPER is Read Only\n");
917 
918  case GITS_CBASER:
919  if (pkt->getSize() == sizeof(uint32_t)) {
920  gitsCbaser.low = pkt->getLE<uint32_t>();
921  } else {
922  assert(pkt->getSize() == sizeof(uint64_t));
923  gitsCbaser = pkt->getLE<uint64_t>();
924  }
925 
926  gitsCreadr = 0; // Cleared when CBASER gets written
927 
929  break;
930 
931  case GITS_CBASER + 4:
932  assert(pkt->getSize() == sizeof(uint32_t));
933  gitsCbaser.high = pkt->getLE<uint32_t>();
934 
935  gitsCreadr = 0; // Cleared when CBASER gets written
936 
938  break;
939 
940  case GITS_CWRITER:
941  if (pkt->getSize() == sizeof(uint32_t)) {
942  gitsCwriter.low = pkt->getLE<uint32_t>();
943  } else {
944  assert(pkt->getSize() == sizeof(uint64_t));
945  gitsCwriter = pkt->getLE<uint64_t>();
946  }
947 
949  break;
950 
951  case GITS_CWRITER + 4:
952  assert(pkt->getSize() == sizeof(uint32_t));
953  gitsCwriter.high = pkt->getLE<uint32_t>();
954 
956  break;
957 
958  case GITS_CREADR:
959  panic("GITS_READR is Read Only\n");
960 
961  case GITS_TRANSLATER:
962  if (gitsControl.enabled) {
963  translate(pkt);
964  }
965  break;
966 
967  default:
968  if (GITS_BASER.contains(addr)) {
969  auto relative_addr = addr - GITS_BASER.start();
970  auto baser_index = relative_addr / sizeof(uint64_t);
971 
972  const uint64_t table_base = tableBases[baser_index];
973  const uint64_t w_mask = tableBases[baser_index].type ?
975  const uint64_t val = pkt->getLE<uint64_t>() & w_mask;
976 
977  tableBases[baser_index] = table_base | val;
978  break;
979  } else {
980  panic("Unrecognized register access\n");
981  }
982  }
983 
984  pkt->makeAtomicResponse();
985  return pioDelay;
986 }
987 
988 bool
989 Gicv3Its::idOutOfRange(uint32_t event_id, uint8_t itt_range) const
990 {
991  const uint32_t id_bits = gitsTyper.idBits;
992  return event_id >= (1ULL << (id_bits + 1)) ||
993  event_id >= ((1ULL << itt_range) + 1);
994 }
995 
996 bool
997 Gicv3Its::deviceOutOfRange(uint32_t device_id) const
998 {
999  return device_id >= (1ULL << (gitsTyper.devBits + 1));
1000 }
1001 
1002 bool
1004 {
1005  return size > gitsTyper.idBits;
1006 }
1007 
1008 bool
1009 Gicv3Its::collectionOutOfRange(uint32_t collection_id) const
1010 {
1011  // If GITS_TYPER.CIL == 0, ITS supports 16-bit CollectionID
1012  // Otherwise, #bits is specified by GITS_TYPER.CIDbits
1013  const auto cid_bits = gitsTyper.cil == 0 ?
1014  16 : gitsTyper.cidBits + 1;
1015 
1016  return collection_id >= (1ULL << cid_bits);
1017 }
1018 
1019 bool
1020 Gicv3Its::lpiOutOfRange(uint32_t intid) const
1021 {
1022  return intid >= (1ULL << (Gicv3Distributor::IDBITS + 1)) ||
1024  intid != Gicv3::INTID_SPURIOUS);
1025 }
1026 
1027 DrainState
1029 {
1031  return DrainState::Drained;
1032  } else {
1033  DPRINTF(Drain, "GICv3 ITS not drained\n");
1034  return DrainState::Draining;
1035  }
1036 }
1037 
1038 void
1040 {
1041  SERIALIZE_SCALAR(gitsControl);
1047 
1049 }
1050 
1051 void
1053 {
1054  UNSERIALIZE_SCALAR(gitsControl);
1060 
1062 }
1063 
1064 void
1066 {
1067  // Make the reader point to the next element
1068  gitsCreadr.offset = gitsCreadr.offset + 1;
1069 
1070  // Check for wrapping
1071  if (gitsCreadr.offset == maxCommands()) {
1072  gitsCreadr.offset = 0;
1073  }
1074 }
1075 
1076 uint64_t
1078 {
1079  return (4096 * (gitsCbaser.size + 1)) / sizeof(ItsCommand::CommandEntry);
1080 }
1081 
1082 void
1084 {
1085  if (!gitsControl.enabled || !gitsCbaser.valid)
1086  return;
1087 
1088  // If GITS_CWRITER gets set by sw to a value bigger than the
1089  // allowed one, the command queue should stop processing commands
1090  // until the register gets reset to an allowed one
1091  if (gitsCwriter.offset >= maxCommands()) {
1092  return;
1093  }
1094 
1095  if (gitsCwriter.offset != gitsCreadr.offset) {
1096  // writer and reader pointing to different command
1097  // entries: queue not empty.
1098  DPRINTF(ITS, "Reading command from queue\n");
1099 
1100  if (!pendingCommands) {
1101  auto *cmd_proc = new ItsCommand(*this);
1102 
1103  runProcess(cmd_proc, nullptr);
1104  } else {
1105  DPRINTF(ITS, "Waiting for pending command to finish\n");
1106  }
1107  }
1108 }
1109 
1110 Port &
1111 Gicv3Its::getPort(const std::string &if_name, PortID idx)
1112 {
1113  if (if_name == "dma") {
1114  return dmaPort;
1115  }
1116  return BasicPioDevice::getPort(if_name, idx);
1117 }
1118 
1119 void
1121 {
1122  assert(!packetsToRetry.empty());
1123 
1124  while (!packetsToRetry.empty()) {
1125  ItsAction a = packetsToRetry.front();
1126 
1127  assert(a.type == ItsActionType::SEND_REQ);
1128 
1129  if (!dmaPort.sendTimingReq(a.pkt))
1130  break;
1131 
1132  packetsToRetry.pop();
1133  }
1134 }
1135 
1136 bool
1138 {
1139  // @todo: We need to pay for this and not just zero it out
1140  pkt->headerDelay = pkt->payloadDelay = 0;
1141 
1142  ItsProcess *proc =
1143  safe_cast<ItsProcess *>(pkt->popSenderState());
1144 
1145  runProcessTiming(proc, pkt);
1146 
1147  return true;
1148 }
1149 
1150 ItsAction
1152 {
1153  if (sys->isAtomicMode()) {
1154  return runProcessAtomic(proc, pkt);
1155  } else if (sys->isTimingMode()) {
1156  return runProcessTiming(proc, pkt);
1157  } else {
1158  panic("Not in timing or atomic mode\n");
1159  }
1160 }
1161 
1162 ItsAction
1164 {
1165  ItsAction action = proc->run(pkt);
1166 
1167  switch (action.type) {
1169  action.pkt->pushSenderState(proc);
1170 
1171  if (packetsToRetry.empty() &&
1172  dmaPort.sendTimingReq(action.pkt)) {
1173 
1174  } else {
1175  packetsToRetry.push(action);
1176  }
1177  break;
1178 
1180  delete proc;
1181  if (!pendingCommands && !commandEvent.scheduled()) {
1183  }
1184  break;
1185 
1186  default:
1187  panic("Unknown action\n");
1188  }
1189 
1190  return action;
1191 }
1192 
1193 ItsAction
1195 {
1196  ItsAction action;
1197  Tick delay = 0;
1198  bool terminate = false;
1199 
1200  do {
1201  action = proc->run(pkt);
1202 
1203  switch (action.type) {
1205  delay += dmaPort.sendAtomic(action.pkt);
1206  pkt = action.pkt;
1207  break;
1208 
1210  delete proc;
1211  terminate = true;
1212  break;
1213 
1214  default:
1215  panic("Unknown action\n");
1216  }
1217 
1218  } while (!terminate);
1219 
1220  action.delay = delay;
1221 
1222  return action;
1223 }
1224 
1225 void
1227 {
1228  DPRINTF(ITS, "Starting Translation Request\n");
1229 
1230  auto *proc = new ItsTranslation(*this);
1231  runProcess(proc, pkt);
1232 }
1233 
1236 {
1237  if (gitsTyper.pta == 1) {
1238  // RDBase is a redistributor address
1239  return gic->getRedistributorByAddr(rd_base << 16);
1240  } else {
1241  // RDBase is a redistributor number
1242  return gic->getRedistributor(rd_base);
1243  }
1244 }
1245 
1246 Addr
1248 {
1249  auto base_it = std::find_if(
1250  tableBases.begin(), tableBases.end(),
1251  [table] (const BASER &b) { return b.type == table; }
1252  );
1253 
1254  panic_if(base_it == tableBases.end(),
1255  "ITS Table not recognised\n");
1256 
1257  const BASER base = *base_it;
1258 
1259  // real address depends on page size
1260  switch (base.pageSize) {
1261  case SIZE_4K:
1262  case SIZE_16K:
1263  return mbits(base, 47, 12);
1264  case SIZE_64K:
1265  return mbits(base, 47, 16) | (bits(base, 15, 12) << 48);
1266  default:
1267  panic("Unsupported page size\n");
1268  }
1269 }
1270 
1271 void
1274 {
1275  const uint64_t largest_lpi_id = 1ULL << (rd1->lpiIDBits + 1);
1276  uint8_t lpi_pending_table[largest_lpi_id / 8];
1277 
1278  // Copying the pending table from redistributor 1 to redistributor 2
1279  rd1->memProxy->readBlob(
1280  rd1->lpiPendingTablePtr, (uint8_t *)lpi_pending_table,
1281  sizeof(lpi_pending_table));
1282 
1283  rd2->memProxy->writeBlob(
1284  rd2->lpiPendingTablePtr, (uint8_t *)lpi_pending_table,
1285  sizeof(lpi_pending_table));
1286 
1287  // Clearing pending table in redistributor 2
1288  rd1->memProxy->memsetBlob(
1289  rd1->lpiPendingTablePtr,
1290  0, sizeof(lpi_pending_table));
1291 
1292  rd2->updateDistributor();
1293 }
Gicv3Its::deviceOutOfRange
bool deviceOutOfRange(uint32_t device_id) const
Returns TRUE if the value supplied has bits above the implemented range or if the value supplied exce...
Definition: gic_v3_its.cc:997
Event::scheduled
bool scheduled() const
Determine if the current event is scheduled.
Definition: eventq.hh:462
Gicv3Its::gitsIidr
uint32_t gitsIidr
Definition: gic_v3_its.hh:224
Packet::makeAtomicResponse
void makeAtomicResponse()
Definition: packet.hh:1017
Gicv3Its::getPort
Port & getPort(const std::string &if_name, PortID idx) override
Get a port with a given name and index.
Definition: gic_v3_its.cc:1111
ItsProcess::ITTE
Gicv3Its::ITTE ITTE
Definition: gic_v3_its.hh:355
Gicv3Its::requestorId
uint32_t requestorId
Definition: gic_v3_its.hh:328
BasicPioDevice::pioAddr
Addr pioAddr
Address that the device listens to.
Definition: io_device.hh:148
Gicv3Its::GITS_TYPER
@ GITS_TYPER
Definition: gic_v3_its.hh:141
Gicv3Its::GITS_BASER
static const AddrRange GITS_BASER
Definition: gic_v3_its.hh:117
gic_v3_its.hh
Gicv3Its::collectionOutOfRange
bool collectionOutOfRange(uint32_t collection_id) const
Returns TRUE if the value supplied has bits above the implemented range or if the value exceeds the t...
Definition: gic_v3_its.cc:1009
Gicv3Redistributor::lpiIDBits
uint8_t lpiIDBits
Definition: gic_v3_redistributor.hh:169
warn
#define warn(...)
Definition: logging.hh:239
Gicv3Its::getAddrRanges
AddrRangeList getAddrRanges() const override
Every PIO device is obliged to provide an implementation that returns the address ranges the device r...
Definition: gic_v3_its.cc:812
gic_v3_redistributor.hh
Gicv3::getRedistributorByAddr
Gicv3Redistributor * getRedistributorByAddr(Addr address) const
Definition: gic_v3.cc:249
ItsCommand::movall
void movall(Yield &yield, CommandEntry &command)
Definition: gic_v3_its.cc:657
Gicv3Its::size
Bitfield< 7, 0 > size
Definition: gic_v3_its.hh:186
Gicv3Its::gitsTyper
TYPER gitsTyper
Definition: gic_v3_its.hh:220
Gicv3Its::read
Tick read(PacketPtr pkt) override
Pure virtual function that the device must implement.
Definition: gic_v3_its.cc:822
System::isTimingMode
bool isTimingMode() const
Is the system in timing mode?
Definition: system.hh:264
UNSERIALIZE_SCALAR
#define UNSERIALIZE_SCALAR(scalar)
Definition: serialize.hh:591
ItsCommand::deviceOutOfRange
bool deviceOutOfRange(CommandEntry &command) const
Definition: gic_v3_its.hh:524
ItsCommand::vmapp
void vmapp(Yield &yield, CommandEntry &command)
Definition: gic_v3_its.cc:750
Packet::getAddr
Addr getAddr() const
Definition: packet.hh:755
Gicv3Its::GITS_CBASER
@ GITS_CBASER
Definition: gic_v3_its.hh:142
m5::Coroutine::CallerType
CallerType: A reference to an object of this class will be passed to the coroutine task.
Definition: coroutine.hh:83
ItsCommand::doInt
void doInt(Yield &yield, CommandEntry &command)
Definition: gic_v3_its.cc:465
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
Gicv3Its::dmaPort
DataPort dmaPort
Definition: gic_v3_its.hh:103
UNSERIALIZE_CONTAINER
#define UNSERIALIZE_CONTAINER(member)
Definition: serialize.hh:650
ItsCommand::vsync
void vsync(Yield &yield, CommandEntry &command)
Definition: gic_v3_its.cc:774
ItsProcess::ItsProcess
ItsProcess(Gicv3Its &_its)
Definition: gic_v3_its.cc:60
Gicv3Its::gitsTranslater
uint32_t gitsTranslater
Definition: gic_v3_its.hh:225
ItsProcess::writeDeviceTable
void writeDeviceTable(Yield &yield, uint32_t device_id, DTE dte)
Definition: gic_v3_its.cc:149
Gicv3Its::recvTimingResp
bool recvTimingResp(PacketPtr pkt)
Definition: gic_v3_its.cc:1137
ItsCommand::CommandEntry::eventId
uint32_t eventId
Definition: gic_v3_its.hh:433
Gicv3Its::moveAllPendingState
void moveAllPendingState(Gicv3Redistributor *rd1, Gicv3Redistributor *rd2)
Definition: gic_v3_its.cc:1272
Gicv3::getDistributor
Gicv3Distributor * getDistributor() const
Definition: gic_v3.hh:139
ItsTranslation::translateLPI
std::pair< uint32_t, Gicv3Redistributor * > translateLPI(Yield &yield, uint32_t device_id, uint32_t event_id)
Definition: gic_v3_its.cc:262
Gicv3Its::commandEvent
EventFunctionWrapper commandEvent
Definition: gic_v3_its.hh:330
ItsCommand::commandName
static std::string commandName(uint32_t cmd)
Definition: gic_v3_its.cc:333
ItsProcess::coroutine
std::unique_ptr< Coroutine > coroutine
Definition: gic_v3_its.hh:396
Gicv3Its::tableBases
std::vector< BASER > tableBases
Definition: gic_v3_its.hh:227
ItsCommand::CommandEntry::type
uint32_t type
Definition: gic_v3_its.hh:431
Gicv3Its::ItsTables
ItsTables
Definition: gic_v3_its.hh:306
MemCmd::ReadReq
@ ReadReq
Definition: packet.hh:83
Gicv3Its::serialize
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: gic_v3_its.cc:1039
Tick
uint64_t Tick
Tick count type.
Definition: types.hh:59
ItsProcess::doWrite
void doWrite(Yield &yield, Addr addr, void *ptr, size_t size)
Definition: gic_v3_its.cc:115
PortID
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
Definition: types.hh:243
AddrRange::contains
bool contains(const Addr &a) const
Determine if the range contains an address.
Definition: addr_range.hh:435
RequestPtr
std::shared_ptr< Request > RequestPtr
Definition: request.hh:86
ItsProcess::reinit
void reinit()
Definition: gic_v3_its.cc:70
X86ISA::base
Bitfield< 51, 12 > base
Definition: pagetable.hh:138
Packet::req
RequestPtr req
A pointer to the original request.
Definition: packet.hh:341
Gicv3Its::runProcessTiming
ItsAction runProcessTiming(ItsProcess *proc, PacketPtr pkt)
Definition: gic_v3_its.cc:1163
ItsCommand::mapi
void mapi(Yield &yield, CommandEntry &command)
Definition: gic_v3_its.cc:587
Gicv3Its::setGIC
void setGIC(Gicv3 *_gic)
Definition: gic_v3_its.cc:805
ItsCommand::sync
void sync(Yield &yield, CommandEntry &command)
Definition: gic_v3_its.cc:732
ItsCommand::movi
void movi(Yield &yield, CommandEntry &command)
Definition: gic_v3_its.cc:671
Gicv3Its::unserialize
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition: gic_v3_its.cc:1052
Packet::getSize
unsigned getSize() const
Definition: packet.hh:765
Gicv3Its::GITS_PIDR2
@ GITS_PIDR2
Definition: gic_v3_its.hh:145
Gicv3Its::GITS_CREADR
@ GITS_CREADR
Definition: gic_v3_its.hh:144
Gicv3Its::checkCommandQueue
void checkCommandQueue()
Definition: gic_v3_its.cc:1083
Gicv3Its::SIZE_16K
@ SIZE_16K
Definition: gic_v3_its.hh:317
ItsCommand::CommandEntry
Definition: gic_v3_its.hh:427
ContextSwitchTaskId::DMA
@ DMA
Definition: request.hh:78
Gicv3Redistributor::isPendingLPI
bool isPendingLPI(uint32_t intid)
Definition: gic_v3_redistributor.cc:907
Packet::headerDelay
uint32_t headerDelay
The extra delay from seeing the packet until the header is transmitted.
Definition: packet.hh:395
Gicv3Its::SIZE_64K
@ SIZE_64K
Definition: gic_v3_its.hh:318
ItsCommand::collectionOutOfRange
bool collectionOutOfRange(CommandEntry &command) const
Definition: gic_v3_its.hh:539
PioDevice::sys
System * sys
Definition: io_device.hh:102
Gicv3Its::recvReqRetry
void recvReqRetry()
Definition: gic_v3_its.cc:1120
DrainState::Drained
@ Drained
Buffers drained, ready for serialization/handover.
PortProxy::writeBlob
void writeBlob(Addr addr, const void *p, int size) const
Same as tryWriteBlob, but insists on success.
Definition: port_proxy.hh:187
ItsProcess::run
ItsAction run(PacketPtr pkt)
Definition: gic_v3_its.cc:83
MemCmd::WriteReq
@ WriteReq
Definition: packet.hh:86
DrainState
DrainState
Object drain/handover states.
Definition: drain.hh:71
Gicv3Its::BASER_WMASK
static const uint64_t BASER_WMASK
Definition: gic_v3_its.hh:128
X86ISA::system
Bitfield< 15 > system
Definition: misc.hh:997
Gicv3Its::pageAddress
Addr pageAddress(enum ItsTables table)
Definition: gic_v3_its.cc:1247
Gicv3Its::sizeOutOfRange
bool sizeOutOfRange(uint32_t size) const
Returns TRUE if the value (size) supplied exceeds the maximum allowed by GITS_TYPER....
Definition: gic_v3_its.cc:1003
cp
Definition: cprintf.cc:37
Gicv3Its::idOutOfRange
bool idOutOfRange(uint32_t event_id, uint8_t itt_range) const
Returns TRUE if the eventID supplied has bits above the implemented size or above the itt_range.
Definition: gic_v3_its.cc:989
EventManager::schedule
void schedule(Event &event, Tick when)
Definition: eventq.hh:1016
ArmISA::a
Bitfield< 8 > a
Definition: miscregs_types.hh:62
ItsCommand::main
void main(Yield &yield) override
Definition: gic_v3_its.cc:340
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
AddrRange
The AddrRange class encapsulates an address range, and supports a number of tests to check if two ran...
Definition: addr_range.hh:68
Gicv3Its::gic
Gicv3 * gic
Definition: gic_v3_its.hh:329
ItsCommand::sizeOutOfRange
bool sizeOutOfRange(CommandEntry &command) const
Definition: gic_v3_its.hh:529
ItsCommand::mapd
void mapd(Yield &yield, CommandEntry &command)
Definition: gic_v3_its.cc:571
Gicv3Its::lpiOutOfRange
bool lpiOutOfRange(uint32_t intid) const
Returns TRUE if the value supplied is larger than that permitted by GICD_TYPER.IDbits or not in the L...
Definition: gic_v3_its.cc:1020
PioDevice::getPort
Port & getPort(const std::string &if_name, PortID idx=InvalidPortID) override
Get a port with a given name and index.
Definition: io_device.cc:64
DPRINTF
#define DPRINTF(x,...)
Definition: trace.hh:237
ItsAction::type
ItsActionType type
Definition: gic_v3_its.hh:68
ItsActionType::SEND_REQ
@ SEND_REQ
Port
Ports are used to interface objects to each other.
Definition: port.hh:56
ItsCommand::CommandEntry::deviceId
uint32_t deviceId
Definition: gic_v3_its.hh:432
ItsProcess::name
const std::string name() const
Returns the Gicv3Its name.
Definition: gic_v3_its.cc:77
ItsCommand::clear
void clear(Yield &yield, CommandEntry &command)
Definition: gic_v3_its.cc:391
ItsCommand::vmapi
void vmapi(Yield &yield, CommandEntry &command)
Definition: gic_v3_its.cc:744
Clocked::clockEdge
Tick clockEdge(Cycles cycles=Cycles(0)) const
Determine the tick when a cycle begins, by default the current one, but the argument also enables the...
Definition: clocked_object.hh:174
ItsProcess::writeIrqTranslationTable
void writeIrqTranslationTable(Yield &yield, const Addr itt_base, uint32_t event_id, ITTE itte)
Definition: gic_v3_its.cc:160
RangeSize
AddrRange RangeSize(Addr start, Addr size)
Definition: addr_range.hh:651
Gicv3Its::GITS_CTLR
@ GITS_CTLR
Definition: gic_v3_its.hh:139
Gicv3Its
GICv3 ITS module.
Definition: gic_v3_its.hh:80
ItsProcess::doRead
void doRead(Yield &yield, Addr addr, void *ptr, size_t size)
Definition: gic_v3_its.cc:91
Gicv3Its::SIZE_4K
@ SIZE_4K
Definition: gic_v3_its.hh:316
Packet::setUintX
void setUintX(uint64_t w, ByteOrder endian)
Set the value in the word w after truncating it to the length of the packet and then byteswapping it ...
Definition: packet.cc:367
ItsCommand::DispatchTable
std::unordered_map< std::underlying_type< enum CommandType >::type, DispatchEntry > DispatchTable
Definition: gic_v3_its.hh:486
Gicv3Redistributor::lpiPendingTablePtr
Addr lpiPendingTablePtr
Definition: gic_v3_redistributor.hh:170
BasicPioDevice::pioSize
Addr pioSize
Size that the device's address range.
Definition: io_device.hh:151
Gicv3Its::gitsCwriter
CRDWR gitsCwriter
Definition: gic_v3_its.hh:223
ItsCommand::idOutOfRange
bool idOutOfRange(CommandEntry &command, DTE dte) const
Definition: gic_v3_its.hh:519
mbits
constexpr T mbits(T val, unsigned first, unsigned last)
Mask off the given bits in place like bits() but without shifting.
Definition: bitfield.hh:100
Gicv3
Definition: gic_v3.hh:53
ItsActionType::TERMINATE
@ TERMINATE
std::pair
STL pair class.
Definition: stl.hh:58
ItsCommand::vmapti
void vmapti(Yield &yield, CommandEntry &command)
Definition: gic_v3_its.cc:756
X86ISA::val
Bitfield< 63 > val
Definition: misc.hh:769
ItsProcess::readDeviceTable
uint64_t readDeviceTable(Yield &yield, uint32_t device_id)
Definition: gic_v3_its.cc:183
ProbePoints::Packet
ProbePointArg< PacketInfo > Packet
Packet probe point.
Definition: mem.hh:103
Addr
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:148
ItsCommand
An ItsCommand is created whenever there is a new command in the command queue.
Definition: gic_v3_its.hh:424
ItsProcess::terminate
void terminate(Yield &yield)
Definition: gic_v3_its.cc:139
name
const std::string & name()
Definition: trace.cc:48
Gicv3::getRedistributor
Gicv3Redistributor * getRedistributor(ContextID context_id) const
Definition: gic_v3.hh:145
SERIALIZE_SCALAR
#define SERIALIZE_SCALAR(scalar)
Definition: serialize.hh:584
ItsCommand::vmovp
void vmovp(Yield &yield, CommandEntry &command)
Definition: gic_v3_its.cc:768
ItsCommand::vmovi
void vmovi(Yield &yield, CommandEntry &command)
Definition: gic_v3_its.cc:762
Gicv3Its::incrementReadPointer
void incrementReadPointer()
Definition: gic_v3_its.cc:1065
ItsCommand::mapc
void mapc(Yield &yield, CommandEntry &command)
Definition: gic_v3_its.cc:554
packet_access.hh
Gicv3Its::DEVICE_TABLE
@ DEVICE_TABLE
Definition: gic_v3_its.hh:308
ItsCommand::CommandEntry::raw
uint64_t raw[4]
Definition: gic_v3_its.hh:438
Gicv3Its::Gicv3Its
Gicv3Its(const Gicv3ItsParams &params)
Definition: gic_v3_its.cc:779
Gicv3Its::maxCommands
uint64_t maxCommands() const
Definition: gic_v3_its.cc:1077
ItsProcess::CTE
Gicv3Its::CTE CTE
Definition: gic_v3_its.hh:356
Gicv3Its::BASER_WMASK_UNIMPL
static const uint64_t BASER_WMASK_UNIMPL
Definition: gic_v3_its.hh:130
Gicv3Its::GITS_TRANSLATER
@ GITS_TRANSLATER
Definition: gic_v3_its.hh:148
Gicv3Its::getRedistributor
Gicv3Redistributor * getRedistributor(uint64_t rd_base)
Definition: gic_v3_its.cc:1235
Gicv3Its::drain
DrainState drain() override
Draining is the process of clearing out the states of SimObjects.These are the SimObjects that are pa...
Definition: gic_v3_its.cc:1028
X86ISA::addr
Bitfield< 3 > addr
Definition: types.hh:80
SimObject::name
virtual const std::string name() const
Definition: sim_object.hh:182
ItsProcess::~ItsProcess
virtual ~ItsProcess()
Definition: gic_v3_its.cc:65
ItsAction::pkt
PacketPtr pkt
Definition: gic_v3_its.hh:69
ItsProcess::readIrqTranslationTable
uint64_t readIrqTranslationTable(Yield &yield, const Addr itt_base, uint32_t event_id)
Definition: gic_v3_its.cc:196
ItsProcess::Coroutine
m5::Coroutine< PacketPtr, ItsAction > Coroutine
Definition: gic_v3_its.hh:357
ItsProcess::writeIrqCollectionTable
void writeIrqCollectionTable(Yield &yield, uint32_t collection_id, CTE cte)
Definition: gic_v3_its.cc:171
panic_if
#define panic_if(cond,...)
Conditional panic macro that checks the supplied condition and only panics if the condition is true a...
Definition: logging.hh:197
ItsCommand::discard
void discard(Yield &yield, CommandEntry &command)
Definition: gic_v3_its.cc:426
ItsCommand::vinvall
void vinvall(Yield &yield, CommandEntry &command)
Definition: gic_v3_its.cc:738
ItsProcess::DTE
Gicv3Its::DTE DTE
Definition: gic_v3_its.hh:354
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
Gicv3Its::pendingCommands
bool pendingCommands
Definition: gic_v3_its.hh:332
ItsCommand::inv
void inv(Yield &yield, CommandEntry &command)
Definition: gic_v3_its.cc:500
ArmISA::b
Bitfield< 7 > b
Definition: miscregs_types.hh:376
m5::Coroutine::CallerType::get
std::enable_if_t<!std::is_same< T, void >::value, T > get()
get() is the way we can extrapolate arguments from the coroutine caller.
Definition: coroutine.hh:140
Gicv3::INTID_SPURIOUS
static const int INTID_SPURIOUS
Definition: gic_v3.hh:73
AddrRange::start
Addr start() const
Get the start address of the range.
Definition: addr_range.hh:314
ItsProcess::main
virtual void main(Yield &yield)=0
ItsCommand::ItsCommand
ItsCommand(Gicv3Its &_its)
Definition: gic_v3_its.cc:315
ItsCommand::invall
void invall(Yield &yield, CommandEntry &command)
Definition: gic_v3_its.cc:534
Gicv3Its::write
Tick write(PacketPtr pkt) override
Pure virtual function that the device must implement.
Definition: gic_v3_its.cc:896
SERIALIZE_CONTAINER
#define SERIALIZE_CONTAINER(member)
Definition: serialize.hh:642
Packet
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition: packet.hh:258
ArmISA::gic
Bitfield< 27, 24 > gic
Definition: miscregs_types.hh:171
BasicPioDevice
Definition: io_device.hh:144
Packet::popSenderState
SenderState * popSenderState()
Pop the top of the state stack and return a pointer to it.
Definition: packet.cc:340
Gicv3Its::gitsCreadr
CRDWR gitsCreadr
Definition: gic_v3_its.hh:222
Gicv3Its::runProcess
ItsAction runProcess(ItsProcess *proc, PacketPtr pkt)
Definition: gic_v3_its.cc:1151
Gicv3Its::CTLR_QUIESCENT
static const uint32_t CTLR_QUIESCENT
Definition: gic_v3_its.hh:134
ItsCommand::mapti
void mapti(Yield &yield, CommandEntry &command)
Definition: gic_v3_its.cc:621
COMMAND
#define COMMAND(x, method)
Definition: gic_v3_its.cc:54
Gicv3Its::translate
void translate(PacketPtr pkt)
Definition: gic_v3_its.cc:1226
logging.hh
BasicPioDevice::pioDelay
Tick pioDelay
Delay that the device experinces on an access.
Definition: io_device.hh:154
ItsAction::delay
Tick delay
Definition: gic_v3_its.hh:70
CheckpointOut
std::ostream CheckpointOut
Definition: serialize.hh:64
bits
constexpr T bits(T val, unsigned first, unsigned last)
Extract the bitfield from position 'first' to 'last' (inclusive) from 'val' and right justify it.
Definition: bitfield.hh:73
Gicv3Its::COLLECTION_TABLE
@ COLLECTION_TABLE
Definition: gic_v3_its.hh:311
Gicv3Redistributor::SMALLEST_LPI_ID
static const uint32_t SMALLEST_LPI_ID
Definition: gic_v3_redistributor.hh:194
Gicv3Its::GITS_IIDR
@ GITS_IIDR
Definition: gic_v3_its.hh:140
trace.hh
ItsTranslation::~ItsTranslation
~ItsTranslation()
Definition: gic_v3_its.cc:229
SimObject::params
const Params & params() const
Definition: sim_object.hh:168
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
ItsTranslation
An ItsTranslation is created whenever a peripheral writes a message in GITS_TRANSLATER (MSI).
Definition: gic_v3_its.hh:405
Gicv3Redistributor::updateDistributor
void updateDistributor()
Definition: gic_v3_redistributor.cc:791
std::list< AddrRange >
Gicv3Its::icid
Bitfield< 45, 30 > icid
Definition: gic_v3_its.hh:277
ItsTranslation::main
void main(Yield &yield) override
Definition: gic_v3_its.cc:238
Gicv3Its::GITS_CWRITER
@ GITS_CWRITER
Definition: gic_v3_its.hh:143
ItsCommand::processCommand
void processCommand(Yield &yield, CommandEntry &command)
Definition: gic_v3_its.cc:378
ItsActionType::INITIAL_NOP
@ INITIAL_NOP
CheckpointIn
Definition: serialize.hh:68
PortProxy::memsetBlob
void memsetBlob(Addr addr, uint8_t v, int size) const
Same as tryMemsetBlob, but insists on success.
Definition: port_proxy.hh:197
PortProxy::readBlob
void readBlob(Addr addr, void *p, int size) const
Higher level interfaces based on the above.
Definition: port_proxy.hh:177
Gicv3Distributor::gicdPidr2
uint32_t gicdPidr2
Definition: gic_v3_distributor.hh:167
Gicv3Its::packetsToRetry
std::queue< ItsAction > packetsToRetry
Definition: gic_v3_its.hh:327
ItsCommand::cmdDispatcher
static DispatchTable cmdDispatcher
Definition: gic_v3_its.hh:488
ItsProcess::its
Gicv3Its & its
Definition: gic_v3_its.hh:393
System::isAtomicMode
bool isAtomicMode() const
Is the system in atomic mode?
Definition: system.hh:253
ItsProcess::readIrqCollectionTable
uint64_t readIrqCollectionTable(Yield &yield, uint32_t collection_id)
Definition: gic_v3_its.cc:209
gic_v3_distributor.hh
Gicv3Distributor::IDBITS
static const uint32_t IDBITS
Definition: gic_v3_distributor.hh:174
Gicv3Its::pendingTranslations
uint32_t pendingTranslations
Definition: gic_v3_its.hh:333
ItsCommand::~ItsCommand
~ItsCommand()
Definition: gic_v3_its.cc:324
gic_v3.hh
ItsCommand::readCommand
void readCommand(Yield &yield, CommandEntry &command)
Definition: gic_v3_its.cc:363
Gicv3Redistributor
Definition: gic_v3_redistributor.hh:52
Gicv3Its::runProcessAtomic
ItsAction runProcessAtomic(ItsProcess *proc, PacketPtr pkt)
Definition: gic_v3_its.cc:1194
ItsAction
Definition: gic_v3_its.hh:66
ItsTranslation::ItsTranslation
ItsTranslation(Gicv3Its &_its)
Definition: gic_v3_its.cc:221
Gicv3Its::NUM_BASER_REGS
static const uint32_t NUM_BASER_REGS
Definition: gic_v3_its.hh:119
ULL
#define ULL(N)
uint64_t constant
Definition: types.hh:46
Gicv3Redistributor::setClrLPI
void setClrLPI(uint64_t data, bool set)
Definition: gic_v3_redistributor.cc:919
DrainState::Draining
@ Draining
Draining buffers pending serialization/handover.
Gicv3Redistributor::memProxy
PortProxy * memProxy
Definition: gic_v3_redistributor.hh:66
Gicv3Its::gitsCbaser
CBASER gitsCbaser
Definition: gic_v3_its.hh:221
panic
#define panic(...)
This implements a cprintf based panic() function.
Definition: logging.hh:171
ItsProcess
ItsProcess is a base coroutine wrapper which is spawned by the Gicv3Its module when the latter needs ...
Definition: gic_v3_its.hh:351

Generated on Tue Mar 23 2021 19:41:26 for gem5 by doxygen 1.8.17