From 0b83afe90a89cf175d29951ab6f8f0e04eccee16 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Fri, 14 Jul 2006 20:11:29 +0000 Subject: 2006-07-13 Jerry Needell * clock/ckinit.c, include/leon.h, timer/timer.c, amba/amba.c fixed up merge from 4.6.6. Correct references to LEON3_IrqCtrl_Regs_Map.mask[x] and LEON3_Timer_Regs_Map.timer[x]. --- c/src/lib/libbsp/sparc/leon3/ChangeLog | 6 ++++ c/src/lib/libbsp/sparc/leon3/amba/amba.c | 26 +++++++++++++++-- c/src/lib/libbsp/sparc/leon3/clock/ckinit.c | 44 ++++++++++++++++++++++------- c/src/lib/libbsp/sparc/leon3/include/leon.h | 28 +++++++++--------- c/src/lib/libbsp/sparc/leon3/timer/timer.c | 21 ++++++++------ 5 files changed, 90 insertions(+), 35 deletions(-) (limited to 'c/src/lib/libbsp/sparc') diff --git a/c/src/lib/libbsp/sparc/leon3/ChangeLog b/c/src/lib/libbsp/sparc/leon3/ChangeLog index 3a33f8a030..081989146c 100644 --- a/c/src/lib/libbsp/sparc/leon3/ChangeLog +++ b/c/src/lib/libbsp/sparc/leon3/ChangeLog @@ -1,3 +1,9 @@ +2006-07-13 Jerry Needell + + * clock/ckinit.c, include/leon.h, timer/timer.c, amba/amba.c + fixed up merge from 4.6.6. Correct references to + LEON3_IrqCtrl_Regs_Map.mask[x] and LEON3_Timer_Regs_Map.timer[x]. + 2006-07-12 Jerry Needell * amba/amba.c, clock/ckinit.c, include/amba.h, timer/timer.c: Search diff --git a/c/src/lib/libbsp/sparc/leon3/amba/amba.c b/c/src/lib/libbsp/sparc/leon3/amba/amba.c index f9fd786771..ffcabf0497 100644 --- a/c/src/lib/libbsp/sparc/leon3/amba/amba.c +++ b/c/src/lib/libbsp/sparc/leon3/amba/amba.c @@ -13,7 +13,7 @@ * $Id$ */ -#include +#include #define amba_insert_device(tab, address) \ { \ @@ -31,6 +31,9 @@ amba_confarea_type amba_conf; /* Pointers to Interrupt Controller configuration registers */ volatile LEON3_IrqCtrl_Regs_Map *LEON3_IrqCtrl_Regs; +int LEON3_Cpu_Index = 0; +static int apb_init = 0; + /* * bsp_leon3_predriver_hook * @@ -41,12 +44,23 @@ volatile LEON3_IrqCtrl_Regs_Map *LEON3_IrqCtrl_Regs; * amba_ahb_masters, amba_ahb_slaves and amba. */ +unsigned int getasr17(); + +asm(" .text \n" + "getasr17: \n" + "retl \n" + "mov %asr17, %o0\n" +); + + +extern rtems_configuration_table Configuration; void bsp_leon3_predriver_hook(void) { unsigned int *cfg_area; /* address to configuration area */ unsigned int mbar, iobar, conf; int i, j; + unsigned int tmp; amba_conf.ahbmst.devnr = 0; amba_conf.ahbslv.devnr = 0; amba_conf.apbslv.devnr = 0; cfg_area = (unsigned int *) (LEON3_IO_AREA | LEON3_CONF_AREA); @@ -68,7 +82,8 @@ void bsp_leon3_predriver_hook(void) { conf = amba_get_confword(amba_conf.ahbslv, i, 0); mbar = amba_ahb_get_membar(amba_conf.ahbslv, i, 0); - if ((amba_vendor(conf) == VENDOR_GAISLER) && (amba_device(conf) == GAISLER_APBMST)) + if ((amba_vendor(conf) == VENDOR_GAISLER) && (amba_device(conf) == GAISLER_APBMST) && + (apb_init == 0)) { amba_conf.apbmst = amba_membar_start(mbar); cfg_area = (unsigned int *) (amba_conf.apbmst | LEON3_CONF_AREA); @@ -77,6 +92,7 @@ void bsp_leon3_predriver_hook(void) amba_insert_device(&amba_conf.apbslv, cfg_area); cfg_area += LEON3_APB_CONF_WORDS; } + apb_init = 1; } } @@ -89,6 +105,12 @@ void bsp_leon3_predriver_hook(void) { iobar = amba_apb_get_membar(amba_conf.apbslv, i); LEON3_IrqCtrl_Regs = (volatile LEON3_IrqCtrl_Regs_Map *) amba_iobar_start(amba_conf.apbmst, iobar); + /* asm("mov %%asr17, %0": : "r" (tmp)); */ + if (Configuration.User_multiprocessing_table != NULL) + { + tmp = getasr17(); + LEON3_Cpu_Index = (tmp >> 28) & 3; + } break; } i++; 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; diff --git a/c/src/lib/libbsp/sparc/leon3/include/leon.h b/c/src/lib/libbsp/sparc/leon3/include/leon.h index d0efb1ee07..e90b2f5950 100644 --- a/c/src/lib/libbsp/sparc/leon3/include/leon.h +++ b/c/src/lib/libbsp/sparc/leon3/include/leon.h @@ -26,7 +26,7 @@ extern "C" { #endif -#define LEON_INTERRUPT_EXTERNAL_1 5 +#define LEON_INTERRUPT_EXTERNAL_1 5 #ifndef ASM /* @@ -293,23 +293,24 @@ extern int LEON3_Cpu_Index; (LEON3_IrqCtrl_Regs.ipend & (1 << (_source))) #define LEON_Is_interrupt_masked( _source ) \ - (LEON3_IrqCtrl_Regs.mask_p0 & (1 << (_source))) + do {\ + (LEON3_IrqCtrl_Regs.mask[LEON3_Cpu_Index] & (1 << (_source))); \ + } while (0) + #define LEON_Mask_interrupt( _source ) \ do { \ uint32_t _level; \ - \ _level = sparc_disable_interrupts(); \ - LEON3_IrqCtrl_Regs->mask_p0 &= ~(1 << (_source)); \ + LEON3_IrqCtrl_Regs->mask[LEON3_Cpu_Index] &= ~(1 << (_source)); \ sparc_enable_interrupts( _level ); \ } while (0) #define LEON_Unmask_interrupt( _source ) \ do { \ uint32_t _level; \ - \ _level = sparc_disable_interrupts(); \ - LEON3_IrqCtrl_Regs->mask_p0 |= (1 << (_source)); \ + LEON3_IrqCtrl_Regs->mask[LEON3_Cpu_Index] |= (1 << (_source)); \ sparc_enable_interrupts( _level ); \ } while (0) @@ -317,10 +318,9 @@ extern int LEON3_Cpu_Index; do { \ uint32_t _level; \ uint32_t _mask = 1 << (_source); \ - \ _level = sparc_disable_interrupts(); \ - (_previous) = LEON3_IrqCtrl_Regs->mask_p0; \ - LEON3_IrqCtrl_Regs->mask_p0 = _previous & ~_mask; \ + (_previous) = LEON3_IrqCtrl_Regs->mask[LEON3_Cpu_Index]; \ + LEON3_IrqCtrl_Regs->mask[LEON3_Cpu_Index] = _previous & ~_mask; \ sparc_enable_interrupts( _level ); \ (_previous) &= _mask; \ } while (0) @@ -329,13 +329,13 @@ extern int LEON3_Cpu_Index; do { \ uint32_t _level; \ uint32_t _mask = 1 << (_source); \ - \ _level = sparc_disable_interrupts(); \ - LEON3_IrqCtrl_Regs->mask_p0 = \ - (LEON3_IrqCtrl_Regs->mask_p0 & ~_mask) | (_previous); \ + LEON3_IrqCtrl_Regs->mask[LEON3_Cpu_Index] = \ + (LEON3_IrqCtrl_Regs->mask[LEON3_Cpu_Index] & ~_mask) | (_previous); \ sparc_enable_interrupts( _level ); \ } while (0) + /* * Each timer control register is organized as follows: * @@ -367,9 +367,6 @@ extern int LEON3_Cpu_Index; #define LEON_REG_TIMER_COUNTER_DEFINED_MASK 0x00000003 #define LEON_REG_TIMER_COUNTER_CURRENT_MODE_MASK 0x00000003 -/* XXX really needed but I can't get it to install -- JRS */ -/* #include */ - #endif /* !ASM */ #ifdef __cplusplus @@ -377,4 +374,5 @@ extern int LEON3_Cpu_Index; #endif #endif /* !_INCLUDE_LEON_h */ +/* end of include file */ diff --git a/c/src/lib/libbsp/sparc/leon3/timer/timer.c b/c/src/lib/libbsp/sparc/leon3/timer/timer.c index 04ff40d5aa..d9a0f8b6b3 100644 --- a/c/src/lib/libbsp/sparc/leon3/timer/timer.c +++ b/c/src/lib/libbsp/sparc/leon3/timer/timer.c @@ -22,28 +22,33 @@ #include +extern rtems_configuration_table Configuration; + +#define LEON3_TIMER_INDEX \ + (Configuration.User_multiprocessing_table ? \ + (Configuration.User_multiprocessing_table)->maximum_nodes + \ + (Configuration.User_multiprocessing_table)->node - 1 : 1) + rtems_boolean Timer_driver_Find_average_overhead; rtems_boolean Timer_driver_Is_initialized = FALSE; extern volatile LEON3_Timer_Regs_Map *LEON3_Timer_Regs; - void Timer_initialize() { - /* * Timer runs long and accurate enough not to require an interrupt. */ if (LEON3_Timer_Regs) { if ( Timer_driver_Is_initialized == FALSE ) { /* approximately 1 us per countdown */ - LEON3_Timer_Regs->reload_t1 = 0xffffff; - LEON3_Timer_Regs->value_t1 = 0xffffff; + LEON3_Timer_Regs->timer[LEON3_TIMER_INDEX].reload = 0xffffff; + LEON3_Timer_Regs->timer[LEON3_TIMER_INDEX].value = 0xffffff; } else { Timer_driver_Is_initialized = TRUE; } - LEON3_Timer_Regs->conf_t1 = LEON3_GPTIMER_EN | LEON3_GPTIMER_LD; + LEON3_Timer_Regs->timer[LEON3_TIMER_INDEX].conf = LEON3_GPTIMER_EN | LEON3_GPTIMER_LD; } } @@ -53,10 +58,10 @@ void Timer_initialize() int Read_timer() { - uint32_t total; + rtems_unsigned32 total; if (LEON3_Timer_Regs) { - total = LEON3_Timer_Regs->value_t1; + total = LEON3_Timer_Regs->timer[LEON3_TIMER_INDEX].value; total = 0xffffff - total; @@ -65,7 +70,7 @@ int Read_timer() if ( total < LEAST_VALID ) return 0; /* below timer resolution */ - + return total - AVG_OVERHEAD; } return 0; -- cgit v1.2.3