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