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)