All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.