master
c 273 lines 11 KB
Raw
1 /*
2 * QTest testcase for the M25P80 Flash (Using the Aspeed SPI
3 * Controller)
4 *
5 * Copyright (C) 2016 IBM Corp.
6 *
7 * SPDX-License-Identifier: MIT
8 */
9
10 #include "qemu/osdep.h"
11 #include "libqtest-single.h"
12 #include "qemu/bitops.h"
13 #include "aspeed-smc-utils.h"
14
15 static void test_palmetto_bmc(AspeedSMCTestData *data)
16 {
17 int ret;
18 int fd;
19
20 fd = g_file_open_tmp("qtest.m25p80.n25q256a.XXXXXX", &data->tmp_path, NULL);
21 g_assert(fd >= 0);
22 ret = ftruncate(fd, 32 * 1024 * 1024);
23 g_assert(ret == 0);
24 close(fd);
25
26 data->s = qtest_initf("-m 256 -machine palmetto-bmc "
27 "-drive file=%s,format=raw,if=mtd",
28 data->tmp_path);
29
30 /* fmc cs0 with n25q256a flash */
31 data->flash_base = 0x20000000;
32 data->spi_base = 0x1E620000;
33 data->jedec_id = 0x20ba19;
34 data->cs = 0;
35 data->node = "/machine/soc/fmc/ssi.0/child[0]";
36 /* beyond 16MB */
37 data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
38
39 qtest_add_data_func("/ast2400/smc/read_jedec",
40 data, aspeed_smc_test_read_jedec);
41 qtest_add_data_func("/ast2400/smc/erase_sector",
42 data, aspeed_smc_test_erase_sector);
43 qtest_add_data_func("/ast2400/smc/erase_all",
44 data, aspeed_smc_test_erase_all);
45 qtest_add_data_func("/ast2400/smc/write_page",
46 data, aspeed_smc_test_write_page);
47 qtest_add_data_func("/ast2400/smc/read_page_mem",
48 data, aspeed_smc_test_read_page_mem);
49 qtest_add_data_func("/ast2400/smc/write_page_mem",
50 data, aspeed_smc_test_write_page_mem);
51 qtest_add_data_func("/ast2400/smc/read_status_reg",
52 data, aspeed_smc_test_read_status_reg);
53 qtest_add_data_func("/ast2400/smc/status_reg_write_protection",
54 data, aspeed_smc_test_status_reg_write_protection);
55 qtest_add_data_func("/ast2400/smc/read_page_mem_fast_read",
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 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
70 * subsequent flash writes.
71 */
72 qtest_add_data_func("/ast2400/smc/write_block_protect",
73 data, aspeed_smc_test_write_block_protect);
74 qtest_add_data_func("/ast2400/smc/write_block_protect_bottom_bit",
75 data, aspeed_smc_test_write_block_protect_bottom_bit);
76 }
77
78 static void test_ast2500_evb(AspeedSMCTestData *data)
79 {
80 int ret;
81 int fd;
82
83 fd = g_file_open_tmp("qtest.m25p80.mx25l25635e.XXXXXX",
84 &data->tmp_path, NULL);
85 g_assert(fd >= 0);
86 ret = ftruncate(fd, 32 * 1024 * 1024);
87 g_assert(ret == 0);
88 close(fd);
89
90 data->s = qtest_initf("-machine ast2500-evb "
91 "-drive file=%s,format=raw,if=mtd",
92 data->tmp_path);
93
94 /* fmc cs0 with mx25l25635e flash */
95 data->flash_base = 0x20000000;
96 data->spi_base = 0x1E620000;
97 data->jedec_id = 0xc22019;
98 data->cs = 0;
99 data->node = "/machine/soc/fmc/ssi.0/child[0]";
100 /* beyond 16MB */
101 data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
102
103 qtest_add_data_func("/ast2500/smc/read_jedec",
104 data, aspeed_smc_test_read_jedec);
105 qtest_add_data_func("/ast2500/smc/erase_sector",
106 data, aspeed_smc_test_erase_sector);
107 qtest_add_data_func("/ast2500/smc/erase_all",
108 data, aspeed_smc_test_erase_all);
109 qtest_add_data_func("/ast2500/smc/write_page",
110 data, aspeed_smc_test_write_page);
111 qtest_add_data_func("/ast2500/smc/read_page_mem",
112 data, aspeed_smc_test_read_page_mem);
113 qtest_add_data_func("/ast2500/smc/write_page_mem",
114 data, aspeed_smc_test_write_page_mem);
115 qtest_add_data_func("/ast2500/smc/read_status_reg",
116 data, aspeed_smc_test_read_status_reg);
117 qtest_add_data_func("/ast2500/smc/write_page_qpi",
118 data, aspeed_smc_test_write_page_qpi);
119 qtest_add_data_func("/ast2500/smc/read_page_mem_fast_read",
120 data, aspeed_smc_test_read_page_mem_fast_read);
121 qtest_add_data_func("/ast2500/smc/write_page_fast_read",
122 data, aspeed_smc_test_write_page_fast_read);
123 qtest_add_data_func("/ast2500/smc/read_page_mem_dor",
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)
134 {
135 int ret;
136 int fd;
137
138 fd = g_file_open_tmp("qtest.m25p80.mx66u51235f.XXXXXX",
139 &data->tmp_path, NULL);
140 g_assert(fd >= 0);
141 ret = ftruncate(fd, 64 * 1024 * 1024);
142 g_assert(ret == 0);
143 close(fd);
144
145 data->s = qtest_initf("-machine ast2600-evb "
146 "-drive file=%s,format=raw,if=mtd",
147 data->tmp_path);
148
149 /* fmc cs0 with w25q512jv flash */
150 data->flash_base = 0x20000000;
151 data->spi_base = 0x1E620000;
152 data->jedec_id = 0xef4020;
153 data->cs = 0;
154 data->node = "/machine/soc/fmc/ssi.0/child[0]";
155 /* beyond 16MB */
156 data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
157
158 qtest_add_data_func("/ast2600/smc/read_jedec",
159 data, aspeed_smc_test_read_jedec);
160 qtest_add_data_func("/ast2600/smc/erase_sector",
161 data, aspeed_smc_test_erase_sector);
162 qtest_add_data_func("/ast2600/smc/erase_all",
163 data, aspeed_smc_test_erase_all);
164 qtest_add_data_func("/ast2600/smc/write_page",
165 data, aspeed_smc_test_write_page);
166 qtest_add_data_func("/ast2600/smc/read_page_mem",
167 data, aspeed_smc_test_read_page_mem);
168 qtest_add_data_func("/ast2600/smc/write_page_mem",
169 data, aspeed_smc_test_write_page_mem);
170 qtest_add_data_func("/ast2600/smc/read_status_reg",
171 data, aspeed_smc_test_read_status_reg);
172 qtest_add_data_func("/ast2600/smc/write_page_qpi",
173 data, aspeed_smc_test_write_page_qpi);
174 qtest_add_data_func("/ast2600/smc/read_page_mem_fast_read",
175 data, aspeed_smc_test_read_page_mem_fast_read);
176 qtest_add_data_func("/ast2600/smc/write_page_fast_read",
177 data, aspeed_smc_test_write_page_fast_read);
178 qtest_add_data_func("/ast2600/smc/read_page_mem_dor",
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)
189 {
190 int ret;
191 int fd;
192
193 fd = g_file_open_tmp("qtest.m25p80.w25q80bl.XXXXXX",
194 &data->tmp_path, NULL);
195 g_assert(fd >= 0);
196 ret = ftruncate(fd, 1 * 1024 * 1024);
197 g_assert(ret == 0);
198 close(fd);
199
200 data->s = qtest_initf("-machine ast1030-evb "
201 "-drive file=%s,format=raw,if=mtd",
202 data->tmp_path);
203
204 /* fmc cs0 with w25q80bl flash */
205 data->flash_base = 0x80000000;
206 data->spi_base = 0x7E620000;
207 data->jedec_id = 0xef4014;
208 data->cs = 0;
209 data->node = "/machine/soc/fmc/ssi.0/child[0]";
210 /* beyond 512KB */
211 data->page_addr = 0x800 * FLASH_PAGE_SIZE;
212
213 qtest_add_data_func("/ast1030/smc/read_jedec",
214 data, aspeed_smc_test_read_jedec);
215 qtest_add_data_func("/ast1030/smc/erase_sector",
216 data, aspeed_smc_test_erase_sector);
217 qtest_add_data_func("/ast1030/smc/erase_all",
218 data, aspeed_smc_test_erase_all);
219 qtest_add_data_func("/ast1030/smc/write_page",
220 data, aspeed_smc_test_write_page);
221 qtest_add_data_func("/ast1030/smc/read_page_mem",
222 data, aspeed_smc_test_read_page_mem);
223 qtest_add_data_func("/ast1030/smc/write_page_mem",
224 data, aspeed_smc_test_write_page_mem);
225 qtest_add_data_func("/ast1030/smc/read_status_reg",
226 data, aspeed_smc_test_read_status_reg);
227 qtest_add_data_func("/ast1030/smc/write_page_qpi",
228 data, aspeed_smc_test_write_page_qpi);
229 qtest_add_data_func("/ast1030/smc/read_page_mem_fast_read",
230 data, aspeed_smc_test_read_page_mem_fast_read);
231 qtest_add_data_func("/ast1030/smc/write_page_fast_read",
232 data, aspeed_smc_test_write_page_fast_read);
233 qtest_add_data_func("/ast1030/smc/read_page_mem_dor",
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)
244 {
245 AspeedSMCTestData palmetto_data;
246 AspeedSMCTestData ast2500_evb_data;
247 AspeedSMCTestData ast2600_evb_data;
248 AspeedSMCTestData ast1030_evb_data;
249 int ret;
250
251 g_test_init(&argc, &argv, NULL);
252
253 test_palmetto_bmc(&palmetto_data);
254 test_ast2500_evb(&ast2500_evb_data);
255 test_ast2600_evb(&ast2600_evb_data);
256 test_ast1030_evb(&ast1030_evb_data);
257 ret = g_test_run();
258
259 qtest_quit(palmetto_data.s);
260 qtest_quit(ast2500_evb_data.s);
261 qtest_quit(ast2600_evb_data.s);
262 qtest_quit(ast1030_evb_data.s);
263 unlink(palmetto_data.tmp_path);
264 unlink(ast2500_evb_data.tmp_path);
265 unlink(ast2600_evb_data.tmp_path);
266 unlink(ast1030_evb_data.tmp_path);
267 g_free(palmetto_data.tmp_path);
268 g_free(ast2500_evb_data.tmp_path);
269 g_free(ast2600_evb_data.tmp_path);
270 g_free(ast1030_evb_data.tmp_path);
271
272 return ret;
273 }