summaryrefslogtreecommitdiffstats
path: root/bsps/arm/shared
diff options
context:
space:
mode:
authorKinsey Moore <kinsey.moore@oarcorp.com>2020-08-27 22:07:52 -0500
committerJoel Sherrill <joel@rtems.org>2020-10-05 16:11:39 -0500
commit1480c3f5e8a7c376cde4eff5699d76672d3d901f (patch)
treef18e07dfd3a6bf9362f96bc3bde5ded616ca0835 /bsps/arm/shared
parentspec: Add missing spintrcritical24 definition (diff)
downloadrtems-1480c3f5e8a7c376cde4eff5699d76672d3d901f.tar.bz2
bsps: Break out AArch32 portions of GPT driver
This breaks AArch32-specific portions of the ARM GPT driver into their own file so that the generic code can be moved for reuse by other architectures.
Diffstat (limited to 'bsps/arm/shared')
-rw-r--r--bsps/arm/shared/clock/arm-generic-timer-aarch32.c74
-rw-r--r--bsps/arm/shared/clock/clock-generic-timer.c211
2 files changed, 74 insertions, 211 deletions
diff --git a/bsps/arm/shared/clock/arm-generic-timer-aarch32.c b/bsps/arm/shared/clock/arm-generic-timer-aarch32.c
new file mode 100644
index 0000000000..a187bbba6f
--- /dev/null
+++ b/bsps/arm/shared/clock/arm-generic-timer-aarch32.c
@@ -0,0 +1,74 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup RTEMSBSPsARMShared
+ *
+ * @brief ARM-specific clock driver functions.
+ */
+
+/*
+ * Copyright (C) 2020 On-Line Applications Research Corporation (OAR)
+ * Written by Kinsey Moore <kinsey.moore@oarcorp.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <libcpu/arm-cp15.h>
+#include <dev/clock/arm-generic-timer.h>
+
+uint64_t arm_gt_clock_get_compare_value(void)
+{
+#ifdef ARM_GENERIC_TIMER_USE_VIRTUAL
+ return arm_cp15_get_counter_pl1_virtual_compare_value();
+#else
+ return arm_cp15_get_counter_pl1_physical_compare_value();
+#endif
+}
+
+void arm_gt_clock_set_compare_value(uint64_t cval)
+{
+#ifdef ARM_GENERIC_TIMER_USE_VIRTUAL
+ arm_cp15_set_counter_pl1_virtual_compare_value(cval);
+#else
+ arm_cp15_set_counter_pl1_physical_compare_value(cval);
+#endif
+}
+
+uint64_t arm_gt_clock_get_count(void)
+{
+#ifdef ARM_GENERIC_TIMER_USE_VIRTUAL
+ return arm_cp15_get_counter_virtual_count();
+#else
+ return arm_cp15_get_counter_physical_count();
+#endif
+}
+
+void arm_gt_clock_set_control(uint32_t ctl)
+{
+#ifdef ARM_GENERIC_TIMER_USE_VIRTUAL
+ arm_cp15_set_counter_pl1_virtual_timer_control(ctl);
+#else
+ arm_cp15_set_counter_pl1_physical_timer_control(ctl);
+#endif
+}
diff --git a/bsps/arm/shared/clock/clock-generic-timer.c b/bsps/arm/shared/clock/clock-generic-timer.c
deleted file mode 100644
index 072583473e..0000000000
--- a/bsps/arm/shared/clock/clock-generic-timer.c
+++ /dev/null
@@ -1,211 +0,0 @@
-/*
- * Copyright (c) 2017 embedded brains GmbH. All rights reserved.
- *
- * embedded brains GmbH
- * Dornierstr. 4
- * 82178 Puchheim
- * Germany
- * <info@embedded-brains.de>
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rtems.org/license/LICENSE.
- */
-
-#include <bsp.h>
-#include <bsp/fatal.h>
-#include <bsp/irq.h>
-#include <bsp/irq-generic.h>
-
-#include <rtems/counter.h>
-#include <rtems/sysinit.h>
-#include <rtems/timecounter.h>
-#include <rtems/score/smpimpl.h>
-
-#include <libcpu/arm-cp15.h>
-
-/*
- * Clock driver using the ARMv7-AR Generic Timer. The BSP must provide the
- * following function via <bsp.h>:
- *
- * void arm_generic_timer_get_config(uint32_t *frequency, uint32_t *irq);
- *
- * The BSP may optionally define ARM_GENERIC_TIMER_USE_VIRTUAL in <bsp.h> to
- * use the virtual timer instead of the physical timer.
- */
-
-typedef struct {
- struct timecounter tc;
- uint32_t interval;
- rtems_vector_number irq;
-} arm_gt_clock_context;
-
-static arm_gt_clock_context arm_gt_clock_instance;
-
-/* This is defined in dev/clock/clockimpl.h */
-void Clock_isr(rtems_irq_hdl_param arg);
-
-static inline uint64_t arm_gt_clock_get_compare_value(void)
-{
-#ifdef ARM_GENERIC_TIMER_USE_VIRTUAL
- return arm_cp15_get_counter_pl1_virtual_compare_value();
-#else
- return arm_cp15_get_counter_pl1_physical_compare_value();
-#endif
-}
-
-static inline void arm_gt_clock_set_compare_value(uint64_t cval)
-{
-#ifdef ARM_GENERIC_TIMER_USE_VIRTUAL
- arm_cp15_set_counter_pl1_virtual_compare_value(cval);
-#else
- arm_cp15_set_counter_pl1_physical_compare_value(cval);
-#endif
-}
-
-static inline uint64_t arm_gt_clock_get_count(void)
-{
-#ifdef ARM_GENERIC_TIMER_USE_VIRTUAL
- return arm_cp15_get_counter_virtual_count();
-#else
- return arm_cp15_get_counter_physical_count();
-#endif
-}
-
-static inline void arm_gt_clock_set_control(uint32_t ctl)
-{
-#ifdef ARM_GENERIC_TIMER_USE_VIRTUAL
- arm_cp15_set_counter_pl1_virtual_timer_control(ctl);
-#else
- arm_cp15_set_counter_pl1_physical_timer_control(ctl);
-#endif
-}
-
-static void arm_gt_clock_at_tick(void)
-{
- uint64_t cval;
- uint32_t interval;
-
- interval = arm_gt_clock_instance.interval;
- cval = arm_gt_clock_get_compare_value();
- cval += interval;
- arm_gt_clock_set_compare_value(cval);
-#ifdef ARM_GENERIC_TIMER_UNMASK_AT_TICK
- arm_gt_clock_set_control(0x1);
-#endif /* ARM_GENERIC_TIMER_UNMASK_AT_TICK */
-}
-
-static void arm_gt_clock_handler_install(void)
-{
- rtems_status_code sc;
-
- sc = rtems_interrupt_handler_install(
- arm_gt_clock_instance.irq,
- "Clock",
- RTEMS_INTERRUPT_UNIQUE,
- (rtems_interrupt_handler) Clock_isr,
- NULL
- );
- if (sc != RTEMS_SUCCESSFUL) {
- bsp_fatal(BSP_ARM_FATAL_GENERIC_TIMER_CLOCK_IRQ_INSTALL);
- }
-}
-
-static uint32_t arm_gt_clock_get_timecount(struct timecounter *tc)
-{
- return (uint32_t) arm_gt_clock_get_count();
-}
-
-static void arm_gt_clock_gt_init(uint64_t cval)
-{
- arm_gt_clock_set_compare_value(cval);
- arm_gt_clock_set_control(0x1);
-}
-
-#if defined(RTEMS_SMP) && !defined(CLOCK_DRIVER_USE_ONLY_BOOT_PROCESSOR)
-static void arm_gt_clock_secondary_action(void *arg)
-{
- uint64_t *cval;
-
- cval = arg;
- arm_gt_clock_gt_init(*cval);
- bsp_interrupt_vector_enable(arm_gt_clock_instance.irq);
-}
-#endif
-
-static void arm_gt_clock_secondary_initialization(uint64_t cval)
-{
-#if defined(RTEMS_SMP) && !defined(CLOCK_DRIVER_USE_ONLY_BOOT_PROCESSOR)
- _SMP_Broadcast_action(arm_gt_clock_secondary_action, &cval);
-#endif
-}
-
-static void arm_gt_clock_initialize(void)
-{
- uint64_t frequency;
- uint64_t us_per_tick;
- uint32_t interval;
- uint64_t cval;
- struct timecounter *tc;
-
- tc = &arm_gt_clock_instance.tc;
- frequency = tc->tc_frequency;
- us_per_tick = rtems_configuration_get_microseconds_per_tick();
- interval = (uint32_t) ((frequency * us_per_tick) / 1000000);
- cval = arm_gt_clock_get_count();
- cval += interval;
- arm_gt_clock_instance.interval = interval;
-
- arm_gt_clock_gt_init(cval);
- arm_gt_clock_secondary_initialization(cval);
-
- tc->tc_get_timecount = arm_gt_clock_get_timecount;
- tc->tc_counter_mask = 0xffffffff;
- tc->tc_quality = RTEMS_TIMECOUNTER_QUALITY_CLOCK_DRIVER;
- rtems_timecounter_install(tc);
-}
-
-uint32_t _CPU_Counter_frequency(void)
-{
- return (uint32_t) arm_gt_clock_instance.tc.tc_frequency;
-}
-
-CPU_Counter_ticks _CPU_Counter_read(void)
-{
- return (uint32_t) arm_gt_clock_get_count();
-}
-
-static void arm_gt_clock_early_init(void)
-{
- uint32_t frequency;
- arm_gt_clock_set_control(0x3);
-
- arm_generic_timer_get_config(
- &frequency,
- &arm_gt_clock_instance.irq
- );
-
- /*
- * Used by _CPU_Counter_frequency() before arm_gt_clock_initialize() is
- * called.
- */
- arm_gt_clock_instance.tc.tc_frequency = frequency;
-}
-
-RTEMS_SYSINIT_ITEM(
- arm_gt_clock_early_init,
- RTEMS_SYSINIT_CPU_COUNTER,
- RTEMS_SYSINIT_ORDER_FIRST
-);
-
-#define Clock_driver_support_at_tick() \
- arm_gt_clock_at_tick()
-
-#define Clock_driver_support_initialize_hardware() \
- arm_gt_clock_initialize()
-
-#define Clock_driver_support_install_isr(isr) \
- arm_gt_clock_handler_install()
-
-/* Include shared source clock driver code */
-#include "../../shared/dev/clock/clockimpl.h"