write_queue_entry.hh revision 12724
19243SN/A/* 210889Sandreas.hansson@arm.com * Copyright (c) 2012-2013, 2015-2016 ARM Limited 39243SN/A * All rights reserved. 49243SN/A * 59243SN/A * The license below extends only to copyright in the software and shall 69243SN/A * not be construed as granting a license to any other intellectual 79243SN/A * property including but not limited to intellectual property relating 89243SN/A * to a hardware implementation of the functionality of the software 99243SN/A * licensed hereunder. You may use the software subject to the license 109243SN/A * terms below provided that you ensure that this notice is replicated 119243SN/A * unmodified and in its entirety in all distributions of the software, 129243SN/A * modified or unmodified, in source code or in binary form. 139243SN/A * 149831SN/A * Copyright (c) 2002-2005 The Regents of The University of Michigan 159831SN/A * All rights reserved. 169831SN/A * 179243SN/A * Redistribution and use in source and binary forms, with or without 189243SN/A * modification, are permitted provided that the following conditions are 199243SN/A * met: redistributions of source code must retain the above copyright 209243SN/A * notice, this list of conditions and the following disclaimer; 219243SN/A * redistributions in binary form must reproduce the above copyright 229243SN/A * notice, this list of conditions and the following disclaimer in the 239243SN/A * documentation and/or other materials provided with the distribution; 249243SN/A * neither the name of the copyright holders nor the names of its 259243SN/A * contributors may be used to endorse or promote products derived from 269243SN/A * this software without specific prior written permission. 279243SN/A * 289243SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 299243SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 309243SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 319243SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 329243SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 339243SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 349243SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 359243SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 369243SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 379243SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 389243SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 399243SN/A * 409243SN/A * Authors: Erik Hallnor 419243SN/A * Andreas Hansson 429967SN/A */ 4310618SOmar.Naji@arm.com 449243SN/A/** 459243SN/A * @file 4610146Sandreas.hansson@arm.com * Write queue entry 479356SN/A */ 4810146Sandreas.hansson@arm.com 4910247Sandreas.hansson@arm.com#ifndef __MEM_CACHE_WRITE_QUEUE_ENTRY_HH__ 5010208Sandreas.hansson@arm.com#define __MEM_CACHE_WRITE_QUEUE_ENTRY_HH__ 519352SN/A 5210146Sandreas.hansson@arm.com#include <list> 539814SN/A 549243SN/A#include "base/printable.hh" 559243SN/A#include "mem/cache/queue_entry.hh" 5610432SOmar.Naji@arm.com 579243SN/Aclass BaseCache; 5810146Sandreas.hansson@arm.com 599243SN/A/** 6010619Sandreas.hansson@arm.com * Write queue entry 619243SN/A */ 6210211Sandreas.hansson@arm.comclass WriteQueueEntry : public QueueEntry, public Printable 6310618SOmar.Naji@arm.com{ 6410208Sandreas.hansson@arm.com 6510489SOmar.Naji@arm.com /** 669831SN/A * Consider the queues friends to avoid making everything public. 679831SN/A */ 689831SN/A template<typename Entry> 699831SN/A friend class Queue; 709831SN/A friend class WriteQueue; 7110140SN/A 7210646Sandreas.hansson@arm.com public: 739243SN/A 7410394Swendy.elsasser@arm.com class Target { 7510394Swendy.elsasser@arm.com public: 769566SN/A 779243SN/A const Tick recvTime; //!< Time when request was received (for stats) 789243SN/A const Tick readyTime; //!< Time when request is ready to be serviced 7910140SN/A const Counter order; //!< Global order (for memory consistency mgmt) 8010140SN/A const PacketPtr pkt; //!< Pending request packet. 8110147Sandreas.hansson@arm.com 8210147Sandreas.hansson@arm.com Target(PacketPtr _pkt, Tick _readyTime, Counter _order) 8310393Swendy.elsasser@arm.com : recvTime(curTick()), readyTime(_readyTime), order(_order), 8410394Swendy.elsasser@arm.com pkt(_pkt) 8510394Swendy.elsasser@arm.com {} 8610394Swendy.elsasser@arm.com }; 879243SN/A 889243SN/A class TargetList : public std::list<Target> { 8910141SN/A 909726SN/A public: 919726SN/A 9210618SOmar.Naji@arm.com TargetList() {} 9310618SOmar.Naji@arm.com void add(PacketPtr pkt, Tick readyTime, Counter order); 949243SN/A bool checkFunctional(PacketPtr pkt); 9510620Sandreas.hansson@arm.com void print(std::ostream &os, int verbosity, 9610620Sandreas.hansson@arm.com const std::string &prefix) const; 9710620Sandreas.hansson@arm.com }; 9810620Sandreas.hansson@arm.com 9910620Sandreas.hansson@arm.com /** A list of write queue entriess. */ 10010889Sandreas.hansson@arm.com typedef std::list<WriteQueueEntry *> List; 10110889Sandreas.hansson@arm.com /** WriteQueueEntry list iterator. */ 10210889Sandreas.hansson@arm.com typedef List::iterator Iterator; 10310618SOmar.Naji@arm.com 10410618SOmar.Naji@arm.com bool sendPacket(BaseCache &cache); 10510618SOmar.Naji@arm.com 10610432SOmar.Naji@arm.com private: 10710618SOmar.Naji@arm.com 10810618SOmar.Naji@arm.com /** 10910618SOmar.Naji@arm.com * Pointer to this entry on the ready list. 11010432SOmar.Naji@arm.com * @sa MissQueue, WriteQueue::readyList 11110246Sandreas.hansson@arm.com */ 11210618SOmar.Naji@arm.com Iterator readyIter; 11310561SOmar.Naji@arm.com 11410561SOmar.Naji@arm.com /** 11510561SOmar.Naji@arm.com * Pointer to this entry on the allocated list. 11610394Swendy.elsasser@arm.com * @sa MissQueue, WriteQueue::allocatedList 11710394Swendy.elsasser@arm.com */ 11810394Swendy.elsasser@arm.com Iterator allocIter; 11910394Swendy.elsasser@arm.com 12010394Swendy.elsasser@arm.com /** List of all requests that match the address */ 12110394Swendy.elsasser@arm.com TargetList targets; 12210394Swendy.elsasser@arm.com 12310394Swendy.elsasser@arm.com public: 12410618SOmar.Naji@arm.com 12510394Swendy.elsasser@arm.com /** A simple constructor. */ 12610394Swendy.elsasser@arm.com WriteQueueEntry() {} 12710618SOmar.Naji@arm.com 12810394Swendy.elsasser@arm.com /** 12910246Sandreas.hansson@arm.com * Allocate a miss to this entry. 13010246Sandreas.hansson@arm.com * @param blk_addr The address of the block. 13110246Sandreas.hansson@arm.com * @param blk_size The number of bytes to request. 13210140SN/A * @param pkt The original write. 13310140SN/A * @param when_ready When should the write be sent out. 13410140SN/A * @param _order The logical order of this write. 13510140SN/A */ 13610140SN/A void allocate(Addr blk_addr, unsigned blk_size, PacketPtr pkt, 1379243SN/A Tick when_ready, Counter _order); 1389243SN/A 1399567SN/A 1409243SN/A /** 14110489SOmar.Naji@arm.com * Mark this entry as free. 14210489SOmar.Naji@arm.com */ 14310489SOmar.Naji@arm.com void deallocate(); 14410489SOmar.Naji@arm.com 14510489SOmar.Naji@arm.com /** 14610489SOmar.Naji@arm.com * Returns the current number of allocated targets. 14710489SOmar.Naji@arm.com * @return The current number of allocated targets. 14810489SOmar.Naji@arm.com */ 14910489SOmar.Naji@arm.com int getNumTargets() const 15010489SOmar.Naji@arm.com { return targets.size(); } 1519243SN/A 1529243SN/A /** 1539831SN/A * Returns true if there are targets left. 1549831SN/A * @return true if there are targets 1559831SN/A */ 1569831SN/A bool hasTargets() const { return !targets.empty(); } 1579831SN/A 1589243SN/A /** 15910207Sandreas.hansson@arm.com * Returns a reference to the first target. 16010207Sandreas.hansson@arm.com * @return A pointer to the first target. 16110207Sandreas.hansson@arm.com */ 16210207Sandreas.hansson@arm.com Target *getTarget() 16310207Sandreas.hansson@arm.com { 16410394Swendy.elsasser@arm.com assert(hasTargets()); 16510394Swendy.elsasser@arm.com return &targets.front(); 16610394Swendy.elsasser@arm.com } 16710394Swendy.elsasser@arm.com 16810394Swendy.elsasser@arm.com /** 16910394Swendy.elsasser@arm.com * Pop first target. 17010394Swendy.elsasser@arm.com */ 17110394Swendy.elsasser@arm.com void popTarget() 17210394Swendy.elsasser@arm.com { 17310394Swendy.elsasser@arm.com targets.pop_front(); 17410394Swendy.elsasser@arm.com } 17510394Swendy.elsasser@arm.com 17610394Swendy.elsasser@arm.com bool checkFunctional(PacketPtr pkt); 17710394Swendy.elsasser@arm.com 17810394Swendy.elsasser@arm.com /** 17910394Swendy.elsasser@arm.com * Prints the contents of this MSHR for debugging. 18010394Swendy.elsasser@arm.com */ 18110394Swendy.elsasser@arm.com void print(std::ostream &os, 18210394Swendy.elsasser@arm.com int verbosity = 0, 18310394Swendy.elsasser@arm.com const std::string &prefix = "") const; 18410394Swendy.elsasser@arm.com /** 18510394Swendy.elsasser@arm.com * A no-args wrapper of print(std::ostream...) meant to be 18610561SOmar.Naji@arm.com * invoked from DPRINTFs avoiding string overheads in fast mode 18710561SOmar.Naji@arm.com * 18810394Swendy.elsasser@arm.com * @return string with mshr fields 18910394Swendy.elsasser@arm.com */ 19010394Swendy.elsasser@arm.com std::string print() const; 19110394Swendy.elsasser@arm.com}; 19210394Swendy.elsasser@arm.com 19310394Swendy.elsasser@arm.com#endif // __MEM_CACHE_WRITE_QUEUE_ENTRY_HH__ 1949243SN/A