image: Fix various test failures
Subsystems (2)
cover image: Fix various test failures
Recent changes have broken the FIT and vboot tests. Also the SPI tests have been wrong since before the last release and were disabled.
This series collects together the required fixes.
Note: The FIT and vboot tests are hard to run (in that each requires manual effort). At some point we should be able to bring these into Stephen Warren's test framework.
Simon Glass (16):
image: Correct the OS location code to work on sandbox Revert "image-fit: Fix signature checking"
image: Fix FIT and vboot tests to exit sandbox correctly
trace: Fix compiler warnings in trace
lib: Don't instrument the div64 function
trace: Improve the trace test number recognition
timer: Support tracing fully
timer: Provide an early timer
timer: Set up the real timer after driver model is available
sandbox: timer: Support the early timer
sandbox: Correct ordering of defconfig
sandbox: Enable the early timer
sandbox: spi: Add more debugging to SPI emulation
sandbox: spi: Remove an incorrect free()
spi: Correct two error return values
spi: Re-enable the SPI flash tests
cmd/trace.c | 4 ++-- common/board_f.c | 6 ++++++ common/board_r.c | 14 ++++++++++++-- common/bootm.c | 2 +- common/image-fit.c | 16 +++++++++++++--- configs/sandbox_defconfig | 11 ++++++----- drivers/mtd/spi/sandbox.c | 14 ++++++++++---- drivers/mtd/spi/sf_probe.c | 4 +--- drivers/mtd/spi/spi_flash.c | 2 +- drivers/timer/Kconfig | 10 ++++++++++ drivers/timer/sandbox_timer.c | 14 ++++++++++++-- drivers/timer/timer-uclass.c | 6 +++--- include/image.h | 5 +---- include/timer.h | 21 +++++++++++++++++++++ lib/div64.c | 3 ++- lib/time.c | 28 +++++++++++++++++++++------- test/dm/Makefile | 4 ++-- test/image/test-fit.py | 4 ++++ test/trace/test-trace.sh | 4 +++- test/vboot/sandbox-u-boot.dts | 3 +++ 20 files changed, 134 insertions(+), 41 deletions(-)
Signature · 1 line
2.7.0.rc3.207.g0ac5344
PATCH 1/16 image: Correct the OS location code to work on sandbox
A recent change broke the 'bootm' command on sandbox. The root cause is using a pointer as an address. Conversion from pointer to address needs to use map_to_sysmem() so that sandbox can do the right thing. The problem was pre-existing but uncovered by a recent commit.
Fix this. Also move fit_get_end() to the C file to avoid needing to include mapmem.h (and thus asm/io.h) everywhere.
---
common/bootm.c | 2 +- common/image-fit.c | 5 +++++ include/image.h | 5 +---- 3 files changed, 7 insertions(+), 5 deletions(-)
common/bootm.c +1 -1
@@ -201,7 +201,7 @@ static int bootm_find_os(cmd_tbl_t *cmdtp, int flag, int argc, images.ep += images.os.load; } - images.os.start = (ulong )os_hdr; + images.os.start =map_to_sysmem (os_hdr);return 0 ; }
common/image-fit.c +5 -0
@@ -851,6 +851,11 @@ static int fit_image_hash_get_ignore(const void *fit, int noffset, int *ignore)return 0 ; } +ulong fit_get_end (const void *fit) +{ +return map_to_sysmem ((void *)(fit +fdt_totalsize (fit))); +} +/** * fit_set_timestamp - set node timestamp property * @fit: pointer to the FIT format image header
include/image.h +1 -4
@@ -818,10 +818,7 @@ static inline ulong fit_get_size(const void *fit)* returns: * end address of the FIT image (blob) in memory */ -static inline ulong fit_get_end (const void *fit) -{ -return (ulong )fit +fdt_totalsize (fit); -} +ulong fit_get_end (const void *fit);/** * fit_get_name - get FIT node name
Signature · 1 line
2.7.0.rc3.207.g0ac5344
PATCH 2/16 Revert "image-fit: Fix signature checking"
In reply to Simon GlassThis reverts commit 84ca65aa4bd0d03867e9e49805201d0564d3ffb0.
On signature verification failures fit_image_verify() should NOT exit with error. Only keys marked 'required' can cause image verification failure. This logic is already there and works correctly.
Add a comment to make this clear.
---
common/image-fit.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
common/image-fit.c +8 -3
@@ -1035,10 +1035,15 @@ int fit_image_verify(const void *fit, int image_noffset) strlen(FIT_SIG_NODENAME))) { ret =fit_image_check_sig (fit, noffset, data, size,-1 , &err_msg); -if (ret) { + +/* +* Show an indication on failure, but do not return +* an error. Only keys marked 'required' can cause +* an image validation failure. See the call to +* fit_image_verify_required_sigs() above. +*/ +if (ret)puts ("- " ); - goto error; - }else puts ("+ " ); }
Signature · 1 line
2.7.0.rc3.207.g0ac5344
PATCH 3/16 image: Fix FIT and vboot tests to exit sandbox correctly
In reply to Simon GlassWhen used with a device tree, sandbox now requires a 'reset' controller. Add this to the device trees so that reset works and the tests can complete.
---
test/image/test-fit.py | 4 ++++ test/vboot/sandbox-u-boot.dts | 3 +++ 2 files changed, 7 insertions(+)
test/image/test-fit.py +4 -0
@@ -108,6 +108,10 @@ base_fdt = ''' model = "Sandbox Verified Boot Test"; compatible = "sandbox"; + reset at 0 { + compatible = "sandbox,reset"; + }; + }; '''
test/vboot/sandbox-u-boot.dts +3 -0
@@ -4,4 +4,7 @@ model = "Sandbox Verified Boot Test"; compatible = "sandbox"; + reset at 0 { + compatible = "sandbox,reset"; + }; };
Signature · 1 line
2.7.0.rc3.207.g0ac5344
PATCH 4/16 trace: Fix compiler warnings in trace
In reply to Simon GlassWith min() we must use the same type for each parameter. Fix two problems in trace.c which produce compiler warnings.
---
cmd/trace.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
cmd/trace.c +2 -2
@@ -43,7 +43,7 @@ static int create_func_list(int argc, char * const argv[]) err =trace_list_functions (buff + buff_ptr, avail, &needed);if (err)printf ("Error: truncated (%#x bytes needed)\n" , needed); - used =min (avail, needed); + used =min (avail, (size_t )needed);printf ("Function trace dumped to %08lx, size %#zx\n" , (ulong )map_to_sysmem (buff + buff_ptr), used);setenv_hex ("profbase" ,map_to_sysmem (buff));
@@ -67,7 +67,7 @@ static int create_call_list(int argc, char * const argv[]) err =trace_list_calls (buff + buff_ptr, avail, &needed);if (err)printf ("Error: truncated (%#x bytes needed)\n" , needed); - used =min (avail, needed); + used =min (avail, (size_t )needed);printf ("Call list dumped to %08lx, size %#zx\n" , (ulong )map_to_sysmem (buff + buff_ptr), used);
Signature · 1 line
2.7.0.rc3.207.g0ac5344
PATCH 4/16 trace: Fix compiler warnings in trace
Quoted 9 lines · Simon Glass
With
min()we must use the same type for each parameter. Fix two problems intrace.cwhich produce compiler warnings.Signed-off-by Simon Glass <[email protected]>---
cmd/trace.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
PATCH 5/16 lib: Don't instrument the div64 function
In reply to Simon GlassThis function can be called from the timer code on instrumented functions. Mark it as 'notrace' so that it doesn't cause infinite recursion.
---
lib/div64.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
lib/div64.c +2 -1
@@ -18,8 +18,9 @@#include <div64.h> #include <linux/types.h> +#include <linux/compiler.h> -uint32_t __div64_32 (uint64_t *n,uint32_t base) +uint32_t notrace __div64_32(uint64_t *n, uint32_t base) {uint64_t rem = *n;uint64_t b = base;
Signature · 1 line
2.7.0.rc3.207.g0ac5344
PATCH 5/16 lib: Don't instrument the div64 function
Quoted 9 lines · Simon Glass
This function can be called from the timer code on instrumented functions. Mark it as 'notrace' so that it doesn't cause infinite recursion.
Signed-off-by Simon Glass <[email protected]>---
lib/div64.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
PATCH 6/16 trace: Improve the trace test number recognition
In reply to Simon GlassThe awk tool can be confused by return character (ASCII 13) in its input since it thinks there is a separate field. These can appear if the terminal is in raw mode, perhaps due to a previous U-Boot crash with sandbox. This is very confusing. Remove these so that the trace test passes.
---
test/trace/test-trace.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
test/trace/test-trace.sh +3 -1
@@ -45,7 +45,9 @@ check_results() { # between calls 2 and 3, where tracing is paused. # This code gets the sign of the difference between each number and # its predecessor. - counts="$(tr -d , <${tmp} | awk '/traced function calls/ { diff = $1 - upto; upto = $1; printf "%d ", diff < 0 ? -1 : (diff > 0 ? 1 : 0)}')" + counts="$(tr -d ',\r' <${tmp} | awk \ + '/traced function calls/ { diff = $1 - upto; upto = $1; \ + printf "%d ", diff < 0 ? -1 : (diff > 0 ? 1 : 0)}')" if [ "${counts}" != "1 1 0 1 " ]; then fail "trace collection error: ${counts}"
Signature · 1 line
2.7.0.rc3.207.g0ac5344
PATCH 7/16 timer: Support tracing fully
In reply to Simon GlassA few of the functions in the timer uclass are not marked with 'notrace'. Fix this so that tracing can be used with CONFIG_TRACE.
---
drivers/timer/timer-uclass.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/timer/timer-uclass.c +3 -3
@@ -22,7 +22,7 @@ DECLARE_GLOBAL_DATA_PTR;* tick, and no timer interrupt. */ -int timer_get_count (struct udevice *dev,u64 *count) +int notrace timer_get_count(struct udevice *dev, u64 *count) {const struct timer_ops *ops =device_get_ops (dev);
@@ -32,9 +32,9 @@ int timer_get_count(struct udevice *dev, u64 *count)return ops->get_count (dev, count); } -unsigned long timer_get_rate (struct udevice *dev) +unsigned long notrace timer_get_rate (struct udevice *dev) { -struct timer_dev_priv *uc_priv =dev_get_uclass_priv (dev); +struct timer_dev_priv *uc_priv = dev->uclass_priv;return uc_priv->clock_rate; }
Signature · 1 line
2.7.0.rc3.207.g0ac5344
PATCH 7/16 timer: Support tracing fully
Hi Simon,
Quoted 23 lines · Simon Glass
A few of the functions in the timer uclass are not marked with 'notrace'. Fix this so that tracing can be used with
CONFIG_TRACE.Signed-off-by Simon Glass <[email protected]>---
drivers/timer/timer-uclass.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)drivers/timer/timer-uclass.c +1
-1@@ -22,7 +22,7 @@ DECLARE_GLOBAL_DATA_PTR;* tick, and no timer interrupt. */ -int timer_get_count (struct udevice *dev,u64 *count) +int notrace timer_get_count(struct udevice *dev, u64 *count) {const struct timer_ops *ops =device_get_ops (dev);
drivers/timer/timer-uclass.c int timer_get_count(struct udevice *dev, u64 *count) · line 32
Quoted 1 line
drivers/timer/timer-uclass.c +0
-0@@ -32,9 +32,9 @@ int timer_get_count(struct udevice *dev, u64 *count)return ops->get_count (dev, count);
Besides making timer_get_count() and timer_get_rate() APIs notrace, does it help to make the timer uclass ops notrace as well?
drivers/timer/timer-uclass.c int timer_get_count(struct udevice *dev, u64 *count) · line 37
Quoted 7 lines
drivers/timer/timer-uclass.c +2
-2} -unsigned long timer_get_rate (struct udevice *dev) +unsigned long notrace timer_get_rate (struct udevice *dev) { -struct timer_dev_priv *uc_priv =dev_get_uclass_priv (dev); +struct timer_dev_priv *uc_priv = dev->uclass_priv;
Why is this change needed?
drivers/timer/timer-uclass.c int timer_get_count(struct udevice *dev, u64 *count)
Quoted 4 lines
drivers/timer/timer-uclass.c +0
-1return uc_priv->clock_rate; } --
Regards,
Bin
PATCH 7/16 timer: Support tracing fully
Hi Bin,
Quoted 25 lines · Bin Meng
Hi Simon,
Quoted 22 lines · Simon Glass
A few of the functions in the timer uclass are not marked with 'notrace'. Fix this so that tracing can be used with
CONFIG_TRACE.Signed-off-by Simon Glass <[email protected]>---
drivers/timer/timer-uclass.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)drivers/timer/timer-uclass.c +1
-1@@ -22,7 +22,7 @@ DECLARE_GLOBAL_DATA_PTR;* tick, and no timer interrupt. */ -int timer_get_count (struct udevice *dev,u64 *count) +int notrace timer_get_count(struct udevice *dev, u64 *count) {const struct timer_ops *ops =device_get_ops (dev);
Quoted 5 lines
drivers/timer/timer-uclass.c int timer_get_count(struct udevice *dev, u64 *count) · line 32
Quoted 2 lines
drivers/timer/timer-uclass.c +0
-0@@ -32,9 +32,9 @@ int timer_get_count(struct udevice *dev, u64 *count)return ops->get_count (dev, count);Besides making
timer_get_count()andtimer_get_rate()APIs notrace, does it help to make the timer uclass ops notrace as well?
I don't think so. From what I can this needs to be done in each driver.
Quoted 10 lines
drivers/timer/timer-uclass.c int timer_get_count(struct udevice *dev, u64 *count) · line 37
Quoted 8 lines
drivers/timer/timer-uclass.c +2
-2} -unsigned long timer_get_rate (struct udevice *dev) +unsigned long notrace timer_get_rate (struct udevice *dev) { -struct timer_dev_priv *uc_priv =dev_get_uclass_priv (dev); +struct timer_dev_priv *uc_priv = dev->uclass_priv;Why is this change needed?
To avoid a function call, and the notrace problem.
Quoted 8 lines
drivers/timer/timer-uclass.c int timer_get_count(struct udevice *dev, u64 *count)
Quoted 5 lines
drivers/timer/timer-uclass.c +0
-1return uc_priv->clock_rate; } --Regards,
Bin
Regards,
Simon
PATCH 8/16 timer: Provide an early timer
In reply to Simon GlassIn some cases the timer must be accessible before driver model is active. Examples include when using CONFIG_TRACE to trace U-Boot's execution before driver model is set up. Enable this option to use an early timer. These functions must be supported by your timer driver: timer_early_get_count() and timer_early_get_rate().
---
drivers/timer/Kconfig | 10 ++++++++++ include/timer.h | 21 +++++++++++++++++++++ lib/time.c | 28 +++++++++++++++++++++------- 3 files changed, 52 insertions(+), 7 deletions(-)
drivers/timer/Kconfig +10 -0
@@ -9,6 +9,16 @@ config TIMER will be used. The timer is usually a 32 bits free-running up counter. There may be no real tick, and no timer interrupt. +config TIMER_EARLY + bool "Allow timer to be used early in U-Boot" + depends on TIMER + help + In some cases the timer must be accessible before driver model is + active. Examples include when using CONFIG_TRACE to trace U-Boot's + execution before driver model is set up. Enable this option to + use an early timer. These functions must be supported by your timer + driver: timer_early_get_count() and timer_early_get_rate(). + config ALTERA_TIMER bool "Altera timer support" depends on TIMER
include/timer.h +21 -0
@@ -67,4 +67,25 @@ struct timer_dev_priv { unsigned long clock_rate; }; +/** +* timer_early_get_count() - Implement timer_get_count() before driver model +* +* If CONFIG_TIMER_EARLY is enabled, this function wil be called to return +* the current timer value before the proper driver model timer is ready. +* It should be implemented by one of the timer values. This is mostly useful +* for tracing. +*/ +u64 timer_early_get_count (void ); + +/** +* timer_early_get_rate() - Get the timer rate before driver model +* +* If CONFIG_TIMER_EARLY is enabled, this function wil be called to return +* the current timer rate in Hz before the proper driver model timer is ready. +* It should be implemented by one of the timer values. This is mostly useful +* for tracing. This corresponds to the clock_rate value in struct +* timer_dev_priv. +*/ +unsigned long timer_early_get_rate (void ); +#endif /* _TIMER_H_ */
lib/time.c +21 -7
@@ -43,11 +43,17 @@ extern unsigned long __weak timer_read_counter(void);#ifdef CONFIG_TIMER ulong notrace get_tbclk(void) { -int ret; +if (!gd->timer) { +#ifdef CONFIG_TIMER_EARLY +return timer_early_get_rate (); +#else +int ret; - ret =dm_timer_init (); -if (ret) -return ret; + ret =dm_timer_init (); +if (ret) +return ret; +#endif + }return timer_get_rate (gd->timer); }
@@ -57,9 +63,17 @@ uint64_t notrace get_ticks(void)u64 count;int ret; - ret =dm_timer_init (); -if (ret) -return ret; +if (!gd->timer) { +#ifdef CONFIG_TIMER_EARLY +return timer_early_get_count (); +#else +int ret; + + ret =dm_timer_init (); +if (ret) +return ret; +#endif + } ret =timer_get_count (gd->timer, &count);if (ret)
Signature · 1 line
2.7.0.rc3.207.g0ac5344
PATCH 8/16 timer: Provide an early timer
Hi Simon,
Quoted 48 lines · Simon Glass
In some cases the timer must be accessible before driver model is active. Examples include when using
CONFIG_TRACEto trace U-Boot's execution before driver model is set up. Enable this option to use an early timer. These functions must be supported by your timer driver:timer_early_get_count()andtimer_early_get_rate().Signed-off-by Simon Glass <[email protected]>---
drivers/timer/Kconfig | 10 ++++++++++ include/timer.h | 21 +++++++++++++++++++++ lib/time.c | 28 +++++++++++++++++++++------- 3 files changed, 52 insertions(+), 7 deletions(-)drivers/timer/Kconfig +10
-0@@ -9,6 +9,16 @@ config TIMER will be used. The timer is usually a 32 bits free-running up counter. There may be no real tick, and no timer interrupt. +config TIMER_EARLY + bool "Allow timer to be used early in U-Boot" + depends on TIMER + help + In some cases the timer must be accessible before driver model is + active. Examples include when using CONFIG_TRACE to trace U-Boot's + execution before driver model is set up. Enable this option to + use an early timer. These functions must be supported by your timer + driver: timer_early_get_count() and timer_early_get_rate(). + config ALTERA_TIMER bool "Altera timer support" depends on TIMERinclude/timer.h +5
-0@@ -67,4 +67,25 @@ struct timer_dev_priv {unsigned long clock_rate; }; +/** +* timer_early_get_count() - Implement timer_get_count() before driver model +* +* If CONFIG_TIMER_EARLY is enabled, this function wil be called to return +* the current timer value before the proper driver model timer is ready.
include/timer.h struct timer_dev_priv { · line 84
Quoted 10 lines
include/timer.h +10
-0+* It should be implemented by one of the timer values. This is mostly useful +* for tracing. +*/ +u64 timer_early_get_count (void ); + +/** +* timer_early_get_rate() - Get the timer rate before driver model +* +* If CONFIG_TIMER_EARLY is enabled, this function wil be called to return +* the current timer rate in Hz before the proper driver model timer is ready.
nits: two spaces between 'rate' and 'in'
include/timer.h struct timer_dev_priv { · line 87
Quoted 3 lines
include/timer.h +3
-0+* It should be implemented by one of the timer values. This is mostly useful +* for tracing. This corresponds to the clock_rate value in struct +* timer_dev_priv.
Is this supposed to be a hard-codeded value returned by the timer driver? The timer-uclass driver gets this clock rate from device tree, but I believe at that time when early timer is called, FDT blob might not be available yet.
include/timer.h struct timer_dev_priv { · line 91
Quoted 4 lines
include/timer.h +3
-0+*/ +unsigned long timer_early_get_rate (void ); +#endif /* _TIMER_H_ */
[snip]
Regards,
Bin
PATCH 8/16 timer: Provide an early timer
Hi Bin,
Quoted 64 lines · Bin Meng
Hi Simon,
Quoted 48 lines · Simon Glass
In some cases the timer must be accessible before driver model is active. Examples include when using
CONFIG_TRACEto trace U-Boot's execution before driver model is set up. Enable this option to use an early timer. These functions must be supported by your timer driver:timer_early_get_count()andtimer_early_get_rate().Signed-off-by Simon Glass <[email protected]>---
drivers/timer/Kconfig | 10 ++++++++++ include/timer.h | 21 +++++++++++++++++++++ lib/time.c | 28 +++++++++++++++++++++------- 3 files changed, 52 insertions(+), 7 deletions(-)drivers/timer/Kconfig +10
-0@@ -9,6 +9,16 @@ config TIMER will be used. The timer is usually a 32 bits free-running up counter. There may be no real tick, and no timer interrupt. +config TIMER_EARLY + bool "Allow timer to be used early in U-Boot" + depends on TIMER + help + In some cases the timer must be accessible before driver model is + active. Examples include when using CONFIG_TRACE to trace U-Boot's + execution before driver model is set up. Enable this option to + use an early timer. These functions must be supported by your timer + driver: timer_early_get_count() and timer_early_get_rate(). + config ALTERA_TIMER bool "Altera timer support" depends on TIMERinclude/timer.h +5
-0@@ -67,4 +67,25 @@ struct timer_dev_priv {unsigned long clock_rate; }; +/** +* timer_early_get_count() - Implement timer_get_count() before driver model +* +* If CONFIG_TIMER_EARLY is enabled, this function wil be called to return +* the current timer value before the proper driver model timer is ready. include/timer.h struct timer_dev_priv { · line 84
Quoted 10 lines
include/timer.h +10
-0+* It should be implemented by one of the timer values. This is mostly useful +* for tracing. +*/ +u64 timer_early_get_count (void ); + +/** +* timer_early_get_rate() - Get the timer rate before driver model +* +* If CONFIG_TIMER_EARLY is enabled, this function wil be called to return +* the current timer rate in Hz before the proper driver model timer is ready. nits: two spaces between 'rate' and 'in'
Quoted 8 lines
include/timer.h struct timer_dev_priv { · line 87
Quoted 3 lines
include/timer.h +3
-0+* It should be implemented by one of the timer values. This is mostly useful +* for tracing. This corresponds to the clock_rate value in struct +* timer_dev_priv. Is this supposed to be a hard-codeded value returned by the timer driver? The timer-uclass driver gets this clock rate from device tree, but I believe at that time when early timer is called, FDT blob might not be available yet.
Possibly, although the FDT is available pretty early. I doubt anyone would need to call the timer that early.
Quoted 10 lines
include/timer.h struct timer_dev_priv { · line 91
Quoted 5 lines
include/timer.h +3
-0+*/ +unsigned long timer_early_get_rate (void ); +#endif /* _TIMER_H_ */ [snip]
Regards,
Bin
Regards,
Simon
PATCH 9/16 timer: Set up the real timer after driver model is available
In reply to Simon GlassWhen using the early timer, we need to manually trigger setting up the real timer. This will not happen automatically. Do this immediately after starting driver model.
---
common/board_f.c | 6 ++++++ common/board_r.c | 14 ++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-)
common/board_f.c +6 -0
@@ -45,6 +45,7 @@#include <post.h> #include <spi.h> #include <status_led.h> +#include <timer.h> #include <trace.h> #include <video.h> #include <watchdog.h>
@@ -805,6 +806,11 @@ static int initf_dm(void)if (ret)return ret;#endif +#ifdef CONFIG_TIMER_EARLY + ret =dm_timer_init (); +if (ret) +return ret; +#endif return 0 ; }
common/board_r.c +12 -2
@@ -46,6 +46,7 @@#include <serial.h> #include <spi.h> #include <stdio_dev.h> +#include <timer.h> #include <trace.h> #include <watchdog.h> #ifdef CONFIG_CMD_AMBAPP
@@ -312,13 +313,22 @@ static int initr_noncached(void)#ifdef CONFIG_DM static int initr_dm (void ) { +int ret; +/* Save the pre-reloc driver model and start a new one */ gd->dm_root_f = gd->dm_root; gd->dm_root =NULL ; -#ifdef CONFIG_TIMER + ret =dm_init_and_scan (false); +if (ret) +return ret; +#ifdef CONFIG_TIMER_EARLY gd->timer =NULL ; + ret =dm_timer_init (); +if (ret) +return ret;#endif -return dm_init_and_scan (false); + +return 0 ; }#endif
Signature · 1 line
2.7.0.rc3.207.g0ac5344
PATCH 9/16 timer: Set up the real timer after driver model is available
Quoted 11 lines · Simon Glass
When using the early timer, we need to manually trigger setting up the real timer. This will not happen automatically. Do this immediately after starting driver model.
Signed-off-by Simon Glass <[email protected]>---
common/board_f.c | 6 ++++++ common/board_r.c | 14 ++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-)
PATCH 10/16 sandbox: timer: Support the early timer
In reply to Simon GlassAdd support for the early timer so we can use tracing with sandbox again.
---
drivers/timer/sandbox_timer.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
drivers/timer/sandbox_timer.c +12 -2
@@ -18,9 +18,19 @@ void sandbox_timer_add_offset(unsigned long offset) sandbox_timer_offset += offset; } -static int sandbox_timer_get_count (struct udevice *dev,u64 *count) +u64 notrace timer_early_get_count(void) { - *count =os_get_nsec () /1000 + sandbox_timer_offset *1000 ; +return os_get_nsec () /1000 + sandbox_timer_offset *1000 ; +} + +unsigned long notrace timer_early_get_rate (void ) +{ +return 1000000 ; +} + +static notrace int sandbox_timer_get_count(struct udevice *dev, u64 *count) +{ + *count =timer_early_get_count ();return 0 ; }
Signature · 1 line
2.7.0.rc3.207.g0ac5344
PATCH 10/16 sandbox: timer: Support the early timer
Hi Simon,
Quoted 16 lines · Simon Glass
Add support for the early timer so we can use tracing with sandbox again.
Signed-off-by Simon Glass <[email protected]>---
drivers/timer/sandbox_timer.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)drivers/timer/sandbox_timer.c +0
-0@@ -18,9 +18,19 @@ void sandbox_timer_add_offset(unsigned long offset) sandbox_timer_offset += offset; }
drivers/timer/sandbox_timer.c void sandbox_timer_add_offset(unsigned long offset) · line 28
Quoted 10 lines
drivers/timer/sandbox_timer.c +7
-2-static int sandbox_timer_get_count (struct udevice *dev,u64 *count) +u64 notrace timer_early_get_count(void) { - *count =os_get_nsec () /1000 + sandbox_timer_offset *1000 ; +return os_get_nsec () /1000 + sandbox_timer_offset *1000 ; +} + +unsigned long notrace timer_early_get_rate (void ) +{ +return 1000000 ;
Hard-coded?
drivers/timer/sandbox_timer.c void sandbox_timer_add_offset(unsigned long offset)
Quoted 9 lines
drivers/timer/sandbox_timer.c +5
-1+} + +static notrace int sandbox_timer_get_count(struct udevice *dev, u64 *count) +{ + *count =timer_early_get_count ();return 0 ; } --
Regards,
Bin
PATCH 10/16 sandbox: timer: Support the early timer
Hi Bin
Quoted 19 lines · Bin Meng
Hi Simon,
Quoted 16 lines · Simon Glass
Add support for the early timer so we can use tracing with sandbox again.
Signed-off-by Simon Glass <[email protected]>---
drivers/timer/sandbox_timer.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)drivers/timer/sandbox_timer.c +0
-0@@ -18,9 +18,19 @@ void sandbox_timer_add_offset(unsigned long offset) sandbox_timer_offset += offset; }
Quoted 12 lines
drivers/timer/sandbox_timer.c void sandbox_timer_add_offset(unsigned long offset) · line 28
Quoted 10 lines
drivers/timer/sandbox_timer.c +7
-2-static int sandbox_timer_get_count (struct udevice *dev,u64 *count) +u64 notrace timer_early_get_count(void) { - *count =os_get_nsec () /1000 + sandbox_timer_offset *1000 ; +return os_get_nsec () /1000 + sandbox_timer_offset *1000 ; +} + +unsigned long notrace timer_early_get_rate (void ) +{ +return 1000000 ;Hard-coded?
Yes - I'll convert it to a constant. But since the OS calls use nanoseconds and want to convert to milliseconds it is hard-coded.
Quoted 7 lines
Quoted 7 lines
drivers/timer/sandbox_timer.c +5
-0+} + +static notrace int sandbox_timer_get_count(struct udevice *dev, u64 *count) +{ + *count =timer_early_get_count ();
Quoted 6 lines
drivers/timer/sandbox_timer.c void sandbox_timer_add_offset(unsigned long offset)
Quoted 3 lines
drivers/timer/sandbox_timer.c +0
-1return 0 ; } --Regards,
Bin
Regards,
Simon
PATCH 11/16 sandbox: Correct ordering of defconfig
In reply to Simon GlassThis has got out of order: fix it.
---
configs/sandbox_defconfig | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
configs/sandbox_defconfig +5 -5
@@ -1,10 +1,13 @@ CONFIG_SYS_MALLOC_F_LEN=0x2000 CONFIG_PCI=y CONFIG_DEFAULT_DEVICE_TREE="sandbox" -CONFIG_DM_PCI_COMPAT=y CONFIG_FIT=y CONFIG_FIT_VERBOSE=y CONFIG_FIT_SIGNATURE=y +CONFIG_BOOTSTAGE=y +CONFIG_BOOTSTAGE_REPORT=y +CONFIG_CONSOLE_RECORD=y +CONFIG_CONSOLE_RECORD_OUT_SIZE=0x1000 # CONFIG_CMD_ELF is not set # CONFIG_CMD_IMLS is not set # CONFIG_CMD_FLASH is not set
@@ -12,14 +15,10 @@ CONFIG_CMD_REMOTEPROC=y CONFIG_CMD_GPIO=y # CONFIG_CMD_SETEXPR is not set CONFIG_CMD_SOUND=y -CONFIG_BOOTSTAGE=y -CONFIG_BOOTSTAGE_REPORT=y CONFIG_CMD_PMIC=y CONFIG_CMD_REGULATOR=y CONFIG_CMD_TPM=y CONFIG_CMD_TPM_TEST=y -CONFIG_CONSOLE_RECORD=y -CONFIG_CONSOLE_RECORD_OUT_SIZE=0x1000 CONFIG_OF_CONTROL=y CONFIG_OF_HOSTFILE=y CONFIG_REGMAP=y
@@ -52,6 +51,7 @@ CONFIG_SPI_FLASH_SST=y CONFIG_SPI_FLASH_WINBOND=y CONFIG_DM_ETH=y CONFIG_DM_PCI=y +CONFIG_DM_PCI_COMPAT=y CONFIG_PCI_SANDBOX=y CONFIG_PINCTRL=y CONFIG_PINCONF=y
Signature · 1 line
2.7.0.rc3.207.g0ac5344
PATCH 12/16 sandbox: Enable the early timer
In reply to Simon GlassEnable this so that tracing works with sandbox.
---
configs/sandbox_defconfig | 1 + 1 file changed, 1 insertion(+)
configs/sandbox_defconfig +1 -0
@@ -68,6 +68,7 @@ CONFIG_SOUND=y CONFIG_SOUND_SANDBOX=y CONFIG_SANDBOX_SPI=y CONFIG_TIMER=y +CONFIG_TIMER_EARLY=y CONFIG_SANDBOX_TIMER=y CONFIG_TPM_TIS_SANDBOX=y CONFIG_USB=y
Signature · 1 line
2.7.0.rc3.207.g0ac5344
PATCH 12/16 sandbox: Enable the early timer
Quoted 8 lines · Simon Glass
Enable this so that tracing works with sandbox.
Signed-off-by Simon Glass <[email protected]>---
configs/sandbox_defconfig | 1 + 1 file changed, 1 insertion(+)
PATCH 13/16 sandbox: spi: Add more debugging to SPI emulation
In reply to Simon GlassAdd a little more debugging to help when things go wrong.
---
drivers/mtd/spi/sandbox.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
drivers/mtd/spi/sandbox.c +10 -3
@@ -142,13 +142,15 @@ static int sandbox_sf_probe(struct udevice *dev)if (bus->seq <CONFIG_SANDBOX_SPI_MAX_BUS ) spec = state->spi[bus->seq][cs].spec;if (!spec) { +debug ("%s: No spec found for bus %d, cs %d\n" , + __func__, bus->seq, cs); ret = -ENOENT ; goto error; } file =strchr (spec,':' );if (!file) { -printf ("sandbox_sf: unable to parse file\n" ); +printf ("%s: unable to parse file\n" , __func__); ret = -EINVAL ; goto error; }
@@ -174,7 +176,7 @@ static int sandbox_sf_probe(struct udevice *dev)break ; }if (!data->name) { -printf ("sandbox_sf: unknown flash '%*s'\n" , (int )idname_len, +printf ("%s: unknown flash '%*s'\n" , __func__, (int )idname_len, spec); ret = -EINVAL ; goto error;
@@ -186,7 +188,7 @@ static int sandbox_sf_probe(struct udevice *dev) sbsf->fd =os_open (pdata->filename,02 );if (sbsf->fd ==-1 ) {free (sbsf); -printf ("sandbox_sf: unable to open file '%s'\n" , +printf ("%s: unable to open file '%s'\n" , __func__, pdata->filename); ret = -EIO ; goto error;
@@ -553,6 +555,9 @@ static int sandbox_cmdline_cb_spi_sf(struct sandbox_state *state,* yet. Perhaps we can figure something out. */ state->spi[bus][cs].spec = spec; +debug ("%s: Setting up spec '%s' for bus %ld, cs %ld\n" , __func__, + spec, bus, cs); +return 0 ; }SANDBOX_CMDLINE_OPT (spi_sf,1 ,"connect a SPI flash: <bus>:<cs>:<id>:<file>" );
@@ -671,6 +676,8 @@ int dm_scan_other(bool pre_reloc_only) __func__, busnum, cs);return ret; } +debug ("%s: Setting up spec '%s' for bus %d, cs %d\n" , + __func__, spec, busnum, cs); } } }
Signature · 1 line
2.7.0.rc3.207.g0ac5344
PATCH 13/16 sandbox: spi: Add more debugging to SPI emulation
Quoted 4 lines · Simon Glass
Add a little more debugging to help when things go wrong.
Signed-off-by Simon Glass <[email protected]>---
Signature · 1 line
Jagan.
PATCH 14/16 sandbox: spi: Remove an incorrect free()
In reply to Simon GlassWe must not free data that is managed by driver mode. Remove this line, which is a hangover from the pre-driver-model code.
This fixes a problem where 'sf probe' crashes U-Boot if the backing file for the SPI flash cannot be found.
---
drivers/mtd/spi/sandbox.c | 1 - 1 file changed, 1 deletion(-)
drivers/mtd/spi/sandbox.c +0 -1
@@ -187,7 +187,6 @@ static int sandbox_sf_probe(struct udevice *dev) sbsf->fd =os_open (pdata->filename,02 );if (sbsf->fd ==-1 ) { -free (sbsf);printf ("%s: unable to open file '%s'\n" , __func__, pdata->filename); ret = -EIO ;
Signature · 1 line
2.7.0.rc3.207.g0ac5344
PATCH 14/16 sandbox: spi: Remove an incorrect free()
Quoted 8 lines · Simon Glass
We must not free data that is managed by driver mode. Remove this line, which is a hangover from the pre-driver-model code.
This fixes a problem where 'sf probe' crashes U-Boot if the backing file for the SPI flash cannot be found.
Signed-off-by Simon Glass <[email protected]>---
Signature · 1 line
Jagan.
PATCH 14/16 sandbox: spi: Remove an incorrect free()
In reply to Simon GlassQuoted 7 lines · Simon Glass
We must not free data that is managed by driver mode. Remove this line, which is a hangover from the pre-driver-model code.
This fixes a problem where 'sf probe' crashes U-Boot if the backing file for the SPI flash cannot be found.
Signed-off-by Simon Glass <[email protected]>
Signature · 8 lines
Tom -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 836 bytes Desc: Digital signature URL: <http://lists.denx.de/pipermail/u-boot/attachments/20160215/048b791c/attachment.sig>
PATCH 15/16 spi: Correct two error return values
In reply to Simon GlassWhen an error number is provided we should use it, not change it. This fixes the SPI and SPI flash tests.
One of these is long-standing. The other seems to have been introduced by commit 1e90d9fd (sf: Move read_id code to sf_ops).
---
drivers/mtd/spi/sf_probe.c | 4 +--- drivers/mtd/spi/spi_flash.c | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-)
drivers/mtd/spi/sf_probe.c +1 -3
@@ -42,10 +42,8 @@ static int spi_flash_probe_slave(struct spi_flash *flash) } ret =spi_flash_scan (flash); -if (ret) { - ret = -EINVAL ; +if (ret) goto err_read_id; - }#ifdef CONFIG_SPI_FLASH_MTD ret =spi_flash_mtd_register (flash);
drivers/mtd/spi/spi_flash.c +1 -1
@@ -980,7 +980,7 @@ int spi_flash_scan(struct spi_flash *flash) ret =spi_flash_cmd (spi,CMD_READ_ID , idcode,sizeof (idcode));if (ret) {printf ("SF: Failed to get idcodes\n" ); -return -EINVAL ; +return ret; }#ifdef DEBUG
Signature · 1 line
2.7.0.rc3.207.g0ac5344
PATCH 15/16 spi: Correct two error return values
Quoted 9 lines · Simon Glass
When an error number is provided we should use it, not change it. This fixes the SPI and SPI flash tests.
One of these is long-standing. The other seems to have been introduced by commit
1e90d9fd(sf: Moveread_idcode tosf_ops).Signed-off-by Simon Glass <[email protected]>Fixes 1e90d9fd (sf: Move read_id code to sf_ops)---
Signature · 1 line
Jagan.
PATCH 16/16 spi: Re-enable the SPI flash tests
In reply to Simon GlassThese are working correctly again, so re-enable them.
---
test/dm/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
test/dm/Makefile +2 -2
@@ -27,8 +27,8 @@ obj-y += regmap.o obj-$(CONFIG_REMOTEPROC) += remoteproc.o obj-$(CONFIG_RESET) += reset.o obj-$(CONFIG_DM_RTC) += rtc.o -#obj-$(CONFIG_DM_SPI_FLASH) += sf.o -#obj-$(CONFIG_DM_SPI) += spi.o +obj-$(CONFIG_DM_SPI_FLASH) += sf.o +obj-$(CONFIG_DM_SPI) += spi.o obj-y += syscon.o obj-$(CONFIG_DM_USB) += usb.o obj-$(CONFIG_DM_PMIC) += pmic.o
Signature · 1 line
2.7.0.rc3.207.g0ac5344
PATCH 16/16 spi: Re-enable the SPI flash tests
Quoted 4 lines · Simon Glass
These are working correctly again, so re-enable them.
Signed-off-by Simon Glass <[email protected]>---
Signature · 1 line
Jagan.
cover image: Fix various test failures
In reply to Simon GlassQuoted 8 lines · Simon Glass
Recent changes have broken the FIT and vboot tests. Also the SPI tests have been wrong since before the last release and were disabled.
This series collects together the required fixes.
Note: The FIT and vboot tests are hard to run (in that each requires manual effort). At some point we should be able to bring these into Stephen Warren's test framework.
The series,
(via ./test/py/test.py --bd sandbox --build)