qemu-arm
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH for-5.1] hw/arm/nrf51_soc: Set system_clock_scale


From: Philippe Mathieu-Daudé
Subject: Re: [PATCH for-5.1] hw/arm/nrf51_soc: Set system_clock_scale
Date: Mon, 3 Aug 2020 17:18:05 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.5.0

On 7/27/20 9:34 PM, Peter Maydell wrote:
> The nrf51 SoC model wasn't setting the system_clock_scale
> global.which meant that if guest code used the systick timer in "use
> the processor clock" mode it would hang because time never advances.
> 
> Set the global to match the documented CPU clock speed for this SoC.
> 
> This SoC in fact doesn't have a SysTick timer (which is the only thing
> currently that cares about the system_clock_scale), because it's
> a configurable option in the Cortex-M0. However our Cortex-M0 and
> thus our nrf51 and our micro:bit board do provide a SysTick, so
> we ought to provide a functional one rather than a broken one.
> 
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
> Tested with 'make check'/'make check-acceptance' only.
> 
>  hw/arm/nrf51_soc.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/hw/arm/nrf51_soc.c b/hw/arm/nrf51_soc.c
> index 45e6cc97d70..e15981e019f 100644
> --- a/hw/arm/nrf51_soc.c
> +++ b/hw/arm/nrf51_soc.c
> @@ -32,6 +32,9 @@
>  
>  #define BASE_TO_IRQ(base) ((base >> 12) & 0x1F)
>  
> +/* HCLK (the main CPU clock) on this SoC is always 16MHz */
> +#define HCLK_FRQ 16000000
> +
>  static uint64_t clock_read(void *opaque, hwaddr addr, unsigned int size)
>  {
>      qemu_log_mask(LOG_UNIMP, "%s: 0x%" HWADDR_PRIx " [%u]\n",
> @@ -65,6 +68,8 @@ static void nrf51_soc_realize(DeviceState *dev_soc, Error 
> **errp)
>          return;
>      }
>  
> +    system_clock_scale = NANOSECONDS_PER_SECOND / HCLK_FRQ;

So nice when the datasheet is available, and even listed at the top of
the file!

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

> +
>      object_property_set_link(OBJECT(&s->cpu), "memory", 
> OBJECT(&s->container),
>                               &error_abort);
>      if (!sysbus_realize(SYS_BUS_DEVICE(&s->cpu), errp)) {
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]