From 7a80de464167ec45fdb70f63d83d07f7c2c57b82 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 24 Feb 2016 09:14:42 -0700 Subject: [PATCH 01/17] 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. Fixes: 1fec3c5d (common/image.c: Make boot_get_ramdisk() perform a check for Android images) Signed-off-by: Simon Glass --- common/bootm.c | 2 +- common/image-fit.c | 5 +++++ include/image.h | 5 +---- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/common/bootm.c b/common/bootm.c index 99d574db2c..df27089965 100644 --- a/common/bootm.c +++ b/common/bootm.c @@ -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; } diff --git a/common/image-fit.c b/common/image-fit.c index c531ee74d7..d3fad30c34 100644 --- a/common/image-fit.c +++ b/common/image-fit.c @@ -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 diff --git a/include/image.h b/include/image.h index 299d6d2a13..518a4f5291 100644 --- a/include/image.h +++ b/include/image.h @@ -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 From 2e33e761656f30651ed9ae16ecdbd5117d51d7d2 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 24 Feb 2016 09:14:43 -0700 Subject: [PATCH 02/17] Revert "image-fit: Fix signature checking" This 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. Fixes: 84ca65aa (image-fit: Fix signature checking) Signed-off-by: Simon Glass --- common/image-fit.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/common/image-fit.c b/common/image-fit.c index d3fad30c34..fbd9e0d770 100644 --- a/common/image-fit.c +++ b/common/image-fit.c @@ -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("+ "); } From 0edd82e2448d4aa8f729ac1df8bb55121388a069 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 24 Feb 2016 09:14:44 -0700 Subject: [PATCH 03/17] image: Fix FIT and vboot tests to exit sandbox correctly When 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. Signed-off-by: Simon Glass Fixes: 5010d98f (sandbox: Use the reset driver to handle reset) --- test/image/test-fit.py | 4 ++++ test/vboot/sandbox-u-boot.dts | 3 +++ 2 files changed, 7 insertions(+) diff --git a/test/image/test-fit.py b/test/image/test-fit.py index d5143cbb0f..db0649fca8 100755 --- a/test/image/test-fit.py +++ b/test/image/test-fit.py @@ -108,6 +108,10 @@ base_fdt = ''' model = "Sandbox Verified Boot Test"; compatible = "sandbox"; + reset@0 { + compatible = "sandbox,reset"; + }; + }; ''' diff --git a/test/vboot/sandbox-u-boot.dts b/test/vboot/sandbox-u-boot.dts index a1e853c9ca..63f8f401de 100644 --- a/test/vboot/sandbox-u-boot.dts +++ b/test/vboot/sandbox-u-boot.dts @@ -4,4 +4,7 @@ model = "Sandbox Verified Boot Test"; compatible = "sandbox"; + reset@0 { + compatible = "sandbox,reset"; + }; }; From 5eca977935bf58f4227b2681e612a452a0da0286 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 24 Feb 2016 09:14:45 -0700 Subject: [PATCH 04/17] trace: Fix compiler warnings in trace With min() we must use the same type for each parameter. Fix two problems in trace.c which produce compiler warnings. Signed-off-by: Simon Glass Reviewed-by: Bin Meng --- cmd/trace.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/trace.c b/cmd/trace.c index 1e62a1a199..1a6d8c3047 100644 --- a/cmd/trace.c +++ b/cmd/trace.c @@ -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); From 83cc112e82fea5f521a3bf6334dce6e6c56ef0e6 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 24 Feb 2016 09:14:46 -0700 Subject: [PATCH 05/17] lib: Don't instrument the div64 function 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 Reviewed-by: Bin Meng --- lib/div64.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/div64.c b/lib/div64.c index 795ef0e1e4..319fca50fa 100644 --- a/lib/div64.c +++ b/lib/div64.c @@ -18,8 +18,9 @@ #include #include +#include -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; From f91281b1eb8897cb49a395666aa58ae4c8c62c6c Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 24 Feb 2016 09:14:47 -0700 Subject: [PATCH 06/17] trace: Improve the trace test number recognition The 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. Signed-off-by: Simon Glass --- test/trace/test-trace.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/trace/test-trace.sh b/test/trace/test-trace.sh index 3e8651ed60..746793c83b 100755 --- a/test/trace/test-trace.sh +++ b/test/trace/test-trace.sh @@ -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}" From 4f051824b5c2a6bf8d3114c772676977fb95969a Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 24 Feb 2016 09:14:48 -0700 Subject: [PATCH 07/17] timer: Support tracing fully 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 --- drivers/timer/timer-uclass.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/timer/timer-uclass.c b/drivers/timer/timer-uclass.c index 83d1a35e06..382c0f2bd1 100644 --- a/drivers/timer/timer-uclass.c +++ b/drivers/timer/timer-uclass.c @@ -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; } From c95fec31928d7e2596364ee1d226b52ffd7793f2 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 24 Feb 2016 09:14:49 -0700 Subject: [PATCH 08/17] timer: Provide an early timer 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(). Signed-off-by: Simon Glass --- drivers/timer/Kconfig | 10 ++++++++++ include/timer.h | 21 +++++++++++++++++++++ lib/time.c | 28 +++++++++++++++++++++------- 3 files changed, 52 insertions(+), 7 deletions(-) diff --git a/drivers/timer/Kconfig b/drivers/timer/Kconfig index ff65a731de..cb18f12fc9 100644 --- a/drivers/timer/Kconfig +++ b/drivers/timer/Kconfig @@ -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 diff --git a/include/timer.h b/include/timer.h index f14725cc28..dcc803c392 100644 --- a/include/timer.h +++ b/include/timer.h @@ -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_ */ diff --git a/lib/time.c b/lib/time.c index e9f6861b98..f37150fddc 100644 --- a/lib/time.c +++ b/lib/time.c @@ -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) From 1057e6cfe12bf71394fe02e0939f232417882f90 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 24 Feb 2016 09:14:50 -0700 Subject: [PATCH 09/17] timer: Set up the real timer after driver model is available 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 Reviewed-by: Bin Meng --- common/board_f.c | 6 ++++++ common/board_r.c | 14 ++++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/common/board_f.c b/common/board_f.c index a960144b02..622093a391 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -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; } diff --git a/common/board_r.c b/common/board_r.c index 6c23865279..52a9b262eb 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #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 From 01476eaf07514412cb9d8da6ddaf623d6b14d008 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 24 Feb 2016 09:14:51 -0700 Subject: [PATCH 10/17] sandbox: timer: Support the early timer Add support for the early timer so we can use tracing with sandbox again. Signed-off-by: Simon Glass --- drivers/timer/sandbox_timer.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/drivers/timer/sandbox_timer.c b/drivers/timer/sandbox_timer.c index a8da936349..6a6411afeb 100644 --- a/drivers/timer/sandbox_timer.c +++ b/drivers/timer/sandbox_timer.c @@ -10,6 +10,8 @@ #include #include +#define SANDBOX_TIMER_RATE 1000000 + /* system timer offset in ms */ static unsigned long sandbox_timer_offset; @@ -18,9 +20,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 SANDBOX_TIMER_RATE; +} + +static notrace int sandbox_timer_get_count(struct udevice *dev, u64 *count) +{ + *count = timer_early_get_count(); return 0; } @@ -30,7 +42,7 @@ static int sandbox_timer_probe(struct udevice *dev) struct timer_dev_priv *uc_priv = dev_get_uclass_priv(dev); if (!uc_priv->clock_rate) - uc_priv->clock_rate = 1000000; + uc_priv->clock_rate = SANDBOX_TIMER_RATE; return 0; } From c00e922530d599761f8876317f80392d6802c812 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 24 Feb 2016 09:14:52 -0700 Subject: [PATCH 11/17] sandbox: Correct ordering of defconfig This has got out of order: fix it. Signed-off-by: Simon Glass --- configs/sandbox_defconfig | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig index b5b81caaae..8b878e299b 100644 --- a/configs/sandbox_defconfig +++ b/configs/sandbox_defconfig @@ -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 From 651490212a43645434db17c1afc1831048e03800 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 24 Feb 2016 09:14:53 -0700 Subject: [PATCH 12/17] sandbox: Enable the early timer Enable this so that tracing works with sandbox. Signed-off-by: Simon Glass Reviewed-by: Bin Meng --- configs/sandbox_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/configs/sandbox_defconfig b/configs/sandbox_defconfig index 8b878e299b..02534bfea7 100644 --- a/configs/sandbox_defconfig +++ b/configs/sandbox_defconfig @@ -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 From 20f655da11cdddfeb0814197f9b3c71d4d297061 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 24 Feb 2016 09:14:54 -0700 Subject: [PATCH 13/17] sandbox: spi: Add more debugging to SPI emulation Add a little more debugging to help when things go wrong. Signed-off-by: Simon Glass Reviewed-by: Jagan Teki Tested-by: Jagan Teki --- drivers/mtd/spi/sandbox.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/mtd/spi/sandbox.c b/drivers/mtd/spi/sandbox.c index 895604d736..ec07be71a1 100644 --- a/drivers/mtd/spi/sandbox.c +++ b/drivers/mtd/spi/sandbox.c @@ -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: :::"); @@ -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); } } } From ffe276d27a538ca410d697126c562a1ce0ac8bbc Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 24 Feb 2016 09:14:55 -0700 Subject: [PATCH 14/17] sandbox: spi: Remove an incorrect free() 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 Reviewed-by: Jagan Teki Tested-by: Jagan Teki Reviewed-by: Tom Rini --- drivers/mtd/spi/sandbox.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/mtd/spi/sandbox.c b/drivers/mtd/spi/sandbox.c index ec07be71a1..53470b90ce 100644 --- a/drivers/mtd/spi/sandbox.c +++ b/drivers/mtd/spi/sandbox.c @@ -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; From 0badb23d110c886cf25550325f36ce1eba1eb5e2 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 24 Feb 2016 09:14:56 -0700 Subject: [PATCH 15/17] spi: Correct two error return values 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: Move read_id code to sf_ops). Signed-off-by: Simon Glass Fixes: 1e90d9fd (sf: Move read_id code to sf_ops) Reviewed-by: Jagan Teki Tested-by: Jagan Teki --- drivers/mtd/spi/sf_probe.c | 4 +--- drivers/mtd/spi/spi_flash.c | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/drivers/mtd/spi/sf_probe.c b/drivers/mtd/spi/sf_probe.c index daa1d5b249..7b296378d2 100644 --- a/drivers/mtd/spi/sf_probe.c +++ b/drivers/mtd/spi/sf_probe.c @@ -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); diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c index 3c365d5e9a..2ae2e3c8c9 100644 --- a/drivers/mtd/spi/spi_flash.c +++ b/drivers/mtd/spi/spi_flash.c @@ -989,7 +989,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 From f8025b58f834c1f25e60b9f4c8e7719cb228a5a1 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Wed, 24 Feb 2016 09:14:57 -0700 Subject: [PATCH 16/17] spi: Re-enable the SPI flash tests These are working correctly again, so re-enable them. Signed-off-by: Simon Glass Reviewed-by: Jagan Teki Tested-by: Jagan Teki --- test/dm/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/dm/Makefile b/test/dm/Makefile index d4f3f22e58..fd0198f1ba 100644 --- a/test/dm/Makefile +++ b/test/dm/Makefile @@ -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 From 6796704b0dfb4f98cb4a026988e9739884812b5c Mon Sep 17 00:00:00 2001 From: Bin Meng Date: Wed, 17 Feb 2016 23:14:47 -0800 Subject: [PATCH 17/17] pci: Fix compiler warnings in dm_pciauto_setup_device() Fix the following compiler warnings when DEBUG is on. warning: 'bar_res' may be used uninitialized in this function. drivers/pci/pci_auto.c:101:21: if (!enum_only && pciauto_region_allocate(bar_res, bar_size, ^ Signed-off-by: Bin Meng Reviewed-by: Simon Glass --- drivers/pci/pci_auto.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/pci/pci_auto.c b/drivers/pci/pci_auto.c index 88bc416c61..ee9a854bda 100644 --- a/drivers/pci/pci_auto.c +++ b/drivers/pci/pci_auto.c @@ -30,7 +30,7 @@ void dm_pciauto_setup_device(struct udevice *dev, int bars_num, u8 header_type; int rom_addr; pci_addr_t bar_value; - struct pci_region *bar_res; + struct pci_region *bar_res = NULL; int found_mem64 = 0; u16 class;