[PATCH v2] time: Fix get_ticks being non-monotonic

Michael Opdenacker michael.opdenacker at bootlin.com
Mon Mar 1 17:40:49 CET 2021


Hi Simon,

I'm back working on this old issue. Thanks for your help with this!

So, SPL support for Atmel/Microchip SAMA5D3 is still broken in the
latest mainline, at least for the Xplained board with the MMC configuration.

My comments and further questions below...

On 11/22/20 12:07 AM, Simon Glass wrote:
> Hi Michael,
>
> On Thu, 19 Nov 2020 at 04:23, Michael Opdenacker
> <michael.opdenacker at bootlin.com> wrote:
>> Hi,
>>
>> Sorry, no messaging quoting, I was not subscribed to the list at that time.
>>
>> Merging this change into master actually broke the SPL on
>> Atmel/Microchip SAMA5D3, at least booting from MMC:
>>
>> RomBOOT
>>
>> <debug_uart>
>> Could not initialize timer (err -11)
>>
>> Could not initialize timer (err -11)
>>
>> Could not initialize timer (err -11)
>> ...
>>
>> I'll look for a fix, but suggestions are welcome!


Now, it's:

Could not initialize timer (err -19)
(-19 is -ENODEV  /* No such device */)

> The board might need CONFIG_TIMER_EARLY, but otherwise I think it is a
> case of figuring out why the timer is used before it is available.


I tried to enable CONFIG_TIMER_EARLY but it fails at link time:

  LD      u-boot
arm-linux-ld.bfd: lib/built-in.o: in function `get_tbclk':
/home/mike/work/git/git.denx.de/u-boot/lib/time.c:70: undefined
reference to `timer_early_get_rate'
arm-linux-ld.bfd: lib/built-in.o: in function `get_ticks':
/home/mike/work/git/git.denx.de/u-boot/lib/time.c:90: undefined
reference to `timer_early_get_count'
make: *** [Makefile:1765: u-boot] Error 1


This is not a surprise, as according to
https://elixir.bootlin.com/u-boot/latest/C/ident/timer_early_get_rate, 
timer_early_get_rate() is not implemented on ARM, only on sandbox
(drivers/timer/sandbox_timer.c) and on x86 (drivers/timer/tsc_timer.c).

So, I'm moving to your second suggestion...


>
> You can use dm_dump_all() to print out available devices and whether
> they are probed.


Done, I added dm_dump_all to lib/time.c right before the panic() message:

 Class     Index  Probed  Driver                Name
-----------------------------------------------------------
 root  0  [ + ]   root_driver  root_driver
 simple_bus  0  [   ]   simple_bus  `-- ahb
 simple_bus  1  [   ]   simple_bus      `-- apb
 mmc  0  [   ]   atmel-mci          |-- mmc at f0000000
 blk  0  [   ]   mmc_blk          |   `-- mmc at f0000000.blk
 mmc  1  [   ]   atmel-mci          |-- mmc at f8000000
 blk  1  [   ]   mmc_blk          |   `-- mmc at f8000000.blk
 serial  0  [   ]   serial_atmel          |-- serial at ffffee00
 pinctrl  0  [   ]   atmel_sama5d3_pinctrl          |-- pinctrl at fffff200
 pinconfig  0  [   ]   pinconfig          |   |-- dbgu
 pinconfig  1  [   ]   pinconfig          |   |   `-- dbgu-0
 pinconfig  2  [   ]   pinconfig          |   |-- mmc0
 pinconfig  3  [   ]   pinconfig          |   |   |-- mmc0_clk_cmd_dat0
 pinconfig  4  [   ]   pinconfig          |   |   |-- mmc0_dat1_3
 pinconfig  5  [   ]   pinconfig          |   |   `-- mmc0_dat4_7
 pinconfig  6  [   ]   pinconfig          |   |-- mmc1
 pinconfig  7  [   ]   pinconfig          |   |   |-- mmc1_clk_cmd_dat0
 pinconfig  8  [   ]   pinconfig          |   |   `-- mmc1_dat1_3
 pinconfig  9  [   ]   pinconfig          |   |-- spi0
 pinconfig  10  [   ]   pinconfig          |   |   `-- spi0-0
 pinconfig  11  [   ]   pinconfig          |   |-- spi1
 pinconfig  12  [   ]   pinconfig          |   |   `-- spi1-0
 pinconfig  13  [   ]   pinconfig          |   `-- board
 pinconfig  14  [   ]   pinconfig          |       |-- mmc0_cd
 pinconfig  15  [   ]   pinconfig          |       `-- mmc1_cd
 gpio  0  [   ]   atmel_at91rm9200_gpio          |-- gpio at fffff200
 gpio  1  [   ]   atmel_at91rm9200_gpio          |-- gpio at fffff400
 gpio  2  [   ]   atmel_at91rm9200_gpio          |-- gpio at fffff600
 gpio  3  [   ]   atmel_at91rm9200_gpio          |-- gpio at fffff800
 gpio  4  [   ]   atmel_at91rm9200_gpio          |-- gpio at fffffa00
 simple_bus  2  [   ]   at91-pmc          `-- pmc at fffffc00
 clk  0  [   ]   at91sam9x5-utmi-clk              |-- utmick
 clk  1  [   ]   at91-master-clk              |-- masterck
 misc  0  [   ]   sam9x5-periph-clk              `-- periphck
 clk  2  [   ]   periph-clk                  |-- dbgu_clk at 2
 clk  3  [   ]   periph-clk                  |-- pioA_clk at 6
 clk  4  [   ]   periph-clk                  |-- pioB_clk at 7
 clk  5  [   ]   periph-clk                  |-- pioC_clk at 8
 clk  6  [   ]   periph-clk                  |-- pioD_clk at 9
 clk  7  [   ]   periph-clk                  |-- pioE_clk at 10
 clk  8  [   ]   periph-clk                  |-- mci0_clk at 21
 clk  9  [   ]   periph-clk                  |-- mci1_clk at 22
 clk  10  [   ]   periph-clk                  |-- spi0_clk at 24
 clk  11  [   ]   periph-clk                  `-- spi1_clk at 25
Could not initialize timer (err -19)

I'm not familiar enough with U-Boot yet (and with SAMA5D3 support
either) to see why the timer device is missing here, but I hope our
Microchip friends can give us further clues...

Thanks again,

Cheers,

Michael.

-- 
Michael Opdenacker, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com



More information about the U-Boot mailing list