mshr_queue.hh revision 5314
15086Sgblack@eecs.umich.edu/* 25086Sgblack@eecs.umich.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan 35086Sgblack@eecs.umich.edu * All rights reserved. 45086Sgblack@eecs.umich.edu * 57087Snate@binkert.org * Redistribution and use in source and binary forms, with or without 67087Snate@binkert.org * modification, are permitted provided that the following conditions are 77087Snate@binkert.org * met: redistributions of source code must retain the above copyright 87087Snate@binkert.org * notice, this list of conditions and the following disclaimer; 97087Snate@binkert.org * redistributions in binary form must reproduce the above copyright 107087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the 117087Snate@binkert.org * documentation and/or other materials provided with the distribution; 127087Snate@binkert.org * neither the name of the copyright holders nor the names of its 135086Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 147087Snate@binkert.org * this software without specific prior written permission. 157087Snate@binkert.org * 167087Snate@binkert.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 177087Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 187087Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 197087Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 207087Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 217087Snate@binkert.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 225086Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 237087Snate@binkert.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 245086Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 255086Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 265086Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 275086Sgblack@eecs.umich.edu * 285086Sgblack@eecs.umich.edu * Authors: Erik Hallnor 295086Sgblack@eecs.umich.edu */ 305086Sgblack@eecs.umich.edu 315086Sgblack@eecs.umich.edu/** @file 325086Sgblack@eecs.umich.edu * Declaration of a structure to manage MSHRs. 335086Sgblack@eecs.umich.edu */ 345086Sgblack@eecs.umich.edu 355086Sgblack@eecs.umich.edu#ifndef __MEM__CACHE__MISS__MSHR_QUEUE_HH__ 365086Sgblack@eecs.umich.edu#define __MEM__CACHE__MISS__MSHR_QUEUE_HH__ 375086Sgblack@eecs.umich.edu 385086Sgblack@eecs.umich.edu#include <vector> 395086Sgblack@eecs.umich.edu 405647Sgblack@eecs.umich.edu#include "mem/packet.hh" 415647Sgblack@eecs.umich.edu#include "mem/cache/miss/mshr.hh" 425647Sgblack@eecs.umich.edu 435647Sgblack@eecs.umich.edu/** 445647Sgblack@eecs.umich.edu * A Class for maintaining a list of pending and allocated memory requests. 457629Sgblack@eecs.umich.edu */ 467629Sgblack@eecs.umich.educlass MSHRQueue 477629Sgblack@eecs.umich.edu{ 485086Sgblack@eecs.umich.edu private: 495135Sgblack@eecs.umich.edu /** Local label (for functional print requests) */ 505647Sgblack@eecs.umich.edu const std::string label; 515234Sgblack@eecs.umich.edu 525086Sgblack@eecs.umich.edu /** MSHR storage. */ 535086Sgblack@eecs.umich.edu MSHR *registers; 545086Sgblack@eecs.umich.edu /** Holds pointers to all allocated entries. */ 557693SAli.Saidi@ARM.com MSHR::List allocatedList; 565086Sgblack@eecs.umich.edu /** Holds pointers to entries that haven't been sent to the bus. */ 575086Sgblack@eecs.umich.edu MSHR::List readyList; 585086Sgblack@eecs.umich.edu /** Holds non allocated entries. */ 595086Sgblack@eecs.umich.edu MSHR::List freeList; 605086Sgblack@eecs.umich.edu 615086Sgblack@eecs.umich.edu // Parameters 625086Sgblack@eecs.umich.edu /** 635135Sgblack@eecs.umich.edu * The total number of entries in this queue. This number is set as the 645135Sgblack@eecs.umich.edu * number of entries requested plus (numReserve - 1). This allows for 655135Sgblack@eecs.umich.edu * the same number of effective entries while still maintaining the reserve. 665135Sgblack@eecs.umich.edu */ 676048Sgblack@eecs.umich.edu const int numEntries; 686048Sgblack@eecs.umich.edu 696048Sgblack@eecs.umich.edu /** 706048Sgblack@eecs.umich.edu * The number of entries to hold in reserve. This is needed because copy 716048Sgblack@eecs.umich.edu * operations can allocate upto 4 entries at one time. 726048Sgblack@eecs.umich.edu */ 736048Sgblack@eecs.umich.edu const int numReserve; 746048Sgblack@eecs.umich.edu 755135Sgblack@eecs.umich.edu MSHR::Iterator addToReadyList(MSHR *mshr); 765135Sgblack@eecs.umich.edu 775135Sgblack@eecs.umich.edu 785135Sgblack@eecs.umich.edu public: 795135Sgblack@eecs.umich.edu /** The number of allocated entries. */ 805135Sgblack@eecs.umich.edu int allocated; 815135Sgblack@eecs.umich.edu /** The number of entries that have been forwarded to the bus. */ 825135Sgblack@eecs.umich.edu int inServiceEntries; 835135Sgblack@eecs.umich.edu /** The index of this queue within the cache (MSHR queue vs. write 845135Sgblack@eecs.umich.edu * buffer). */ 855135Sgblack@eecs.umich.edu const int index; 865135Sgblack@eecs.umich.edu 875135Sgblack@eecs.umich.edu /** 885135Sgblack@eecs.umich.edu * Create a queue with a given number of entries. 895135Sgblack@eecs.umich.edu * @param num_entrys The number of entries in this queue. 905135Sgblack@eecs.umich.edu * @param reserve The minimum number of entries needed to satisfy 915135Sgblack@eecs.umich.edu * any access. 925264Sgblack@eecs.umich.edu */ 935135Sgblack@eecs.umich.edu MSHRQueue(const std::string &_label, int num_entries, int reserve, 945135Sgblack@eecs.umich.edu int index); 955135Sgblack@eecs.umich.edu 965135Sgblack@eecs.umich.edu /** Destructor */ 975141Sgblack@eecs.umich.edu ~MSHRQueue(); 985141Sgblack@eecs.umich.edu 995141Sgblack@eecs.umich.edu /** 1005141Sgblack@eecs.umich.edu * Find the first MSHR that matches the provided address. 1015141Sgblack@eecs.umich.edu * @param addr The address to find. 1025141Sgblack@eecs.umich.edu * @return Pointer to the matching MSHR, null if not found. 1035141Sgblack@eecs.umich.edu */ 1045141Sgblack@eecs.umich.edu MSHR *findMatch(Addr addr) const; 1055141Sgblack@eecs.umich.edu 1065182Sgblack@eecs.umich.edu /** 1075141Sgblack@eecs.umich.edu * Find and return all the matching entries in the provided vector. 1085141Sgblack@eecs.umich.edu * @param addr The address to find. 1095141Sgblack@eecs.umich.edu * @param matches The vector to return pointers to the matching entries. 1105141Sgblack@eecs.umich.edu * @return True if any matches are found, false otherwise. 1115141Sgblack@eecs.umich.edu * @todo Typedef the vector?? 1125141Sgblack@eecs.umich.edu */ 1135135Sgblack@eecs.umich.edu bool findMatches(Addr addr, std::vector<MSHR*>& matches) const; 1145141Sgblack@eecs.umich.edu 1155141Sgblack@eecs.umich.edu /** 1165141Sgblack@eecs.umich.edu * Find any pending requests that overlap the given request. 1175141Sgblack@eecs.umich.edu * @param pkt The request to find. 1185141Sgblack@eecs.umich.edu * @return A pointer to the earliest matching MSHR. 1195141Sgblack@eecs.umich.edu */ 1205141Sgblack@eecs.umich.edu MSHR *findPending(Addr addr, int size) const; 1215141Sgblack@eecs.umich.edu 1225141Sgblack@eecs.umich.edu bool checkFunctional(PacketPtr pkt, Addr blk_addr); 1235141Sgblack@eecs.umich.edu 1245141Sgblack@eecs.umich.edu /** 1255141Sgblack@eecs.umich.edu * Allocates a new MSHR for the request and size. This places the request 1265135Sgblack@eecs.umich.edu * as the first target in the MSHR. 1275141Sgblack@eecs.umich.edu * @param pkt The request to handle. 1285141Sgblack@eecs.umich.edu * @param size The number in bytes to fetch from memory. 1295135Sgblack@eecs.umich.edu * @return The a pointer to the MSHR allocated. 1305141Sgblack@eecs.umich.edu * 1315141Sgblack@eecs.umich.edu * @pre There are free entries. 1325141Sgblack@eecs.umich.edu */ 1335141Sgblack@eecs.umich.edu MSHR *allocate(Addr addr, int size, PacketPtr &pkt, 1345135Sgblack@eecs.umich.edu Tick when, Counter order); 1355141Sgblack@eecs.umich.edu 1365141Sgblack@eecs.umich.edu /** 1375141Sgblack@eecs.umich.edu * Removes the given MSHR from the queue. This places the MSHR on the 1385141Sgblack@eecs.umich.edu * free list. 1395141Sgblack@eecs.umich.edu * @param mshr 1405141Sgblack@eecs.umich.edu */ 1415141Sgblack@eecs.umich.edu void deallocate(MSHR *mshr); 1425141Sgblack@eecs.umich.edu 1435141Sgblack@eecs.umich.edu /** 1445141Sgblack@eecs.umich.edu * Remove a MSHR from the queue. Returns an iterator into the 1455141Sgblack@eecs.umich.edu * allocatedList for faster squash implementation. 1465141Sgblack@eecs.umich.edu * @param mshr The MSHR to remove. 1475264Sgblack@eecs.umich.edu * @return An iterator to the next entry in the allocatedList. 1485141Sgblack@eecs.umich.edu */ 1495141Sgblack@eecs.umich.edu MSHR::Iterator deallocateOne(MSHR *mshr); 1505141Sgblack@eecs.umich.edu 1515141Sgblack@eecs.umich.edu /** 1525141Sgblack@eecs.umich.edu * Moves the MSHR to the front of the pending list if it is not 1535141Sgblack@eecs.umich.edu * in service. 1545141Sgblack@eecs.umich.edu * @param mshr The entry to move. 1555141Sgblack@eecs.umich.edu */ 1565141Sgblack@eecs.umich.edu void moveToFront(MSHR *mshr); 1575141Sgblack@eecs.umich.edu 1585141Sgblack@eecs.umich.edu /** 1595141Sgblack@eecs.umich.edu * Mark the given MSHR as in service. This removes the MSHR from the 1605141Sgblack@eecs.umich.edu * readyList. Deallocates the MSHR if it does not expect a response. 1615141Sgblack@eecs.umich.edu * @param mshr The MSHR to mark in service. 1625141Sgblack@eecs.umich.edu */ 1635141Sgblack@eecs.umich.edu void markInService(MSHR *mshr); 1645141Sgblack@eecs.umich.edu 1655135Sgblack@eecs.umich.edu /** 1665135Sgblack@eecs.umich.edu * Mark an in service entry as pending, used to resend a request. 1675135Sgblack@eecs.umich.edu * @param mshr The MSHR to resend. 1685360Sgblack@eecs.umich.edu */ 1695360Sgblack@eecs.umich.edu void markPending(MSHR *mshr); 1705360Sgblack@eecs.umich.edu 1715360Sgblack@eecs.umich.edu /** 1725360Sgblack@eecs.umich.edu * Squash outstanding requests with the given thread number. If a request 1735360Sgblack@eecs.umich.edu * is in service, just squashes the targets. 1745647Sgblack@eecs.umich.edu * @param threadNum The thread to squash. 1755647Sgblack@eecs.umich.edu */ 1765647Sgblack@eecs.umich.edu void squash(int threadNum); 1775360Sgblack@eecs.umich.edu 1785647Sgblack@eecs.umich.edu /** 1795647Sgblack@eecs.umich.edu * Returns true if the pending list is not empty. 1805647Sgblack@eecs.umich.edu * @return True if there are outstanding requests. 1815648Sgblack@eecs.umich.edu */ 1825648Sgblack@eecs.umich.edu bool havePending() const 1835360Sgblack@eecs.umich.edu { 1845141Sgblack@eecs.umich.edu return !readyList.empty(); 1855141Sgblack@eecs.umich.edu } 1865141Sgblack@eecs.umich.edu 1875141Sgblack@eecs.umich.edu /** 1885141Sgblack@eecs.umich.edu * Returns true if there are no free entries. 1895141Sgblack@eecs.umich.edu * @return True if this queue is full. 1905135Sgblack@eecs.umich.edu */ 1915135Sgblack@eecs.umich.edu bool isFull() const 1925135Sgblack@eecs.umich.edu { 1935135Sgblack@eecs.umich.edu return (allocated > numEntries - numReserve); 1945135Sgblack@eecs.umich.edu } 1955135Sgblack@eecs.umich.edu 1966042Sgblack@eecs.umich.edu /** 1975135Sgblack@eecs.umich.edu * Returns the MSHR at the head of the readyList. 1985135Sgblack@eecs.umich.edu * @return The next request to service. 1995135Sgblack@eecs.umich.edu */ 2005135Sgblack@eecs.umich.edu MSHR *getNextMSHR() const 2015135Sgblack@eecs.umich.edu { 2025135Sgblack@eecs.umich.edu if (readyList.empty() || readyList.front()->readyTime > curTick) { 2036042Sgblack@eecs.umich.edu return NULL; 2045135Sgblack@eecs.umich.edu } 2056042Sgblack@eecs.umich.edu return readyList.front(); 2066042Sgblack@eecs.umich.edu } 2076042Sgblack@eecs.umich.edu 2085135Sgblack@eecs.umich.edu Tick nextMSHRReadyTime() const 2095135Sgblack@eecs.umich.edu { 2106329Sgblack@eecs.umich.edu return readyList.empty() ? MaxTick : readyList.front()->readyTime; 2116329Sgblack@eecs.umich.edu } 2126329Sgblack@eecs.umich.edu}; 2136329Sgblack@eecs.umich.edu 2146329Sgblack@eecs.umich.edu#endif //__MEM__CACHE__MISS__MSHR_QUEUE_HH__ 2156329Sgblack@eecs.umich.edu