From d53d04473e0d6ca1765f1117072eec59187a7f7b Mon Sep 17 00:00:00 2001 From: Andreas Hansson Date: Tue, 28 Aug 2012 14:30:31 -0400 Subject: Clock: Rework clocks to avoid tick-to-cycle transformations This patch introduces the notion of a clock update function that aims to avoid costly divisions when turning the current tick into a cycle. Each clocked object advances a private (hidden) cycle member and a tick member and uses these to implement functions for getting the tick of the next cycle, or the tick of a cycle some time in the future. In the different modules using the clocks, changes are made to avoid counting in ticks only to later translate to cycles. There are a few oddities in how the O3 and inorder CPU count idle cycles, as seen by a few locations where a cycle is subtracted in the calculation. This is done such that the regression does not change any stats, but should be revisited in a future patch. Another, much needed, change that is not done as part of this patch is to introduce a new typedef uint64_t Cycle to be able to at least hint at the unit of the variables counting Ticks vs Cycles. This will be done as a follow-up patch. As an additional follow up, the thread context still uses ticks for the book keeping of last activate and last suspend and this should probably also be changed into cycles as well. --- src/dev/arm/pl111.cc | 16 +++++++++------- src/dev/i8254xGBe.cc | 4 ++-- src/dev/ns_gige.cc | 6 +++--- 3 files changed, 14 insertions(+), 12 deletions(-) (limited to 'src/dev') diff --git a/src/dev/arm/pl111.cc b/src/dev/arm/pl111.cc index d79a1cf39..7990e02ed 100644 --- a/src/dev/arm/pl111.cc +++ b/src/dev/arm/pl111.cc @@ -440,7 +440,7 @@ Pl111::readFramebuffer() schedule(intEvent, nextCycle()); curAddr = 0; - startTime = curTick(); + startTime = curCycle(); maxAddr = static_cast(length * bytesPerPixel); @@ -475,12 +475,12 @@ Pl111::fillFifo() void Pl111::dmaDone() { - Tick maxFrameTime = lcdTiming2.cpl * height * clock; + Tick maxFrameTime = lcdTiming2.cpl * height; --dmaPendingNum; if (maxAddr == curAddr && !dmaPendingNum) { - if ((curTick() - startTime) > maxFrameTime) { + if ((curCycle() - startTime) > maxFrameTime) { warn("CLCD controller buffer underrun, took %d cycles when should" " have taken %d\n", curTick() - startTime, maxFrameTime); lcdRis.underflow = 1; @@ -498,11 +498,13 @@ Pl111::dmaDone() pic->seekp(0); bmp->write(pic); - DPRINTF(PL111, "-- schedule next dma read event at %d tick \n", - maxFrameTime + curTick()); - + // schedule the next read based on when the last frame started + // and the desired fps (i.e. maxFrameTime), we turn the + // argument into a relative number of cycles in the future by + // subtracting curCycle() if (lcdControl.lcden) - schedule(readEvent, nextCycle(startTime + maxFrameTime)); + schedule(readEvent, clockEdge(startTime + maxFrameTime - + curCycle())); } if (dmaPendingNum > (maxOutstandingDma - waterMark)) diff --git a/src/dev/i8254xGBe.cc b/src/dev/i8254xGBe.cc index f7f6a1178..3ba140bce 100644 --- a/src/dev/i8254xGBe.cc +++ b/src/dev/i8254xGBe.cc @@ -2052,7 +2052,7 @@ IGbE::restartClock() { if (!tickEvent.scheduled() && (rxTick || txTick || txFifoTick) && getState() == SimObject::Running) - schedule(tickEvent, (curTick() / ticks(1)) * ticks(1) + ticks(1)); + schedule(tickEvent, clockEdge(1)); } unsigned int @@ -2434,7 +2434,7 @@ IGbE::tick() if (rxTick || txTick || txFifoTick) - schedule(tickEvent, curTick() + ticks(1)); + schedule(tickEvent, curTick() + clockPeriod()); } void diff --git a/src/dev/ns_gige.cc b/src/dev/ns_gige.cc index 6a55516c5..583cdb140 100644 --- a/src/dev/ns_gige.cc +++ b/src/dev/ns_gige.cc @@ -1147,7 +1147,7 @@ NSGigE::rxKick() } // Go to the next state machine clock tick. - rxKickTick = curTick() + ticks(1); + rxKickTick = curTick() + clockPeriod(); } switch(rxDmaState) { @@ -1594,7 +1594,7 @@ NSGigE::txKick() } // Go to the next state machine clock tick. - txKickTick = curTick() + ticks(1); + txKickTick = curTick() + clockPeriod(); } switch(txDmaState) { @@ -2015,7 +2015,7 @@ NSGigE::transferDone() DPRINTF(Ethernet, "transfer complete: data in txFifo...schedule xmit\n"); - reschedule(txEvent, curTick() + ticks(1), true); + reschedule(txEvent, curTick() + clockPeriod(), true); } bool -- cgit v1.2.3