@samitouri / QOSamiQemu / commits / a15167a329

tests/qtest: aspeed_smc: Add Quad Output Read (QOR) test coverage

Add read_page_mem_qor (CTRL_FREADMODE with QOR command and quad data IO mode) and write_page_qor (user-mode QOR) tests. Reviewed-by: Bin Meng <bin.meng@processmission.com> Link: https://lore.kernel.org/qemu-devel/20260714124621.522948-5-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 a15167a329f7f9bf5a637ae8186ed51e31e5eb63
4 files changed +67
tests/qtest/aspeed-smc-utils.c
+43
@@ -100,6 +100,8 @@ static void spi_ctrl_set_fast_read(const AspeedSMCTestData *data, uint8_t cmd)
100
101 if (cmd == DOR) {
102 iomode = CTRL_IO_DUAL_DATA;
103 + } else if (cmd == QOR) {
104 + iomode = CTRL_IO_QUAD_DATA;
105 }
106
107 ctrl &= ~(CTRL_USERMODE | (0xff << 16) |
@@ -783,3 +785,44 @@ void aspeed_smc_test_write_page_dor(const void *data)
785 {
786 test_write_page(data, read_page_dor);
787 }
788 +
789 +static void read_page_mem_qor(const AspeedSMCTestData *data,
790 + uint32_t addr, uint32_t *page)
791 +{
792 + int i;
793 +
794 + spi_ctrl_set_fast_read(data, QOR);
795 +
796 + for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
797 + page[i] = make_be32(flash_readl(data, addr + i * 4));
798 + }
799 +}
800 +
801 +void aspeed_smc_test_read_page_mem_qor(const void *data)
802 +{
803 + test_read_page_mem(data, read_page_mem_qor);
804 +}
805 +
806 +static void read_page_qor(const AspeedSMCTestData *data,
807 + uint32_t addr, uint32_t *page)
808 +{
809 + int i;
810 +
811 + spi_ctrl_start_user(data);
812 +
813 + flash_writeb(data, 0, EN_4BYTE_ADDR);
814 + flash_writeb(data, 0, QOR);
815 + flash_writel(data, 0, make_be32(addr));
816 + /* 1 dummy byte for standard SPI QOR */
817 + flash_writeb(data, 0, 0x00);
818 +
819 + for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
820 + page[i] = make_be32(flash_readl(data, 0));
821 + }
822 + spi_ctrl_stop_user(data);
823 +}
824 +
825 +void aspeed_smc_test_write_page_qor(const void *data)
826 +{
827 + test_write_page(data, read_page_qor);
828 +}
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_QUAD_DATA BIT(30)
32 #define CTRL_IO_DUAL_DATA BIT(29)
33 #define CTRL_DUMMY_LOW_SHIFT 6
34 #define CTRL_DUMMY_HIGH_SHIFT 14
@@ -44,6 +45,7 @@ enum {
45 READ = 0x03,
46 FAST_READ = 0x0b,
47 DOR = 0x3b,
48 + QOR = 0x6b,
49 PP = 0x02,
50 WRSR = 0x1,
51 WREN = 0x6,
@@ -83,5 +85,7 @@ void aspeed_smc_test_read_page_mem_fast_read(const void *data);
85 void aspeed_smc_test_write_page_fast_read(const void *data);
86 void aspeed_smc_test_read_page_mem_dor(const void *data);
87 void aspeed_smc_test_write_page_dor(const void *data);
88 +void aspeed_smc_test_read_page_mem_qor(const void *data);
89 +void aspeed_smc_test_write_page_qor(const void *data);
90
91 #endif /* TESTS_ASPEED_SMC_UTILS_H */
tests/qtest/aspeed_smc-test.c
+16
@@ -60,6 +60,10 @@ static void test_palmetto_bmc(AspeedSMCTestData *data)
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 + qtest_add_data_func("/ast2400/smc/read_page_mem_qor",
64 + data, aspeed_smc_test_read_page_mem_qor);
65 + qtest_add_data_func("/ast2400/smc/write_page_qor",
66 + data, aspeed_smc_test_write_page_qor);
67 /*
68 * Block protect tests must be run last because the block protect
69 * state is not cleared by reset_memory() and silently prevents
@@ -120,6 +124,10 @@ static void test_ast2500_evb(AspeedSMCTestData *data)
124 data, aspeed_smc_test_read_page_mem_dor);
125 qtest_add_data_func("/ast2500/smc/write_page_dor",
126 data, aspeed_smc_test_write_page_dor);
127 + qtest_add_data_func("/ast2500/smc/read_page_mem_qor",
128 + data, aspeed_smc_test_read_page_mem_qor);
129 + qtest_add_data_func("/ast2500/smc/write_page_qor",
130 + data, aspeed_smc_test_write_page_qor);
131 }
132
133 static void test_ast2600_evb(AspeedSMCTestData *data)
@@ -171,6 +179,10 @@ static void test_ast2600_evb(AspeedSMCTestData *data)
179 data, aspeed_smc_test_read_page_mem_dor);
180 qtest_add_data_func("/ast2600/smc/write_page_dor",
181 data, aspeed_smc_test_write_page_dor);
182 + qtest_add_data_func("/ast2600/smc/read_page_mem_qor",
183 + data, aspeed_smc_test_read_page_mem_qor);
184 + qtest_add_data_func("/ast2600/smc/write_page_qor",
185 + data, aspeed_smc_test_write_page_qor);
186 }
187
188 static void test_ast1030_evb(AspeedSMCTestData *data)
@@ -222,6 +234,10 @@ static void test_ast1030_evb(AspeedSMCTestData *data)
234 data, aspeed_smc_test_read_page_mem_dor);
235 qtest_add_data_func("/ast1030/smc/write_page_dor",
236 data, aspeed_smc_test_write_page_dor);
237 + qtest_add_data_func("/ast1030/smc/read_page_mem_qor",
238 + data, aspeed_smc_test_read_page_mem_qor);
239 + qtest_add_data_func("/ast1030/smc/write_page_qor",
240 + data, aspeed_smc_test_write_page_qor);
241 }
242
243 int main(int argc, char **argv)
tests/qtest/ast2700-smc-test.c
+4
@@ -60,6 +60,10 @@ static void test_ast2700_evb(AspeedSMCTestData *data)
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 + qtest_add_data_func("/ast2700/smc/read_page_mem_qor",
64 + data, aspeed_smc_test_read_page_mem_qor);
65 + qtest_add_data_func("/ast2700/smc/write_page_qor",
66 + data, aspeed_smc_test_write_page_qor);
67 }
68
69 int main(int argc, char **argv)