diff options
Diffstat (limited to 'c/src/lib/libbsp/sparc/leon3/clock/ckinit.c')
-rw-r--r-- | c/src/lib/libbsp/sparc/leon3/clock/ckinit.c | 44 |
1 files changed, 34 insertions, 10 deletions
diff --git a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c index bd6746bf17..6e439c6868 100644 --- a/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c +++ b/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c @@ -30,13 +30,17 @@ * The Real Time Clock Counter Timer uses this trap type. */ +extern rtems_configuration_table Configuration; + +#define LEON3_CLOCK_INDEX (Configuration.User_multiprocessing_table ? LEON3_Cpu_Index : 0) + #define CLOCK_VECTOR LEON_TRAP_TYPE( LEON_INTERRUPT_TIMER1 ) /* * Clock ticks since initialization */ -volatile uint32_t Clock_driver_ticks; +volatile rtems_unsigned32 Clock_driver_ticks; volatile LEON3_Timer_Regs_Map *LEON3_Timer_Regs = 0; static int clkirq; @@ -47,7 +51,7 @@ static int clkirq; * the simulator. */ -extern uint32_t CPU_SPARC_CLICKS_PER_TICK; +extern rtems_unsigned32 CPU_SPARC_CLICKS_PER_TICK; rtems_isr_entry Old_ticker; @@ -60,7 +64,6 @@ void Clock_exit( void ); rtems_device_major_number rtems_clock_major = ~0; rtems_device_minor_number rtems_clock_minor; - /* * Clock_isr * @@ -124,19 +127,40 @@ void Install_clock( rtems_isr_entry clock_isr ) { + int i; + unsigned int iobar, conf; + Clock_driver_ticks = 0; + /* Find GP Timer */ + + i = 0; + while (i < amba_conf.apbslv.devnr) + { + conf = amba_get_confword(amba_conf.apbslv, i, 0); + if ((amba_vendor(conf) == VENDOR_GAISLER) && (amba_device(conf) == GAISLER_GPTIMER)) + { + iobar = amba_apb_get_membar(amba_conf.apbslv, i); + LEON3_Timer_Regs = (volatile LEON3_Timer_Regs_Map *) amba_iobar_start(amba_conf.apbmst, iobar); + break; + } + i++; + } clkirq = (LEON3_Timer_Regs->status & 0xfc) >> 3; + /* MP */ + if (Configuration.User_multiprocessing_table != NULL) + { + clkirq += LEON3_Cpu_Index; + } + if ( BSP_Configuration.ticks_per_timeslice ) { - Old_ticker = (rtems_isr_entry) - set_vector( clock_isr, LEON_TRAP_TYPE(clkirq), 1 ); + Old_ticker = (rtems_isr_entry) set_vector( clock_isr, LEON_TRAP_TYPE(clkirq), 1 ); - LEON3_Timer_Regs->reload_t0 = CPU_SPARC_CLICKS_PER_TICK - 1; + LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].reload = CPU_SPARC_CLICKS_PER_TICK - 1; - LEON3_Timer_Regs->conf_t0 = LEON3_GPTIMER_EN | LEON3_GPTIMER_RL | - LEON3_GPTIMER_LD | LEON3_GPTIMER_IRQEN; + LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].conf = LEON3_GPTIMER_EN | LEON3_GPTIMER_RL | LEON3_GPTIMER_LD | LEON3_GPTIMER_IRQEN; atexit( Clock_exit ); } @@ -162,7 +186,7 @@ void Clock_exit( void ) if ( BSP_Configuration.ticks_per_timeslice ) { LEON_Mask_interrupt(LEON_TRAP_TYPE(clkirq)); - LEON3_Timer_Regs->conf_t0 = 0; + LEON3_Timer_Regs->timer[LEON3_CLOCK_INDEX].conf = 0; /* do not restore old vector */ } @@ -226,7 +250,7 @@ rtems_device_driver Clock_control( void *pargp ) { - uint32_t isrlevel; + rtems_unsigned32 isrlevel; rtems_libio_ioctl_args_t *args = pargp; |