Deleted Added
sdiff udiff text old ( 10883:9294c4a60251 ) new ( 11128:b6532152a64a )
full compact
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

--- 38 unchanged lines hidden (view full) ---

49#include "sim/system.hh"
50
51std::pair<SnoopFilter::SnoopList, Cycles>
52SnoopFilter::lookupRequest(const Packet* cpkt, const SlavePort& slave_port)
53{
54 DPRINTF(SnoopFilter, "%s: packet src %s addr 0x%x cmd %s\n",
55 __func__, slave_port.name(), cpkt->getAddr(), cpkt->cmdString());
56
57 Addr line_addr = cpkt->getAddr() & ~(linesize - 1);
58 SnoopMask req_port = portToMask(slave_port);
59 auto sf_it = cachedLocations.find(line_addr);
60 bool is_hit = (sf_it != cachedLocations.end());
61 // Create a new element through operator[] and modify in-place
62 SnoopItem& sf_item = is_hit ? sf_it->second : cachedLocations[line_addr];
63 SnoopMask interested = sf_item.holder | sf_item.requested;
64
65 totRequests++;
66 if (is_hit) {
67 // Single bit set -> value is a power of two
68 if (isPow2(interested))
69 hitSingleRequests++;
70 else
71 hitMultiRequests++;
72 }
73
74 DPRINTF(SnoopFilter, "%s: SF value %x.%x\n",
75 __func__, sf_item.requested, sf_item.holder);
76
77 if (!cpkt->req->isUncacheable() && cpkt->needsResponse()) {
78 if (!cpkt->memInhibitAsserted()) {
79 // Max one request per address per port
80 panic_if(sf_item.requested & req_port, "double request :( "\
81 "SF value %x.%x\n", sf_item.requested, sf_item.holder);
82
83 // Mark in-flight requests to distinguish later on
84 sf_item.requested |= req_port;
85 } else {

--- 13 unchanged lines hidden (view full) ---

99
100void
101SnoopFilter::updateRequest(const Packet* cpkt, const SlavePort& slave_port,
102 bool will_retry)
103{
104 DPRINTF(SnoopFilter, "%s: packet src %s addr 0x%x cmd %s\n",
105 __func__, slave_port.name(), cpkt->getAddr(), cpkt->cmdString());
106
107 if (cpkt->req->isUncacheable())
108 return;
109
110 Addr line_addr = cpkt->getAddr() & ~(linesize - 1);
111 SnoopMask req_port = portToMask(slave_port);
112 SnoopItem& sf_item = cachedLocations[line_addr];
113
114 DPRINTF(SnoopFilter, "%s: old SF value %x.%x retry: %i\n",
115 __func__, sf_item.requested, sf_item.holder, will_retry);
116
117 if (will_retry) {
118 // Unmark a request that will come again.

--- 32 unchanged lines hidden (view full) ---

151 assert(cpkt->isRequest());
152
153 // Broadcast / filter upward snoops
154 const bool filter_upward = true; // @todo: Make configurable
155
156 if (!filter_upward)
157 return snoopAll(lookupLatency);
158
159 Addr line_addr = cpkt->getAddr() & ~(linesize - 1);
160 auto sf_it = cachedLocations.find(line_addr);
161 bool is_hit = (sf_it != cachedLocations.end());
162 // Create a new element through operator[] and modify in-place
163 SnoopItem& sf_item = is_hit ? sf_it->second : cachedLocations[line_addr];
164
165 DPRINTF(SnoopFilter, "%s: old SF value %x.%x\n",
166 __func__, sf_item.requested, sf_item.holder);
167

--- 34 unchanged lines hidden (view full) ---

202{
203 DPRINTF(SnoopFilter, "%s: packet rsp %s req %s addr 0x%x cmd %s\n",
204 __func__, rsp_port.name(), req_port.name(), cpkt->getAddr(),
205 cpkt->cmdString());
206
207 assert(cpkt->isResponse());
208 assert(cpkt->memInhibitAsserted());
209
210 if (cpkt->req->isUncacheable())
211 return;
212
213 Addr line_addr = cpkt->getAddr() & ~(linesize - 1);
214 SnoopMask rsp_mask = portToMask(rsp_port);
215 SnoopMask req_mask = portToMask(req_port);
216 SnoopItem& sf_item = cachedLocations[line_addr];
217
218 DPRINTF(SnoopFilter, "%s: old SF value %x.%x\n",
219 __func__, sf_item.requested, sf_item.holder);
220
221 // The source should have the line

--- 27 unchanged lines hidden (view full) ---

249void
250SnoopFilter::updateSnoopForward(const Packet* cpkt,
251 const SlavePort& rsp_port, const MasterPort& req_port)
252{
253 DPRINTF(SnoopFilter, "%s: packet rsp %s req %s addr 0x%x cmd %s\n",
254 __func__, rsp_port.name(), req_port.name(), cpkt->getAddr(),
255 cpkt->cmdString());
256
257 Addr line_addr = cpkt->getAddr() & ~(linesize - 1);
258 SnoopItem& sf_item = cachedLocations[line_addr];
259 SnoopMask rsp_mask M5_VAR_USED = portToMask(rsp_port);
260
261 assert(cpkt->isResponse());
262 assert(cpkt->memInhibitAsserted());
263
264 DPRINTF(SnoopFilter, "%s: old SF value %x.%x\n",
265 __func__, sf_item.requested, sf_item.holder);

--- 13 unchanged lines hidden (view full) ---

279void
280SnoopFilter::updateResponse(const Packet* cpkt, const SlavePort& slave_port)
281{
282 DPRINTF(SnoopFilter, "%s: packet src %s addr 0x%x cmd %s\n",
283 __func__, slave_port.name(), cpkt->getAddr(), cpkt->cmdString());
284
285 assert(cpkt->isResponse());
286
287 if (cpkt->req->isUncacheable())
288 return;
289
290 Addr line_addr = cpkt->getAddr() & ~(linesize - 1);
291 SnoopMask slave_mask = portToMask(slave_port);
292 SnoopItem& sf_item = cachedLocations[line_addr];
293
294 DPRINTF(SnoopFilter, "%s: old SF value %x.%x\n",
295 __func__, sf_item.requested, sf_item.holder);
296
297 // Make sure we have seen the actual request, too
298 panic_if(!(sf_item.requested & slave_mask), "SF value %x.%x missing "\

--- 48 unchanged lines hidden ---