summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/sparc
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2006-07-14 20:11:29 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2006-07-14 20:11:29 +0000
commit0b83afe90a89cf175d29951ab6f8f0e04eccee16 (patch)
tree939d0e1d7fd20dd4e5898408eba76c430d0b0a2c /c/src/lib/libbsp/sparc
parentadded ChangeLog entries for PR1117/1118/1119/1120 (diff)
downloadrtems-0b83afe90a89cf175d29951ab6f8f0e04eccee16.tar.bz2
2006-07-13 Jerry Needell <jerry.needell@unh.edu>
* 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].
Diffstat (limited to 'c/src/lib/libbsp/sparc')
-rw-r--r--c/src/lib/libbsp/sparc/leon3/ChangeLog6
-rw-r--r--c/src/lib/libbsp/sparc/leon3/amba/amba.c26
-rw-r--r--c/src/lib/libbsp/sparc/leon3/clock/ckinit.c44
-rw-r--r--c/src/lib/libbsp/sparc/leon3/include/leon.h28
-rw-r--r--c/src/lib/libbsp/sparc/leon3/timer/timer.c21
5 files changed, 90 insertions, 35 deletions
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 <jerry.needell@unh.edu>
+
+ * 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 <jerry.needell@unh.edu>
* 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 <leon.h>
+#include <bsp.h>
#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 <spacewire.h> */
-
#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 <bsp.h>
+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;