coherent_xbar.cc (11196:53d4f7e452d6) coherent_xbar.cc (11199:929fd978ab4e)
1/*
2 * Copyright (c) 2011-2015 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

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

194 // the xbar has to be charged also with to lookup latency
195 // of the snoop filter
196 pkt->headerDelay += sf_res.second * clockPeriod();
197 DPRINTF(CoherentXBar, "recvTimingReq: src %s %s 0x%x"\
198 " SF size: %i lat: %i\n", src_port->name(),
199 pkt->cmdString(), pkt->getAddr(), sf_res.first.size(),
200 sf_res.second);
201
1/*
2 * Copyright (c) 2011-2015 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

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

194 // the xbar has to be charged also with to lookup latency
195 // of the snoop filter
196 pkt->headerDelay += sf_res.second * clockPeriod();
197 DPRINTF(CoherentXBar, "recvTimingReq: src %s %s 0x%x"\
198 " SF size: %i lat: %i\n", src_port->name(),
199 pkt->cmdString(), pkt->getAddr(), sf_res.first.size(),
200 sf_res.second);
201
202 if (pkt->evictingBlock()) {
202 if (pkt->isEviction()) {
203 // for block-evicting packets, i.e. writebacks and
204 // clean evictions, there is no need to snoop up, as
205 // all we do is determine if the block is cached or
206 // not, instead just set it here based on the snoop
207 // filter result
208 if (!sf_res.first.empty())
209 pkt->setBlockCached();
210 } else {

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

215 }
216
217 // add the snoop delay to our header delay, and then reset it
218 pkt->headerDelay += pkt->snoopDelay;
219 pkt->snoopDelay = 0;
220 }
221
222 // forwardTiming snooped into peer caches of the sender, and if
203 // for block-evicting packets, i.e. writebacks and
204 // clean evictions, there is no need to snoop up, as
205 // all we do is determine if the block is cached or
206 // not, instead just set it here based on the snoop
207 // filter result
208 if (!sf_res.first.empty())
209 pkt->setBlockCached();
210 } else {

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

215 }
216
217 // add the snoop delay to our header delay, and then reset it
218 pkt->headerDelay += pkt->snoopDelay;
219 pkt->snoopDelay = 0;
220 }
221
222 // forwardTiming snooped into peer caches of the sender, and if
223 // this is a clean evict, but the packet is found in a cache, do
224 // not forward it
225 if (pkt->cmd == MemCmd::CleanEvict && pkt->isBlockCached()) {
226 DPRINTF(CoherentXBar, "recvTimingReq: Clean evict 0x%x still cached, "
223 // this is a clean evict or clean writeback, but the packet is
224 // found in a cache, do not forward it
225 if ((pkt->cmd == MemCmd::CleanEvict ||
226 pkt->cmd == MemCmd::WritebackClean) && pkt->isBlockCached()) {
227 DPRINTF(CoherentXBar, "Clean evict/writeback %#llx still cached, "
227 "not forwarding\n", pkt->getAddr());
228
229 // update the layer state and schedule an idle event
230 reqLayers[master_port_id]->succeededTiming(packetFinishTime);
231
232 // queue the packet for deletion
233 pendingDelete.reset(pkt);
234

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

629 }
630 snoop_response_cmd = snoop_result.first;
631 snoop_response_latency += snoop_result.second;
632 }
633
634 // forwardAtomic snooped into peer caches of the sender, and if
635 // this is a clean evict, but the packet is found in a cache, do
636 // not forward it
228 "not forwarding\n", pkt->getAddr());
229
230 // update the layer state and schedule an idle event
231 reqLayers[master_port_id]->succeededTiming(packetFinishTime);
232
233 // queue the packet for deletion
234 pendingDelete.reset(pkt);
235

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

630 }
631 snoop_response_cmd = snoop_result.first;
632 snoop_response_latency += snoop_result.second;
633 }
634
635 // forwardAtomic snooped into peer caches of the sender, and if
636 // this is a clean evict, but the packet is found in a cache, do
637 // not forward it
637 if (pkt->cmd == MemCmd::CleanEvict && pkt->isBlockCached()) {
638 DPRINTF(CoherentXBar, "recvAtomic: Clean evict 0x%x still cached, "
638 if ((pkt->cmd == MemCmd::CleanEvict ||
639 pkt->cmd == MemCmd::WritebackClean) && pkt->isBlockCached()) {
640 DPRINTF(CoherentXBar, "Clean evict/writeback %#llx still cached, "
639 "not forwarding\n", pkt->getAddr());
640 return 0;
641 }
642
643 // even if we had a snoop response, we must continue and also
644 // perform the actual request at the destination
645 PortID master_port_id = findPort(pkt->getAddr());
646

--- 259 unchanged lines hidden ---
641 "not forwarding\n", pkt->getAddr());
642 return 0;
643 }
644
645 // even if we had a snoop response, we must continue and also
646 // perform the actual request at the destination
647 PortID master_port_id = findPort(pkt->getAddr());
648

--- 259 unchanged lines hidden ---