[PATCH] bsps/aarch64/raspberrypi: Add system timer support

Ning Yang yangn0 at qq.com
Thu Apr 11 16:48:07 UTC 2024


Hi Mr. Kinsey Moore,

I will send the patch based on the current RTEMS master as soon as possible.

I am an applicant for GSOC2024 and will continue to improve RPi4 BSP the year. I'm currently working on debugging UART interrupt mode. Please let me know if there's anything I can do to help.

Best regards,

Ning

> 2024年4月12日 00:08,Kinsey Moore <kinsey.moore at oarcorp.com> 写道:
> 
> Ah, that makes sense. If your patch depends on Utkarsh's work, then we'll need to work on getting that into upstream RTEMS as well. If your patch can be rebased on to current RTEMS master, that would be ideal.
> 
> Regarding Utkarsh's work not being merged into RTEMS, patches sometimes slip through the cracks and fail to get the reviews they need to progress to a point where they can be accepted into RTEMS. I'm actually working on Noor's SMP patch for RPi4 (also one of last year's GSoC projects) right now to get it into good condition for merging into RTEMS.
> 
> Kinsey
> 
> On Thu, Apr 11, 2024 at 10:59 AM Ning Yang <yangn0 at qq.com> wrote:
> Hi Mr. Kinsey Moore:
> 
> I am using the RPi4 BSP (project of GSOC2023) written by Utkarsh Verma. For some reason it wasn't merged.
> https://lists.rtems.org/pipermail/devel/2023-August/076152.html
> I got the code from his github: https://github.com/UtkarshVerma/rtems
> 
> Best regards,
> 
> Ning
> 
> > 2024年4月11日 23:22,Kinsey Moore <kinsey.moore at oarcorp.com> 写道:
> > 
> > I couldn't get this patch to apply. Are you sure it came from the right branch and has no merge commits ahead of it?
> > 
> > Kinsey
> > 
> > On Wed, Apr 10, 2024 at 9:24 AM Ning Yang <yangn0 at qq.com> wrote:
> > The clock from the ARM timer is derived from the system clock. This clock can change dynamically e.g. if the system goes into reduced power or in low power mode. Thus the clock speed adapts to the overall system performance capabilities. For accurate timing it is recommended to use the system timers.
> > 
> > if BSP_CLOCK_USE_SYSTEMTIMER = 1, use the System Timer, otherwise use the ARM Timer.
> > ---
> >  .../aarch64/raspberrypi/include/bsp/bcm2711.h | 28 ++++++++++++
> >  .../raspberrypi/include/bsp/raspberrypi.h     | 43 +++++++++++++++++++
> >  bsps/aarch64/raspberrypi/start/bspstartmmu.c  |  8 ++++
> >  spec/build/bsps/aarch64/raspberrypi/bsp4b.yml |  1 +
> >  spec/build/bsps/aarch64/raspberrypi/obj.yml   |  3 ++
> >  .../bsps/aarch64/raspberrypi/objclock.yml     |  4 +-
> >  .../aarch64/raspberrypi/objsystemtimer.yml    | 22 ++++++++++
> >  .../aarch64/raspberrypi/optsystemtimer.yml    | 24 +++++++++++
> >  8 files changed, 132 insertions(+), 1 deletion(-)
> >  create mode 100644 bsps/aarch64/raspberrypi/include/bsp/raspberrypi.h
> >  create mode 100644 spec/build/bsps/aarch64/raspberrypi/objsystemtimer.yml
> >  create mode 100644 spec/build/bsps/aarch64/raspberrypi/optsystemtimer.yml
> > 
> > diff --git a/bsps/aarch64/raspberrypi/include/bsp/bcm2711.h b/bsps/aarch64/raspberrypi/include/bsp/bcm2711.h
> > index e6c77fa025..8707582ebb 100644
> > --- a/bsps/aarch64/raspberrypi/include/bsp/bcm2711.h
> > +++ b/bsps/aarch64/raspberrypi/include/bsp/bcm2711.h
> > @@ -11,6 +11,7 @@
> >  /*
> >   * Copyright (C) 2022 Mohd Noor Aman
> >   * Copyright (C) 2023 Utkarsh Verma
> > + * Copyright (C) 2024 Ning Yang
> >   *
> >   *
> >   * Redistribution and use in source and binary forms, with or without
> > @@ -91,6 +92,27 @@
> >  #define BCM2711_UART5_BASE (BCM2711_PL011_BASE + 0xa00)
> >  #define BCM2711_UART5_SIZE BCM2711_PL011_DEVICE_SIZE
> > 
> > +/* System Timer */
> > +/**
> > + * NOTE: The GPU uses Compare registers 0 and 2 for
> > + *       it's own RTOS. 1 and 3 are available for use in
> > + *       RTEMS.
> > + */
> > +#define BCM2835_GPU_TIMER_BASE    (BCM2711_PERIPHERAL_BASE + 0x2000000+ 0x3000)
> > +#define BCM2835_GPU_TIMER_SIZE    0x1C
> > +
> > +#define BCM2835_GPU_TIMER_CS      (BCM2835_GPU_TIMER_BASE + 0x00)
> > +#define BCM2835_GPU_TIMER_CS_M0   0x00000001
> > +#define BCM2835_GPU_TIMER_CS_M1   0x00000002
> > +#define BCM2835_GPU_TIMER_CS_M2   0x00000004
> > +#define BCM2835_GPU_TIMER_CS_M3   0x00000008
> > +#define BCM2835_GPU_TIMER_CLO     (BCM2835_GPU_TIMER_BASE + 0x04)
> > +#define BCM2835_GPU_TIMER_CHI     (BCM2835_GPU_TIMER_BASE + 0x08)
> > +#define BCM2835_GPU_TIMER_C0      (BCM2835_GPU_TIMER_BASE + 0x0C)
> > +#define BCM2835_GPU_TIMER_C1      (BCM2835_GPU_TIMER_BASE + 0x10)
> > +#define BCM2835_GPU_TIMER_C2      (BCM2835_GPU_TIMER_BASE + 0x14)
> > +#define BCM2835_GPU_TIMER_C3      (BCM2835_GPU_TIMER_BASE + 0x18)
> > +
> >  /* ARM Local */
> >  #define BCM2711_ARM_LOCAL_BASE 0xff800000LL
> >  #define BCM2711_ARM_LOCAL_SIZE 0x800000
> > @@ -114,4 +136,10 @@
> >  #define BCM2711_IRQ_AUX                (BCM2711_IRQ_VC_PERIPHERAL_BASE + 29)
> >  #define BCM2711_IRQ_PL011_UART         (BCM2711_IRQ_VC_PERIPHERAL_BASE + 57)
> > 
> > +/* Interrupt Vectors: System Timer */
> > +#define BCM2835_IRQ_ID_GPU_TIMER_M0    (BCM2711_IRQ_VC_PERIPHERAL_BASE + 0)
> > +#define BCM2835_IRQ_ID_GPU_TIMER_M1    (BCM2711_IRQ_VC_PERIPHERAL_BASE + 1)
> > +#define BCM2835_IRQ_ID_GPU_TIMER_M2    (BCM2711_IRQ_VC_PERIPHERAL_BASE + 2)
> > +#define BCM2835_IRQ_ID_GPU_TIMER_M3    (BCM2711_IRQ_VC_PERIPHERAL_BASE + 3)
> > +
> >  #endif /* LIBBSP_AARCH64_RASPBERRYPI_BSP_BCM2711_H */
> > diff --git a/bsps/aarch64/raspberrypi/include/bsp/raspberrypi.h b/bsps/aarch64/raspberrypi/include/bsp/raspberrypi.h
> > new file mode 100644
> > index 0000000000..2e1c673bfb
> > --- /dev/null
> > +++ b/bsps/aarch64/raspberrypi/include/bsp/raspberrypi.h
> > @@ -0,0 +1,43 @@
> > +/* SPDX-License-Identifier: BSD-2-Clause */
> > +
> > +/**
> > + * @file
> > + *
> > + * @ingroup RTEMSBSPsAArch64RaspberryPi
> > + *
> > + * @brief RaspberryPi shared Register Definitions
> > + */
> > +
> > +/*
> > + * Copyright (C) 2024 Ning Yang
> > + *
> > + *
> > + * 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.
> > + */
> > +
> > +#ifndef LIBBSP_AARCH64_RASPBERRYPI_RASPBERRYPI_H
> > +#define LIBBSP_AARCH64_RASPBERRYPI_RASPBERRYPI_H
> > +
> > +#include <bsp/bcm2711.h>
> > +#define BCM2835_REG(addr)          *(volatile uint32_t*)(addr)
> > +
> > +#endif /* LIBBSP_AARCH64_RASPBERRYPI_RASPBERRYPI_H */
> > \ No newline at end of file
> > diff --git a/bsps/aarch64/raspberrypi/start/bspstartmmu.c b/bsps/aarch64/raspberrypi/start/bspstartmmu.c
> > index d5d1381357..eb59b8f31b 100644
> > --- a/bsps/aarch64/raspberrypi/start/bspstartmmu.c
> > +++ b/bsps/aarch64/raspberrypi/start/bspstartmmu.c
> > @@ -11,6 +11,7 @@
> >  /*
> >   * Copyright (C) 2022 Mohd Noor Aman
> >   * Copyright (C) 2023 Utkarsh Verma
> > + * Copyright (C) 2024 Ning Yang
> >   *
> >   *
> >   * Redistribution and use in source and binary forms, with or without
> > @@ -45,6 +46,7 @@
> >  #include "bsp/irq.h"
> >  #include "bsp/mbox.h"
> >  #include "bsp/rpi-gpio.h"
> > +#include "bsp/bcm2711.h"
> > 
> >  #define CONSOLE_DEVICE_MMU_CONFIG(_port, _file, base, size, ...) \
> >      {.begin = base, .end = base + size, .flags = AARCH64_MMU_DEVICE},
> > @@ -52,6 +54,12 @@
> >  BSP_START_DATA_SECTION static const aarch64_mmu_config_entry
> >      bsp_mmu_config_table[] = {
> >          AARCH64_MMU_DEFAULT_SECTIONS,
> > +        {
> > +            /* System Timer */
> > +            .begin = BCM2835_GPU_TIMER_BASE,
> > +            .end   = BCM2835_GPU_TIMER_BASE + BCM2835_GPU_TIMER_SIZE,
> > +            .flags = AARCH64_MMU_DEVICE,
> > +        },
> > 
> >          /* clang-format off */
> >          CONSOLE_DEVICES(CONSOLE_DEVICE_MMU_CONFIG)
> > diff --git a/spec/build/bsps/aarch64/raspberrypi/bsp4b.yml b/spec/build/bsps/aarch64/raspberrypi/bsp4b.yml
> > index 4347235208..fd1f1ab33f 100644
> > --- a/spec/build/bsps/aarch64/raspberrypi/bsp4b.yml
> > +++ b/spec/build/bsps/aarch64/raspberrypi/bsp4b.yml
> > @@ -17,6 +17,7 @@ includes: []
> >  install:
> >    - destination: ${BSP_INCLUDEDIR}/bsp
> >      source:
> > +      - bsps/aarch64/raspberrypi/include/bsp/raspberrypi.h
> >        - bsps/aarch64/raspberrypi/include/bsp/bcm2711.h
> > 
> >  source: []
> > diff --git a/spec/build/bsps/aarch64/raspberrypi/obj.yml b/spec/build/bsps/aarch64/raspberrypi/obj.yml
> > index 4a320336b7..9692cc955f 100644
> > --- a/spec/build/bsps/aarch64/raspberrypi/obj.yml
> > +++ b/spec/build/bsps/aarch64/raspberrypi/obj.yml
> > @@ -2,6 +2,7 @@ SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
> >  copyrights:
> >    - Copyright (C) 2022 Mohd Noor Aman
> >    - Copyright (C) 2023 Utkarsh Verma
> > +  - Copyright (C) 2024 Ning Yang
> > 
> >  type: build
> >  enabled-by: true
> > @@ -31,6 +32,8 @@ links:
> >      uid: objcache
> >    - role: build-dependency
> >      uid: objclock
> > +  - role: build-dependency
> > +    uid: objsystemtimer
> >    - role: build-dependency
> >      uid: objconsole
> >    - role: build-dependency
> > diff --git a/spec/build/bsps/aarch64/raspberrypi/objclock.yml b/spec/build/bsps/aarch64/raspberrypi/objclock.yml
> > index 550df8029a..317919026e 100644
> > --- a/spec/build/bsps/aarch64/raspberrypi/objclock.yml
> > +++ b/spec/build/bsps/aarch64/raspberrypi/objclock.yml
> > @@ -2,9 +2,11 @@ SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
> >  copyrights:
> >    - Copyright (C) 2022 Mohd Noor Aman
> >    - Copyright (C) 2023 Utkarsh Verma
> > +  - Copyright (C) 2024 Ning Yang
> > 
> >  type: build
> > -enabled-by: true
> > +enabled-by:
> > +  not: BSP_CLOCK_USE_SYSTEMTIMER
> > 
> >  build-type: objects
> >  cflags: []
> > diff --git a/spec/build/bsps/aarch64/raspberrypi/objsystemtimer.yml b/spec/build/bsps/aarch64/raspberrypi/objsystemtimer.yml
> > new file mode 100644
> > index 0000000000..7fc4118d0e
> > --- /dev/null
> > +++ b/spec/build/bsps/aarch64/raspberrypi/objsystemtimer.yml
> > @@ -0,0 +1,22 @@
> > +SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
> > +copyrights:
> > +  - Copyright (C) 2024 Ning Yang
> > +
> > +type: build
> > +enabled-by: 
> > +- BSP_CLOCK_USE_SYSTEMTIMER
> > +
> > +build-type: objects
> > +cflags: []
> > +cppflags: []
> > +cxxflags: []
> > +includes: []
> > +install: []
> > +
> > +source:
> > +  - bsps/shared/dev/clock/bcm2835-system-timer.c
> > +  - bsps/shared/dev/cpucounter/cpucounterfrequency.c
> > +  - bsps/shared/dev/cpucounter/cpucounterread.c
> > +  - bsps/shared/dev/getentropy/getentropy-cpucounter.c
> > +
> > +links: []
> > \ No newline at end of file
> > diff --git a/spec/build/bsps/aarch64/raspberrypi/optsystemtimer.yml b/spec/build/bsps/aarch64/raspberrypi/optsystemtimer.yml
> > new file mode 100644
> > index 0000000000..1cceebf22b
> > --- /dev/null
> > +++ b/spec/build/bsps/aarch64/raspberrypi/optsystemtimer.yml
> > @@ -0,0 +1,24 @@
> > +SPDX-License-Identifier: CC-BY-SA-4.0 OR BSD-2-Clause
> > +copyrights:
> > +  - Copyright (C) 2024 Ning Yang
> > +
> > +type: build
> > +build-type: option
> > +
> > +enabled-by: true
> > +name: BSP_CLOCK_USE_SYSTEMTIMER
> > +description: |
> > +  The clock from the ARM timer is derived from the system clock. This clock can change dynamically e.g. if the system
> > +  goes into reduced power or in low power mode. Thus the clock speed adapts to the overall system performance
> > +  capabilities. For accurate timing it is recommended to use the system timers.
> > +
> > +actions:
> > +  - get-boolean: null
> > +  - define-condition: null
> > +  - env-enable: null
> > +default:
> > +  - enabled-by: 
> > +    - aarch64/raspberrypi4b
> > +    value: false
> > +
> > +links: []
> > \ No newline at end of file
> > -- 
> > 2.34.1
> > 
> > _______________________________________________
> > devel mailing list
> > devel at rtems.org
> > http://lists.rtems.org/mailman/listinfo/devel
> 
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel



More information about the devel mailing list