tests/qtest: aspeed_smc: Add Dual Output Read (DOR) test coverage
Add read_page_mem_dor (CTRL_FREADMODE with DOR command and dual data IO mode) and write_page_dor (user-mode DOR) tests. Reviewed-by: Bin Meng <bin.meng@processmission.com> Link: https://lore.kernel.org/qemu-devel/20260714124621.522948-4-clg@redhat.com Signed-off-by: Cédric Le Goater <clg@redhat.com>
Cédric Le Goater committed
Jul 14, 2026 at 14:46 UTC
da5598227d06112f7d5ef6dcb567173158690565
4 files changed
+69
tests/qtest/aspeed-smc-utils.c
+45
@@ -98,6 +98,10 @@ static void spi_ctrl_set_fast_read(const AspeedSMCTestData *data, uint8_t cmd)
98
uint32_t ctrl = spi_readl(data, ctrl_reg);
99
uint32_t iomode = 0;
100
101
+ if (cmd == DOR) {
102
+ iomode = CTRL_IO_DUAL_DATA;
103
+ }
104
+
105
ctrl &= ~(CTRL_USERMODE | (0xff << 16) |
106
(0x3 << CTRL_DUMMY_LOW_SHIFT) |
107
(0x1 << CTRL_DUMMY_HIGH_SHIFT) |
@@ -738,3 +742,44 @@ void aspeed_smc_test_write_page_fast_read(const void *data)
742
{
743
test_write_page(data, read_page_fast_read);
744
}
745
+
746
+static void read_page_mem_dor(const AspeedSMCTestData *data,
747
+ uint32_t addr, uint32_t *page)
748
+{
749
+ int i;
750
+
751
+ spi_ctrl_set_fast_read(data, DOR);
752
+
753
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
754
+ page[i] = make_be32(flash_readl(data, addr + i * 4));
755
+ }
756
+}
757
+
758
+void aspeed_smc_test_read_page_mem_dor(const void *data)
759
+{
760
+ test_read_page_mem(data, read_page_mem_dor);
761
+}
762
+
763
+static void read_page_dor(const AspeedSMCTestData *data,
764
+ uint32_t addr, uint32_t *page)
765
+{
766
+ int i;
767
+
768
+ spi_ctrl_start_user(data);
769
+
770
+ flash_writeb(data, 0, EN_4BYTE_ADDR);
771
+ flash_writeb(data, 0, DOR);
772
+ flash_writel(data, 0, make_be32(addr));
773
+ /* 1 dummy byte for standard SPI DOR */
774
+ flash_writeb(data, 0, 0x00);
775
+
776
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
777
+ page[i] = make_be32(flash_readl(data, 0));
778
+ }
779
+ spi_ctrl_stop_user(data);
780
+}
781
+
782
+void aspeed_smc_test_write_page_dor(const void *data)
783
+{
784
+ test_write_page(data, read_page_dor);
785
+}
tests/qtest/aspeed-smc-utils.h
+4
@@ -28,6 +28,7 @@
28
#define CTRL_FREADMODE 0x1
29
#define CTRL_WRITEMODE 0x2
30
#define CTRL_USERMODE 0x3
31
+#define CTRL_IO_DUAL_DATA BIT(29)
32
#define CTRL_DUMMY_LOW_SHIFT 6
33
#define CTRL_DUMMY_HIGH_SHIFT 14
34
#define SR_WEL BIT(1)
@@ -42,6 +43,7 @@ enum {
43
BULK_ERASE = 0xc7,
44
READ = 0x03,
45
FAST_READ = 0x0b,
46
+ DOR = 0x3b,
47
PP = 0x02,
48
WRSR = 0x1,
49
WREN = 0x6,
@@ -79,5 +81,7 @@ void aspeed_smc_test_write_block_protect_bottom_bit(const void *data);
81
void aspeed_smc_test_write_page_qpi(const void *data);
82
void aspeed_smc_test_read_page_mem_fast_read(const void *data);
83
void aspeed_smc_test_write_page_fast_read(const void *data);
84
+void aspeed_smc_test_read_page_mem_dor(const void *data);
85
+void aspeed_smc_test_write_page_dor(const void *data);
86
87
#endif /* TESTS_ASPEED_SMC_UTILS_H */
tests/qtest/aspeed_smc-test.c
+16
@@ -56,6 +56,10 @@ static void test_palmetto_bmc(AspeedSMCTestData *data)
56
data, aspeed_smc_test_read_page_mem_fast_read);
57
qtest_add_data_func("/ast2400/smc/write_page_fast_read",
58
data, aspeed_smc_test_write_page_fast_read);
59
+ qtest_add_data_func("/ast2400/smc/read_page_mem_dor",
60
+ data, aspeed_smc_test_read_page_mem_dor);
61
+ qtest_add_data_func("/ast2400/smc/write_page_dor",
62
+ data, aspeed_smc_test_write_page_dor);
63
/*
64
* Block protect tests must be run last because the block protect
65
* state is not cleared by reset_memory() and silently prevents
@@ -112,6 +116,10 @@ static void test_ast2500_evb(AspeedSMCTestData *data)
116
data, aspeed_smc_test_read_page_mem_fast_read);
117
qtest_add_data_func("/ast2500/smc/write_page_fast_read",
118
data, aspeed_smc_test_write_page_fast_read);
119
+ qtest_add_data_func("/ast2500/smc/read_page_mem_dor",
120
+ data, aspeed_smc_test_read_page_mem_dor);
121
+ qtest_add_data_func("/ast2500/smc/write_page_dor",
122
+ data, aspeed_smc_test_write_page_dor);
123
}
124
125
static void test_ast2600_evb(AspeedSMCTestData *data)
@@ -159,6 +167,10 @@ static void test_ast2600_evb(AspeedSMCTestData *data)
167
data, aspeed_smc_test_read_page_mem_fast_read);
168
qtest_add_data_func("/ast2600/smc/write_page_fast_read",
169
data, aspeed_smc_test_write_page_fast_read);
170
+ qtest_add_data_func("/ast2600/smc/read_page_mem_dor",
171
+ data, aspeed_smc_test_read_page_mem_dor);
172
+ qtest_add_data_func("/ast2600/smc/write_page_dor",
173
+ data, aspeed_smc_test_write_page_dor);
174
}
175
176
static void test_ast1030_evb(AspeedSMCTestData *data)
@@ -206,6 +218,10 @@ static void test_ast1030_evb(AspeedSMCTestData *data)
218
data, aspeed_smc_test_read_page_mem_fast_read);
219
qtest_add_data_func("/ast1030/smc/write_page_fast_read",
220
data, aspeed_smc_test_write_page_fast_read);
221
+ qtest_add_data_func("/ast1030/smc/read_page_mem_dor",
222
+ data, aspeed_smc_test_read_page_mem_dor);
223
+ qtest_add_data_func("/ast1030/smc/write_page_dor",
224
+ data, aspeed_smc_test_write_page_dor);
225
}
226
227
int main(int argc, char **argv)
tests/qtest/ast2700-smc-test.c
+4
@@ -56,6 +56,10 @@ static void test_ast2700_evb(AspeedSMCTestData *data)
56
data, aspeed_smc_test_read_page_mem_fast_read);
57
qtest_add_data_func("/ast2700/smc/write_page_fast_read",
58
data, aspeed_smc_test_write_page_fast_read);
59
+ qtest_add_data_func("/ast2700/smc/read_page_mem_dor",
60
+ data, aspeed_smc_test_read_page_mem_dor);
61
+ qtest_add_data_func("/ast2700/smc/write_page_dor",
62
+ data, aspeed_smc_test_write_page_dor);
63
}
64
65
int main(int argc, char **argv)