diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-09-19 09:12:02 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-09-19 10:57:27 +0200 |
commit | ec28f31138bd0becb9d199c51369b8cba2951ab7 (patch) | |
tree | 7bbf2c9453674d98559ec1573cf7eaba5440bd11 /c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c | |
parent | bsp/qoriq: Add early debug output initialization (diff) | |
download | rtems-ec28f31138bd0becb9d199c51369b8cba2951ab7.tar.bz2 |
bsp/qoriq: Add decrementer clock driver
Update #3085.
Diffstat (limited to 'c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c')
-rw-r--r-- | c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c | 51 |
1 files changed, 45 insertions, 6 deletions
diff --git a/c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c b/c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c index ca61d255d3..82d8b8c57f 100644 --- a/c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c +++ b/c/src/lib/libbsp/powerpc/qoriq/clock/clock-config.c @@ -7,7 +7,7 @@ */ /* - * Copyright (c) 2011, 2016 embedded brains GmbH. All rights reserved. + * Copyright (c) 2011, 2017 embedded brains GmbH. All rights reserved. * * embedded brains GmbH * Dornierstr. 4 @@ -31,6 +31,45 @@ /* This is defined in clockdrv_shell.h */ static rtems_isr Clock_isr(void *arg); +static struct timecounter qoriq_clock_tc; + +#ifdef QORIQ_IS_HYPERVISOR_GUEST + +#define CLOCK_DRIVER_USE_ONLY_BOOT_PROCESSOR + +void qoriq_decrementer_dispatch(void) +{ + PPC_SET_SPECIAL_PURPOSE_REGISTER(BOOKE_TSR, BOOKE_TSR_DIS); + Clock_isr(NULL); +} + +static uint32_t qoriq_clock_get_timecount(struct timecounter *tc) +{ + return ppc_alternate_time_base(); +} + +static void qoriq_clock_initialize(void) +{ + uint64_t frequency = bsp_time_base_frequency; + uint32_t us_per_tick = rtems_configuration_get_microseconds_per_tick(); + uint32_t interval = (uint32_t) ((frequency * us_per_tick) / 1000000); + + PPC_SET_SPECIAL_PURPOSE_REGISTER(BOOKE_DECAR, interval - 1); + PPC_SET_SPECIAL_PURPOSE_REGISTER_BITS( + BOOKE_TCR, + BOOKE_TCR_DIE | BOOKE_TCR_ARE + ); + ppc_set_decrementer_register(interval - 1); + + qoriq_clock_tc.tc_get_timecount = qoriq_clock_get_timecount; + qoriq_clock_tc.tc_counter_mask = 0xffffffff; + qoriq_clock_tc.tc_frequency = qoriq_clock_frequency; + qoriq_clock_tc.tc_quality = RTEMS_TIMECOUNTER_QUALITY_CLOCK_DRIVER; + rtems_timecounter_install(&qoriq_clock_tc); +} + +#else /* !QORIQ_IS_HYPERVISOR_GUEST */ + static volatile qoriq_pic_global_timer *const qoriq_clock = #if QORIQ_CLOCK_TIMER < 4 &qoriq.pic.gta [QORIQ_CLOCK_TIMER]; @@ -47,8 +86,6 @@ static volatile qoriq_pic_global_timer *const qoriq_timecounter = #define CLOCK_INTERRUPT (QORIQ_IRQ_GT_BASE + QORIQ_CLOCK_TIMER) -static struct timecounter qoriq_clock_tc; - static void qoriq_clock_handler_install(void) { rtems_status_code sc = RTEMS_SUCCESSFUL; @@ -123,9 +160,6 @@ static void qoriq_clock_cleanup(void) } } -#define Clock_driver_support_initialize_hardware() \ - qoriq_clock_initialize() - #define Clock_driver_support_install_isr(clock_isr) \ qoriq_clock_handler_install() @@ -135,5 +169,10 @@ static void qoriq_clock_cleanup(void) #define Clock_driver_support_shutdown_hardware() \ qoriq_clock_cleanup() +#endif /* QORIQ_IS_HYPERVISOR_GUEST */ + +#define Clock_driver_support_initialize_hardware() \ + qoriq_clock_initialize() + /* Include shared source clock driver code */ #include "../../../shared/clockdrv_shell.h" |