mshr_queue.cc (10910:32f3d1c454ec) mshr_queue.cc (10913:38dbdeea7f1f)
1/*
2 * Copyright (c) 2012-2013, 2015 ARM Limited
3 * All rights reserved.
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software

--- 42 unchanged lines hidden (view full) ---

51
52using namespace std;
53
54MSHRQueue::MSHRQueue(const std::string &_label,
55 int num_entries, int reserve, int demand_reserve,
56 int _index)
57 : label(_label), numEntries(num_entries + reserve - 1),
58 numReserve(reserve), demandReserve(demand_reserve),
1/*
2 * Copyright (c) 2012-2013, 2015 ARM Limited
3 * All rights reserved.
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software

--- 42 unchanged lines hidden (view full) ---

51
52using namespace std;
53
54MSHRQueue::MSHRQueue(const std::string &_label,
55 int num_entries, int reserve, int demand_reserve,
56 int _index)
57 : label(_label), numEntries(num_entries + reserve - 1),
58 numReserve(reserve), demandReserve(demand_reserve),
59 registers(numEntries), drainManager(NULL), allocated(0),
59 registers(numEntries), allocated(0),
60 inServiceEntries(0), index(_index)
61{
62 for (int i = 0; i < numEntries; ++i) {
63 registers[i].queue = this;
64 freeList.push_back(&registers[i]);
65 }
66}
67

--- 107 unchanged lines hidden (view full) ---

175 freeList.push_front(mshr);
176 allocated--;
177 if (mshr->inService) {
178 inServiceEntries--;
179 } else {
180 readyList.erase(mshr->readyIter);
181 }
182 mshr->deallocate();
60 inServiceEntries(0), index(_index)
61{
62 for (int i = 0; i < numEntries; ++i) {
63 registers[i].queue = this;
64 freeList.push_back(&registers[i]);
65 }
66}
67

--- 107 unchanged lines hidden (view full) ---

175 freeList.push_front(mshr);
176 allocated--;
177 if (mshr->inService) {
178 inServiceEntries--;
179 } else {
180 readyList.erase(mshr->readyIter);
181 }
182 mshr->deallocate();
183 if (drainManager && allocated == 0) {
183 if (drainState() == DrainState::Draining && allocated == 0) {
184 // Notify the drain manager that we have completed draining if
185 // there are no other outstanding requests in this MSHR queue.
186 DPRINTF(Drain, "MSHRQueue now empty, signalling drained\n");
184 // Notify the drain manager that we have completed draining if
185 // there are no other outstanding requests in this MSHR queue.
186 DPRINTF(Drain, "MSHRQueue now empty, signalling drained\n");
187 drainManager->signalDrainDone();
188 drainManager = NULL;
189 setDrainState(DrainState::Drained);
187 signalDrainDone();
190 }
191 return retval;
192}
193
194void
195MSHRQueue::moveToFront(MSHR *mshr)
196{
197 if (!mshr->inService) {

--- 62 unchanged lines hidden (view full) ---

260 ++i;
261 }
262 } else {
263 ++i;
264 }
265 }
266}
267
188 }
189 return retval;
190}
191
192void
193MSHRQueue::moveToFront(MSHR *mshr)
194{
195 if (!mshr->inService) {

--- 62 unchanged lines hidden (view full) ---

258 ++i;
259 }
260 } else {
261 ++i;
262 }
263 }
264}
265
268unsigned int
269MSHRQueue::drain(DrainManager *dm)
266DrainState
267MSHRQueue::drain()
270{
268{
271 if (allocated == 0) {
272 setDrainState(DrainState::Drained);
273 return 0;
274 } else {
275 drainManager = dm;
276 setDrainState(DrainState::Draining);
277 return 1;
278 }
269 return allocated == 0 ? DrainState::Drained : DrainState::Draining;
279}
270}