blob: 9f0f08814b92ed4961985743a2d56117cbfd5d06 [file] [log] [blame]
Ali Saidi851f91f2006-07-20 19:03:47 -04001/*
Andreas Hansson0cd0a8f2012-02-24 11:52:49 -05002 * Copyright (c) 2012 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
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated
11 * unmodified and in its entirety in all distributions of the software,
12 * modified or unmodified, in source code or in binary form.
13 *
Ali Saidi851f91f2006-07-20 19:03:47 -040014 * Copyright (c) 2006 The Regents of The University of Michigan
15 * All rights reserved.
16 *
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions are
19 * met: redistributions of source code must retain the above copyright
20 * notice, this list of conditions and the following disclaimer;
21 * redistributions in binary form must reproduce the above copyright
22 * notice, this list of conditions and the following disclaimer in the
23 * documentation and/or other materials provided with the distribution;
24 * neither the name of the copyright holders nor the names of its
25 * contributors may be used to endorse or promote products derived from
26 * this software without specific prior written permission.
27 *
28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39 *
40 * Authors: Ali Saidi
Andreas Hansson0cd0a8f2012-02-24 11:52:49 -050041 * Andreas Hansson
Ali Saidi851f91f2006-07-20 19:03:47 -040042 */
43
44#include "mem/tport.hh"
45
Brandon Potter7a8dda42016-11-09 14:27:37 -060046#include "mem/mem_object.hh"
47
Andreas Hanssonc2d2ea92012-03-22 06:36:27 -040048SimpleTimingPort::SimpleTimingPort(const std::string& _name,
49 MemObject* _owner) :
Andreas Hansson67e257f2012-07-09 12:35:42 -040050 QueuedSlavePort(_name, _owner, queueImpl), queueImpl(*_owner, *this)
Nathan Binkertc25d9662008-11-10 11:51:18 -080051{
Nathan Binkertc25d9662008-11-10 11:51:18 -080052}
53
Steve Reinhardt41f6cbc2007-05-28 08:11:43 -070054void
55SimpleTimingPort::recvFunctional(PacketPtr pkt)
56{
Robert Kovacsics2f170622018-07-19 18:56:06 +010057 if (!respQueue.trySatisfyFunctional(pkt)) {
Andreas Hanssonc2d2ea92012-03-22 06:36:27 -040058 // do an atomic access and throw away the returned latency
Ali Saidi3d2764a2006-10-12 15:30:30 -040059 recvAtomic(pkt);
Steve Reinhardt2f93db62007-07-29 20:17:03 -070060 }
Steve Reinhardtf9ae0dc2006-08-30 16:24:26 -070061}
62
63bool
Andreas Hansson3fea59e2012-05-01 13:40:42 -040064SimpleTimingPort::recvTimingReq(PacketPtr pkt)
Steve Reinhardtf9ae0dc2006-08-30 16:24:26 -070065{
Andreas Hansson9929e882013-04-22 13:20:33 -040066 // the SimpleTimingPort should not be used anywhere where there is
Andreas Hansson0fcb3762015-12-31 09:32:58 -050067 // a need to deal with snoop responses and their flow control
68 // requirements
69 if (pkt->cacheResponding())
70 panic("SimpleTimingPort should never see packets with the "
71 "cacheResponding flag set\n");
Steve Reinhardt1b20df52007-06-26 22:23:10 -070072
Steve Reinhardt35cf19d2007-06-17 17:27:53 -070073 bool needsResponse = pkt->needsResponse();
Steve Reinhardtf9ae0dc2006-08-30 16:24:26 -070074 Tick latency = recvAtomic(pkt);
Ron Dreslinskie65f0ce2006-10-08 19:05:48 -040075 // turn packet around to go back to requester if response expected
Steve Reinhardt35cf19d2007-06-17 17:27:53 -070076 if (needsResponse) {
Steve Reinhardt1b20df52007-06-26 22:23:10 -070077 // recvAtomic() should already have turned packet into
78 // atomic response
Steve Reinhardt35cf19d2007-06-17 17:27:53 -070079 assert(pkt->isResponse());
Andreas Hanssone317d8b2012-08-22 11:39:56 -040080 schedTimingResp(pkt, curTick() + latency);
Steve Reinhardt35cf19d2007-06-17 17:27:53 -070081 } else {
Andreas Hanssonac1368d2015-11-06 03:26:21 -050082 // queue the packet for deletion
83 pendingDelete.reset(pkt);
Ron Dreslinski4fff6d42006-10-17 16:47:22 -040084 }
Steve Reinhardt1b20df52007-06-26 22:23:10 -070085
Steve Reinhardtf9ae0dc2006-08-30 16:24:26 -070086 return true;
87}