Ok, just making sure. Congratulations on the paper Ali! :)

Gabe

Steve Reinhardt wrote:
> It's extremely useful... I've been leaning on Ali to get this
> committed so that we can use it at AMD.  I predict that some people
> will switch to M5 just so they can use these features.  You should
> read Ali's forthcoming ISCA paper (hurrah!) to see just how cool this
> is... I'll send you a copy off list.
>
> Steve
>
> On Thu, Feb 26, 2009 at 4:32 PM, Gabe Black <[email protected]> wrote:
>   
>> Should this stuff be in the head? Is it useful outside of your project?
>>
>> Gabe
>>
>> Ali Saidi wrote:
>>     
>>> changeset 2b989b925c9c in /z/repo/m5
>>> details: http://repo.m5sim.org/m5?cmd=changeset;node=2b989b925c9c
>>> description:
>>>       CPA: Add annotations to IGbE and CopyEngine device models.
>>>
>>> diffstat:
>>>
>>> 4 files changed, 227 insertions(+), 5 deletions(-)
>>> src/dev/copy_engine.cc |   17 ++++++++
>>> src/dev/copy_engine.hh |   30 +++++++++++++++
>>> src/dev/i8254xGBe.cc   |   92 
>>> +++++++++++++++++++++++++++++++++++++++++++++++
>>> src/dev/i8254xGBe.hh   |   93 
>>> +++++++++++++++++++++++++++++++++++++++++++++---
>>>
>>> diffs (truncated from 715 to 300 lines):
>>>
>>> diff -r 899ecfbce5af -r 2b989b925c9c src/dev/copy_engine.cc
>>> --- a/src/dev/copy_engine.cc  Thu Feb 26 19:29:17 2009 -0500
>>> +++ b/src/dev/copy_engine.cc  Thu Feb 26 19:29:17 2009 -0500
>>> @@ -34,6 +34,7 @@
>>>
>>>  #include <algorithm>
>>>
>>> +#include "base/cp_annotate.hh"
>>>  #include "base/trace.hh"
>>>  #include "dev/copy_engine.hh"
>>>  #include "mem/packet.hh"
>>> @@ -427,6 +428,8 @@
>>>  void
>>>  CopyEngine::CopyEngineChannel::fetchDescriptor(Addr address)
>>>  {
>>> +    anDq();
>>> +    anBegin("FetchDescriptor");
>>>      DPRINTF(DMACopyEngine, "Reading descriptor from at memory location 
>>> %#x(%#x)\n",
>>>             address, ce->platform->pciToDma(address));
>>>      assert(address);
>>> @@ -455,6 +458,8 @@
>>>              if (inDrain()) return;
>>>              writeCompletionStatus();
>>>          } else {
>>> +            anBegin("Idle");
>>> +            anWait();
>>>              busy = false;
>>>              nextState = Idle;
>>>              inDrain();
>>> @@ -473,6 +478,7 @@
>>>  void
>>>  CopyEngine::CopyEngineChannel::readCopyBytes()
>>>  {
>>> +    anBegin("ReadCopyBytes");
>>>      DPRINTF(DMACopyEngine, "Reading %d bytes from buffer to memory 
>>> location %#x(%#x)\n",
>>>             curDmaDesc->len, curDmaDesc->dest,
>>>             ce->platform->pciToDma(curDmaDesc->src));
>>> @@ -493,6 +499,7 @@
>>>  void
>>>  CopyEngine::CopyEngineChannel::writeCopyBytes()
>>>  {
>>> +    anBegin("WriteCopyBytes");
>>>      DPRINTF(DMACopyEngine, "Writing %d bytes from buffer to memory 
>>> location %#x(%#x)\n",
>>>             curDmaDesc->len, curDmaDesc->dest,
>>>             ce->platform->pciToDma(curDmaDesc->dest));
>>> @@ -513,6 +520,8 @@
>>>      cr.status.compl_desc_addr(lastDescriptorAddr >> 6);
>>>      completionDataReg = cr.status() | 1;
>>>
>>> +    anQ("DMAUsedDescQ", channelId, 1);
>>> +    anQ("AppRecvQ", curDmaDesc->user1, curDmaDesc->len);
>>>      if (curDmaDesc->command & DESC_CTRL_CP_STS) {
>>>          nextState = CompletionWrite;
>>>          if (inDrain()) return;
>>> @@ -529,6 +538,8 @@
>>>      busy = false;
>>>
>>>      if (underReset) {
>>> +        anBegin("Reset");
>>> +        anWait();
>>>          underReset = false;
>>>          refreshNext = false;
>>>          busy = false;
>>> @@ -549,12 +560,15 @@
>>>      } else {
>>>          inDrain();
>>>          nextState = Idle;
>>> +        anWait();
>>> +        anBegin("Idle");
>>>      }
>>>  }
>>>
>>>  void
>>>  CopyEngine::CopyEngineChannel::writeCompletionStatus()
>>>  {
>>> +    anBegin("WriteCompletionStatus");
>>>      DPRINTF(DMACopyEngine, "Writing completion status %#x to address 
>>> %#x(%#x)\n",
>>>              completionDataReg, cr.completionAddr,
>>>              ce->platform->pciToDma(cr.completionAddr));
>>> @@ -574,6 +588,7 @@
>>>  void
>>>  CopyEngine::CopyEngineChannel::fetchNextAddr(Addr address)
>>>  {
>>> +    anBegin("FetchNextAddr");
>>>      DPRINTF(DMACopyEngine, "Fetching next address...\n");
>>>      busy = true;
>>>      cePort->dmaAction(MemCmd::ReadReq, ce->platform->pciToDma(address +
>>> @@ -590,6 +605,8 @@
>>>          DPRINTF(DMACopyEngine, "Got NULL descriptor, nothing more to 
>>> do\n");
>>>          busy = false;
>>>          nextState = Idle;
>>> +        anWait();
>>> +        anBegin("Idle");
>>>          inDrain();
>>>          return;
>>>      }
>>> diff -r 899ecfbce5af -r 2b989b925c9c src/dev/copy_engine.hh
>>> --- a/src/dev/copy_engine.hh  Thu Feb 26 19:29:17 2009 -0500
>>> +++ b/src/dev/copy_engine.hh  Thu Feb 26 19:29:17 2009 -0500
>>> @@ -130,6 +130,36 @@
>>>          void recvCommand();
>>>          bool inDrain();
>>>          void restartStateMachine();
>>> +        inline void anBegin(const char *s)
>>> +        {
>>> +            CPA::cpa()->hwBegin(CPA::FL_NONE, ce->sys,
>>> +                         channelId, "CopyEngine", s);
>>> +        }
>>> +
>>> +        inline void anWait()
>>> +        {
>>> +            CPA::cpa()->hwWe(CPA::FL_NONE, ce->sys,
>>> +                     channelId, "CopyEngine", "DMAUnusedDescQ", channelId);
>>> +        }
>>> +
>>> +        inline void anDq()
>>> +        {
>>> +            CPA::cpa()->hwDq(CPA::FL_NONE, ce->sys,
>>> +                      channelId, "CopyEngine", "DMAUnusedDescQ", 
>>> channelId);
>>> +        }
>>> +
>>> +        inline void anPq()
>>> +        {
>>> +            CPA::cpa()->hwDq(CPA::FL_NONE, ce->sys,
>>> +                      channelId, "CopyEngine", "DMAUnusedDescQ", 
>>> channelId);
>>> +        }
>>> +
>>> +        inline void anQ(const char * s, uint64_t id, int size = 1)
>>> +        {
>>> +            CPA::cpa()->hwQ(CPA::FL_NONE, ce->sys, channelId,
>>> +                    "CopyEngine", s, id, NULL, size);
>>> +        }
>>> +
>>>      };
>>>
>>>    private:
>>> diff -r 899ecfbce5af -r 2b989b925c9c src/dev/i8254xGBe.cc
>>> --- a/src/dev/i8254xGBe.cc    Thu Feb 26 19:29:17 2009 -0500
>>> +++ b/src/dev/i8254xGBe.cc    Thu Feb 26 19:29:17 2009 -0500
>>> @@ -113,10 +113,20 @@
>>>      // Magic happy checksum value
>>>      flash[EEPROM_SIZE-1] = htobe((uint16_t)(EEPROM_CSUM - csum));
>>>
>>> +    // Store the MAC address as queue ID
>>> +    macAddr = p->hardware_address;
>>> +
>>>      rxFifo.clear();
>>>      txFifo.clear();
>>>  }
>>>
>>> +void
>>> +IGbE::init()
>>> +{
>>> +    cpa = CPA::cpa();
>>> +    PciDev::init();
>>> +}
>>> +
>>>  EtherInt*
>>>  IGbE::getEthPort(const std::string &if_name, int idx)
>>>  {
>>> @@ -793,6 +803,13 @@
>>>        pktEvent(this), pktHdrEvent(this), pktDataEvent(this)
>>>
>>>  {
>>> +    annSmFetch = "RX Desc Fetch";
>>> +    annSmWb = "RX Desc Writeback";
>>> +    annUnusedDescQ = "RX Unused Descriptors";
>>> +    annUnusedCacheQ = "RX Unused Descriptor Cache";
>>> +    annUsedCacheQ = "RX Used Descriptor Cache";
>>> +    annUsedDescQ = "RX Used Descriptors";
>>> +    annDescQ = "RX Descriptors";
>>>  }
>>>
>>>  void
>>> @@ -910,6 +927,8 @@
>>>      RxDesc *desc;
>>>      desc = unusedCache.front();
>>>
>>> +    igbe->anBegin("RXS", "Update Desc");
>>> +
>>>      uint16_t crcfixup = igbe->regs.rctl.secrc() ? 0 : 4 ;
>>>      DPRINTF(EthernetDesc, "pktPtr->length: %d bytesCopied: %d stripcrc 
>>> offset: %d value written: %d %d\n",
>>>              pktPtr->length, bytesCopied, crcfixup,
>>> @@ -1052,8 +1071,11 @@
>>>      enableSm();
>>>      pktDone = true;
>>>
>>> +    igbe->anBegin("RXS", "Done Updating Desc");
>>>      DPRINTF(EthernetDesc, "Processing of this descriptor complete\n");
>>> +    igbe->anDq("RXS", annUnusedCacheQ);
>>>      unusedCache.pop_front();
>>> +    igbe->anQ("RXS", annUsedCacheQ);
>>>      usedCache.push_back(desc);
>>>  }
>>>
>>> @@ -1112,6 +1134,13 @@
>>>         useTso(false), pktEvent(this), headerEvent(this), nullEvent(this)
>>>
>>>  {
>>> +    annSmFetch = "TX Desc Fetch";
>>> +    annSmWb = "TX Desc Writeback";
>>> +    annUnusedDescQ = "TX Unused Descriptors";
>>> +    annUnusedCacheQ = "TX Unused Descriptor Cache";
>>> +    annUsedCacheQ = "TX Used Descriptor Cache";
>>> +    annUsedDescQ = "TX Used Descriptors";
>>> +    annDescQ = "TX Descriptors";
>>>  }
>>>
>>>  void
>>> @@ -1154,7 +1183,9 @@
>>>
>>>          TxdOp::setDd(desc);
>>>          unusedCache.pop_front();
>>> +        igbe->anDq("TXS", annUnusedCacheQ);
>>>          usedCache.push_back(desc);
>>> +        igbe->anQ("TXS", annUsedCacheQ);
>>>      }
>>>
>>>      if (!unusedCache.size())
>>> @@ -1298,6 +1329,8 @@
>>>      assert(unusedCache.size());
>>>      assert(pktPtr);
>>>
>>> +    igbe->anBegin("TXS", "Update Desc");
>>> +
>>>      DPRINTF(EthernetDesc, "DMA of packet complete\n");
>>>
>>>
>>> @@ -1323,7 +1356,9 @@
>>>              (pktPtr->length < ( tsoMss + tsoHeaderLen) &&
>>>               tsoTotalLen != tsoUsedLen && useTso)) {
>>>          assert(!useTso || (tsoDescBytesUsed == TxdOp::getLen(desc)));
>>> +        igbe->anDq("TXS", annUnusedCacheQ);
>>>          unusedCache.pop_front();
>>> +        igbe->anQ("TXS", annUsedCacheQ);
>>>          usedCache.push_back(desc);
>>>
>>>          tsoDescBytesUsed = 0;
>>> @@ -1441,7 +1476,9 @@
>>>
>>>      if (!useTso ||  TxdOp::getLen(desc) == tsoDescBytesUsed) {
>>>          DPRINTF(EthernetDesc, "Descriptor Done\n");
>>> +        igbe->anDq("TXS", annUnusedCacheQ);
>>>          unusedCache.pop_front();
>>> +        igbe->anQ("TXS", annUsedCacheQ);
>>>          usedCache.push_back(desc);
>>>          tsoDescBytesUsed = 0;
>>>      }
>>> @@ -1458,14 +1495,17 @@
>>>      tsoPktHasHeader = false;
>>>
>>>      if (igbe->regs.txdctl.wthresh() == 0) {
>>> +        igbe->anBegin("TXS", "Desc Writeback");
>>>          DPRINTF(EthernetDesc, "WTHRESH == 0, writing back descriptor\n");
>>>          writeback(0);
>>>      } else if (igbe->regs.txdctl.gran() && igbe->regs.txdctl.wthresh() >=
>>>              descInBlock(usedCache.size())) {
>>>          DPRINTF(EthernetDesc, "used > WTHRESH, writing back descriptor\n");
>>> +        igbe->anBegin("TXS", "Desc Writeback");
>>>          writeback((igbe->cacheBlockSize()-1)>>4);
>>>      } else if (igbe->regs.txdctl.wthresh() >= usedCache.size()) {
>>>          DPRINTF(EthernetDesc, "used > WTHRESH, writing back descriptor\n");
>>> +        igbe->anBegin("TXS", "Desc Writeback");
>>>          writeback((igbe->cacheBlockSize()-1)>>4);
>>>      }
>>>
>>> @@ -1604,6 +1644,7 @@
>>>      else
>>>          changeState(Drained);
>>>
>>> +    DPRINTF(EthernetSM, "got drain() returning %d", count);
>>>      return count;
>>>  }
>>>
>>> @@ -1617,6 +1658,7 @@
>>>      rxTick = true;
>>>
>>>      restartClock();
>>> +    DPRINTF(EthernetSM, "resuming from drain");
>>>  }
>>>
>>>  void
>>> @@ -1625,6 +1667,7 @@
>>>      if (!drainEvent)
>>>          return;
>>>
>>> +    DPRINTF(EthernetSM, "checkDrain() in drain\n");
>>>      txFifoTick = false;
>>>      txTick = false;
>>>      rxTick = false;
>>> @@ -1651,11 +1694,13 @@
>>>                   && !txDescCache.packetMultiDesc() && txPacket->length) {
>>>          bool success;
>>>
>>> +        anQ("TXS", "TX FIFO Q");
>>>          DPRINTF(EthernetSM, "TXS: packet placed in TX FIFO\n");
>>>          success = txFifo.push(txPacket);
>>>          txFifoTick = true && !drainEvent;
>>>          assert(success);
>>>          txPacket = NULL;
>>> _______________________________________________
>>> m5-dev mailing list
>>> [email protected]
>>> http://m5sim.org/mailman/listinfo/m5-dev
>>>
>>>       
>> _______________________________________________
>> m5-dev mailing list
>> [email protected]
>> http://m5sim.org/mailman/listinfo/m5-dev
>>
>>     
> _______________________________________________
> m5-dev mailing list
> [email protected]
> http://m5sim.org/mailman/listinfo/m5-dev
>   

_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to