mem-ruby: add CHI SnpRespData_SD_Fwded_SC message

This snoop reponse is not generated internally by the SLICC
implementation, but is required for compatibility with classic caches
which may remain in SD state while returning SC data upon receiving
a converted SnpShared.

Change-Id: I5270b29c8863c7afd8abc39b3c7978b95330c183
This commit is contained in:
Tiago Mück
2023-06-01 18:38:50 -05:00
committed by Bobby R. Bruce
parent f37dfc090d
commit bc52d886a8
5 changed files with 18 additions and 3 deletions

View File

@@ -1950,6 +1950,7 @@ action(Send_SnpSharedFwd_ToOwner, desc="") {
if (retToSrc) {
tbe.expected_snp_resp.addExpectedDataType(CHIDataType:SnpRespData_SC_Fwded_SC);
tbe.expected_snp_resp.addExpectedDataType(CHIDataType:SnpRespData_SC_Fwded_SD_PD);
tbe.expected_snp_resp.addExpectedDataType(CHIDataType:SnpRespData_SD_Fwded_SC);
tbe.expected_snp_resp.addExpectedDataType(CHIDataType:SnpRespData_I_Fwded_SC);
tbe.expected_snp_resp.addExpectedDataType(CHIDataType:SnpRespData_I_Fwded_SD_PD);
} else {
@@ -1964,6 +1965,7 @@ action(Send_SnpSharedFwd_ToOwner, desc="") {
tbe.expected_snp_resp.addExpectedRespType(CHIResponseType:SnpResp_SC_Fwded_SC);
}
tbe.expected_snp_resp.addExpectedDataType(CHIDataType:SnpRespData_SC_PD_Fwded_SC);
tbe.expected_snp_resp.addExpectedDataType(CHIDataType:SnpRespData_SD_Fwded_SC);
tbe.expected_snp_resp.addExpectedDataType(CHIDataType:SnpRespData_I_PD_Fwded_SC);
}
tbe.expected_snp_resp.addExpectedCount(1);
@@ -2304,7 +2306,8 @@ action(UpdateDirState_FromSnpDataResp, desc="") {
(in_msg.type == CHIDataType:SnpRespData_SC) ||
(in_msg.type == CHIDataType:SnpRespData_SC_Fwded_SC) ||
(in_msg.type == CHIDataType:SnpRespData_SC_Fwded_SD_PD) ||
(in_msg.type == CHIDataType:SnpRespData_SC_PD_Fwded_SC)) {
(in_msg.type == CHIDataType:SnpRespData_SC_PD_Fwded_SC) ||
(in_msg.type == CHIDataType:SnpRespData_SD_Fwded_SC)) {
// the owner must have been the responder, if there was one
assert((tbe.dir_ownerExists == false) ||
(tbe.dir_ownerExists && (tbe.dir_owner == in_msg.responder)));
@@ -2313,12 +2316,16 @@ action(UpdateDirState_FromSnpDataResp, desc="") {
tbe.dir_ownerIsExcl := false;
if ((in_msg.type == CHIDataType:SnpRespData_SC_Fwded_SC) ||
(in_msg.type == CHIDataType:SnpRespData_SC_PD_Fwded_SC) ||
(in_msg.type == CHIDataType:SnpRespData_SC_Fwded_SD_PD)) {
(in_msg.type == CHIDataType:SnpRespData_SC_Fwded_SD_PD) ||
(in_msg.type == CHIDataType:SnpRespData_SD_Fwded_SC)) {
tbe.dir_sharers.add(tbe.requestor);
}
if (in_msg.type == CHIDataType:SnpRespData_SC_Fwded_SD_PD) {
tbe.dir_ownerExists := true;
tbe.dir_owner := tbe.requestor;
} else if (in_msg.type == CHIDataType:SnpRespData_SD_Fwded_SC) {
tbe.dir_ownerExists := true;
tbe.dir_owner := in_msg.responder;
}
} else if ((in_msg.type == CHIDataType:SnpRespData_I_Fwded_SD_PD) ||
@@ -2507,7 +2514,8 @@ action(UpdateDataState_FromSnpDataResp, desc="") {
} else if ((in_msg.type == CHIDataType:SnpRespData_SD) ||
(in_msg.type == CHIDataType:SnpRespData_SC_Fwded_SD_PD) ||
(in_msg.type == CHIDataType:SnpRespData_I_Fwded_SD_PD)) {
(in_msg.type == CHIDataType:SnpRespData_I_Fwded_SD_PD) ||
(in_msg.type == CHIDataType:SnpRespData_SD_Fwded_SC)) {
tbe.dataDirty := true;
tbe.dataValid := true;
tbe.dataMaybeDirtyUpstream := true;

View File

@@ -229,6 +229,7 @@ void functionalRead(Addr addr, Packet *pkt, WriteMask &mask) {
tbe.expected_snp_resp.receivedDataType(CHIDataType:SnpRespData_UD) ||
tbe.expected_snp_resp.receivedDataType(CHIDataType:SnpRespData_SC_Fwded_SD_PD) ||
tbe.expected_snp_resp.receivedDataType(CHIDataType:SnpRespData_SC_PD_Fwded_SC) ||
tbe.expected_snp_resp.receivedDataType(CHIDataType:SnpRespData_SD_Fwded_SC) ||
tbe.expected_snp_resp.receivedDataType(CHIDataType:SnpRespData_I_Fwded_SD_PD) ||
tbe.expected_snp_resp.receivedDataType(CHIDataType:SnpRespData_I_PD_Fwded_SC);
}
@@ -1420,6 +1421,8 @@ Event dataToEvent (CHIDataType type) {
return Event:SnpRespData_SC_Fwded_SC;
} else if (type == CHIDataType:SnpRespData_SC_Fwded_SD_PD) {
return Event:SnpRespData_SC_Fwded_SD_PD;
} else if (type == CHIDataType:SnpRespData_SD_Fwded_SC) {
return Event:SnpRespData_SD_Fwded_SC;
} else if (type == CHIDataType:SnpRespData_SC_PD_Fwded_SC) {
return Event:SnpRespData_SC_PD_Fwded_SC;
} else if (type == CHIDataType:SnpRespData_I_Fwded_SD_PD) {

View File

@@ -1426,6 +1426,7 @@ transition(BUSY_BLKD,
{SnpRespData_I_PD,SnpRespData_I,SnpRespData_SC_PD,
SnpRespData_SC,SnpRespData_SD,SnpRespData_UC,SnpRespData_UD,
SnpRespData_SC_Fwded_SC,SnpRespData_SC_Fwded_SD_PD,
SnpRespData_SD_Fwded_SC,
SnpRespData_SC_PD_Fwded_SC,SnpRespData_I_Fwded_SD_PD,
SnpRespData_I_PD_Fwded_SC,SnpRespData_I_Fwded_SC}) {
Receive_SnpDataResp;

View File

@@ -406,6 +406,7 @@ machine(MachineType:Cache, "Cache coherency protocol") :
SnpRespData_UD, desc="";
SnpRespData_SC_Fwded_SC, desc="";
SnpRespData_SC_Fwded_SD_PD, desc="";
SnpRespData_SD_Fwded_SC, desc="";
SnpRespData_SC_PD_Fwded_SC, desc="";
SnpRespData_I_Fwded_SD_PD, desc="";
SnpRespData_I_PD_Fwded_SC, desc="";

View File

@@ -205,6 +205,7 @@ enumeration(CHIDataType, desc="...") {
SnpRespData_SC_Fwded_SC;
SnpRespData_SC_Fwded_SD_PD;
SnpRespData_SC_PD_Fwded_SC;
SnpRespData_SD_Fwded_SC;
SnpRespData_I_Fwded_SD_PD;
SnpRespData_I_PD_Fwded_SC;
SnpRespData_I_Fwded_SC;
@@ -243,6 +244,7 @@ structure(CHIDataMsg, desc="", interface="Message") {
(type == CHIDataType:SnpRespData_SD) ||
(type == CHIDataType:SnpRespData_UD) ||
(type == CHIDataType:SnpRespData_SC_Fwded_SD_PD) ||
(type == CHIDataType:SnpRespData_SD_Fwded_SC) ||
(type == CHIDataType:SnpRespData_SC_PD_Fwded_SC) ||
(type == CHIDataType:SnpRespData_I_Fwded_SD_PD) ||
(type == CHIDataType:SnpRespData_I_PD_Fwded_SC);