mshr_queue.hh revision 4920
19157Sandreas.hansson@arm.com/* 211524Sdavid.guillen@arm.com * Copyright (c) 2003-2005 The Regents of The University of Michigan 310000Sclt67@cornell.edu * All rights reserved. 49157Sandreas.hansson@arm.com * 59157Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 69157Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 79157Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 89157Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 99157Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 109157Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 119157Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 129157Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 139157Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 149157Sandreas.hansson@arm.com * this software without specific prior written permission. 159157Sandreas.hansson@arm.com * 169157Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 179157Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 189157Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 199157Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 209157Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 219157Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 229157Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 239157Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 249157Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 259157Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 269157Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 279157Sandreas.hansson@arm.com * 289157Sandreas.hansson@arm.com * Authors: Erik Hallnor 299157Sandreas.hansson@arm.com */ 309157Sandreas.hansson@arm.com 319157Sandreas.hansson@arm.com/** @file 329157Sandreas.hansson@arm.com * Declaration of a structure to manage MSHRs. 339157Sandreas.hansson@arm.com */ 349157Sandreas.hansson@arm.com 359157Sandreas.hansson@arm.com#ifndef __MEM__CACHE__MISS__MSHR_QUEUE_HH__ 369157Sandreas.hansson@arm.com#define __MEM__CACHE__MISS__MSHR_QUEUE_HH__ 379157Sandreas.hansson@arm.com 389157Sandreas.hansson@arm.com#include <vector> 3910000Sclt67@cornell.edu 4011524Sdavid.guillen@arm.com#include "mem/packet.hh" 4111524Sdavid.guillen@arm.com#include "mem/cache/miss/mshr.hh" 429157Sandreas.hansson@arm.com 439157Sandreas.hansson@arm.com/** 449157Sandreas.hansson@arm.com * A Class for maintaining a list of pending and allocated memory requests. 459157Sandreas.hansson@arm.com */ 469157Sandreas.hansson@arm.comclass MSHRQueue 479157Sandreas.hansson@arm.com{ 489157Sandreas.hansson@arm.com private: 499157Sandreas.hansson@arm.com /** MSHR storage. */ 509157Sandreas.hansson@arm.com MSHR *registers; 519157Sandreas.hansson@arm.com /** Holds pointers to all allocated entries. */ 5211524Sdavid.guillen@arm.com MSHR::List allocatedList; 539157Sandreas.hansson@arm.com /** Holds pointers to entries that haven't been sent to the bus. */ 549418Sandreas.hansson@arm.com MSHR::List readyList; 5511524Sdavid.guillen@arm.com /** Holds non allocated entries. */ 569157Sandreas.hansson@arm.com MSHR::List freeList; 579356Snilay@cs.wisc.edu 589793Sakash.bagdia@arm.com // Parameters 599157Sandreas.hansson@arm.com /** 609157Sandreas.hansson@arm.com * The total number of entries in this queue. This number is set as the 619157Sandreas.hansson@arm.com * number of entries requested plus (numReserve - 1). This allows for 6211009Sandreas.sandberg@arm.com * the same number of effective entries while still maintaining the reserve. 6311009Sandreas.sandberg@arm.com */ 6411009Sandreas.sandberg@arm.com const int numEntries; 659157Sandreas.hansson@arm.com 6611009Sandreas.sandberg@arm.com /** 679157Sandreas.hansson@arm.com * The number of entries to hold in reserve. This is needed because copy 689157Sandreas.hansson@arm.com * operations can allocate upto 4 entries at one time. 699157Sandreas.hansson@arm.com */ 709179Sandreas.hansson@arm.com const int numReserve; 719179Sandreas.hansson@arm.com 729179Sandreas.hansson@arm.com MSHR::Iterator addToReadyList(MSHR *mshr); 739179Sandreas.hansson@arm.com 749179Sandreas.hansson@arm.com 759179Sandreas.hansson@arm.com public: 769180Sandreas.hansson@arm.com /** The number of allocated entries. */ 779179Sandreas.hansson@arm.com int allocated; 789157Sandreas.hansson@arm.com /** The number of entries that have been forwarded to the bus. */ 7910236Sjthestness@gmail.com int inServiceEntries; 8010236Sjthestness@gmail.com /** The index of this queue within the cache (MSHR queue vs. write 819179Sandreas.hansson@arm.com * buffer). */ 829179Sandreas.hansson@arm.com const int index; 839179Sandreas.hansson@arm.com 849179Sandreas.hansson@arm.com /** 859179Sandreas.hansson@arm.com * Create a queue with a given number of entries. 869179Sandreas.hansson@arm.com * @param num_entrys The number of entries in this queue. 879179Sandreas.hansson@arm.com * @param reserve The minimum number of entries needed to satisfy 889179Sandreas.hansson@arm.com * any access. 899179Sandreas.hansson@arm.com */ 909179Sandreas.hansson@arm.com MSHRQueue(int num_entries, int reserve, int index); 919179Sandreas.hansson@arm.com 929793Sakash.bagdia@arm.com /** Destructor */ 939179Sandreas.hansson@arm.com ~MSHRQueue(); 949179Sandreas.hansson@arm.com 959179Sandreas.hansson@arm.com /** 969179Sandreas.hansson@arm.com * Find the first MSHR that matches the provided address. 979179Sandreas.hansson@arm.com * @param addr The address to find. 989179Sandreas.hansson@arm.com * @return Pointer to the matching MSHR, null if not found. 999179Sandreas.hansson@arm.com */ 1009179Sandreas.hansson@arm.com MSHR *findMatch(Addr addr) const; 1019179Sandreas.hansson@arm.com 1029793Sakash.bagdia@arm.com /** 1039179Sandreas.hansson@arm.com * Find and return all the matching entries in the provided vector. 1049793Sakash.bagdia@arm.com * @param addr The address to find. 1059179Sandreas.hansson@arm.com * @param matches The vector to return pointers to the matching entries. 1069179Sandreas.hansson@arm.com * @return True if any matches are found, false otherwise. 1079793Sakash.bagdia@arm.com * @todo Typedef the vector?? 1089793Sakash.bagdia@arm.com */ 1099793Sakash.bagdia@arm.com bool findMatches(Addr addr, std::vector<MSHR*>& matches) const; 1109793Sakash.bagdia@arm.com 1119157Sandreas.hansson@arm.com /** 1129545Sandreas.hansson@arm.com * Find any pending requests that overlap the given request. 1139545Sandreas.hansson@arm.com * @param pkt The request to find. 1149157Sandreas.hansson@arm.com * @return A pointer to the earliest matching MSHR. 1159793Sakash.bagdia@arm.com */ 1169157Sandreas.hansson@arm.com MSHR *findPending(Addr addr, int size) const; 1179157Sandreas.hansson@arm.com 11811009Sandreas.sandberg@arm.com bool checkFunctional(PacketPtr pkt, Addr blk_addr); 11911009Sandreas.sandberg@arm.com 1209418Sandreas.hansson@arm.com /** 12110000Sclt67@cornell.edu * Allocates a new MSHR for the request and size. This places the request 12210000Sclt67@cornell.edu * as the first target in the MSHR. 12310000Sclt67@cornell.edu * @param pkt The request to handle. 1249418Sandreas.hansson@arm.com * @param size The number in bytes to fetch from memory. 1259157Sandreas.hansson@arm.com * @return The a pointer to the MSHR allocated. 12611009Sandreas.sandberg@arm.com * 12711009Sandreas.sandberg@arm.com * @pre There are free entries. 12811009Sandreas.sandberg@arm.com */ 1299157Sandreas.hansson@arm.com MSHR *allocate(Addr addr, int size, PacketPtr &pkt, 1309157Sandreas.hansson@arm.com Tick when, Counter order); 1319157Sandreas.hansson@arm.com 13211009Sandreas.sandberg@arm.com /** 1339157Sandreas.hansson@arm.com * Removes the given MSHR from the queue. This places the MSHR on the 1349296Snilay@cs.wisc.edu * free list. 1359296Snilay@cs.wisc.edu * @param mshr 1369296Snilay@cs.wisc.edu */ 1379296Snilay@cs.wisc.edu void deallocate(MSHR *mshr); 1389296Snilay@cs.wisc.edu 1399296Snilay@cs.wisc.edu /** 1409296Snilay@cs.wisc.edu * Remove a MSHR from the queue. Returns an iterator into the 1419793Sakash.bagdia@arm.com * allocatedList for faster squash implementation. 1429296Snilay@cs.wisc.edu * @param mshr The MSHR to remove. 1439793Sakash.bagdia@arm.com * @return An iterator to the next entry in the allocatedList. 1449296Snilay@cs.wisc.edu */ 1459296Snilay@cs.wisc.edu MSHR::Iterator deallocateOne(MSHR *mshr); 1469157Sandreas.hansson@arm.com 1479157Sandreas.hansson@arm.com /** 1489157Sandreas.hansson@arm.com * Moves the MSHR to the front of the pending list if it is not 14910000Sclt67@cornell.edu * in service. 15010000Sclt67@cornell.edu * @param mshr The entry to move. 15110000Sclt67@cornell.edu */ 15210000Sclt67@cornell.edu void moveToFront(MSHR *mshr); 15310000Sclt67@cornell.edu 15410000Sclt67@cornell.edu /** 15510000Sclt67@cornell.edu * Mark the given MSHR as in service. This removes the MSHR from the 15610000Sclt67@cornell.edu * readyList. Deallocates the MSHR if it does not expect a response. 15710000Sclt67@cornell.edu * @param mshr The MSHR to mark in service. 15810236Sjthestness@gmail.com */ 15910236Sjthestness@gmail.com void markInService(MSHR *mshr); 16010236Sjthestness@gmail.com 16110236Sjthestness@gmail.com /** 16210236Sjthestness@gmail.com * Mark an in service entry as pending, used to resend a request. 16310236Sjthestness@gmail.com * @param mshr The MSHR to resend. 1649179Sandreas.hansson@arm.com */ 1659179Sandreas.hansson@arm.com void markPending(MSHR *mshr); 1669179Sandreas.hansson@arm.com 16710236Sjthestness@gmail.com /** 16810236Sjthestness@gmail.com * Squash outstanding requests with the given thread number. If a request 16910236Sjthestness@gmail.com * is in service, just squashes the targets. 1709179Sandreas.hansson@arm.com * @param threadNum The thread to squash. 1719180Sandreas.hansson@arm.com */ 1729179Sandreas.hansson@arm.com void squash(int threadNum); 1739179Sandreas.hansson@arm.com 1749179Sandreas.hansson@arm.com /** 1759179Sandreas.hansson@arm.com * Returns true if the pending list is not empty. 1769179Sandreas.hansson@arm.com * @return True if there are outstanding requests. 1779793Sakash.bagdia@arm.com */ 1789179Sandreas.hansson@arm.com bool havePending() const 1799179Sandreas.hansson@arm.com { 1809179Sandreas.hansson@arm.com return !readyList.empty(); 1819179Sandreas.hansson@arm.com } 1829179Sandreas.hansson@arm.com 1839179Sandreas.hansson@arm.com /** 18410236Sjthestness@gmail.com * Returns true if there are no free entries. 18510236Sjthestness@gmail.com * @return True if this queue is full. 18610236Sjthestness@gmail.com */ 1879179Sandreas.hansson@arm.com bool isFull() const 1889180Sandreas.hansson@arm.com { 1899179Sandreas.hansson@arm.com return (allocated > numEntries - numReserve); 1909179Sandreas.hansson@arm.com } 1919179Sandreas.hansson@arm.com 1929179Sandreas.hansson@arm.com /** 1939179Sandreas.hansson@arm.com * Returns the MSHR at the head of the readyList. 1949179Sandreas.hansson@arm.com * @return The next request to service. 1959179Sandreas.hansson@arm.com */ 1969179Sandreas.hansson@arm.com MSHR *getNextMSHR() const 19710236Sjthestness@gmail.com { 19810236Sjthestness@gmail.com if (readyList.empty() || readyList.front()->readyTime > curTick) { 19910236Sjthestness@gmail.com return NULL; 20010236Sjthestness@gmail.com } 2019157Sandreas.hansson@arm.com return readyList.front(); 20210236Sjthestness@gmail.com } 20310236Sjthestness@gmail.com 20410236Sjthestness@gmail.com Tick nextMSHRReadyTime() const 2059157Sandreas.hansson@arm.com { 2069157Sandreas.hansson@arm.com return readyList.empty() ? MaxTick : readyList.front()->readyTime; 2079648Sdam.sunwoo@arm.com } 2089157Sandreas.hansson@arm.com}; 2099793Sakash.bagdia@arm.com 2109793Sakash.bagdia@arm.com#endif //__MEM__CACHE__MISS__MSHR_QUEUE_HH__ 2119793Sakash.bagdia@arm.com