mshr_queue.hh revision 7667:aa8fd8f6a495
111661Stushar@ece.gatech.edu/* 211661Stushar@ece.gatech.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan 311661Stushar@ece.gatech.edu * All rights reserved. 411661Stushar@ece.gatech.edu * 511661Stushar@ece.gatech.edu * Redistribution and use in source and binary forms, with or without 611661Stushar@ece.gatech.edu * modification, are permitted provided that the following conditions are 711661Stushar@ece.gatech.edu * met: redistributions of source code must retain the above copyright 811661Stushar@ece.gatech.edu * notice, this list of conditions and the following disclaimer; 911661Stushar@ece.gatech.edu * redistributions in binary form must reproduce the above copyright 1011661Stushar@ece.gatech.edu * notice, this list of conditions and the following disclaimer in the 1111661Stushar@ece.gatech.edu * documentation and/or other materials provided with the distribution; 1211661Stushar@ece.gatech.edu * neither the name of the copyright holders nor the names of its 1311661Stushar@ece.gatech.edu * contributors may be used to endorse or promote products derived from 1411661Stushar@ece.gatech.edu * this software without specific prior written permission. 1511661Stushar@ece.gatech.edu * 1611661Stushar@ece.gatech.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1711661Stushar@ece.gatech.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1811661Stushar@ece.gatech.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1911661Stushar@ece.gatech.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2011661Stushar@ece.gatech.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2111661Stushar@ece.gatech.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2211661Stushar@ece.gatech.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2311661Stushar@ece.gatech.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2411661Stushar@ece.gatech.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2511661Stushar@ece.gatech.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2611661Stushar@ece.gatech.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711661Stushar@ece.gatech.edu * 2811661Stushar@ece.gatech.edu * Authors: Erik Hallnor 2911661Stushar@ece.gatech.edu */ 3011661Stushar@ece.gatech.edu 3111793Sbrandon.potter@amd.com/** @file 3211793Sbrandon.potter@amd.com * Declaration of a structure to manage MSHRs. 3311661Stushar@ece.gatech.edu */ 3411661Stushar@ece.gatech.edu 3511661Stushar@ece.gatech.edu#ifndef __MEM__CACHE__MISS__MSHR_QUEUE_HH__ 3611661Stushar@ece.gatech.edu#define __MEM__CACHE__MISS__MSHR_QUEUE_HH__ 3711661Stushar@ece.gatech.edu 3811661Stushar@ece.gatech.edu#include <vector> 3912334Sgabeblack@google.com 4011661Stushar@ece.gatech.edu#include "mem/packet.hh" 4111661Stushar@ece.gatech.edu#include "mem/cache/mshr.hh" 4211661Stushar@ece.gatech.edu 4311661Stushar@ece.gatech.edu/** 4411661Stushar@ece.gatech.edu * A Class for maintaining a list of pending and allocated memory requests. 4511661Stushar@ece.gatech.edu */ 4611661Stushar@ece.gatech.educlass MSHRQueue 4711661Stushar@ece.gatech.edu{ 4811661Stushar@ece.gatech.edu private: 4911661Stushar@ece.gatech.edu /** Local label (for functional print requests) */ 5011661Stushar@ece.gatech.edu const std::string label; 5111661Stushar@ece.gatech.edu 5211661Stushar@ece.gatech.edu /** MSHR storage. */ 5311661Stushar@ece.gatech.edu MSHR *registers; 5411661Stushar@ece.gatech.edu /** Holds pointers to all allocated entries. */ 5511661Stushar@ece.gatech.edu MSHR::List allocatedList; 5611661Stushar@ece.gatech.edu /** Holds pointers to entries that haven't been sent to the bus. */ 5711661Stushar@ece.gatech.edu MSHR::List readyList; 5811661Stushar@ece.gatech.edu /** Holds non allocated entries. */ 5911661Stushar@ece.gatech.edu MSHR::List freeList; 6011661Stushar@ece.gatech.edu 6111661Stushar@ece.gatech.edu // Parameters 6211661Stushar@ece.gatech.edu /** 6311661Stushar@ece.gatech.edu * The total number of entries in this queue. This number is set as the 6411661Stushar@ece.gatech.edu * number of entries requested plus (numReserve - 1). This allows for 6511661Stushar@ece.gatech.edu * the same number of effective entries while still maintaining the reserve. 6611661Stushar@ece.gatech.edu */ 6711661Stushar@ece.gatech.edu const int numEntries; 6811661Stushar@ece.gatech.edu 6911661Stushar@ece.gatech.edu /** 7011661Stushar@ece.gatech.edu * The number of entries to hold in reserve. This is needed because copy 7111661Stushar@ece.gatech.edu * operations can allocate upto 4 entries at one time. 7211661Stushar@ece.gatech.edu */ 7311661Stushar@ece.gatech.edu const int numReserve; 7411661Stushar@ece.gatech.edu 7511661Stushar@ece.gatech.edu MSHR::Iterator addToReadyList(MSHR *mshr); 7611661Stushar@ece.gatech.edu 7711661Stushar@ece.gatech.edu 7811661Stushar@ece.gatech.edu public: 7912129Sspwilson2@wisc.edu /** The number of allocated entries. */ 8012129Sspwilson2@wisc.edu int allocated; 8111661Stushar@ece.gatech.edu /** The number of entries that have been forwarded to the bus. */ 8211661Stushar@ece.gatech.edu int inServiceEntries; 8311661Stushar@ece.gatech.edu /** The index of this queue within the cache (MSHR queue vs. write 8411661Stushar@ece.gatech.edu * buffer). */ 8511661Stushar@ece.gatech.edu const int index; 8611661Stushar@ece.gatech.edu 8711661Stushar@ece.gatech.edu /** 8811661Stushar@ece.gatech.edu * Create a queue with a given number of entries. 8911661Stushar@ece.gatech.edu * @param num_entrys The number of entries in this queue. 9011661Stushar@ece.gatech.edu * @param reserve The minimum number of entries needed to satisfy 9111661Stushar@ece.gatech.edu * any access. 9211661Stushar@ece.gatech.edu */ 9311661Stushar@ece.gatech.edu MSHRQueue(const std::string &_label, int num_entries, int reserve, 9411661Stushar@ece.gatech.edu int index); 9511661Stushar@ece.gatech.edu 9612680Sgiacomo.travaglini@arm.com /** Destructor */ 9711661Stushar@ece.gatech.edu ~MSHRQueue(); 9811661Stushar@ece.gatech.edu 9911661Stushar@ece.gatech.edu /** 10011661Stushar@ece.gatech.edu * Find the first MSHR that matches the provided address. 10111661Stushar@ece.gatech.edu * @param addr The address to find. 10211661Stushar@ece.gatech.edu * @return Pointer to the matching MSHR, null if not found. 10311661Stushar@ece.gatech.edu */ 10411661Stushar@ece.gatech.edu MSHR *findMatch(Addr addr) const; 10511661Stushar@ece.gatech.edu 10611661Stushar@ece.gatech.edu /** 10711661Stushar@ece.gatech.edu * Find and return all the matching entries in the provided vector. 10811661Stushar@ece.gatech.edu * @param addr The address to find. 10911661Stushar@ece.gatech.edu * @param matches The vector to return pointers to the matching entries. 11011661Stushar@ece.gatech.edu * @return True if any matches are found, false otherwise. 11111661Stushar@ece.gatech.edu * @todo Typedef the vector?? 11211661Stushar@ece.gatech.edu */ 11311661Stushar@ece.gatech.edu bool findMatches(Addr addr, std::vector<MSHR*>& matches) const; 11411661Stushar@ece.gatech.edu 11511661Stushar@ece.gatech.edu /** 11611661Stushar@ece.gatech.edu * Find any pending requests that overlap the given request. 11711661Stushar@ece.gatech.edu * @param pkt The request to find. 11811661Stushar@ece.gatech.edu * @return A pointer to the earliest matching MSHR. 11911661Stushar@ece.gatech.edu */ 12011661Stushar@ece.gatech.edu MSHR *findPending(Addr addr, int size) const; 12111661Stushar@ece.gatech.edu 12211661Stushar@ece.gatech.edu bool checkFunctional(PacketPtr pkt, Addr blk_addr); 12311661Stushar@ece.gatech.edu 12411661Stushar@ece.gatech.edu /** 12511661Stushar@ece.gatech.edu * Allocates a new MSHR for the request and size. This places the request 12611661Stushar@ece.gatech.edu * as the first target in the MSHR. 12711661Stushar@ece.gatech.edu * @param pkt The request to handle. 12811661Stushar@ece.gatech.edu * @param size The number in bytes to fetch from memory. 12911661Stushar@ece.gatech.edu * @return The a pointer to the MSHR allocated. 13011661Stushar@ece.gatech.edu * 13111661Stushar@ece.gatech.edu * @pre There are free entries. 13211661Stushar@ece.gatech.edu */ 13311661Stushar@ece.gatech.edu MSHR *allocate(Addr addr, int size, PacketPtr &pkt, 13411661Stushar@ece.gatech.edu Tick when, Counter order); 13512749Sgiacomo.travaglini@arm.com 13611661Stushar@ece.gatech.edu /** 13711661Stushar@ece.gatech.edu * Removes the given MSHR from the queue. This places the MSHR on the 13811661Stushar@ece.gatech.edu * free list. 13911661Stushar@ece.gatech.edu * @param mshr 14011661Stushar@ece.gatech.edu */ 14111661Stushar@ece.gatech.edu void deallocate(MSHR *mshr); 14211661Stushar@ece.gatech.edu 14311661Stushar@ece.gatech.edu /** 14411661Stushar@ece.gatech.edu * Remove a MSHR from the queue. Returns an iterator into the 14511661Stushar@ece.gatech.edu * allocatedList for faster squash implementation. 14611661Stushar@ece.gatech.edu * @param mshr The MSHR to remove. 14711661Stushar@ece.gatech.edu * @return An iterator to the next entry in the allocatedList. 14811661Stushar@ece.gatech.edu */ 14911661Stushar@ece.gatech.edu MSHR::Iterator deallocateOne(MSHR *mshr); 15011661Stushar@ece.gatech.edu 15111661Stushar@ece.gatech.edu /** 15211661Stushar@ece.gatech.edu * Moves the MSHR to the front of the pending list if it is not 15311661Stushar@ece.gatech.edu * in service. 15411661Stushar@ece.gatech.edu * @param mshr The entry to move. 15511661Stushar@ece.gatech.edu */ 15611661Stushar@ece.gatech.edu void moveToFront(MSHR *mshr); 15711661Stushar@ece.gatech.edu 15811661Stushar@ece.gatech.edu /** 15911661Stushar@ece.gatech.edu * Mark the given MSHR as in service. This removes the MSHR from the 16011661Stushar@ece.gatech.edu * readyList. Deallocates the MSHR if it does not expect a response. 16111661Stushar@ece.gatech.edu * @param mshr The MSHR to mark in service. 16211661Stushar@ece.gatech.edu */ 16311661Stushar@ece.gatech.edu void markInService(MSHR *mshr, PacketPtr pkt); 16411661Stushar@ece.gatech.edu 16511661Stushar@ece.gatech.edu /** 16611661Stushar@ece.gatech.edu * Mark an in service entry as pending, used to resend a request. 16711661Stushar@ece.gatech.edu * @param mshr The MSHR to resend. 16811661Stushar@ece.gatech.edu */ 16911661Stushar@ece.gatech.edu void markPending(MSHR *mshr); 17011661Stushar@ece.gatech.edu 17111661Stushar@ece.gatech.edu /** 17211661Stushar@ece.gatech.edu * Squash outstanding requests with the given thread number. If a request 17311661Stushar@ece.gatech.edu * is in service, just squashes the targets. 17411661Stushar@ece.gatech.edu * @param threadNum The thread to squash. 17511661Stushar@ece.gatech.edu */ 17611661Stushar@ece.gatech.edu void squash(int threadNum); 17711661Stushar@ece.gatech.edu 17811661Stushar@ece.gatech.edu /** 17911661Stushar@ece.gatech.edu * Returns true if the pending list is not empty. 18011661Stushar@ece.gatech.edu * @return True if there are outstanding requests. 18111661Stushar@ece.gatech.edu */ 18211661Stushar@ece.gatech.edu bool havePending() const 18311661Stushar@ece.gatech.edu { 18411661Stushar@ece.gatech.edu return !readyList.empty(); 18511661Stushar@ece.gatech.edu } 18611661Stushar@ece.gatech.edu 18711661Stushar@ece.gatech.edu /** 18811661Stushar@ece.gatech.edu * Returns true if there are no free entries. 18911661Stushar@ece.gatech.edu * @return True if this queue is full. 19011661Stushar@ece.gatech.edu */ 19111661Stushar@ece.gatech.edu bool isFull() const 19211661Stushar@ece.gatech.edu { 19311661Stushar@ece.gatech.edu return (allocated > numEntries - numReserve); 19411661Stushar@ece.gatech.edu } 19511661Stushar@ece.gatech.edu 19611661Stushar@ece.gatech.edu /** 19711661Stushar@ece.gatech.edu * Returns the MSHR at the head of the readyList. 19811661Stushar@ece.gatech.edu * @return The next request to service. 19911661Stushar@ece.gatech.edu */ 20011661Stushar@ece.gatech.edu MSHR *getNextMSHR() const 20111661Stushar@ece.gatech.edu { 20211661Stushar@ece.gatech.edu if (readyList.empty() || readyList.front()->readyTime > curTick) { 20311661Stushar@ece.gatech.edu return NULL; 20411661Stushar@ece.gatech.edu } 20511661Stushar@ece.gatech.edu return readyList.front(); 20611661Stushar@ece.gatech.edu } 20711661Stushar@ece.gatech.edu 20811661Stushar@ece.gatech.edu Tick nextMSHRReadyTime() const 20911661Stushar@ece.gatech.edu { 21011661Stushar@ece.gatech.edu return readyList.empty() ? MaxTick : readyList.front()->readyTime; 21111661Stushar@ece.gatech.edu } 21211661Stushar@ece.gatech.edu}; 21311661Stushar@ece.gatech.edu 21411661Stushar@ece.gatech.edu#endif //__MEM__CACHE__MISS__MSHR_QUEUE_HH__ 21511661Stushar@ece.gatech.edu