write_queue_entry.cc revision 11484
111375Sandreas.hansson@arm.com/* 211375Sandreas.hansson@arm.com * Copyright (c) 2012-2013, 2015-2016 ARM Limited 311375Sandreas.hansson@arm.com * All rights reserved. 411375Sandreas.hansson@arm.com * 511375Sandreas.hansson@arm.com * The license below extends only to copyright in the software and shall 611375Sandreas.hansson@arm.com * not be construed as granting a license to any other intellectual 711375Sandreas.hansson@arm.com * property including but not limited to intellectual property relating 811375Sandreas.hansson@arm.com * to a hardware implementation of the functionality of the software 911375Sandreas.hansson@arm.com * licensed hereunder. You may use the software subject to the license 1011375Sandreas.hansson@arm.com * terms below provided that you ensure that this notice is replicated 1111375Sandreas.hansson@arm.com * unmodified and in its entirety in all distributions of the software, 1211375Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form. 1311375Sandreas.hansson@arm.com * 1411375Sandreas.hansson@arm.com * Copyright (c) 2002-2005 The Regents of The University of Michigan 1511375Sandreas.hansson@arm.com * Copyright (c) 2010 Advanced Micro Devices, Inc. 1611375Sandreas.hansson@arm.com * All rights reserved. 1711375Sandreas.hansson@arm.com * 1811375Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 1911375Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 2011375Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 2111375Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 2211375Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 2311375Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 2411375Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 2511375Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 2611375Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 2711375Sandreas.hansson@arm.com * this software without specific prior written permission. 2811375Sandreas.hansson@arm.com * 2911375Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 3011375Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 3111375Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 3211375Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3311375Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3411375Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3511375Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3611375Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3711375Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3811375Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3911375Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 4011375Sandreas.hansson@arm.com * 4111375Sandreas.hansson@arm.com * Authors: Erik Hallnor 4211375Sandreas.hansson@arm.com * Dave Greene 4311375Sandreas.hansson@arm.com * Andreas Hansson 4411375Sandreas.hansson@arm.com */ 4511375Sandreas.hansson@arm.com 4611375Sandreas.hansson@arm.com/** 4711375Sandreas.hansson@arm.com * @file 4811375Sandreas.hansson@arm.com * Miss Status and Handling Register (WriteQueueEntry) definitions. 4911375Sandreas.hansson@arm.com */ 5011375Sandreas.hansson@arm.com 5111375Sandreas.hansson@arm.com#include "mem/cache/write_queue_entry.hh" 5211375Sandreas.hansson@arm.com 5311375Sandreas.hansson@arm.com#include <algorithm> 5411375Sandreas.hansson@arm.com#include <cassert> 5511375Sandreas.hansson@arm.com#include <string> 5611375Sandreas.hansson@arm.com#include <vector> 5711375Sandreas.hansson@arm.com 5811375Sandreas.hansson@arm.com#include "base/misc.hh" 5911375Sandreas.hansson@arm.com#include "base/types.hh" 6011375Sandreas.hansson@arm.com#include "debug/Cache.hh" 6111375Sandreas.hansson@arm.com#include "mem/cache/cache.hh" 6211375Sandreas.hansson@arm.com#include "sim/core.hh" 6311375Sandreas.hansson@arm.com 6411375Sandreas.hansson@arm.comusing namespace std; 6511375Sandreas.hansson@arm.com 6611375Sandreas.hansson@arm.cominline void 6711375Sandreas.hansson@arm.comWriteQueueEntry::TargetList::add(PacketPtr pkt, Tick readyTime, 6811375Sandreas.hansson@arm.com Counter order) 6911375Sandreas.hansson@arm.com{ 7011375Sandreas.hansson@arm.com emplace_back(pkt, readyTime, order); 7111375Sandreas.hansson@arm.com} 7211375Sandreas.hansson@arm.com 7311375Sandreas.hansson@arm.combool 7411375Sandreas.hansson@arm.comWriteQueueEntry::TargetList::checkFunctional(PacketPtr pkt) 7511375Sandreas.hansson@arm.com{ 7611375Sandreas.hansson@arm.com for (auto& t : *this) { 7711375Sandreas.hansson@arm.com if (pkt->checkFunctional(t.pkt)) { 7811375Sandreas.hansson@arm.com return true; 7911375Sandreas.hansson@arm.com } 8011375Sandreas.hansson@arm.com } 8111375Sandreas.hansson@arm.com 8211375Sandreas.hansson@arm.com return false; 8311375Sandreas.hansson@arm.com} 8411375Sandreas.hansson@arm.com 8511375Sandreas.hansson@arm.comvoid 8611375Sandreas.hansson@arm.comWriteQueueEntry::TargetList::print(std::ostream &os, int verbosity, 8711375Sandreas.hansson@arm.com const std::string &prefix) const 8811375Sandreas.hansson@arm.com{ 8911375Sandreas.hansson@arm.com for (auto& t : *this) { 9011375Sandreas.hansson@arm.com ccprintf(os, "%sFromCPU: ", prefix); 9111375Sandreas.hansson@arm.com t.pkt->print(os, verbosity, ""); 9211375Sandreas.hansson@arm.com } 9311375Sandreas.hansson@arm.com} 9411375Sandreas.hansson@arm.com 9511375Sandreas.hansson@arm.comvoid 9611375Sandreas.hansson@arm.comWriteQueueEntry::allocate(Addr blk_addr, unsigned blk_size, PacketPtr target, 9711375Sandreas.hansson@arm.com Tick when_ready, Counter _order) 9811375Sandreas.hansson@arm.com{ 9911375Sandreas.hansson@arm.com blkAddr = blk_addr; 10011375Sandreas.hansson@arm.com blkSize = blk_size; 10111375Sandreas.hansson@arm.com isSecure = target->isSecure(); 10211375Sandreas.hansson@arm.com readyTime = when_ready; 10311375Sandreas.hansson@arm.com order = _order; 10411375Sandreas.hansson@arm.com assert(target); 10511375Sandreas.hansson@arm.com _isUncacheable = target->req->isUncacheable(); 10611375Sandreas.hansson@arm.com inService = false; 10711375Sandreas.hansson@arm.com 10811375Sandreas.hansson@arm.com // we should never have more than a single target for cacheable 10911375Sandreas.hansson@arm.com // writes (writebacks and clean evictions) 11011375Sandreas.hansson@arm.com panic_if(!_isUncacheable && !targets.empty(), 11111375Sandreas.hansson@arm.com "Write queue entry %#llx should never have more than one " 11211375Sandreas.hansson@arm.com "cacheable target", blkAddr); 11311375Sandreas.hansson@arm.com panic_if(!((target->isWrite() && _isUncacheable) || 11411375Sandreas.hansson@arm.com (target->isEviction() && !_isUncacheable)), 11511375Sandreas.hansson@arm.com "Write queue entry %#llx should either be uncacheable write or " 11611375Sandreas.hansson@arm.com "a cacheable eviction"); 11711375Sandreas.hansson@arm.com 11811375Sandreas.hansson@arm.com targets.add(target, when_ready, _order); 11911375Sandreas.hansson@arm.com} 12011375Sandreas.hansson@arm.com 12111375Sandreas.hansson@arm.comvoid 12211375Sandreas.hansson@arm.comWriteQueueEntry::deallocate() 12311375Sandreas.hansson@arm.com{ 12411375Sandreas.hansson@arm.com assert(targets.empty()); 12511375Sandreas.hansson@arm.com inService = false; 12611375Sandreas.hansson@arm.com} 12711375Sandreas.hansson@arm.com 12811375Sandreas.hansson@arm.combool 12911375Sandreas.hansson@arm.comWriteQueueEntry::checkFunctional(PacketPtr pkt) 13011375Sandreas.hansson@arm.com{ 13111375Sandreas.hansson@arm.com // For printing, we treat the WriteQueueEntry as a whole as single 13211375Sandreas.hansson@arm.com // entity. For other requests, we iterate over the individual 13311375Sandreas.hansson@arm.com // targets since that's where the actual data lies. 13411375Sandreas.hansson@arm.com if (pkt->isPrint()) { 13511484Snikos.nikoleris@arm.com pkt->checkFunctional(this, blkAddr, isSecure, blkSize, nullptr); 13611375Sandreas.hansson@arm.com return false; 13711375Sandreas.hansson@arm.com } else { 13811375Sandreas.hansson@arm.com return targets.checkFunctional(pkt); 13911375Sandreas.hansson@arm.com } 14011375Sandreas.hansson@arm.com} 14111375Sandreas.hansson@arm.com 14211375Sandreas.hansson@arm.combool 14311375Sandreas.hansson@arm.comWriteQueueEntry::sendPacket(Cache &cache) 14411375Sandreas.hansson@arm.com{ 14511375Sandreas.hansson@arm.com return cache.sendWriteQueuePacket(this); 14611375Sandreas.hansson@arm.com} 14711375Sandreas.hansson@arm.com 14811375Sandreas.hansson@arm.comvoid 14911375Sandreas.hansson@arm.comWriteQueueEntry::print(std::ostream &os, int verbosity, 15011375Sandreas.hansson@arm.com const std::string &prefix) const 15111375Sandreas.hansson@arm.com{ 15211375Sandreas.hansson@arm.com ccprintf(os, "%s[%#llx:%#llx](%s) %s %s %s state: %s %s %s %s %s\n", 15311375Sandreas.hansson@arm.com prefix, blkAddr, blkAddr + blkSize - 1, 15411375Sandreas.hansson@arm.com isSecure ? "s" : "ns", 15511375Sandreas.hansson@arm.com _isUncacheable ? "Unc" : "", 15611375Sandreas.hansson@arm.com inService ? "InSvc" : ""); 15711375Sandreas.hansson@arm.com 15811375Sandreas.hansson@arm.com ccprintf(os, "%s Targets:\n", prefix); 15911375Sandreas.hansson@arm.com targets.print(os, verbosity, prefix + " "); 16011375Sandreas.hansson@arm.com} 16111375Sandreas.hansson@arm.com 16211375Sandreas.hansson@arm.comstd::string 16311375Sandreas.hansson@arm.comWriteQueueEntry::print() const 16411375Sandreas.hansson@arm.com{ 16511375Sandreas.hansson@arm.com ostringstream str; 16611375Sandreas.hansson@arm.com print(str); 16711375Sandreas.hansson@arm.com return str.str(); 16811375Sandreas.hansson@arm.com} 169