summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/sparc/leon3/clock/ckinit.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/sparc/leon3/clock/ckinit.c')
-rw-r--r--c/src/lib/libbsp/sparc/leon3/clock/ckinit.c44
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;