mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-05 15:15:44 +00:00
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].
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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++;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user