Mem: Use deque instead of list for bus retries
[gem5.git] / src / mem / protocol / RubySlicc_Exports.sm
index 412fd0de0700e892906bc5b33e16208eeaca9682..b42f9c3a94bb6b1e08f9f6a627099737746b4d45 100644 (file)
@@ -1,6 +1,6 @@
-
 /*
- * Copyright (c) 1999-2005 Mark D. Hill and David A. Wood
+ * Copyright (c) 1999-2012 Mark D. Hill and David A. Wood
+ * Copyright (c) 2011 Advanced Micro Devices, Inc.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
 // defines
 external_type(int, primitive="yes", default="0");
 external_type(bool, primitive="yes", default="false");
-external_type(string, primitive="yes");
+external_type(std::string, primitive="yes");
 external_type(uint64, primitive="yes");
 external_type(Time, primitive="yes", default="0");
 external_type(Address);
-external_type(DataBlock, desc="..."){
+structure(DataBlock, external = "yes", desc="..."){
   void clear();
   void copyPartial(DataBlock, int, int);
 }
@@ -47,15 +47,35 @@ external_type(DataBlock, desc="..."){
 // Declarations of external types that are common to all protocols
 
 // AccessPermission
+// The following five states define the access permission of all memory blocks.
+// These permissions have multiple uses.  They coordinate locking and 
+// synchronization primitives, as well as enable functional accesses.
+// One should not need to add any additional permission values and it is very
+// risky to do so.
 enumeration(AccessPermission, desc="...", default="AccessPermission_NotPresent") {
-  Busy,       desc="No Read or Write";
-  Read_Only,  desc="Read Only";
-  Read_Write, desc="Read/Write";
-  Invalid,    desc="Invalid";
-  NotPresent, desc="NotPresent";
-  OnHold,     desc="Holding a place in dnuca cache";
-  ReadUpgradingToWrite, desc="Read only, but trying to get Read/Write";
-  Stale,      desc="local L1 has a modified copy, assume L2 copy is stale data";
+  // Valid data
+  Read_Only,  desc="block is Read Only (modulo functional writes)";
+  Read_Write, desc="block is Read/Write";
+
+  // Possibly Invalid data
+  // The maybe stale permission indicates that accordingly to the protocol, 
+  // there is no guarantee the block contains valid data.  However, functional
+  // writes should update the block because a dataless PUT request may
+  // revalidate the block's data.
+  Maybe_Stale, desc="block can be stale or revalidated by a dataless PUT";
+  // In Broadcast/Snoop protocols, memory has no idea if it is exclusive owner
+  // or not of a block, making it hard to make the logic of having only one
+  // read_write block in the system impossible. This is to allow the memory to
+  // say, "I have the block" and for the RubyPort logic to know that this is a
+  // last-resort block if there are no writable copies in the caching hierarchy.
+  // This is not supposed to be used in directory or token protocols where
+  // memory/NB has an idea of what is going on in the whole system.
+  Backing_Store, desc="for memory in Broadcast/Snoop protocols";
+
+  // Invalid data
+  Invalid,    desc="block is in an Invalid base state";
+  NotPresent, desc="block is NotPresent";
+  Busy,       desc="block is in a transient state, currently invalid";
 }
 
 // TesterStatus
@@ -66,45 +86,18 @@ enumeration(TesterStatus, desc="...") {
   Check_Pending,   desc="Check Pending";
 }
 
-// SpecifiedGeneratorTypes
-enumeration(SpecifiedGeneratorType, desc="...") {
-  DetermGETXGenerator,       desc="deterministic GETX Tester";
-  DetermInvGenerator,        desc="deterministic all shared then invalidate Tester";
-  DetermSeriesGETSGenerator, desc="deterministic Series of GETSs Tester for prefetcher tuning";
-}
-
-// RequestGeneratorStatus
-enumeration(RequestGeneratorStatus, desc="...") {
-  Thinking,        desc="Doing work between release and next acquire";
-  Test_Pending,    desc="Test pending";
-  Before_Swap,     desc="We're about to perform the swap";
-  Swap_Pending,    desc="The swap used for test-and-send is pending";
-  Holding,         desc="We are holding the lock performing the critical section";
-  Release_Pending, desc="The write for the release is pending";
-  Done,            desc="Done, waiting for end of run";
-}
-
-// DetermGETXGeneratorStatus
-enumeration(DetermGETXGeneratorStatus, desc="...") {
-  Thinking,        desc="Doing work before next action";
-  Store_Pending,   desc="Store pending";
-  Done,            desc="Done, waiting for end of run";
-}
-
-// DetermGETXGeneratorStatus
-enumeration(DetermInvGeneratorStatus, desc="...") {
-  Thinking,        desc="Doing work before next action";
-  Store_Pending,   desc="Store pending";
-  Load_Complete,   desc="Load complete";
-  Load_Pending,    desc="Load pending";
-  Done,            desc="Done, waiting for end of run";
+// InvalidateGeneratorStatus
+enumeration(InvalidateGeneratorStatus, desc="...") {
+  Load_Waiting,    desc="Load waiting to be issued";
+  Load_Pending,    desc="Load issued";
+  Inv_Waiting,     desc="Store (invalidate) waiting to be issued";
+  Inv_Pending,     desc="Store (invalidate) issued";
 }
 
-// DetermSeriesGETSGeneratorStatus
-enumeration(DetermSeriesGETSGeneratorStatus, desc="...") {
+// SeriesRequestGeneratorStatus
+enumeration(SeriesRequestGeneratorStatus, desc="...") {
   Thinking,        desc="Doing work before next action";
-  Load_Pending,    desc="Load pending";
-  Done,            desc="Done, waiting for end of run";
+  Request_Pending, desc="Request pending";
 }
 
 // LockStatus
@@ -125,19 +118,27 @@ enumeration(TransitionResult, desc="...") {
   ProtocolStall, desc="Protocol specified stall";
 }
 
-// CacheRequestType
-enumeration(CacheRequestType, desc="...", default="CacheRequestType_NULL") {
-  LD,          desc="Load";
-  ST,          desc="Store";
-  ATOMIC,      desc="Atomic Load/Store";
-  IFETCH,      desc="Instruction fetch";
-  IO,          desc="I/O";
-  REPLACEMENT, desc="Replacement";
-  COMMIT,      desc="Commit version";
-  NULL,        desc="Invalid request type";
+// RubyRequestType
+enumeration(RubyRequestType, desc="...", default="RubyRequestType_NULL") {
+  LD,                desc="Load";
+  ST,                desc="Store";
+  ATOMIC,            desc="Atomic Load/Store";
+  IFETCH,            desc="Instruction fetch";
+  IO,                desc="I/O";
+  REPLACEMENT,       desc="Replacement";
+  Load_Linked,       desc="";
+  Store_Conditional, desc="";
+  RMW_Read,          desc="";
+  RMW_Write,         desc="";
+  Locked_RMW_Read,   desc="";
+  Locked_RMW_Write,  desc="";
+  COMMIT,            desc="Commit version";
+  NULL,              desc="Invalid request type";
+  FLUSH,             desc="Flush request type";
 }
 
 enumeration(SequencerRequestType, desc="...", default="SequencerRequestType_NULL") {
+  Default,    desc="Replace this with access_types passed to the DMA Ruby object";
   LD,          desc="Load";
   ST,          desc="Store";
   NULL,        desc="Invalid request type";
@@ -176,11 +177,36 @@ enumeration(GenericRequestType, desc="...", default="GenericRequestType_NULL") {
   NULL,        desc="null request type";
 }
 
+enumeration(CacheRequestType, desc="...", default="CacheRequestType_NULL") {
+  DataArrayRead,    desc="Read access to the cache's data array";
+  DataArrayWrite,   desc="Write access to the cache's data array";
+  TagArrayRead,     desc="Read access to the cache's tag array";
+  TagArrayWrite,    desc="Write access to the cache's tag array";
+}
+
+enumeration(CacheResourceType, desc="...", default="CacheResourceType_NULL") {
+  DataArray,    desc="Access to the cache's data array";
+  TagArray,     desc="Access to the cache's tag array";
+}
+
+enumeration(DirectoryRequestType, desc="...", default="DirectoryRequestType_NULL") {
+  Default,    desc="Replace this with access_types passed to the Directory Ruby object";
+}
+
+enumeration(DMASequencerRequestType, desc="...", default="DMASequencerRequestType_NULL") {
+  Default,    desc="Replace this with access_types passed to the DMA Ruby object";
+}
+
+enumeration(MemoryControlRequestType, desc="...", default="MemoryControlRequestType_NULL") {
+  Default,    desc="Replace this with access_types passed to the DMA Ruby object";
+}
+
 enumeration(GenericMachineType, desc="...", default="GenericMachineType_NULL") {
   L1Cache,     desc="L1 Cache Mach";
   L2Cache,     desc="L2 Cache Mach";
   L3Cache,     desc="L3 Cache Mach";
   Directory,   desc="Directory Mach";
+  DMA,         desc="DMA Mach";
   Collector,   desc="Collector Mach";
   L1Cache_wCC, desc="L1 Cache Mach with Cache Coherence (used for miss latency profile)";
   L2Cache_wCC, desc="L1 Cache Mach with Cache Coherence (used for miss latency profile)";
@@ -200,6 +226,8 @@ enumeration(MessageSizeType, default="MessageSizeType_Undefined", desc="...") {
   Response_Control, desc="non-data response";
   Writeback_Data, desc="Writeback data";
   Writeback_Control, desc="Writeback control";
+  Broadcast_Control, desc="Broadcast control";
+  Multicast_Control, desc="Multicast control";
   Forwarded_Control, desc="Forwarded control";
   Invalidate_Control, desc="Invalidate control";
   Unblock_Control, desc="Unblock control";
@@ -213,10 +241,11 @@ enumeration(AccessType, desc="...") {
   Write, desc="Writing to cache";
 }
 
-// AccessModeType
-enumeration(AccessModeType, default="AccessModeType_UserMode", desc="...") {
-  SupervisorMode, desc="Supervisor mode";
-  UserMode,       desc="User mode";
+// RubyAccessMode
+enumeration(RubyAccessMode, default="RubyAccessMode_User", desc="...") {
+  Supervisor, desc="Supervisor mode";
+  User,       desc="User mode";
+  Device, desc="Device mode";
 }
 
 enumeration(PrefetchBit, default="PrefetchBit_No", desc="...") {
@@ -226,24 +255,13 @@ enumeration(PrefetchBit, default="PrefetchBit_No", desc="...") {
   L2_HW, desc="This is a L2 hardware prefetch";
 }
 
-// CacheMsg
-structure(CacheMsg, desc="...", interface="Message") {
-  Address LineAddress,       desc="Line address for this request";
-  Address PhysicalAddress,   desc="Physical address for this request";
-  CacheRequestType Type,     desc="Type of request (LD, ST, etc)";
-  Address ProgramCounter,    desc="Program counter of the instruction that caused the miss";
-  AccessModeType AccessMode, desc="user/supervisor access type";
-  int Size,                  desc="size in bytes of access";
-  PrefetchBit Prefetch,      desc="Is this a prefetch request";
-}
-
 // CacheMsg
 structure(SequencerMsg, desc="...", interface="Message") {
   Address LineAddress,       desc="Line address for this request";
   Address PhysicalAddress,   desc="Physical address for this request";
   SequencerRequestType Type,     desc="Type of request (LD, ST, etc)";
   Address ProgramCounter,    desc="Program counter of the instruction that caused the miss";
-  AccessModeType AccessMode, desc="user/supervisor access type";
+  RubyAccessMode AccessMode, desc="user/supervisor access type";
   DataBlock DataBlk,         desc="Data";
   int Len,                   desc="size in bytes of access";
   PrefetchBit Prefetch,      desc="Is this a prefetch request";
@@ -289,54 +307,17 @@ enumeration(MaskPredictorTraining, "MaskPredictorTraining_Undefined", desc="..."
   Both, desc="Both";
 }
 
-// Network Topologies
-enumeration(TopologyType, desc="...") {
-  CROSSBAR, desc="One node per chip, single switch crossbar";
-  HIERARCHICAL_SWITCH, desc="One node per chip, totally ordered hierarchical tree switched network";
-  TORUS_2D, desc="One node per chip, 2D torus";
-  PT_TO_PT, desc="One node per chip, Point to Point Network";
-  FILE_SPECIFIED, desc="described by the file NETWORK_FILE";
-}
-
-// DNUCA AllocationStrategy
-enumeration(AllocationStrategy, desc="...") {
-  InMiddle, desc="";
-  InInvCorners, desc="";
-  InSharedSides, desc="";
-  StaticDist, desc="";
-  RandomBank, desc="";
-  FrequencyBank, desc="";
-  FrequencyBlock, desc="";
-  LRUBlock, desc="";
-}
-
-// DNUCA SearchMechanism
-enumeration(SearchMechanism, desc="...") {
-  Perfect, desc="";
-  PartialTag, desc="";
-  BloomFilter, desc="";
-  Random, desc="";
-  None, desc="";
-}
-
-// DNUCA link type
-enumeration(LinkType, desc="...") {
-  RC_1500UM, desc="";
-  RC_2500UM, desc="";
-  TL_9000UM, desc="";
-  TL_11000UM, desc="";
-  TL_13000UM, desc="";
-  NO_ENERGY, desc="";
+// Request Status
+enumeration(RequestStatus, desc="...", default="RequestStatus_NULL")  {
+  Ready, desc="The sequencer is ready and the request does not alias";
+  Issued, desc="The sequencer successfully issued the request";
+  BufferFull, desc="Can not issue because the sequencer is full";
+  Aliased, desc="This request aliased with a currently outstanding request";
   NULL, desc="";
 }
 
-// transient request type
-enumeration(TransientRequestType, desc="...", default="TransientRequestType_Undefined") {
-  Undefined, desc="";
-  OffChip, desc="";
-  OnChip, desc="";
-  LocalTransient, desc="";
+// LinkDirection
+enumeration(LinkDirection, desc="...") {
+  In, desc="Inward link direction";
+  Out, desc="Outward link direction";
 }
-
-
-