aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/spi/spi-test.h
diff options
context:
space:
mode:
authorMartin Sperl <kernel@martin.sperl.org>2015-11-27 08:56:04 -0500
committerMark Brown <broonie@kernel.org>2015-12-12 18:05:18 -0500
commit84e0c4e5e2c4ef42b9c6f6d4151973a297ee4656 (patch)
tree9a78b4fea6b78e2375a7411d530bb78a54a5e307 /drivers/spi/spi-test.h
parent49ddedf3bfcb59a562c7db0e50aecd1422e9cdc9 (diff)
spi: add loopback test driver to allow for spi_master regression tests
This driver is submitting lots of distinct spi-messages messages with all kinds of alignments and length pattern. Also distinct kinds of transfer pattern tests are implemented (rx, tx, rx/tx, tx+tx, tx+rx,...) Right now on a raspberry pi 752 distinct spi_messages are executed in 13 different scenarios. Configuration of additional test-pattern is easy, so that when new bugs in drivers get detected the relevant transfer pattern can also get added to the test framework, so that such situations are detected in other drivers as well. The idea behind this driver is to make it possible to also detect regressions in spi_master implementations when changes occur. Potentially these tests could get executed automatically in a test-server-farm. Signed-off-by: Martin Sperl <kernel@martin.sperl.org> Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'drivers/spi/spi-test.h')
-rw-r--r--drivers/spi/spi-test.h135
1 files changed, 135 insertions, 0 deletions
diff --git a/drivers/spi/spi-test.h b/drivers/spi/spi-test.h
new file mode 100644
index 000000000000..7bfdbe24cf7e
--- /dev/null
+++ b/drivers/spi/spi-test.h
@@ -0,0 +1,135 @@
1/*
2 * linux/drivers/spi/spi-test.h
3 *
4 * (c) Martin Sperl <kernel@martin.sperl.org>
5 *
6 * spi_test definitions
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 */
18
19#include <linux/spi/spi.h>
20
21#define SPI_TEST_MAX_TRANSFERS 4
22#define SPI_TEST_MAX_SIZE (32 * PAGE_SIZE)
23#define SPI_TEST_MAX_ITERATE 16
24
25/* the "dummy" start addresses used in spi_test
26 * these addresses get translated at a later stage
27 */
28#define RX_START BIT(30)
29#define TX_START BIT(31)
30#define RX(off) ((void *)(RX_START + off))
31#define TX(off) ((void *)(TX_START + off))
32
33/* some special defines for offsets */
34#define SPI_TEST_MAX_SIZE_HALF BIT(29)
35
36/* detection pattern for unfinished reads...
37 * - 0x00 or 0xff could be valid levels for tx_buf = NULL,
38 * so we do not use either of them
39 */
40#define SPI_TEST_PATTERN_UNWRITTEN 0xAA
41#define SPI_TEST_PATTERN_DO_NOT_WRITE 0x55
42#define SPI_TEST_CHECK_DO_NOT_WRITE 64
43
44/**
45 * struct spi_test - describes a specific (set of) tests to execute
46 *
47 * @description: description of the test
48 *
49 * @msg: a template @spi_message usedfor the default settings
50 * @transfers: array of @spi_transfers that are part of the
51 * resulting spi_message. The first transfer with len == 0
52 * signifies the end of the list
53 * @transfer_count: normally computed number of transfers with len > 0
54 *
55 * @run_test: run a specific spi_test - this allows to override
56 * the default implementation of @spi_test_run_transfer
57 * either to add some custom filters for a specific test
58 * or to effectively run some very custom tests...
59 * @execute_msg: run the spi_message for real - this allows to override
60 * @spi_test_execute_msg to apply final modifications
61 * on the spi_message
62 * @expected_return: the expected return code - in some cases we want to
63 * test also for error conditions
64 *
65 * @iterate_len: list of length to iterate on (in addition to the
66 * explicitly set @spi_transfer.len)
67 * @iterate_tx_align: change the alignment of @spi_transfer.tx_buf
68 * for all values in the below range if set.
69 * the ranges are:
70 * [0 : @spi_master.dma_alignment[ if set
71 * [0 : iterate_tx_align[ if unset
72 * @iterate_rx_align: change the alignment of @spi_transfer.rx_buf
73 * see @iterate_tx_align for details
74 * @iterate_transfer_mask: the bitmask of transfers to which the iterations
75 * apply - if 0, then it applies to all transfer
76 *
77 * @fill_option: define the way how tx_buf is filled
78 * @fill_pattern: fill pattern to apply to the tx_buf
79 * (used in some of the @fill_options)
80 */
81
82struct spi_test {
83 char description[64];
84 struct spi_message msg;
85 struct spi_transfer transfers[SPI_TEST_MAX_TRANSFERS];
86 unsigned int transfer_count;
87 int (*run_test)(struct spi_device *spi, struct spi_test *test,
88 void *tx, void *rx);
89 int (*execute_msg)(struct spi_device *spi, struct spi_test *test,
90 void *tx, void *rx);
91 int expected_return;
92 /* iterate over all the non-zero values */
93 int iterate_len[SPI_TEST_MAX_ITERATE];
94 int iterate_tx_align;
95 int iterate_rx_align;
96 u32 iterate_transfer_mask;
97 /* the tx-fill operation */
98 u32 fill_option;
99#define FILL_MEMSET_8 0 /* just memset with 8 bit */
100#define FILL_MEMSET_16 1 /* just memset with 16 bit */
101#define FILL_MEMSET_24 2 /* just memset with 24 bit */
102#define FILL_MEMSET_32 3 /* just memset with 32 bit */
103#define FILL_COUNT_8 4 /* fill with a 8 byte counter */
104#define FILL_COUNT_16 5 /* fill with a 16 bit counter */
105#define FILL_COUNT_24 6 /* fill with a 24 bit counter */
106#define FILL_COUNT_32 7 /* fill with a 32 bit counter */
107#define FILL_TRANSFER_BYTE_8 8 /* fill with the transfer byte - 8 bit */
108#define FILL_TRANSFER_BYTE_16 9 /* fill with the transfer byte - 16 bit */
109#define FILL_TRANSFER_BYTE_24 10 /* fill with the transfer byte - 24 bit */
110#define FILL_TRANSFER_BYTE_32 11 /* fill with the transfer byte - 32 bit */
111#define FILL_TRANSFER_NUM 16 /* fill with the transfer number */
112 u32 fill_pattern;
113};
114
115/* default implementation for @spi_test.run_test */
116int spi_test_run_test(struct spi_device *spi,
117 const struct spi_test *test,
118 void *tx, void *rx);
119
120/* default implementation for @spi_test.execute_msg */
121int spi_test_execute_msg(struct spi_device *spi,
122 struct spi_test *test,
123 void *tx, void *rx);
124
125/* function to execute a set of tests */
126int spi_test_run_tests(struct spi_device *spi,
127 struct spi_test *tests);
128
129/* some of the default @spi_transfer.len to test */
130#define ITERATE_LEN 16, 32, 64, 128, 256, 1024, PAGE_SIZE, 65536
131
132#define ITERATE_MAX_LEN ITERATE_LEN, SPI_TEST_MAX_SIZE
133
134/* the default alignment to test */
135#define ITERATE_ALIGN sizeof(int)