From d813d9aa7513eff88e370309829e7d6faf982c2d Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 26 Mar 2018 06:24:55 +0200 Subject: bsps/powerpc: Move dec clock driver to bsps This patch is a part of the BSP source reorganization. Update #3285. --- c/src/lib/libcpu/powerpc/Makefile.am | 15 -- c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c | 266 ------------------------ 2 files changed, 281 deletions(-) delete mode 100644 c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c (limited to 'c/src/lib/libcpu') diff --git a/c/src/lib/libcpu/powerpc/Makefile.am b/c/src/lib/libcpu/powerpc/Makefile.am index f61524f496..1c15f2cc59 100644 --- a/c/src/lib/libcpu/powerpc/Makefile.am +++ b/c/src/lib/libcpu/powerpc/Makefile.am @@ -40,13 +40,6 @@ if ppc405 endif # ppc405 if mpc6xx - -# mpc6xx/clock -noinst_PROGRAMS += mpc6xx/clock.rel -mpc6xx_clock_rel_SOURCES = mpc6xx/clock/c_clock.c mpc6xx/clock/c_clock.h -mpc6xx_clock_rel_CPPFLAGS = $(AM_CPPFLAGS) -mpc6xx_clock_rel_LDFLAGS = $(RTEMS_RELLDFLAGS) - # mpc6xx/altivec noinst_PROGRAMS += mpc6xx/altivec.rel mpc6xx_altivec_rel_SOURCES = mpc6xx/altivec/vec_sup.c mpc6xx/altivec/vec_sup_asm.S @@ -55,12 +48,4 @@ mpc6xx_altivec_rel_LDFLAGS = $(RTEMS_RELLDFLAGS) endif EXTRA_DIST += mpc6xx/altivec/README -# e500/clock -if e500_clock -noinst_PROGRAMS += e500/clock.rel -e500_clock_rel_SOURCES = mpc6xx/clock/c_clock.c mpc6xx/clock/c_clock.h -e500_clock_rel_CPPFLAGS = $(AM_CPPFLAGS) -e500_clock_rel_LDFLAGS = $(RTEMS_RELLDFLAGS) -endif - include $(top_srcdir)/../../../automake/local.am diff --git a/c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c b/c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c deleted file mode 100644 index c9bb16c451..0000000000 --- a/c/src/lib/libcpu/powerpc/mpc6xx/clock/c_clock.c +++ /dev/null @@ -1,266 +0,0 @@ -/** - * @brief Clock Tick Device Driver - * - * This routine utilizes the Decrementer Register common to the PPC family. - * - * The tick frequency is directly programmed to the configured number of - * microseconds per tick. - */ - -/* - * COPYRIGHT (c) 1989-2014. - * On-Line Applications Research Corporation (OAR). - * - * The license and distribution terms for this file may in - * the file LICENSE in this distribution or at - * http://www.rtems.org/license/LICENSE. - * - * Modified to support the MPC750. - * Modifications Copyright (c) 1999 Eric Valette valette@crf.canon.fr - */ - -#include -#include -#include -#include /* for atexit() */ -#include -#include -#include -#include -#include /* for printk() */ -#include -#include -#include - -#include /* for CLOCK_DRIVER_USE_FAST_IDLE */ - -SPR_RW(BOOKE_TCR) -SPR_RW(BOOKE_TSR) -SPR_RW(BOOKE_DECAR) - -extern int BSP_connect_clock_handler (void); - -/* - * Clock ticks since initialization - */ -volatile uint32_t Clock_driver_ticks; - -/* - * This is the value programmed into the count down timer. - */ -static uint32_t Clock_Decrementer_value; - -static struct timecounter Clock_TC; - -static uint32_t Clock_Get_timecount(struct timecounter *tc) -{ - return ppc_time_base(); -} - -void clockOff(void* unused) -{ - rtems_interrupt_level l; - - if ( ppc_cpu_is_bookE() ) { - rtems_interrupt_disable(l); - _write_BOOKE_TCR(_read_BOOKE_TCR() & ~BOOKE_TCR_DIE); - rtems_interrupt_enable(l); - } else { - /* - * Nothing to do as we cannot disable all interrupts and - * the decrementer interrupt enable is MSR_EE - */ - } -} - -void clockOn(void* unused) -{ - rtems_interrupt_level l; - - PPC_Set_decrementer( Clock_Decrementer_value ); - - if ( ppc_cpu_is_bookE() ) { - _write_BOOKE_DECAR( Clock_Decrementer_value ); - - rtems_interrupt_disable(l); - - /* clear pending/stale irq */ - _write_BOOKE_TSR( BOOKE_TSR_DIS ); - /* enable */ - _write_BOOKE_TCR( _read_BOOKE_TCR() | BOOKE_TCR_DIE ); - - rtems_interrupt_enable(l); - - } -} - -static void clockHandler(void) -{ - #if (CLOCK_DRIVER_USE_FAST_IDLE == 1) - rtems_interrupt_level level; - uint32_t tb; - - rtems_interrupt_disable(level); - - tb = ppc_time_base(); - rtems_timecounter_tick(); - - while ( _Thread_Heir == _Thread_Executing && _Thread_Executing->is_idle ) { - tb += Clock_Decrementer_value; - ppc_set_time_base( tb ); - rtems_timecounter_tick(); - } - - rtems_interrupt_enable(level); - #else - rtems_timecounter_tick(); - #endif -} - -static void (*clock_handler)(void); - -/* - * Clock_isr - * - * This is the clock tick interrupt handler. - * - * Input parameters: - * vector - vector number - * - * Output parameters: NONE - * - * Return values: NONE - * - */ -void clockIsr(void *unused) -{ - int decr; - - /* - * The driver has seen another tick. - */ - do { - register uint32_t flags; - - rtems_interrupt_disable(flags); - __asm__ volatile ( - "mfdec %0; add %0, %0, %1; mtdec %0" - : "=&r"(decr) - : "r"(Clock_Decrementer_value) - ); - rtems_interrupt_enable(flags); - - Clock_driver_ticks += 1; - /* - * Real Time Clock counter/timer is set to automatically reload. - */ - clock_handler(); - } while ( decr < 0 ); -} - -/* - * Clock_isr_bookE - * - * This is the clock tick interrupt handler - * for bookE CPUs. For efficiency reasons we - * provide a separate handler rather than - * checking the CPU type each time. - */ -void clockIsrBookE(void *unused) -{ - /* Note: TSR bit has already been cleared in the exception handler */ - - /* - * The driver has seen another tick. - */ - - Clock_driver_ticks += 1; - - /* - * Real Time Clock counter/timer is set to automatically reload. - */ - clock_handler(); -} - -int clockIsOn(void* unused) -{ - uint32_t msr_value; - - _CPU_MSR_GET( msr_value ); - - if ( ppc_cpu_is_bookE() && ! (_read_BOOKE_TCR() & BOOKE_TCR_DIE) ) - msr_value = 0; - - if (msr_value & MSR_EE) return 1; - - return 0; -} - -/* - * Clock_exit - * - * This routine allows the clock driver to exit by masking the interrupt and - * disabling the clock's counter. - */ -void Clock_exit( void ) -{ - (void) BSP_disconnect_clock_handler (); -} - -/* - * Clock_initialize - * - * This routine initializes the clock driver. - */ -rtems_device_driver Clock_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *pargp -) -{ - rtems_interrupt_level l,tcr; - - Clock_Decrementer_value = (BSP_bus_frequency/BSP_time_base_divisor)* - rtems_configuration_get_milliseconds_per_tick(); - - /* set the decrementer now, prior to installing the handler - * so no interrupts will happen in a while. - */ - PPC_Set_decrementer( (unsigned)-1 ); - - /* On a bookE CPU the decrementer works differently. It doesn't - * count past zero but we can enable auto-reload :-) - */ - if ( ppc_cpu_is_bookE() ) { - - rtems_interrupt_disable(l); - - tcr = _read_BOOKE_TCR(); - tcr |= BOOKE_TCR_ARE; - tcr &= ~BOOKE_TCR_DIE; - _write_BOOKE_TCR(tcr); - - rtems_interrupt_enable(l); - } - - Clock_TC.tc_get_timecount = Clock_Get_timecount; - Clock_TC.tc_counter_mask = 0xffffffff; - Clock_TC.tc_frequency = (UINT64_C(1000) * BSP_bus_frequency) / BSP_time_base_divisor; - Clock_TC.tc_quality = RTEMS_TIMECOUNTER_QUALITY_CLOCK_DRIVER; - rtems_timecounter_install(&Clock_TC); - - /* - * If a decrementer exception was pending, it is cleared by - * executing the default (nop) handler at this point; - * The next exception will then be taken by our clock handler. - * Clock handler installation initializes the decrementer to - * the correct value. - */ - clock_handler = clockHandler; - if (!BSP_connect_clock_handler ()) { - printk("Unable to initialize system clock\n"); - rtems_fatal_error_occurred(1); - } - - return RTEMS_SUCCESSFUL; -} /* Clock_initialize */ -- cgit v1.2.3