gem5 v24.0.0.0
Loading...
Searching...
No Matches
gic_v2m.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2013 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
57#include "dev/arm/gic_v2m.hh"
58
59#include "base/bitunion.hh"
60#include "base/intmath.hh"
61#include "debug/Checkpoint.hh"
62#include "debug/GICV2M.hh"
63#include "dev/io_device.hh"
64#include "mem/packet.hh"
65#include "mem/packet_access.hh"
66
67namespace gem5
68{
69
71 : PioDevice(p), pioDelay(p.pio_delay), frames(p.frames), gic(p.gic)
72{
73 // Assert SPI ranges start at 32
74 for (int i = 0; i < frames.size(); i++) {
75 if (frames[i]->spi_base < 32)
76 fatal("Gicv2m: Frame %d's SPI base (%d) is not in SPI space\n",
77 i, frames[i]->spi_base);
78 }
79 unsigned int x = frames.size();
80 fatal_if(!isPowerOf2(x), "Gicv2m: The v2m shim must be configured with "
81 "a power-of-two number of frames\n");
83}
84
87{
88 AddrRangeList ranges;
89 for (int i = 0; i < frames.size(); i++) {
90 ranges.push_back(RangeSize(frames[i]->addr, FRAME_SIZE));
91 }
92 return ranges;
93}
94
95Tick
97{
98 int frame = frameFromAddr(pkt->getAddr());
99
100 assert(frame >= 0);
101
102 Addr offset = pkt->getAddr() - frames[frame]->addr;
103
104 switch (offset) {
105 case MSI_TYPER:
106 pkt->setLE<uint32_t>((frames[frame]->spi_base << 16) |
107 frames[frame]->spi_len);
108 break;
109
110 case PER_ID4:
111 pkt->setLE<uint32_t>(0x4 | ((4+log2framenum) << 4));
112 // Nr of 4KB blocks used by component. This is messy as frames are 64K
113 // (16, ie 2^4) and we should assert we're given a Po2 number of frames.
114 break;
115 default:
116 DPRINTF(GICV2M, "GICv2m: Read of unk reg %#x\n", offset);
117 pkt->setLE<uint32_t>(0);
118 };
119
120 pkt->makeAtomicResponse();
121
122 return pioDelay;
123}
124
125Tick
127{
128 int frame = frameFromAddr(pkt->getAddr());
129
130 assert(frame >= 0);
131
132 Addr offset = pkt->getAddr() - frames[frame]->addr;
133
134 if (offset == MSI_SETSPI_NSR) {
135 /* Is payload SPI number within range? */
136 uint32_t m = pkt->getLE<uint32_t>();
137 if (m >= frames[frame]->spi_base &&
138 m < (frames[frame]->spi_base + frames[frame]->spi_len)) {
139 DPRINTF(GICV2M, "GICv2m: Frame %d raising MSI %d\n", frame, m);
140 gic->sendInt(m);
141 }
142 } else {
143 DPRINTF(GICV2M, "GICv2m: Write of unk reg %#x\n", offset);
144 }
145
146 pkt->makeAtomicResponse();
147
148 return pioDelay;
149}
150
151int
153{
154 for (int i = 0; i < frames.size(); i++) {
155 if (a >= frames[i]->addr && a < (frames[i]->addr + FRAME_SIZE))
156 return i;
157 }
158 return -1;
159}
160
161} // namespace gem5
#define DPRINTF(x,...)
Definition trace.hh:210
virtual void sendInt(uint32_t num)=0
Post an interrupt from a device that is connected to the GIC.
BaseGic * gic
Gic to which we fire interrupts.
Definition gic_v2m.hh:91
unsigned int log2framenum
Count of number of configured frames, as log2(frames)
Definition gic_v2m.hh:94
static const int PER_ID4
Definition gic_v2m.hh:82
Gicv2mParams Params
Definition gic_v2m.hh:97
virtual Tick read(PacketPtr pkt)
A PIO read to the device.
Definition gic_v2m.cc:96
virtual AddrRangeList getAddrRanges() const
Return the address ranges used by the Gicv2m This is the set of frame addresses.
Definition gic_v2m.cc:86
static const int FRAME_SIZE
Definition gic_v2m.hh:78
virtual Tick write(PacketPtr pkt)
A PIO read to the device.
Definition gic_v2m.cc:126
int frameFromAddr(Addr a) const
Determine which frame a PIO access lands in.
Definition gic_v2m.cc:152
const Tick pioDelay
Latency for an MMIO operation.
Definition gic_v2m.hh:85
Gicv2m(const Params &p)
Definition gic_v2m.cc:70
std::vector< Gicv2mFrame * > frames
A set of configured hardware frames.
Definition gic_v2m.hh:88
static const int MSI_SETSPI_NSR
Definition gic_v2m.hh:81
static const int MSI_TYPER
Definition gic_v2m.hh:80
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition packet.hh:295
Addr getAddr() const
Definition packet.hh:807
void setLE(T v)
Set the value in the data pointer to v as little endian.
void makeAtomicResponse()
Definition packet.hh:1074
T getLE() const
Get the data in the packet byte swapped from little endian to host endian.
This device is the base class which all devices senstive to an address range inherit from.
Definition io_device.hh:103
Implementiation of a GICv2m MSI shim.
AddrRange RangeSize(Addr start, Addr size)
static constexpr std::enable_if_t< std::is_integral_v< T >, int > floorLog2(T x)
Definition intmath.hh:59
static constexpr bool isPowerOf2(const T &n)
Definition intmath.hh:98
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
Definition logging.hh:236
#define fatal(...)
This implements a cprintf based fatal() function.
Definition logging.hh:200
Bitfield< 7 > i
Definition misc_types.hh:67
Bitfield< 27, 24 > gic
Bitfield< 23, 0 > offset
Definition types.hh:144
Bitfield< 8 > a
Definition misc_types.hh:66
Bitfield< 0 > m
Bitfield< 0 > p
Bitfield< 3 > x
Definition pagetable.hh:73
Bitfield< 3 > addr
Definition types.hh:84
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
Definition binary32.hh:36
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition types.hh:147
uint64_t Tick
Tick count type.
Definition types.hh:58
Declaration of the Packet class.

Generated on Tue Jun 18 2024 16:24:02 for gem5 by doxygen 1.11.0