X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmem%2Fprotocol%2FMOESI_CMP_directory-msg.sm;h=7dc5822159d82dbb1f89d1a4a833528244db5cc6;hb=e33b3aa6692b172f6db5957774a9e0289e81fa5b;hp=edbff0c966882291119609fec61450cd622d593b;hpb=b89add1e3f0807219320b8f00f918876921a68ab;p=gem5.git diff --git a/src/mem/protocol/MOESI_CMP_directory-msg.sm b/src/mem/protocol/MOESI_CMP_directory-msg.sm index edbff0c96..7dc582215 100644 --- a/src/mem/protocol/MOESI_CMP_directory-msg.sm +++ b/src/mem/protocol/MOESI_CMP_directory-msg.sm @@ -1,5 +1,16 @@ - /* + * Copyright (c) 2019 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * * Copyright (c) 1999-2005 Mark D. Hill and David A. Wood * All rights reserved. * @@ -40,11 +51,10 @@ enumeration(CoherenceRequestType, desc="...") { PUTO, desc="Put Owned"; PUTO_SHARERS, desc="Put Owned, but sharers exist so don't remove from sharers list"; PUTS, desc="Put Shared"; - WB_ACK, desc="Writeback ack"; - WB_ACK_DATA, desc="Writeback ack"; - WB_NACK, desc="Writeback neg. ack"; INV, desc="Invalidation"; - + WRITEBACK_CLEAN_DATA, desc="Clean writeback (contains data)"; + WRITEBACK_CLEAN_ACK, desc="Clean writeback (contains no data)"; + WRITEBACK_DIRTY_DATA, desc="Dirty writeback (contains data)"; DMA_READ, desc="DMA Read"; DMA_WRITE, desc="DMA Write"; } @@ -56,10 +66,9 @@ enumeration(CoherenceResponseType, desc="...") { DATA_EXCLUSIVE, desc="Data, no processor has a copy"; UNBLOCK, desc="Unblock"; UNBLOCK_EXCLUSIVE, desc="Unblock, we're in E/M"; - WRITEBACK_CLEAN_DATA, desc="Clean writeback (contains data)"; - WRITEBACK_CLEAN_ACK, desc="Clean writeback (contains no data)"; - WRITEBACK_DIRTY_DATA, desc="Dirty writeback (contains data)"; - + WB_ACK, desc="Writeback ack"; + WB_ACK_DATA, desc="Writeback ack"; + WB_NACK, desc="Writeback neg. ack"; DMA_ACK, desc="Ack that a DMA write completed"; } @@ -70,13 +79,23 @@ enumeration(TriggerType, desc="...") { // TriggerMsg structure(TriggerMsg, desc="...", interface="Message") { - Address Address, desc="Physical address for this request"; + Addr addr, desc="Physical address for this request"; TriggerType Type, desc="Type of trigger"; + + bool functionalRead(Packet *pkt) { + // Trigger message does not hold data + return false; + } + + bool functionalWrite(Packet *pkt) { + // Trigger message does not hold data + return false; + } } // RequestMsg (and also forwarded requests) -structure(RequestMsg, desc="...", interface="NetworkMessage") { - Address Address, desc="Physical address for this request"; +structure(RequestMsg, desc="...", interface="Message") { + Addr addr, desc="Physical address for this request"; int Len, desc="Length of Request"; CoherenceRequestType Type, desc="Type of request (GetS, GetX, PutX, etc)"; MachineID Requestor, desc="Node who initiated the request"; @@ -85,13 +104,29 @@ structure(RequestMsg, desc="...", interface="NetworkMessage") { DataBlock DataBlk, desc="data for the cache line (DMA WRITE request)"; int Acks, desc="How many acks to expect"; MessageSizeType MessageSize, desc="size category of the message"; - AccessModeType AccessMode, desc="user/supervisor access type"; + RubyAccessMode AccessMode, desc="user/supervisor access type"; PrefetchBit Prefetch, desc="Is this a prefetch request"; + + bool functionalRead(Packet *pkt) { + // Read only those messages that contain the data + if (Type == CoherenceRequestType:DMA_READ || + Type == CoherenceRequestType:DMA_WRITE || + Type == CoherenceRequestType:WRITEBACK_CLEAN_DATA || + Type == CoherenceRequestType:WRITEBACK_DIRTY_DATA) { + return testAndRead(addr, DataBlk, pkt); + } + return false; + } + + bool functionalWrite(Packet *pkt) { + // No check required since all messages are written + return testAndWrite(addr, DataBlk, pkt); + } } // ResponseMsg (and also unblock requests) -structure(ResponseMsg, desc="...", interface="NetworkMessage") { - Address Address, desc="Physical address for this request"; +structure(ResponseMsg, desc="...", interface="Message") { + Addr addr, desc="Physical address for this request"; CoherenceResponseType Type, desc="Type of response (Ack, Data, etc)"; MachineID Sender, desc="Node who sent the data"; MachineType SenderMachine, desc="type of component sending msg"; @@ -100,6 +135,18 @@ structure(ResponseMsg, desc="...", interface="NetworkMessage") { bool Dirty, desc="Is the data dirty (different than memory)?"; int Acks, desc="How many acks to expect"; MessageSizeType MessageSize, desc="size category of the message"; -} + bool functionalRead(Packet *pkt) { + // Read only those messages that contain the data + if (Type == CoherenceResponseType:DATA || + Type == CoherenceResponseType:DATA_EXCLUSIVE) { + return testAndRead(addr, DataBlk, pkt); + } + return false; + } + bool functionalWrite(Packet *pkt) { + // No check required since all messages are written + return testAndWrite(addr, DataBlk, pkt); + } +}