mshr_queue.cc revision 3149
12810Srdreslin@umich.edu/* 213732Snikos.nikoleris@arm.com * Copyright (c) 2003-2005 The Regents of The University of Michigan 311051Sandreas.hansson@arm.com * All rights reserved. 411051Sandreas.hansson@arm.com * 511051Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 611051Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 711051Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 811051Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 911051Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 1011051Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 1111051Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 1211051Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 1311051Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 1411051Sandreas.hansson@arm.com * this software without specific prior written permission. 1511051Sandreas.hansson@arm.com * 162810Srdreslin@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172810Srdreslin@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182810Srdreslin@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192810Srdreslin@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202810Srdreslin@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212810Srdreslin@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222810Srdreslin@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232810Srdreslin@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242810Srdreslin@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252810Srdreslin@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262810Srdreslin@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272810Srdreslin@umich.edu * 282810Srdreslin@umich.edu * Authors: Erik Hallnor 292810Srdreslin@umich.edu */ 302810Srdreslin@umich.edu 312810Srdreslin@umich.edu/** @file 322810Srdreslin@umich.edu * Definition of the MSHRQueue. 332810Srdreslin@umich.edu */ 342810Srdreslin@umich.edu 352810Srdreslin@umich.edu#include "mem/cache/miss/mshr_queue.hh" 362810Srdreslin@umich.edu#include "sim/eventq.hh" 372810Srdreslin@umich.edu 382810Srdreslin@umich.eduusing namespace std; 392810Srdreslin@umich.edu 402810Srdreslin@umich.eduMSHRQueue::MSHRQueue(int num_mshrs, int reserve) 412810Srdreslin@umich.edu : numMSHRs(num_mshrs + reserve - 1), numReserve(reserve) 4211051Sandreas.hansson@arm.com{ 4311051Sandreas.hansson@arm.com allocated = 0; 442810Srdreslin@umich.edu inServiceMSHRs = 0; 4511051Sandreas.hansson@arm.com allocatedTargets = 0; 4611051Sandreas.hansson@arm.com registers = new MSHR[numMSHRs]; 4712349Snikos.nikoleris@arm.com for (int i = 0; i < numMSHRs; ++i) { 482810Srdreslin@umich.edu freeList.push_back(®isters[i]); 492810Srdreslin@umich.edu } 502810Srdreslin@umich.edu} 512810Srdreslin@umich.edu 5211051Sandreas.hansson@arm.comMSHRQueue::~MSHRQueue() 532810Srdreslin@umich.edu{ 542810Srdreslin@umich.edu delete [] registers; 5511051Sandreas.hansson@arm.com} 562810Srdreslin@umich.edu 5712724Snikos.nikoleris@arm.comMSHR* 5812724Snikos.nikoleris@arm.comMSHRQueue::findMatch(Addr addr) const 5912724Snikos.nikoleris@arm.com{ 6012334Sgabeblack@google.com MSHR::ConstIterator i = allocatedList.begin(); 6112724Snikos.nikoleris@arm.com MSHR::ConstIterator end = allocatedList.end(); 6211051Sandreas.hansson@arm.com for (; i != end; ++i) { 6311051Sandreas.hansson@arm.com MSHR *mshr = *i; 6411051Sandreas.hansson@arm.com if (mshr->addr == addr) { 6511288Ssteve.reinhardt@amd.com return mshr; 6612724Snikos.nikoleris@arm.com } 6713223Sodanrc@yahoo.com.br } 6811051Sandreas.hansson@arm.com return NULL; 6912724Snikos.nikoleris@arm.com} 7012724Snikos.nikoleris@arm.com 7112724Snikos.nikoleris@arm.combool 7212724Snikos.nikoleris@arm.comMSHRQueue::findMatches(Addr addr, vector<MSHR*>& matches) const 7311051Sandreas.hansson@arm.com{ 7411053Sandreas.hansson@arm.com // Need an empty vector 7511053Sandreas.hansson@arm.com assert(matches.empty()); 7612724Snikos.nikoleris@arm.com bool retval = false; 7711051Sandreas.hansson@arm.com MSHR::ConstIterator i = allocatedList.begin(); 7811051Sandreas.hansson@arm.com MSHR::ConstIterator end = allocatedList.end(); 7911051Sandreas.hansson@arm.com for (; i != end; ++i) { 8011051Sandreas.hansson@arm.com MSHR *mshr = *i; 8111601Sandreas.hansson@arm.com if (mshr->addr == addr) { 8211601Sandreas.hansson@arm.com retval = true; 8311051Sandreas.hansson@arm.com matches.push_back(mshr); 8412724Snikos.nikoleris@arm.com } 8511051Sandreas.hansson@arm.com } 8612724Snikos.nikoleris@arm.com return retval; 8711600Sandreas.hansson@arm.com 8811600Sandreas.hansson@arm.com} 8911051Sandreas.hansson@arm.com 9011051Sandreas.hansson@arm.comMSHR* 9111051Sandreas.hansson@arm.comMSHRQueue::findPending(Packet * &pkt) const 9211284Sandreas.hansson@arm.com{ 9311051Sandreas.hansson@arm.com MSHR::ConstIterator i = pendingList.begin(); 9411051Sandreas.hansson@arm.com MSHR::ConstIterator end = pendingList.end(); 9511051Sandreas.hansson@arm.com for (; i != end; ++i) { 9611602Sandreas.hansson@arm.com MSHR *mshr = *i; 9711051Sandreas.hansson@arm.com if (mshr->addr < pkt->getAddr()) { 9811051Sandreas.hansson@arm.com if (mshr->addr + mshr->pkt->getSize() > pkt->getAddr()) { 9911284Sandreas.hansson@arm.com return mshr; 10011051Sandreas.hansson@arm.com } 10111284Sandreas.hansson@arm.com } else { 10211602Sandreas.hansson@arm.com if (pkt->getAddr() + pkt->getSize() > mshr->addr) { 10311051Sandreas.hansson@arm.com return mshr; 10411051Sandreas.hansson@arm.com } 10511284Sandreas.hansson@arm.com } 10611051Sandreas.hansson@arm.com 10711284Sandreas.hansson@arm.com //need to check destination address for copies. 10811284Sandreas.hansson@arm.com //TEMP NOT DOING COPIES 10911284Sandreas.hansson@arm.com#if 0 11011051Sandreas.hansson@arm.com if (mshr->pkt->cmd == Copy) { 11111051Sandreas.hansson@arm.com Addr dest = mshr->pkt->dest; 11211051Sandreas.hansson@arm.com if (dest < pkt->addr) { 11311284Sandreas.hansson@arm.com if (dest + mshr->pkt->size > pkt->addr) { 11411284Sandreas.hansson@arm.com return mshr; 11511284Sandreas.hansson@arm.com } 11611284Sandreas.hansson@arm.com } else { 11711051Sandreas.hansson@arm.com if (pkt->addr + pkt->size > dest) { 11811051Sandreas.hansson@arm.com return mshr; 11911051Sandreas.hansson@arm.com } 12011284Sandreas.hansson@arm.com } 12111284Sandreas.hansson@arm.com } 12211284Sandreas.hansson@arm.com#endif 12311197Sandreas.hansson@arm.com } 12411601Sandreas.hansson@arm.com return NULL; 12511601Sandreas.hansson@arm.com} 12611601Sandreas.hansson@arm.com 12711601Sandreas.hansson@arm.comMSHR* 12811601Sandreas.hansson@arm.comMSHRQueue::allocate(Packet * &pkt, int size) 12911601Sandreas.hansson@arm.com{ 13011601Sandreas.hansson@arm.com Addr aligned_addr = pkt->getAddr() & ~((Addr)size - 1); 13111601Sandreas.hansson@arm.com assert(!freeList.empty()); 13211197Sandreas.hansson@arm.com MSHR *mshr = freeList.front(); 13311601Sandreas.hansson@arm.com assert(mshr->getNumTargets() == 0); 13411601Sandreas.hansson@arm.com freeList.pop_front(); 13511601Sandreas.hansson@arm.com 13611601Sandreas.hansson@arm.com if (!pkt->needsResponse()) { 13711601Sandreas.hansson@arm.com mshr->allocateAsBuffer(pkt); 13811601Sandreas.hansson@arm.com } else { 13911601Sandreas.hansson@arm.com assert(size !=0); 14011051Sandreas.hansson@arm.com mshr->allocate(pkt->cmd, aligned_addr, size, pkt); 14111051Sandreas.hansson@arm.com allocatedTargets += 1; 14211051Sandreas.hansson@arm.com } 14311051Sandreas.hansson@arm.com mshr->allocIter = allocatedList.insert(allocatedList.end(), mshr); 14411051Sandreas.hansson@arm.com mshr->readyIter = pendingList.insert(pendingList.end(), mshr); 14511284Sandreas.hansson@arm.com 14611284Sandreas.hansson@arm.com allocated += 1; 14711051Sandreas.hansson@arm.com return mshr; 14811051Sandreas.hansson@arm.com} 14911051Sandreas.hansson@arm.com 15011051Sandreas.hansson@arm.comMSHR* 15111284Sandreas.hansson@arm.comMSHRQueue::allocateFetch(Addr addr, int size, Packet * &target) 15211051Sandreas.hansson@arm.com{ 15311051Sandreas.hansson@arm.com MSHR *mshr = freeList.front(); 15411051Sandreas.hansson@arm.com assert(mshr->getNumTargets() == 0); 15511051Sandreas.hansson@arm.com freeList.pop_front(); 15611051Sandreas.hansson@arm.com mshr->allocate(Packet::ReadReq, addr, size, target); 15711051Sandreas.hansson@arm.com mshr->allocIter = allocatedList.insert(allocatedList.end(), mshr); 15811051Sandreas.hansson@arm.com mshr->readyIter = pendingList.insert(pendingList.end(), mshr); 15911051Sandreas.hansson@arm.com 16011051Sandreas.hansson@arm.com allocated += 1; 16111051Sandreas.hansson@arm.com return mshr; 16211051Sandreas.hansson@arm.com} 16311051Sandreas.hansson@arm.com 16411051Sandreas.hansson@arm.comMSHR* 16511051Sandreas.hansson@arm.comMSHRQueue::allocateTargetList(Addr addr, int size) 16611051Sandreas.hansson@arm.com{ 16711051Sandreas.hansson@arm.com MSHR *mshr = freeList.front(); 16811051Sandreas.hansson@arm.com assert(mshr->getNumTargets() == 0); 16912724Snikos.nikoleris@arm.com freeList.pop_front(); 17012724Snikos.nikoleris@arm.com Packet * dummy; 17112724Snikos.nikoleris@arm.com mshr->allocate(Packet::ReadReq, addr, size, dummy); 17212724Snikos.nikoleris@arm.com mshr->allocIter = allocatedList.insert(allocatedList.end(), mshr); 17312724Snikos.nikoleris@arm.com mshr->inService = true; 17412724Snikos.nikoleris@arm.com ++inServiceMSHRs; 17512724Snikos.nikoleris@arm.com ++allocated; 17611051Sandreas.hansson@arm.com return mshr; 17711051Sandreas.hansson@arm.com} 17811051Sandreas.hansson@arm.com 17911051Sandreas.hansson@arm.com 18013358Sodanrc@yahoo.com.brvoid 18111051Sandreas.hansson@arm.comMSHRQueue::deallocate(MSHR* mshr) 18211051Sandreas.hansson@arm.com{ 18311484Snikos.nikoleris@arm.com deallocateOne(mshr); 18411051Sandreas.hansson@arm.com} 18511051Sandreas.hansson@arm.com 18611051Sandreas.hansson@arm.comMSHR::Iterator 18711051Sandreas.hansson@arm.comMSHRQueue::deallocateOne(MSHR* mshr) 18811051Sandreas.hansson@arm.com{ 18912724Snikos.nikoleris@arm.com MSHR::Iterator retval = allocatedList.erase(mshr->allocIter); 19011601Sandreas.hansson@arm.com freeList.push_front(mshr); 19111601Sandreas.hansson@arm.com allocated--; 19211601Sandreas.hansson@arm.com allocatedTargets -= mshr->getNumTargets(); 19311051Sandreas.hansson@arm.com if (mshr->inService) { 19411051Sandreas.hansson@arm.com inServiceMSHRs--; 19511051Sandreas.hansson@arm.com } else { 19611051Sandreas.hansson@arm.com pendingList.erase(mshr->readyIter); 19711051Sandreas.hansson@arm.com } 19812345Snikos.nikoleris@arm.com mshr->deallocate(); 19912345Snikos.nikoleris@arm.com return retval; 20012345Snikos.nikoleris@arm.com} 20112345Snikos.nikoleris@arm.com 20211051Sandreas.hansson@arm.comvoid 20311051Sandreas.hansson@arm.comMSHRQueue::moveToFront(MSHR *mshr) 20411051Sandreas.hansson@arm.com{ 20511051Sandreas.hansson@arm.com if (!mshr->inService) { 20611051Sandreas.hansson@arm.com assert(mshr == *(mshr->readyIter)); 20711051Sandreas.hansson@arm.com pendingList.erase(mshr->readyIter); 20811051Sandreas.hansson@arm.com mshr->readyIter = pendingList.insert(pendingList.begin(), mshr); 20911199Sandreas.hansson@arm.com } 21011199Sandreas.hansson@arm.com} 21111199Sandreas.hansson@arm.com 21211199Sandreas.hansson@arm.comvoid 21311199Sandreas.hansson@arm.comMSHRQueue::markInService(MSHR* mshr) 21411051Sandreas.hansson@arm.com{ 21512345Snikos.nikoleris@arm.com //assert(mshr == pendingList.front()); 21612345Snikos.nikoleris@arm.com if (!mshr->pkt->needsResponse()) { 21711051Sandreas.hansson@arm.com assert(mshr->getNumTargets() == 0); 21811051Sandreas.hansson@arm.com deallocate(mshr); 21911051Sandreas.hansson@arm.com return; 22011051Sandreas.hansson@arm.com } 22111051Sandreas.hansson@arm.com mshr->inService = true; 22211051Sandreas.hansson@arm.com pendingList.erase(mshr->readyIter); 22311051Sandreas.hansson@arm.com //mshr->readyIter = NULL; 22411051Sandreas.hansson@arm.com inServiceMSHRs += 1; 22511051Sandreas.hansson@arm.com //pendingList.pop_front(); 22611051Sandreas.hansson@arm.com} 22711051Sandreas.hansson@arm.com 22811051Sandreas.hansson@arm.comvoid 22911051Sandreas.hansson@arm.comMSHRQueue::markPending(MSHR* mshr, Packet::Command cmd) 23011051Sandreas.hansson@arm.com{ 23111051Sandreas.hansson@arm.com //assert(mshr->readyIter == NULL); 23211051Sandreas.hansson@arm.com mshr->pkt->cmd = cmd; 23311051Sandreas.hansson@arm.com mshr->pkt->flags &= ~SATISFIED; 23411130Sali.jafri@arm.com mshr->inService = false; 23511130Sali.jafri@arm.com --inServiceMSHRs; 23611130Sali.jafri@arm.com /** 23711130Sali.jafri@arm.com * @ todo might want to add rerequests to front of pending list for 23811130Sali.jafri@arm.com * performance. 23911130Sali.jafri@arm.com */ 24011130Sali.jafri@arm.com mshr->readyIter = pendingList.insert(pendingList.end(), mshr); 24111130Sali.jafri@arm.com} 24211130Sali.jafri@arm.com 24312345Snikos.nikoleris@arm.comvoid 24412345Snikos.nikoleris@arm.comMSHRQueue::squash(int threadNum) 24511130Sali.jafri@arm.com{ 24611130Sali.jafri@arm.com MSHR::Iterator i = allocatedList.begin(); 24711130Sali.jafri@arm.com MSHR::Iterator end = allocatedList.end(); 24811130Sali.jafri@arm.com for (; i != end;) { 24911130Sali.jafri@arm.com MSHR *mshr = *i; 25011130Sali.jafri@arm.com if (mshr->threadNum == threadNum) { 25112724Snikos.nikoleris@arm.com while (mshr->hasTargets()) { 25211130Sali.jafri@arm.com Packet * target = mshr->getTarget(); 25311130Sali.jafri@arm.com mshr->popTarget(); 25411130Sali.jafri@arm.com 25511130Sali.jafri@arm.com assert(0/*target->req->getThreadNum()*/ == threadNum); 25611130Sali.jafri@arm.com target = NULL; 25711130Sali.jafri@arm.com } 25812724Snikos.nikoleris@arm.com assert(!mshr->hasTargets()); 25911130Sali.jafri@arm.com assert(mshr->ntargets==0); 26011130Sali.jafri@arm.com if (!mshr->inService) { 26111130Sali.jafri@arm.com i = deallocateOne(mshr); 26211130Sali.jafri@arm.com } else { 26311130Sali.jafri@arm.com //mshr->pkt->flags &= ~CACHE_LINE_FILL; 26411130Sali.jafri@arm.com ++i; 26511130Sali.jafri@arm.com } 26611130Sali.jafri@arm.com } else { 26711130Sali.jafri@arm.com ++i; 26811051Sandreas.hansson@arm.com } 26911051Sandreas.hansson@arm.com } 27011051Sandreas.hansson@arm.com} 27111051Sandreas.hansson@arm.com