From 1f02c05c6dfa34266ac8b142578c3e5eb4fbcae2 Mon Sep 17 00:00:00 2001 From: Stuart Ianna Date: Fri, 10 May 2024 12:08:03 +1000 Subject: [PATCH] arch/litex/litex_arch_alarm: Support tickless schedular with arch alarm. This provides an alternate tickless scheduling method, which uses the riscv mtimer as a timebase, allowing the time and timeh registers to used throughout an application. The exiting tickless method, using Litex's timer0 has been left in place, as it is a more performant option, but currently has the potential issue identified in #11189. --- arch/risc-v/src/litex/Make.defs | 4 ++ arch/risc-v/src/litex/litex_arch_alarm.c | 56 +++++++++++++++++++ .../arty_a7/configs/knsh-tickless/defconfig | 2 + 3 files changed, 62 insertions(+) create mode 100644 arch/risc-v/src/litex/litex_arch_alarm.c diff --git a/arch/risc-v/src/litex/Make.defs b/arch/risc-v/src/litex/Make.defs index f3bfabac1b..653bba416f 100644 --- a/arch/risc-v/src/litex/Make.defs +++ b/arch/risc-v/src/litex/Make.defs @@ -38,7 +38,11 @@ CHIP_ASRCS += litex_cache.S ifeq ($(CONFIG_SCHED_TICKLESS),y) +ifeq ($(CONFIG_SCHED_TICKLESS_ALARM),y) +CHIP_CSRCS += litex_arch_alarm.c +else CHIP_CSRCS += litex_tickless.c +endif else CHIP_CSRCS += litex_ticked.c endif diff --git a/arch/risc-v/src/litex/litex_arch_alarm.c b/arch/risc-v/src/litex/litex_arch_alarm.c new file mode 100644 index 0000000000..e3621ae9b4 --- /dev/null +++ b/arch/risc-v/src/litex/litex_arch_alarm.c @@ -0,0 +1,56 @@ +/**************************************************************************** + * arch/risc-v/src/litex/litex_arch_alarm.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include +#include + +#include "chip.h" +#include "litex_clockconfig.h" +#include "riscv_internal.h" +#include "riscv_mtimer.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Function: up_timer_initialize + * + * Description: + * This function is called during start-up to initialize + * the timer interrupt. + * + ****************************************************************************/ + +void up_timer_initialize(void) +{ + struct oneshot_lowerhalf_s *lower + = riscv_mtimer_initialize(LITEX_CLINT_MTIME, LITEX_CLINT_MTIMECMP, + RISCV_IRQ_TIMER, litex_get_hfclk()); + + DEBUGASSERT(lower); + + up_alarm_set_lowerhalf(lower); +} diff --git a/boards/risc-v/litex/arty_a7/configs/knsh-tickless/defconfig b/boards/risc-v/litex/arty_a7/configs/knsh-tickless/defconfig index 83a307a6cf..eab2dece6d 100644 --- a/boards/risc-v/litex/arty_a7/configs/knsh-tickless/defconfig +++ b/boards/risc-v/litex/arty_a7/configs/knsh-tickless/defconfig @@ -8,6 +8,7 @@ # CONFIG_DEBUG_OPT_UNUSED_SECTIONS is not set # CONFIG_NSH_DISABLE_LOSMART is not set # CONFIG_STANDARD_SERIAL is not set +CONFIG_ALARM_ARCH=y CONFIG_ARCH="risc-v" CONFIG_ARCH_ADDRENV=y CONFIG_ARCH_BOARD="arty_a7" @@ -61,6 +62,7 @@ CONFIG_NFILE_DESCRIPTORS_PER_BLOCK=6 CONFIG_NSH_FILEIOSIZE=512 CONFIG_NSH_FILE_APPS=y CONFIG_NSH_READLINE=y +CONFIG_ONESHOT=y CONFIG_PATH_INITIAL="/system/bin" CONFIG_RAM_SIZE=4194304 CONFIG_RAM_START=0x40400000