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