@samitouri / QOSamiQemu / commits / da5598227d

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)