Deleted Added
sdiff udiff text old ( 10399:0644819fc32f ) new ( 10403:b3231fc8ae9d )
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

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

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 SnoopItem& sf_item = cachedLocations[line_addr];
60
61 DPRINTF(SnoopFilter, "%s: SF value %x.%x\n",
62 __func__, sf_item.requested, sf_item.holder);
63
64 if (cpkt->needsResponse()) {
65 if (!cpkt->memInhibitAsserted()) {
66 // Max one request per address per port
67 panic_if(sf_item.requested & req_port, "double request :( "\
68 "SF value %x.%x\n", sf_item.requested, sf_item.holder);

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

76 // sure that we know that that cluster has a copy
77 panic_if(!(sf_item.holder & req_port), "Need to hold the value!");
78 DPRINTF(SnoopFilter, "%s: not marking request. SF value %x.%x\n",
79 __func__, sf_item.requested, sf_item.holder);
80 }
81 DPRINTF(SnoopFilter, "%s: new SF value %x.%x\n",
82 __func__, sf_item.requested, sf_item.holder);
83 }
84 SnoopMask interested = (sf_item.holder | sf_item.requested) & ~req_port;
85 return snoopSelected(maskToPortList(interested), lookupLatency);
86}
87
88void
89SnoopFilter::updateRequest(const Packet* cpkt, const SlavePort& slave_port,
90 bool will_retry)
91{
92 DPRINTF(SnoopFilter, "%s: packet src %s addr 0x%x cmd %s\n",
93 __func__, slave_port.name(), cpkt->getAddr(), cpkt->cmdString());

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

136
137 // Broadcast / filter upward snoops
138 const bool filter_upward = true; // @todo: Make configurable
139
140 if (!filter_upward)
141 return snoopAll(lookupLatency);
142
143 Addr line_addr = cpkt->getAddr() & ~(linesize - 1);
144 SnoopItem& sf_item = cachedLocations[line_addr];
145
146 DPRINTF(SnoopFilter, "%s: old SF value %x.%x\n",
147 __func__, sf_item.requested, sf_item.holder);
148
149 SnoopMask interested = (sf_item.holder | sf_item.requested);
150 assert(cpkt->isInvalidate() == cpkt->needsExclusive());
151 if (cpkt->isInvalidate() && !sf_item.requested) {
152 // Early clear of the holder, if no other request is currently going on
153 // @todo: This should possibly be updated even though we do not filter
154 // upward snoops
155 sf_item.holder = 0;
156 }
157

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

262 if (cpkt->needsExclusive() || !cpkt->sharedAsserted())
263 sf_item.holder = 0;
264 sf_item.holder |= slave_mask;
265 sf_item.requested &= ~slave_mask;
266 DPRINTF(SnoopFilter, "%s: new SF value %x.%x\n",
267 __func__, sf_item.requested, sf_item.holder);
268}
269
270SnoopFilter *
271SnoopFilterParams::create()
272{
273 return new SnoopFilter(this);
274}