OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_52/] [or1ksim/] [tick/] [tick.c] - Diff between revs 1350 and 1365

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 1350 Rev 1365
Line 59... Line 59...
  mtspr(SPR_TTCR, 0);
  mtspr(SPR_TTCR, 0);
  mtspr(SPR_TTMR, 0);
  mtspr(SPR_TTMR, 0);
}
}
 
 
/* Job handler for tick timer */
/* Job handler for tick timer */
void tick_job (int param)
void tick_job (void *param)
{
{
  int mode = (ttmr & SPR_TTMR_M) >> 30;
  int mode = (ttmr & SPR_TTMR_M) >> 30;
  /*debug (7, "tick_job%i, param %i\n", param, mode);*/
  /*debug (7, "tick_job%i, param %i\n", param, mode);*/
  switch (mode) {
  switch (mode) {
  case 1:
  case 1:
    if (!param) {
    if (!param) {
      sprs[SPR_TTCR] = ttcr = 0;
      sprs[SPR_TTCR] = ttcr = 0;
      cycles_start = runtime.sim.cycles - ttcr;
      cycles_start = runtime.sim.cycles - ttcr;
      SCHED_ADD(tick_job, 0, runtime.sim.cycles + (ttmr & SPR_TTMR_PERIOD) - ttcr);
      SCHED_ADD(tick_job, (void *)0, runtime.sim.cycles + (ttmr & SPR_TTMR_PERIOD) - ttcr);
    }
    }
  case 2:
  case 2:
    if (ttmr & SPR_TTMR_IE) {
    if (ttmr & SPR_TTMR_IE) {
      setsprbits(SPR_TTMR, SPR_TTMR_IP, 1);
      setsprbits(SPR_TTMR, SPR_TTMR_IP, 1);
      /* be sure not to issue timer exception if an exception occured before it */
      /* be sure not to issue timer exception if an exception occured before it */
      if (((mfspr(SPR_SR) & SPR_SR_TEE) == SPR_SR_TEE) && (!pending.valid))
      if (((mfspr(SPR_SR) & SPR_SR_TEE) == SPR_SR_TEE) && (!pending.valid))
        except_handle(EXCEPT_TICK, mfspr(SPR_EEAR_BASE));
        except_handle(EXCEPT_TICK, mfspr(SPR_EEAR_BASE));
      else
      else
        /* If TEE is currently not set we have to pend tick exception
        /* If TEE is currently not set we have to pend tick exception
           by rescheduling. */
           by rescheduling. */
        SCHED_ADD(tick_job, 1, runtime.sim.cycles + 1);
        SCHED_ADD(tick_job, (void *)1, runtime.sim.cycles + 1);
    }
    }
    break;
    break;
  }
  }
}
}
 
 
Line 92... Line 92...
{
{
  unsigned mode = (ttmr & SPR_TTMR_M) >> 30;
  unsigned mode = (ttmr & SPR_TTMR_M) >> 30;
  /*debug (7, "ttcr = %08x\n", value);*/
  /*debug (7, "ttcr = %08x\n", value);*/
  ttcr = value;
  ttcr = value;
  /* Remove previous if it exists */
  /* Remove previous if it exists */
  SCHED_FIND_REMOVE(tick_job, 0);
  SCHED_FIND_REMOVE(tick_job, (void *)0);
  SCHED_FIND_REMOVE(tick_job, 1);
  SCHED_FIND_REMOVE(tick_job, (void *)1);
  if (mode == 1 || mode == 2) {
  if (mode == 1 || mode == 2) {
    SCHED_ADD(tick_job, 0, runtime.sim.cycles + (ttmr & SPR_TTMR_PERIOD) - ttcr);
    SCHED_ADD(tick_job, (void *)0, runtime.sim.cycles + (ttmr & SPR_TTMR_PERIOD) - ttcr);
    cycles_start = runtime.sim.cycles - ttcr;
    cycles_start = runtime.sim.cycles - ttcr;
  }
  }
}
}
 
 
void spr_write_ttmr (unsigned long value)
void spr_write_ttmr (unsigned long value)
Line 107... Line 107...
  /*debug (7, "ttmr = %08x\n", value);*/
  /*debug (7, "ttmr = %08x\n", value);*/
  ttmr = value;
  ttmr = value;
  /* Handle the modes properly. */
  /* Handle the modes properly. */
  switch((ttmr & SPR_TTMR_M) >> 30) {
  switch((ttmr & SPR_TTMR_M) >> 30) {
    case 0:    /* Timer is disabled */
    case 0:    /* Timer is disabled */
      SCHED_FIND_REMOVE(tick_job, 0);
      SCHED_FIND_REMOVE(tick_job, (void *)0);
      SCHED_FIND_REMOVE(tick_job, 1);
      SCHED_FIND_REMOVE(tick_job, (void *)1);
      break;
      break;
    case 1:    /* Timer should auto restart */
    case 1:    /* Timer should auto restart */
      sprs[SPR_TTCR] = ttcr = 0;
      sprs[SPR_TTCR] = ttcr = 0;
      cycles_start = runtime.sim.cycles;
      cycles_start = runtime.sim.cycles;
      SCHED_FIND_REMOVE(tick_job, 0);
      SCHED_FIND_REMOVE(tick_job, (void *)0);
      SCHED_FIND_REMOVE(tick_job, 1);
      SCHED_FIND_REMOVE(tick_job, (void *)1);
      SCHED_ADD(tick_job, 0, runtime.sim.cycles + (ttmr & SPR_TTMR_PERIOD) - ttcr);
      SCHED_ADD(tick_job, (void *)0, runtime.sim.cycles + (ttmr & SPR_TTMR_PERIOD) - ttcr);
      break;
      break;
    case 2:    /* Stop the timer when match */
    case 2:    /* Stop the timer when match */
      SCHED_FIND_REMOVE(tick_job, 0);
      SCHED_FIND_REMOVE(tick_job, (void *)0);
      SCHED_FIND_REMOVE(tick_job, 1);
      SCHED_FIND_REMOVE(tick_job, (void *)1);
      break;
      break;
    case 3:    /* Timer keeps running -- do nothing*/
    case 3:    /* Timer keeps running -- do nothing*/
      break;
      break;
  }
  }
}
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.