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