gem5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
snoop_filter.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013-2016 ARM Limited
3  * All rights reserved
4  *
5  * The license below extends only to copyright in the software and shall
6  * not be construed as granting a license to any other intellectual
7  * property including but not limited to intellectual property relating
8  * to a hardware implementation of the functionality of the software
9  * licensed hereunder. You may use the software subject to the license
10  * terms below provided that you ensure that this notice is replicated
11  * unmodified and in its entirety in all distributions of the software,
12  * modified or unmodified, in source code or in binary form.
13  *
14  * Redistribution and use in source and binary forms, with or without
15  * modification, are permitted provided that the following conditions are
16  * met: redistributions of source code must retain the above copyright
17  * notice, this list of conditions and the following disclaimer;
18  * redistributions in binary form must reproduce the above copyright
19  * notice, this list of conditions and the following disclaimer in the
20  * documentation and/or other materials provided with the distribution;
21  * neither the name of the copyright holders nor the names of its
22  * contributors may be used to endorse or promote products derived from
23  * this software without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36  *
37  * Authors: Stephan Diestelhorst
38  */
39 
45 #ifndef __MEM_SNOOP_FILTER_HH__
46 #define __MEM_SNOOP_FILTER_HH__
47 
48 #include <unordered_map>
49 #include <utility>
50 
51 #include "mem/packet.hh"
52 #include "mem/port.hh"
53 #include "mem/qport.hh"
54 #include "params/SnoopFilter.hh"
55 #include "sim/sim_object.hh"
56 #include "sim/system.hh"
57 
87 class SnoopFilter : public SimObject {
88  public:
90 
91  SnoopFilter (const SnoopFilterParams *p) :
93  linesize(p->system->cacheLineSize()), lookupLatency(p->lookup_latency),
94  maxEntryCount(p->max_capacity / p->system->cacheLineSize())
95  {
96  }
97 
104  void setSlavePorts(const SnoopList& slave_ports) {
105  localSlavePortIds.resize(slave_ports.size(), InvalidPortID);
106 
107  PortID id = 0;
108  for (const auto& p : slave_ports) {
109  // no need to track this port if it is not snooping
110  if (p->isSnooping()) {
111  slavePorts.push_back(p);
112  localSlavePortIds[p->getId()] = id++;
113  }
114  }
115 
116  // make sure we can deal with this many ports
117  fatal_if(id > 8 * sizeof(SnoopMask),
118  "Snoop filter only supports %d snooping ports, got %d\n",
119  8 * sizeof(SnoopMask), id);
120  }
121 
135  const SlavePort& slave_port);
136 
146  void finishRequest(bool will_retry, Addr addr, bool is_secure);
147 
158 
169  void updateSnoopResponse(const Packet *cpkt, const SlavePort& rsp_port,
170  const SlavePort& req_port);
171 
181  void updateSnoopForward(const Packet *cpkt, const SlavePort& rsp_port,
182  const MasterPort& req_port);
183 
193  void updateResponse(const Packet *cpkt, const SlavePort& slave_port);
194 
195  virtual void regStats();
196 
197  protected:
198 
207  typedef uint64_t SnoopMask;
208 
214  struct SnoopItem {
217  };
221  typedef std::unordered_map<Addr, SnoopItem> SnoopFilterCache;
222 
227  {
228  return std::make_pair(slavePorts, latency);
229  }
231  Cycles latency) const
232  {
233  return std::make_pair(slave_ports, latency);
234  }
236  {
237  SnoopList empty;
238  return std::make_pair(empty , latency);
239  }
240 
246  SnoopMask portToMask(const SlavePort& port) const;
252  SnoopList maskToPortList(SnoopMask ports) const;
253 
254  private:
255 
259  void eraseIfNullEntry(SnoopFilterCache::iterator& sf_it);
260 
267  SnoopFilterCache::iterator reqLookupResult;
279  const unsigned linesize;
283  const unsigned maxEntryCount;
284 
288  enum LineStatus {
290  LineSecure = 0x01,
291  };
292 
297 
301 };
302 
305 {
306  assert(port.getId() != InvalidPortID);
307  // if this is not a snooping port, return a zero mask
308  return !port.isSnooping() ? 0 :
309  ((SnoopMask)1) << localSlavePortIds[port.getId()];
310 }
311 
314 {
315  SnoopList res;
316  for (const auto& p : slavePorts)
317  if (port_mask & portToMask(*p))
318  res.push_back(p);
319  return res;
320 }
321 
322 #endif // __MEM_SNOOP_FILTER_HH__
A MasterPort is a specialisation of a BaseMasterPort, which implements the default protocol for the t...
Definition: port.hh:167
void updateSnoopForward(const Packet *cpkt, const SlavePort &rsp_port, const MasterPort &req_port)
Pass snoop responses that travel downward through the snoop filter and let them update the snoop filt...
Stats::Scalar hitMultiRequests
PortID getId() const
Get the port id.
Definition: port.hh:102
Cycles is a wrapper class for representing cycle counts, i.e.
Definition: types.hh:83
Stats::Scalar hitMultiSnoops
SnoopFilterCache::iterator reqLookupResult
Iterator used to store the result from lookupRequest until we call finishRequest. ...
const PortID InvalidPortID
Definition: types.hh:182
STL pair class.
Definition: stl.hh:61
void finishRequest(bool will_retry, Addr addr, bool is_secure)
For an un-successful request, revert the change to the snoop filter.
const unsigned maxEntryCount
Max capacity in terms of cache blocks tracked, for sanity checking.
ip6_addr_t addr
Definition: inet.hh:335
void setSlavePorts(const SnoopList &slave_ports)
Init a new snoop filter and tell it about all the slave ports of the enclosing bus.
SnoopList slavePorts
List of all attached snooping slave ports.
Stats::Scalar totSnoops
Port Object Declaration.
A SlavePort is a specialisation of a port.
Definition: port.hh:331
block holds data from the secure memory space
This is a simple scalar statistic, like a counter.
Definition: statistics.hh:2475
std::vector< PortID > localSlavePortIds
Track the mapping from port ids to the local mask ids.
Stats::Scalar hitSingleSnoops
std::pair< SnoopList, Cycles > lookupSnoop(const Packet *cpkt)
Handle an incoming snoop from below (the master port).
SnoopFilter(const SnoopFilterParams *p)
Definition: snoop_filter.hh:91
bool isSnooping() const
Find out if the peer master port is snooping or not.
Definition: port.hh:405
Declaration of the queued port.
SnoopMask portToMask(const SlavePort &port) const
Convert a single port to a corresponding, one-hot bitmask.
Stats::Scalar hitSingleRequests
const Cycles lookupLatency
Latency for doing a lookup in the filter.
const unsigned linesize
Cache line size.
LineStatus
Use the lower bits of the address to keep track of the line status.
Stats::Scalar totRequests
Statistics.
void eraseIfNullEntry(SnoopFilterCache::iterator &sf_it)
Removes snoop filter items which have no requesters and no holders.
Definition: snoop_filter.cc:53
uint64_t SnoopMask
The underlying type for the bitmask we use for tracking.
std::pair< SnoopList, Cycles > snoopDown(Cycles latency) const
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
A Packet is used to encapsulate a transfer between two objects in the memory system (e...
Definition: packet.hh:245
void updateResponse(const Packet *cpkt, const SlavePort &slave_port)
Update the snoop filter with a response from below (outer / other cache, or memory) and update the tr...
SnoopFilterCache cachedLocations
Simple hash set of cached addresses.
std::vector< QueuedSlavePort * > SnoopList
Definition: snoop_filter.hh:89
SnoopList maskToPortList(SnoopMask ports) const
Converts a bitmask of ports into the corresponing list of ports.
virtual void regStats()
Register statistics for this object.
std::pair< SnoopList, Cycles > snoopSelected(const SnoopList &slave_ports, Cycles latency) const
Declaration of the Packet class.
Per cache line item tracking a bitmask of SlavePorts who have an outstanding request to this line (re...
int16_t PortID
Port index/ID type, and a symbolic name for an invalid port id.
Definition: types.hh:181
std::pair< SnoopList, Cycles > snoopAll(Cycles latency) const
Simple factory methods for standard return values.
void updateSnoopResponse(const Packet *cpkt, const SlavePort &rsp_port, const SlavePort &req_port)
Let the snoop filter see any snoop responses that turn into request responses and indicate cache to c...
fatal_if(p->js_features.size() > 16,"Too many job slot feature registers specified (%i)\n", p->js_features.size())
This snoop filter keeps track of which connected port has a particular line of data.
Definition: snoop_filter.hh:87
Bitfield< 0 > p
std::unordered_map< Addr, SnoopItem > SnoopFilterCache
HashMap of SnoopItems indexed by line address.
Abstract superclass for simulation objects.
Definition: sim_object.hh:94
std::pair< SnoopList, Cycles > lookupRequest(const Packet *cpkt, const SlavePort &slave_port)
Lookup a request (from a slave port) in the snoop filter and return a list of other slave ports that ...
Definition: snoop_filter.cc:64
SnoopItem retryItem
Variable to temporarily store value of snoopfilter entry incase finishRequest needs to undo changes m...

Generated on Fri Jun 9 2017 13:03:50 for gem5 by doxygen 1.8.6