1/* 2 * Copyright (c) 2011-2015, 2017 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 --- 94 unchanged lines hidden (view full) --- 103 CoherentXBarSlavePort(const std::string &_name, 104 CoherentXBar &_xbar, PortID _id) 105 : QueuedSlavePort(_name, &_xbar, queue, _id), xbar(_xbar), 106 queue(_xbar, *this) 107 { } 108 109 protected: 110 |
111 bool 112 recvTimingReq(PacketPtr pkt) override 113 { 114 return xbar.recvTimingReq(pkt, id); 115 } |
116 |
117 bool 118 recvTimingSnoopResp(PacketPtr pkt) override 119 { 120 return xbar.recvTimingSnoopResp(pkt, id); 121 } |
122 |
123 Tick 124 recvAtomic(PacketPtr pkt) override 125 { 126 return xbar.recvAtomic(pkt, id); 127 } |
128 |
129 void 130 recvFunctional(PacketPtr pkt) override 131 { 132 xbar.recvFunctional(pkt, id); 133 } |
134 |
135 AddrRangeList 136 getAddrRanges() const override 137 { 138 return xbar.getAddrRanges(); 139 } |
140 141 }; 142 143 /** 144 * Declaration of the coherent crossbar master port type, one will be 145 * instantiated for each of the slave interfaces connecting to the 146 * crossbar. 147 */ --- 13 unchanged lines hidden (view full) --- 161 protected: 162 163 /** 164 * Determine if this port should be considered a snooper. For 165 * a coherent crossbar master port this is always true. 166 * 167 * @return a boolean that is true if this port is snooping 168 */ |
169 bool isSnooping() const override { return true; } |
170 |
171 bool 172 recvTimingResp(PacketPtr pkt) override 173 { 174 return xbar.recvTimingResp(pkt, id); 175 } |
176 |
177 void 178 recvTimingSnoopReq(PacketPtr pkt) override 179 { 180 return xbar.recvTimingSnoopReq(pkt, id); 181 } |
182 |
183 Tick 184 recvAtomicSnoop(PacketPtr pkt) override 185 { 186 return xbar.recvAtomicSnoop(pkt, id); 187 } |
188 |
189 void 190 recvFunctionalSnoop(PacketPtr pkt) override 191 { 192 xbar.recvFunctionalSnoop(pkt, id); 193 } |
194 |
195 void recvRangeChange() override { xbar.recvRangeChange(id); } 196 void recvReqRetry() override { xbar.recvReqRetry(id); } |
197 |
198 }; 199 200 /** 201 * Internal class to bridge between an incoming snoop response 202 * from a slave port and forwarding it through an outgoing slave 203 * port. It is effectively a dangling master port. 204 */ 205 class SnoopRespPort : public MasterPort --- 12 unchanged lines hidden (view full) --- 218 SnoopRespPort(QueuedSlavePort& slave_port, CoherentXBar& _xbar) : 219 MasterPort(slave_port.name() + ".snoopRespPort", &_xbar), 220 slavePort(slave_port) { } 221 222 /** 223 * Override the sending of retries and pass them on through 224 * the mirrored slave port. 225 */ |
226 void 227 sendRetryResp() override 228 { |
229 // forward it as a snoop response retry 230 slavePort.sendRetrySnoopResp(); 231 } 232 |
233 void 234 recvReqRetry() override 235 { 236 panic("SnoopRespPort should never see retry"); 237 } |
238 |
239 bool 240 recvTimingResp(PacketPtr pkt) override |
241 { |
242 panic("SnoopRespPort should never see timing response"); |
243 } 244 245 }; 246 247 std::vector<SnoopRespPort*> snoopRespPorts; 248 249 std::vector<QueuedSlavePort*> snoopPorts; 250 --- 16 unchanged lines hidden (view full) --- 267 * properties. 268 */ 269 System *system; 270 271 /** A snoop filter that tracks cache line residency and can restrict the 272 * broadcast needed for probes. NULL denotes an absent filter. */ 273 SnoopFilter *snoopFilter; 274 |
275 const Cycles snoopResponseLatency; |
276 const bool pointOfCoherency; |
277 const bool pointOfUnification; 278 279 /** 280 * Upstream caches need this packet until true is returned, so 281 * hold it for deletion until a subsequent call 282 */ 283 std::unique_ptr<Packet> pendingDelete; 284 |
285 bool recvTimingReq(PacketPtr pkt, PortID slave_port_id); |
286 bool recvTimingResp(PacketPtr pkt, PortID master_port_id); |
287 void recvTimingSnoopReq(PacketPtr pkt, PortID master_port_id); |
288 bool recvTimingSnoopResp(PacketPtr pkt, PortID slave_port_id); |
289 void recvReqRetry(PortID master_port_id); 290 291 /** 292 * Forward a timing packet to our snoopers, potentially excluding 293 * one of the connected coherent masters to avoid sending a packet 294 * back to where it came from. 295 * 296 * @param pkt Packet to forward 297 * @param exclude_slave_port_id Id of slave port to exclude 298 */ |
299 void 300 forwardTiming(PacketPtr pkt, PortID exclude_slave_port_id) 301 { |
302 forwardTiming(pkt, exclude_slave_port_id, snoopPorts); 303 } 304 305 /** 306 * Forward a timing packet to a selected list of snoopers, potentially 307 * excluding one of the connected coherent masters to avoid sending a packet 308 * back to where it came from. 309 * 310 * @param pkt Packet to forward 311 * @param exclude_slave_port_id Id of slave port to exclude 312 * @param dests Vector of destination ports for the forwarded pkt 313 */ 314 void forwardTiming(PacketPtr pkt, PortID exclude_slave_port_id, 315 const std::vector<QueuedSlavePort*>& dests); 316 |
317 Tick recvAtomic(PacketPtr pkt, PortID slave_port_id); |
318 Tick recvAtomicSnoop(PacketPtr pkt, PortID master_port_id); 319 320 /** 321 * Forward an atomic packet to our snoopers, potentially excluding 322 * one of the connected coherent masters to avoid sending a packet 323 * back to where it came from. 324 * 325 * @param pkt Packet to forward 326 * @param exclude_slave_port_id Id of slave port to exclude 327 * 328 * @return a pair containing the snoop response and snoop latency 329 */ |
330 std::pair 331 forwardAtomic(PacketPtr pkt, PortID exclude_slave_port_id) |
332 { 333 return forwardAtomic(pkt, exclude_slave_port_id, InvalidPortID, 334 snoopPorts); 335 } 336 337 /** 338 * Forward an atomic packet to a selected list of snoopers, potentially 339 * excluding one of the connected coherent masters to avoid sending a packet --- 48 unchanged lines hidden (view full) --- 388 * The memory below is the destination for a cache mainteance 389 * operation to the Point of Coherence/Unification if this is the 390 * Point of Coherence/Unification. 391 * 392 * @param pkt The processed packet 393 * 394 * @return Whether the memory below is the destination for the packet 395 */ |
396 bool 397 isDestination(const PacketPtr pkt) const |
398 { 399 return (pkt->req->isToPOC() && pointOfCoherency) || 400 (pkt->req->isToPOU() && pointOfUnification); 401 } 402 403 Stats::Scalar snoops; 404 Stats::Scalar snoopTraffic; 405 Stats::Distribution snoopFanout; --- 13 unchanged lines hidden --- |