* [U-Boot] [PATCH v3 0/7] add inital SF tests
@ 2018-03-14 2:03 Liam Beguin
2018-03-14 2:03 ` [U-Boot] [PATCH v3 1/7] spi: spi_flash: do not fail silently on bad user input Liam Beguin
` (6 more replies)
0 siblings, 7 replies; 12+ messages in thread
From: Liam Beguin @ 2018-03-14 2:03 UTC (permalink / raw)
To: u-boot
Hi all,
This is the inital step to adding tests for the SF subsystem plus very
minor fixes. It is based on work I found on the mailing list[1].
For now, it doesn't do much but I plan on adding code to reset the flash
to its initial state (based on an env flag) and more code to test the
`sf protect` subcommand (which is the main goal of this series).
I'm sending it now to make sure it's headed in the right direction.
Base on Stephen's comment[2], I haven't added the radomized features.
I'll see how this iteration goes and maybe add it later.
Changes since v2:
- remove double blank lines
- in sf_prepare, fix the way `speed` is read from env__sf_config
- in sf_prepare, fix assert of env__sf_config['offset']
- in sf_prepare, do not fail if env__sf_config['crc32'] == 0
- in sf_{read,update}, `pattern` is in bytes. Make sure md/mw use the
right sizes.
- in sf_{read,update}, rename `crc_read` to `crc_pattern` when
appropriate
- add missing pytest.mark on test_sf_update
Changes since v1:
- remove unnecessary skip flag from environment
- move crc32() to u_boot_utils.py and add extra checks
- rewrite sf_prepare to return a dict of parameter
- use assert instead of pytest.fail
- remove verbose from sf_prepare()
- update documentation
- improve readability
- use ' consistently instead of "
- use sf_read() in test_sf_read()
- rename crc variables
- add speed parameter with optional random range
- allow `sf read` to write at 0x00
Thanks,
Liam Beguin
[ 1 ] https://patchwork.ozlabs.org/patch/623061/
[ 2 ] https://lists.denx.de/pipermail/u-boot/2018-March/321688.html
Liam Beguin (7):
spi: spi_flash: do not fail silently on bad user input
cmd: sf: fix map_physmem check
test/py: README: fix typo
test/py: README: add HOSTNAME to PYTHONPATH
test/py: do not import pytest multiple times
test/py: add generic CRC32 function
test/py: add spi_flash tests
cmd/sf.c | 2 +-
drivers/mtd/spi/spi_flash.c | 2 +-
test/py/README.md | 6 +-
test/py/tests/test_sf.py | 217 ++++++++++++++++++++++++++++++++++++++++++++
test/py/u_boot_utils.py | 24 ++++-
5 files changed, 245 insertions(+), 6 deletions(-)
create mode 100644 test/py/tests/test_sf.py
base-commit: f95ab1fb6e37f0601f397091bb011edf7a98b890
Published-As: https://github.com/Liambeguin/u-boot/releases/tag/test_sf-v3
interdiff vs v2:
diff --git a/test/py/tests/test_sf.py b/test/py/tests/test_sf.py
index 0cc2a60e68d4..8bd1623ff303 100644
--- a/test/py/tests/test_sf.py
+++ b/test/py/tests/test_sf.py
@@ -7,7 +7,6 @@ import pytest
import random
import u_boot_utils
-
"""
Note: This test relies on boardenv_* containing configuration values to define
which SPI Flash areas are available for testing. Without this, this test will
@@ -45,7 +44,6 @@ env__sf_configs = (
)
"""
-
def sf_prepare(u_boot_console, env__sf_config):
"""Check global state of the SPI Flash before running any test.
@@ -63,10 +61,11 @@ def sf_prepare(u_boot_console, env__sf_config):
probe_id = env__sf_config.get('id', 0)
speed = env__sf_config.get('speed', 0)
- if isinstance(speed, list) and len(speed) == 2:
- sf_params['speed'] = random.randint(speed[0], speed[1])
- else:
+ if isinstance(speed, int):
sf_params['speed'] = speed
+ else:
+ assert len(speed) == 2, "If speed is a list, it must have 2 entries"
+ sf_params['speed'] = random.randint(speed[0], speed[1])
cmd = 'sf probe %d %d' % (probe_id, sf_params['speed'])
@@ -87,7 +86,7 @@ def sf_prepare(u_boot_console, env__sf_config):
sf_params['total_size'] = int(m.group(1))
sf_params['total_size'] *= 1024 * 1024
- assert env__sf_config['offset'] is not None, \
+ assert 'offset' in env__sf_config, \
'\'offset\' is required for this test.'
sf_params['len'] = env__sf_config.get('len', sf_params['erase_size'])
@@ -97,12 +96,11 @@ def sf_prepare(u_boot_console, env__sf_config):
'erase length not multiple of erase size.'
assert not (env__sf_config.get('writeable', False) and
- env__sf_config.get('crc32', False)), \
- 'Cannot check crc32 on writeable sections'
+ 'crc32' in env__sf_config), \
+ 'Cannot check crc32 on writeable sections'
return sf_params
-
def sf_read(u_boot_console, env__sf_config, sf_params):
"""Helper function used to read and compute the CRC32 value of a section of
SPI Flash memory.
@@ -120,26 +118,25 @@ def sf_read(u_boot_console, env__sf_config, sf_params):
addr = sf_params['ram_base']
offset = env__sf_config['offset']
count = sf_params['len']
- pattern = random.randint(0, 0xFFFFFFFF)
+ pattern = random.randint(0, 0xFF)
crc_expected = env__sf_config.get('crc32', None)
- cmd = 'mw.b %08x %08x %x' % (addr, pattern, count)
+ cmd = 'mw.b %08x %02x %x' % (addr, pattern, count)
u_boot_console.run_command(cmd)
- crc_read = u_boot_utils.crc32(u_boot_console, addr, count)
+ crc_pattern = u_boot_utils.crc32(u_boot_console, addr, count)
if crc_expected:
- assert crc_read != crc_expected
+ assert crc_pattern != crc_expected
cmd = 'sf read %08x %08x %x' % (addr, offset, count)
response = u_boot_console.run_command(cmd)
assert 'Read: OK' in response, 'Read operation failed'
crc_readback = u_boot_utils.crc32(u_boot_console, addr, count)
- assert crc_read != crc_readback, 'sf read did not update RAM content.'
+ assert crc_pattern != crc_readback, 'sf read did not update RAM content.'
if crc_expected:
assert crc_readback == crc_expected
return crc_readback
-
def sf_update(u_boot_console, env__sf_config, sf_params):
"""Helper function used to update a section of SPI Flash memory.
@@ -155,18 +152,17 @@ def sf_update(u_boot_console, env__sf_config, sf_params):
addr = sf_params['ram_base']
offset = env__sf_config['offset']
count = sf_params['len']
- pattern = int(random.random() * 0xFFFFFFFF)
+ pattern = int(random.random() * 0xFF)
- cmd = 'mw.b %08x %08x %x' % (addr, pattern, count)
+ cmd = 'mw.b %08x %02x %x' % (addr, pattern, count)
u_boot_console.run_command(cmd)
- crc_read = u_boot_utils.crc32(u_boot_console, addr, count)
+ crc_pattern = u_boot_utils.crc32(u_boot_console, addr, count)
cmd = 'sf update %08x %08x %x' % (addr, offset, count)
u_boot_console.run_command(cmd)
crc_readback = sf_read(u_boot_console, env__sf_config, sf_params)
- assert crc_readback == crc_read
-
+ assert crc_readback == crc_pattern
@pytest.mark.buildconfigspec('cmd_sf')
@pytest.mark.buildconfigspec('cmd_crc32')
@@ -175,7 +171,6 @@ def test_sf_read(u_boot_console, env__sf_config):
sf_params = sf_prepare(u_boot_console, env__sf_config)
sf_read(u_boot_console, env__sf_config, sf_params)
-
@pytest.mark.buildconfigspec('cmd_sf')
@pytest.mark.buildconfigspec('cmd_crc32')
@pytest.mark.buildconfigspec('cmd_memory')
@@ -188,7 +183,6 @@ def test_sf_read_twice(u_boot_console, env__sf_config):
assert crc1 == crc2, 'CRC32 of two successive read operation do not match'
-
@pytest.mark.buildconfigspec('cmd_sf')
@pytest.mark.buildconfigspec('cmd_crc32')
@pytest.mark.buildconfigspec('cmd_memory')
@@ -205,15 +199,15 @@ def test_sf_erase(u_boot_console, env__sf_config):
output = u_boot_console.run_command(cmd)
assert 'Erased: OK' in output, 'Erase operation failed'
- cmd = 'mw.b %08x ffffffff %x' % (addr, count)
+ cmd = 'mw.b %08x ff %x' % (addr, count)
u_boot_console.run_command(cmd)
crc_ffs = u_boot_utils.crc32(u_boot_console, addr, count)
crc_read = sf_read(u_boot_console, env__sf_config, sf_params)
assert crc_ffs == crc_read, 'Unexpected CRC32 after erase operation.'
-
@pytest.mark.buildconfigspec('cmd_sf')
+ at pytest.mark.buildconfigspec('cmd_crc32')
@pytest.mark.buildconfigspec('cmd_memory')
def test_sf_update(u_boot_console, env__sf_config):
if not env__sf_config.get('writeable', False):
--
2.16.1.72.g5be1f00a9a70
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v3 1/7] spi: spi_flash: do not fail silently on bad user input
2018-03-14 2:03 [U-Boot] [PATCH v3 0/7] add inital SF tests Liam Beguin
@ 2018-03-14 2:03 ` Liam Beguin
2018-03-14 2:03 ` [U-Boot] [PATCH v3 2/7] cmd: sf: fix map_physmem check Liam Beguin
` (5 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: Liam Beguin @ 2018-03-14 2:03 UTC (permalink / raw)
To: u-boot
Make sure the user is notified instead of silently returning an error.
Signed-off-by: Liam Beguin <liambeguin@gmail.com>
---
drivers/mtd/spi/spi_flash.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/mtd/spi/spi_flash.c b/drivers/mtd/spi/spi_flash.c
index 294d9f9d79c6..2e61685d3ea4 100644
--- a/drivers/mtd/spi/spi_flash.c
+++ b/drivers/mtd/spi/spi_flash.c
@@ -320,7 +320,7 @@ int spi_flash_cmd_erase_ops(struct spi_flash *flash, u32 offset, size_t len)
erase_size = flash->erase_size;
if (offset % erase_size || len % erase_size) {
- debug("SF: Erase offset/length not multiple of erase size\n");
+ printf("SF: Erase offset/length not multiple of erase size\n");
return -1;
}
--
2.16.1.72.g5be1f00a9a70
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v3 2/7] cmd: sf: fix map_physmem check
2018-03-14 2:03 [U-Boot] [PATCH v3 0/7] add inital SF tests Liam Beguin
2018-03-14 2:03 ` [U-Boot] [PATCH v3 1/7] spi: spi_flash: do not fail silently on bad user input Liam Beguin
@ 2018-03-14 2:03 ` Liam Beguin
2018-03-14 2:03 ` [U-Boot] [PATCH v3 3/7] test/py: README: fix typo Liam Beguin
` (4 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: Liam Beguin @ 2018-03-14 2:03 UTC (permalink / raw)
To: u-boot
Make sure 0x00 is a valid address to read to. If `addr` is 0x00 then
map_physmem() will return 0 which should be a valid address.
Signed-off-by: Liam Beguin <liambeguin@gmail.com>
---
cmd/sf.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cmd/sf.c b/cmd/sf.c
index f971eec781cc..e7ff9a646208 100644
--- a/cmd/sf.c
+++ b/cmd/sf.c
@@ -287,7 +287,7 @@ static int do_spi_flash_read_write(int argc, char * const argv[])
}
buf = map_physmem(addr, len, MAP_WRBACK);
- if (!buf) {
+ if (!buf && addr) {
puts("Failed to map physical memory\n");
return 1;
}
--
2.16.1.72.g5be1f00a9a70
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v3 3/7] test/py: README: fix typo
2018-03-14 2:03 [U-Boot] [PATCH v3 0/7] add inital SF tests Liam Beguin
2018-03-14 2:03 ` [U-Boot] [PATCH v3 1/7] spi: spi_flash: do not fail silently on bad user input Liam Beguin
2018-03-14 2:03 ` [U-Boot] [PATCH v3 2/7] cmd: sf: fix map_physmem check Liam Beguin
@ 2018-03-14 2:03 ` Liam Beguin
2018-03-14 2:03 ` [U-Boot] [PATCH v3 4/7] test/py: README: add HOSTNAME to PYTHONPATH Liam Beguin
` (3 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: Liam Beguin @ 2018-03-14 2:03 UTC (permalink / raw)
To: u-boot
Fix a minor typo causing vim (and possibly other) to get confused with
coloring.
Signed-off-by: Liam Beguin <liambeguin@gmail.com>
---
test/py/README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/test/py/README.md b/test/py/README.md
index eefac377567a..000afce93c4a 100644
--- a/test/py/README.md
+++ b/test/py/README.md
@@ -150,7 +150,7 @@ processing.
option takes a single argument which is used to filter test names. Simple
logical operators are supported. For example:
- `'ums'` runs only tests with "ums" in their name.
- - ``ut_dm'` runs only tests with "ut_dm" in their name. Note that in this
+ - `'ut_dm'` runs only tests with "ut_dm" in their name. Note that in this
case, "ut_dm" is a parameter to a test rather than the test name. The full
test name is e.g. "test_ut[ut_dm_leak]".
- `'not reset'` runs everything except tests with "reset" in their name.
--
2.16.1.72.g5be1f00a9a70
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v3 4/7] test/py: README: add HOSTNAME to PYTHONPATH
2018-03-14 2:03 [U-Boot] [PATCH v3 0/7] add inital SF tests Liam Beguin
` (2 preceding siblings ...)
2018-03-14 2:03 ` [U-Boot] [PATCH v3 3/7] test/py: README: fix typo Liam Beguin
@ 2018-03-14 2:03 ` Liam Beguin
2018-03-14 2:03 ` [U-Boot] [PATCH v3 5/7] test/py: do not import pytest multiple times Liam Beguin
` (2 subsequent siblings)
6 siblings, 0 replies; 12+ messages in thread
From: Liam Beguin @ 2018-03-14 2:03 UTC (permalink / raw)
To: u-boot
As opposed to PATH, HOSTNAME is not appended to PYTHONPATH
automatically. Lets add it to the examples to make it more
obvious to new users.
Signed-off-by: Liam Beguin <liambeguin@gmail.com>
---
test/py/README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/test/py/README.md b/test/py/README.md
index 000afce93c4a..aed2fd063a81 100644
--- a/test/py/README.md
+++ b/test/py/README.md
@@ -320,7 +320,7 @@ If U-Boot has already been built:
```bash
PATH=$HOME/ubtest/bin:$PATH \
- PYTHONPATH=${HOME}/ubtest/py:${PYTHONPATH} \
+ PYTHONPATH=${HOME}/ubtest/py/${HOSTNAME}:${PYTHONPATH} \
./test/py/test.py --bd seaboard
```
@@ -331,7 +331,7 @@ follow:
```bash
CROSS_COMPILE=arm-none-eabi- \
PATH=$HOME/ubtest/bin:$PATH \
- PYTHONPATH=${HOME}/ubtest/py:${PYTHONPATH} \
+ PYTHONPATH=${HOME}/ubtest/py/${HOSTNAME}:${PYTHONPATH} \
./test/py/test.py --bd seaboard --build
```
--
2.16.1.72.g5be1f00a9a70
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v3 5/7] test/py: do not import pytest multiple times
2018-03-14 2:03 [U-Boot] [PATCH v3 0/7] add inital SF tests Liam Beguin
` (3 preceding siblings ...)
2018-03-14 2:03 ` [U-Boot] [PATCH v3 4/7] test/py: README: add HOSTNAME to PYTHONPATH Liam Beguin
@ 2018-03-14 2:03 ` Liam Beguin
2018-03-14 2:03 ` [U-Boot] [PATCH v3 6/7] test/py: add generic CRC32 function Liam Beguin
2018-03-14 2:03 ` [U-Boot] [PATCH v3 7/7] test/py: add spi_flash tests Liam Beguin
6 siblings, 0 replies; 12+ messages in thread
From: Liam Beguin @ 2018-03-14 2:03 UTC (permalink / raw)
To: u-boot
Signed-off-by: Liam Beguin <liambeguin@gmail.com>
---
test/py/u_boot_utils.py | 1 -
1 file changed, 1 deletion(-)
diff --git a/test/py/u_boot_utils.py b/test/py/u_boot_utils.py
index 9acb92ddc448..64584494e463 100644
--- a/test/py/u_boot_utils.py
+++ b/test/py/u_boot_utils.py
@@ -11,7 +11,6 @@ import os.path
import pytest
import sys
import time
-import pytest
def md5sum_data(data):
"""Calculate the MD5 hash of some data.
--
2.16.1.72.g5be1f00a9a70
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v3 6/7] test/py: add generic CRC32 function
2018-03-14 2:03 [U-Boot] [PATCH v3 0/7] add inital SF tests Liam Beguin
` (4 preceding siblings ...)
2018-03-14 2:03 ` [U-Boot] [PATCH v3 5/7] test/py: do not import pytest multiple times Liam Beguin
@ 2018-03-14 2:03 ` Liam Beguin
2018-03-14 2:03 ` [U-Boot] [PATCH v3 7/7] test/py: add spi_flash tests Liam Beguin
6 siblings, 0 replies; 12+ messages in thread
From: Liam Beguin @ 2018-03-14 2:03 UTC (permalink / raw)
To: u-boot
Add a generic function which can be used to compute the CRC32 value of
a region of RAM.
Signed-off-by: Liam Beguin <liambeguin@gmail.com>
---
test/py/u_boot_utils.py | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
diff --git a/test/py/u_boot_utils.py b/test/py/u_boot_utils.py
index 64584494e463..de9ee2643f51 100644
--- a/test/py/u_boot_utils.py
+++ b/test/py/u_boot_utils.py
@@ -11,6 +11,7 @@ import os.path
import pytest
import sys
import time
+import re
def md5sum_data(data):
"""Calculate the MD5 hash of some data.
@@ -310,3 +311,25 @@ def persistent_file_helper(u_boot_log, filename):
"""
return PersistentFileHelperCtxMgr(u_boot_log, filename)
+
+def crc32(u_boot_console, address, count):
+ """Helper function used to compute the CRC32 value of a section of RAM.
+
+ Args:
+ u_boot_console: A U-Boot console connection.
+ address: Address where data starts.
+ count: Amount of data to use for calculation.
+
+ Returns:
+ CRC32 value
+ """
+
+ bcfg = u_boot_console.config.buildconfig
+ has_cmd_crc32 = bcfg.get('config_cmd_crc32', 'n') == 'y'
+ assert has_cmd_crc32, 'Cannot compute crc32 without CONFIG_CMD_CRC32.'
+ output = u_boot_console.run_command('crc32 %08x %x' % (address, count))
+
+ m = re.search('==> ([0-9a-fA-F]{8})$', output)
+ assert m, 'CRC32 operation failed.'
+
+ return m.group(1)
--
2.16.1.72.g5be1f00a9a70
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v3 7/7] test/py: add spi_flash tests
2018-03-14 2:03 [U-Boot] [PATCH v3 0/7] add inital SF tests Liam Beguin
` (5 preceding siblings ...)
2018-03-14 2:03 ` [U-Boot] [PATCH v3 6/7] test/py: add generic CRC32 function Liam Beguin
@ 2018-03-14 2:03 ` Liam Beguin
2018-03-14 14:35 ` Michal Simek
2018-03-14 16:17 ` Stephen Warren
6 siblings, 2 replies; 12+ messages in thread
From: Liam Beguin @ 2018-03-14 2:03 UTC (permalink / raw)
To: u-boot
Add basic tests for the spi_flash subsystem.
Signed-off-by: Liam Beguin <liambeguin@gmail.com>
---
test/py/tests/test_sf.py | 217 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 217 insertions(+)
create mode 100644 test/py/tests/test_sf.py
diff --git a/test/py/tests/test_sf.py b/test/py/tests/test_sf.py
new file mode 100644
index 000000000000..8bd1623ff303
--- /dev/null
+++ b/test/py/tests/test_sf.py
@@ -0,0 +1,217 @@
+# Copyright (c) 2017, Xiphos Systems Corp. All rights reserved.
+#
+# SPDX-License-Identifier: GPL-2.0
+
+import re
+import pytest
+import random
+import u_boot_utils
+
+"""
+Note: This test relies on boardenv_* containing configuration values to define
+which SPI Flash areas are available for testing. Without this, this test will
+be automatically skipped.
+For example:
+
+# A list of sections of Flash memory to be tested.
+env__sf_configs = (
+ {
+ # Where in SPI Flash should the test operate.
+ 'offset': 0x00000000,
+ # This value is optional.
+ # If present, specifies the [[bus:]cs] argument used in `sf probe`
+ # If missing, defaults to 0.
+ 'id': '0:1',
+ # This value is optional.
+ # If set as a number, specifies the speed of the SPI Flash.
+ # If set as an array of 2, specifies a range for a random speed.
+ # If missing, defaults to 0.
+ 'speed': 1000000,
+ # This value is optional.
+ # If present, specifies the size to use for read/write operations.
+ # If missing, the SPI Flash page size is used as a default (based on
+ # the `sf probe` output).
+ 'len': 0x10000,
+ # This value is optional.
+ # If present, specifies if the test can write to Flash offset
+ # If missing, defaults to False.
+ 'writeable': False,
+ # This value is optional.
+ # If present, specifies the expected CRC32 value of the flash area.
+ # If missing, extra check is ignored.
+ 'crc32': 0xCAFECAFE,
+ },
+)
+"""
+
+def sf_prepare(u_boot_console, env__sf_config):
+ """Check global state of the SPI Flash before running any test.
+
+ Args:
+ u_boot_console: A U-Boot console connection.
+ env__sf_config: The single SPI Flash device configuration on which to
+ run the tests.
+
+ Returns:
+ sf_params: a dictionnary of SPI Flash parameters.
+ """
+
+ sf_params = {}
+ sf_params['ram_base'] = u_boot_utils.find_ram_base(u_boot_console)
+
+ probe_id = env__sf_config.get('id', 0)
+ speed = env__sf_config.get('speed', 0)
+ if isinstance(speed, int):
+ sf_params['speed'] = speed
+ else:
+ assert len(speed) == 2, "If speed is a list, it must have 2 entries"
+ sf_params['speed'] = random.randint(speed[0], speed[1])
+
+ cmd = 'sf probe %d %d' % (probe_id, sf_params['speed'])
+
+ output = u_boot_console.run_command(cmd)
+ assert 'SF: Detected' in output, 'No Flash device available'
+
+ m = re.search('page size (.+?) Bytes', output)
+ assert m, 'SPI Flash page size not recognized'
+ sf_params['page_size'] = int(m.group(1))
+
+ m = re.search('erase size (.+?) KiB', output)
+ assert m, 'SPI Flash erase size not recognized'
+ sf_params['erase_size'] = int(m.group(1))
+ sf_params['erase_size'] *= 1024
+
+ m = re.search('total (.+?) MiB', output)
+ assert m, 'SPI Flash total size not recognized'
+ sf_params['total_size'] = int(m.group(1))
+ sf_params['total_size'] *= 1024 * 1024
+
+ assert 'offset' in env__sf_config, \
+ '\'offset\' is required for this test.'
+ sf_params['len'] = env__sf_config.get('len', sf_params['erase_size'])
+
+ assert not env__sf_config['offset'] % sf_params['erase_size'], \
+ 'offset not multiple of erase size.'
+ assert not sf_params['len'] % sf_params['erase_size'], \
+ 'erase length not multiple of erase size.'
+
+ assert not (env__sf_config.get('writeable', False) and
+ 'crc32' in env__sf_config), \
+ 'Cannot check crc32 on writeable sections'
+
+ return sf_params
+
+def sf_read(u_boot_console, env__sf_config, sf_params):
+ """Helper function used to read and compute the CRC32 value of a section of
+ SPI Flash memory.
+
+ Args:
+ u_boot_console: A U-Boot console connection.
+ env__sf_config: The single SPI Flash device configuration on which to
+ run the tests.
+ sf_params: SPI Flash parameters.
+
+ Returns:
+ CRC32 value of SPI Flash section
+ """
+
+ addr = sf_params['ram_base']
+ offset = env__sf_config['offset']
+ count = sf_params['len']
+ pattern = random.randint(0, 0xFF)
+ crc_expected = env__sf_config.get('crc32', None)
+
+ cmd = 'mw.b %08x %02x %x' % (addr, pattern, count)
+ u_boot_console.run_command(cmd)
+ crc_pattern = u_boot_utils.crc32(u_boot_console, addr, count)
+ if crc_expected:
+ assert crc_pattern != crc_expected
+
+ cmd = 'sf read %08x %08x %x' % (addr, offset, count)
+ response = u_boot_console.run_command(cmd)
+ assert 'Read: OK' in response, 'Read operation failed'
+ crc_readback = u_boot_utils.crc32(u_boot_console, addr, count)
+ assert crc_pattern != crc_readback, 'sf read did not update RAM content.'
+ if crc_expected:
+ assert crc_readback == crc_expected
+
+ return crc_readback
+
+def sf_update(u_boot_console, env__sf_config, sf_params):
+ """Helper function used to update a section of SPI Flash memory.
+
+ Args:
+ u_boot_console: A U-Boot console connection.
+ env__sf_config: The single SPI Flash device configuration on which to
+ run the tests.
+
+ Returns:
+ CRC32 value of SPI Flash section
+ """
+
+ addr = sf_params['ram_base']
+ offset = env__sf_config['offset']
+ count = sf_params['len']
+ pattern = int(random.random() * 0xFF)
+
+ cmd = 'mw.b %08x %02x %x' % (addr, pattern, count)
+ u_boot_console.run_command(cmd)
+ crc_pattern = u_boot_utils.crc32(u_boot_console, addr, count)
+
+ cmd = 'sf update %08x %08x %x' % (addr, offset, count)
+ u_boot_console.run_command(cmd)
+ crc_readback = sf_read(u_boot_console, env__sf_config, sf_params)
+
+ assert crc_readback == crc_pattern
+
+ at pytest.mark.buildconfigspec('cmd_sf')
+ at pytest.mark.buildconfigspec('cmd_crc32')
+ at pytest.mark.buildconfigspec('cmd_memory')
+def test_sf_read(u_boot_console, env__sf_config):
+ sf_params = sf_prepare(u_boot_console, env__sf_config)
+ sf_read(u_boot_console, env__sf_config, sf_params)
+
+ at pytest.mark.buildconfigspec('cmd_sf')
+ at pytest.mark.buildconfigspec('cmd_crc32')
+ at pytest.mark.buildconfigspec('cmd_memory')
+def test_sf_read_twice(u_boot_console, env__sf_config):
+ sf_params = sf_prepare(u_boot_console, env__sf_config)
+
+ crc1 = sf_read(u_boot_console, env__sf_config, sf_params)
+ sf_params['ram_base'] += 0x100
+ crc2 = sf_read(u_boot_console, env__sf_config, sf_params)
+
+ assert crc1 == crc2, 'CRC32 of two successive read operation do not match'
+
+ at pytest.mark.buildconfigspec('cmd_sf')
+ at pytest.mark.buildconfigspec('cmd_crc32')
+ at pytest.mark.buildconfigspec('cmd_memory')
+def test_sf_erase(u_boot_console, env__sf_config):
+ if not env__sf_config.get('writeable', False):
+ pytest.skip('Flash config is tagged as not writeable')
+
+ sf_params = sf_prepare(u_boot_console, env__sf_config)
+ addr = sf_params['ram_base']
+ offset = env__sf_config['offset']
+ count = sf_params['len']
+
+ cmd = 'sf erase %08x %x' % (offset, count)
+ output = u_boot_console.run_command(cmd)
+ assert 'Erased: OK' in output, 'Erase operation failed'
+
+ cmd = 'mw.b %08x ff %x' % (addr, count)
+ u_boot_console.run_command(cmd)
+ crc_ffs = u_boot_utils.crc32(u_boot_console, addr, count)
+
+ crc_read = sf_read(u_boot_console, env__sf_config, sf_params)
+ assert crc_ffs == crc_read, 'Unexpected CRC32 after erase operation.'
+
+ at pytest.mark.buildconfigspec('cmd_sf')
+ at pytest.mark.buildconfigspec('cmd_crc32')
+ at pytest.mark.buildconfigspec('cmd_memory')
+def test_sf_update(u_boot_console, env__sf_config):
+ if not env__sf_config.get('writeable', False):
+ pytest.skip('Flash config is tagged as not writeable')
+
+ sf_params = sf_prepare(u_boot_console, env__sf_config)
+ sf_update(u_boot_console, env__sf_config, sf_params)
--
2.16.1.72.g5be1f00a9a70
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v3 7/7] test/py: add spi_flash tests
2018-03-14 2:03 ` [U-Boot] [PATCH v3 7/7] test/py: add spi_flash tests Liam Beguin
@ 2018-03-14 14:35 ` Michal Simek
2018-03-14 15:59 ` Liam Beguin
2018-03-14 16:17 ` Stephen Warren
1 sibling, 1 reply; 12+ messages in thread
From: Michal Simek @ 2018-03-14 14:35 UTC (permalink / raw)
To: u-boot
On 14.3.2018 03:03, Liam Beguin wrote:
> Add basic tests for the spi_flash subsystem.
>
> Signed-off-by: Liam Beguin <liambeguin@gmail.com>
> ---
> test/py/tests/test_sf.py | 217 +++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 217 insertions(+)
> create mode 100644 test/py/tests/test_sf.py
>
> diff --git a/test/py/tests/test_sf.py b/test/py/tests/test_sf.py
> new file mode 100644
> index 000000000000..8bd1623ff303
> --- /dev/null
> +++ b/test/py/tests/test_sf.py
> @@ -0,0 +1,217 @@
> +# Copyright (c) 2017, Xiphos Systems Corp. All rights reserved.
here should be probably also xilinx copyright because some things were
taken from that.
Michal
^ permalink raw reply [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v3 7/7] test/py: add spi_flash tests
2018-03-14 14:35 ` Michal Simek
@ 2018-03-14 15:59 ` Liam Beguin
2018-03-15 6:35 ` Michal Simek
0 siblings, 1 reply; 12+ messages in thread
From: Liam Beguin @ 2018-03-14 15:59 UTC (permalink / raw)
To: u-boot
Hi Michal,
On Wed, 14 Mar 2018 at 10:35 Michal Simek <michal.simek@xilinx.com> wrote:
> On 14.3.2018 03:03, Liam Beguin wrote:
> > Add basic tests for the spi_flash subsystem.
> >
> > Signed-off-by: Liam Beguin <liambeguin@gmail.com>
> > ---
> > test/py/tests/test_sf.py | 217
> +++++++++++++++++++++++++++++++++++++++++++++++
> > 1 file changed, 217 insertions(+)
> > create mode 100644 test/py/tests/test_sf.py
> >
> > diff --git a/test/py/tests/test_sf.py b/test/py/tests/test_sf.py
> > new file mode 100644
> > index 000000000000..8bd1623ff303
> > --- /dev/null
> > +++ b/test/py/tests/test_sf.py
> > @@ -0,0 +1,217 @@
> > +# Copyright (c) 2017, Xiphos Systems Corp. All rights reserved.
>
> here should be probably also xilinx copyright because some things were
> taken from that.
>
>
Right, is this ok with you? (copied from your initial patch)
Copyright (c) 2016, Xilinx Inc. Michal Simek
> Michal
>
Liam Beguin
^ permalink raw reply [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v3 7/7] test/py: add spi_flash tests
2018-03-14 2:03 ` [U-Boot] [PATCH v3 7/7] test/py: add spi_flash tests Liam Beguin
2018-03-14 14:35 ` Michal Simek
@ 2018-03-14 16:17 ` Stephen Warren
1 sibling, 0 replies; 12+ messages in thread
From: Stephen Warren @ 2018-03-14 16:17 UTC (permalink / raw)
To: u-boot
On 03/13/2018 08:03 PM, Liam Beguin wrote:
> Add basic tests for the spi_flash subsystem.
Reviewed-by: Stephen Warren <swarren@nvidia.com>
^ permalink raw reply [flat|nested] 12+ messages in thread
* [U-Boot] [PATCH v3 7/7] test/py: add spi_flash tests
2018-03-14 15:59 ` Liam Beguin
@ 2018-03-15 6:35 ` Michal Simek
0 siblings, 0 replies; 12+ messages in thread
From: Michal Simek @ 2018-03-15 6:35 UTC (permalink / raw)
To: u-boot
On 14.3.2018 16:59, Liam Beguin wrote:
> Hi Michal,
>
> On Wed, 14 Mar 2018 at 10:35 Michal Simek <michal.simek@xilinx.com> wrote:
>
>> On 14.3.2018 03:03, Liam Beguin wrote:
>>> Add basic tests for the spi_flash subsystem.
>>>
>>> Signed-off-by: Liam Beguin <liambeguin@gmail.com>
>>> ---
>>> test/py/tests/test_sf.py | 217
>> +++++++++++++++++++++++++++++++++++++++++++++++
>>> 1 file changed, 217 insertions(+)
>>> create mode 100644 test/py/tests/test_sf.py
>>>
>>> diff --git a/test/py/tests/test_sf.py b/test/py/tests/test_sf.py
>>> new file mode 100644
>>> index 000000000000..8bd1623ff303
>>> --- /dev/null
>>> +++ b/test/py/tests/test_sf.py
>>> @@ -0,0 +1,217 @@
>>> +# Copyright (c) 2017, Xiphos Systems Corp. All rights reserved.
>>
>> here should be probably also xilinx copyright because some things were
>> taken from that.
>>
>>
> Right, is this ok with you? (copied from your initial patch)
>
> Copyright (c) 2016, Xilinx Inc. Michal Simek
definitely. I see it in v4 already.
Thanks,
Michal
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2018-03-15 6:35 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-03-14 2:03 [U-Boot] [PATCH v3 0/7] add inital SF tests Liam Beguin
2018-03-14 2:03 ` [U-Boot] [PATCH v3 1/7] spi: spi_flash: do not fail silently on bad user input Liam Beguin
2018-03-14 2:03 ` [U-Boot] [PATCH v3 2/7] cmd: sf: fix map_physmem check Liam Beguin
2018-03-14 2:03 ` [U-Boot] [PATCH v3 3/7] test/py: README: fix typo Liam Beguin
2018-03-14 2:03 ` [U-Boot] [PATCH v3 4/7] test/py: README: add HOSTNAME to PYTHONPATH Liam Beguin
2018-03-14 2:03 ` [U-Boot] [PATCH v3 5/7] test/py: do not import pytest multiple times Liam Beguin
2018-03-14 2:03 ` [U-Boot] [PATCH v3 6/7] test/py: add generic CRC32 function Liam Beguin
2018-03-14 2:03 ` [U-Boot] [PATCH v3 7/7] test/py: add spi_flash tests Liam Beguin
2018-03-14 14:35 ` Michal Simek
2018-03-14 15:59 ` Liam Beguin
2018-03-15 6:35 ` Michal Simek
2018-03-14 16:17 ` Stephen Warren
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.