xref: /qemu/tests/qtest/aspeed_smc-test.c (revision 3e62a32ddb89831c4a01b9526ae656f7fb802998)
17a2334f7SCédric Le Goater /*
27a2334f7SCédric Le Goater  * QTest testcase for the M25P80 Flash (Using the Aspeed SPI
37a2334f7SCédric Le Goater  * Controller)
47a2334f7SCédric Le Goater  *
57a2334f7SCédric Le Goater  * Copyright (C) 2016 IBM Corp.
67a2334f7SCédric Le Goater  *
77a2334f7SCédric Le Goater  * Permission is hereby granted, free of charge, to any person obtaining a copy
87a2334f7SCédric Le Goater  * of this software and associated documentation files (the "Software"), to deal
97a2334f7SCédric Le Goater  * in the Software without restriction, including without limitation the rights
107a2334f7SCédric Le Goater  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
117a2334f7SCédric Le Goater  * copies of the Software, and to permit persons to whom the Software is
127a2334f7SCédric Le Goater  * furnished to do so, subject to the following conditions:
137a2334f7SCédric Le Goater  *
147a2334f7SCédric Le Goater  * The above copyright notice and this permission notice shall be included in
157a2334f7SCédric Le Goater  * all copies or substantial portions of the Software.
167a2334f7SCédric Le Goater  *
177a2334f7SCédric Le Goater  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
187a2334f7SCédric Le Goater  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
197a2334f7SCédric Le Goater  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
207a2334f7SCédric Le Goater  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
217a2334f7SCédric Le Goater  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
227a2334f7SCédric Le Goater  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
237a2334f7SCédric Le Goater  * THE SOFTWARE.
247a2334f7SCédric Le Goater  */
257a2334f7SCédric Le Goater 
267a2334f7SCédric Le Goater #include "qemu/osdep.h"
277a2334f7SCédric Le Goater #include "qemu/bswap.h"
28dd210749SThomas Huth #include "libqtest-single.h"
29188052a1SIris Chen #include "qemu/bitops.h"
30*3e62a32dSJamin Lin #include "aspeed-smc-utils.h"
317a2334f7SCédric Le Goater 
32*3e62a32dSJamin Lin static void test_palmetto_bmc(AspeedSMCTestData *data)
337a2334f7SCédric Le Goater {
347a2334f7SCédric Le Goater     int ret;
357a2334f7SCédric Le Goater     int fd;
367a2334f7SCédric Le Goater 
37975d4bafSJamin Lin     fd = g_file_open_tmp("qtest.m25p80.n25q256a.XXXXXX", &data->tmp_path, NULL);
387a2334f7SCédric Le Goater     g_assert(fd >= 0);
39975d4bafSJamin Lin     ret = ftruncate(fd, 32 * 1024 * 1024);
407a2334f7SCédric Le Goater     g_assert(ret == 0);
417a2334f7SCédric Le Goater     close(fd);
427a2334f7SCédric Le Goater 
43975d4bafSJamin Lin     data->s = qtest_initf("-m 256 -machine palmetto-bmc "
447a2334f7SCédric Le Goater                           "-drive file=%s,format=raw,if=mtd",
45975d4bafSJamin Lin                           data->tmp_path);
467a2334f7SCédric Le Goater 
47975d4bafSJamin Lin     /* fmc cs0 with n25q256a flash */
48975d4bafSJamin Lin     data->flash_base = 0x20000000;
49975d4bafSJamin Lin     data->spi_base = 0x1E620000;
50975d4bafSJamin Lin     data->jedec_id = 0x20ba19;
51dc32f5baSJamin Lin     data->cs = 0;
52dc32f5baSJamin Lin     data->node = "/machine/soc/fmc/ssi.0/child[0]";
53369a47aeSJamin Lin     /* beyond 16MB */
54369a47aeSJamin Lin     data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
557a2334f7SCédric Le Goater 
56*3e62a32dSJamin Lin     qtest_add_data_func("/ast2400/smc/read_jedec",
57*3e62a32dSJamin Lin                         data, aspeed_smc_test_read_jedec);
58*3e62a32dSJamin Lin     qtest_add_data_func("/ast2400/smc/erase_sector",
59*3e62a32dSJamin Lin                         data, aspeed_smc_test_erase_sector);
60*3e62a32dSJamin Lin     qtest_add_data_func("/ast2400/smc/erase_all",
61*3e62a32dSJamin Lin                         data, aspeed_smc_test_erase_all);
62*3e62a32dSJamin Lin     qtest_add_data_func("/ast2400/smc/write_page",
63*3e62a32dSJamin Lin                         data, aspeed_smc_test_write_page);
64975d4bafSJamin Lin     qtest_add_data_func("/ast2400/smc/read_page_mem",
65*3e62a32dSJamin Lin                         data, aspeed_smc_test_read_page_mem);
66975d4bafSJamin Lin     qtest_add_data_func("/ast2400/smc/write_page_mem",
67*3e62a32dSJamin Lin                         data, aspeed_smc_test_write_page_mem);
68975d4bafSJamin Lin     qtest_add_data_func("/ast2400/smc/read_status_reg",
69*3e62a32dSJamin Lin                         data, aspeed_smc_test_read_status_reg);
70975d4bafSJamin Lin     qtest_add_data_func("/ast2400/smc/status_reg_write_protection",
71*3e62a32dSJamin Lin                         data, aspeed_smc_test_status_reg_write_protection);
72975d4bafSJamin Lin     qtest_add_data_func("/ast2400/smc/write_block_protect",
73*3e62a32dSJamin Lin                         data, aspeed_smc_test_write_block_protect);
74975d4bafSJamin Lin     qtest_add_data_func("/ast2400/smc/write_block_protect_bottom_bit",
75*3e62a32dSJamin Lin                         data, aspeed_smc_test_write_block_protect_bottom_bit);
76755e984aSJamin Lin }
77755e984aSJamin Lin 
78*3e62a32dSJamin Lin static void test_ast2500_evb(AspeedSMCTestData *data)
79658ebe13SJamin Lin {
80658ebe13SJamin Lin     int ret;
81658ebe13SJamin Lin     int fd;
82658ebe13SJamin Lin 
83658ebe13SJamin Lin     fd = g_file_open_tmp("qtest.m25p80.mx25l25635e.XXXXXX",
84658ebe13SJamin Lin                          &data->tmp_path, NULL);
85658ebe13SJamin Lin     g_assert(fd >= 0);
86658ebe13SJamin Lin     ret = ftruncate(fd, 32 * 1024 * 1024);
87658ebe13SJamin Lin     g_assert(ret == 0);
88658ebe13SJamin Lin     close(fd);
89658ebe13SJamin Lin 
90658ebe13SJamin Lin     data->s = qtest_initf("-machine ast2500-evb "
91658ebe13SJamin Lin                           "-drive file=%s,format=raw,if=mtd",
92658ebe13SJamin Lin                           data->tmp_path);
93658ebe13SJamin Lin 
94658ebe13SJamin Lin     /* fmc cs0 with mx25l25635e flash */
95658ebe13SJamin Lin     data->flash_base = 0x20000000;
96658ebe13SJamin Lin     data->spi_base = 0x1E620000;
97658ebe13SJamin Lin     data->jedec_id = 0xc22019;
98658ebe13SJamin Lin     data->cs = 0;
99658ebe13SJamin Lin     data->node = "/machine/soc/fmc/ssi.0/child[0]";
100658ebe13SJamin Lin     /* beyond 16MB */
101658ebe13SJamin Lin     data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
102658ebe13SJamin Lin 
103*3e62a32dSJamin Lin     qtest_add_data_func("/ast2500/smc/read_jedec",
104*3e62a32dSJamin Lin                         data, aspeed_smc_test_read_jedec);
105*3e62a32dSJamin Lin     qtest_add_data_func("/ast2500/smc/erase_sector",
106*3e62a32dSJamin Lin                         data, aspeed_smc_test_erase_sector);
107*3e62a32dSJamin Lin     qtest_add_data_func("/ast2500/smc/erase_all",
108*3e62a32dSJamin Lin                         data, aspeed_smc_test_erase_all);
109*3e62a32dSJamin Lin     qtest_add_data_func("/ast2500/smc/write_page",
110*3e62a32dSJamin Lin                         data, aspeed_smc_test_write_page);
111658ebe13SJamin Lin     qtest_add_data_func("/ast2500/smc/read_page_mem",
112*3e62a32dSJamin Lin                         data, aspeed_smc_test_read_page_mem);
113658ebe13SJamin Lin     qtest_add_data_func("/ast2500/smc/write_page_mem",
114*3e62a32dSJamin Lin                         data, aspeed_smc_test_write_page_mem);
115658ebe13SJamin Lin     qtest_add_data_func("/ast2500/smc/read_status_reg",
116*3e62a32dSJamin Lin                         data, aspeed_smc_test_read_status_reg);
11708479f0cSJamin Lin     qtest_add_data_func("/ast2500/smc/write_page_qpi",
118*3e62a32dSJamin Lin                         data, aspeed_smc_test_write_page_qpi);
119658ebe13SJamin Lin }
12084f7ea6dSJamin Lin 
121*3e62a32dSJamin Lin static void test_ast2600_evb(AspeedSMCTestData *data)
12284f7ea6dSJamin Lin {
12384f7ea6dSJamin Lin     int ret;
12484f7ea6dSJamin Lin     int fd;
12584f7ea6dSJamin Lin 
12684f7ea6dSJamin Lin     fd = g_file_open_tmp("qtest.m25p80.mx66u51235f.XXXXXX",
12784f7ea6dSJamin Lin                          &data->tmp_path, NULL);
12884f7ea6dSJamin Lin     g_assert(fd >= 0);
12984f7ea6dSJamin Lin     ret = ftruncate(fd, 64 * 1024 * 1024);
13084f7ea6dSJamin Lin     g_assert(ret == 0);
13184f7ea6dSJamin Lin     close(fd);
13284f7ea6dSJamin Lin 
13384f7ea6dSJamin Lin     data->s = qtest_initf("-machine ast2600-evb "
13484f7ea6dSJamin Lin                           "-drive file=%s,format=raw,if=mtd",
13584f7ea6dSJamin Lin                           data->tmp_path);
13684f7ea6dSJamin Lin 
13784f7ea6dSJamin Lin     /* fmc cs0 with mx66u51235f flash */
13884f7ea6dSJamin Lin     data->flash_base = 0x20000000;
13984f7ea6dSJamin Lin     data->spi_base = 0x1E620000;
14084f7ea6dSJamin Lin     data->jedec_id = 0xc2253a;
14184f7ea6dSJamin Lin     data->cs = 0;
14284f7ea6dSJamin Lin     data->node = "/machine/soc/fmc/ssi.0/child[0]";
14384f7ea6dSJamin Lin     /* beyond 16MB */
14484f7ea6dSJamin Lin     data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
14584f7ea6dSJamin Lin 
146*3e62a32dSJamin Lin     qtest_add_data_func("/ast2600/smc/read_jedec",
147*3e62a32dSJamin Lin                         data, aspeed_smc_test_read_jedec);
148*3e62a32dSJamin Lin     qtest_add_data_func("/ast2600/smc/erase_sector",
149*3e62a32dSJamin Lin                         data, aspeed_smc_test_erase_sector);
150*3e62a32dSJamin Lin     qtest_add_data_func("/ast2600/smc/erase_all",
151*3e62a32dSJamin Lin                         data, aspeed_smc_test_erase_all);
152*3e62a32dSJamin Lin     qtest_add_data_func("/ast2600/smc/write_page",
153*3e62a32dSJamin Lin                         data, aspeed_smc_test_write_page);
15484f7ea6dSJamin Lin     qtest_add_data_func("/ast2600/smc/read_page_mem",
155*3e62a32dSJamin Lin                         data, aspeed_smc_test_read_page_mem);
15684f7ea6dSJamin Lin     qtest_add_data_func("/ast2600/smc/write_page_mem",
157*3e62a32dSJamin Lin                         data, aspeed_smc_test_write_page_mem);
15884f7ea6dSJamin Lin     qtest_add_data_func("/ast2600/smc/read_status_reg",
159*3e62a32dSJamin Lin                         data, aspeed_smc_test_read_status_reg);
16008479f0cSJamin Lin     qtest_add_data_func("/ast2600/smc/write_page_qpi",
161*3e62a32dSJamin Lin                         data, aspeed_smc_test_write_page_qpi);
16284f7ea6dSJamin Lin }
1630f6e8aa4SJamin Lin 
164*3e62a32dSJamin Lin static void test_ast1030_evb(AspeedSMCTestData *data)
1650f6e8aa4SJamin Lin {
1660f6e8aa4SJamin Lin     int ret;
1670f6e8aa4SJamin Lin     int fd;
1680f6e8aa4SJamin Lin 
1690f6e8aa4SJamin Lin     fd = g_file_open_tmp("qtest.m25p80.w25q80bl.XXXXXX",
1700f6e8aa4SJamin Lin                          &data->tmp_path, NULL);
1710f6e8aa4SJamin Lin     g_assert(fd >= 0);
1720f6e8aa4SJamin Lin     ret = ftruncate(fd, 1 * 1024 * 1024);
1730f6e8aa4SJamin Lin     g_assert(ret == 0);
1740f6e8aa4SJamin Lin     close(fd);
1750f6e8aa4SJamin Lin 
1760f6e8aa4SJamin Lin     data->s = qtest_initf("-machine ast1030-evb "
1770f6e8aa4SJamin Lin                           "-drive file=%s,format=raw,if=mtd",
1780f6e8aa4SJamin Lin                           data->tmp_path);
1790f6e8aa4SJamin Lin 
1800f6e8aa4SJamin Lin     /* fmc cs0 with w25q80bl flash */
1810f6e8aa4SJamin Lin     data->flash_base = 0x80000000;
1820f6e8aa4SJamin Lin     data->spi_base = 0x7E620000;
1830f6e8aa4SJamin Lin     data->jedec_id = 0xef4014;
1840f6e8aa4SJamin Lin     data->cs = 0;
1850f6e8aa4SJamin Lin     data->node = "/machine/soc/fmc/ssi.0/child[0]";
1860f6e8aa4SJamin Lin     /* beyond 512KB */
1870f6e8aa4SJamin Lin     data->page_addr = 0x800 * FLASH_PAGE_SIZE;
1880f6e8aa4SJamin Lin 
189*3e62a32dSJamin Lin     qtest_add_data_func("/ast1030/smc/read_jedec",
190*3e62a32dSJamin Lin                         data, aspeed_smc_test_read_jedec);
191*3e62a32dSJamin Lin     qtest_add_data_func("/ast1030/smc/erase_sector",
192*3e62a32dSJamin Lin                         data, aspeed_smc_test_erase_sector);
193*3e62a32dSJamin Lin     qtest_add_data_func("/ast1030/smc/erase_all",
194*3e62a32dSJamin Lin                         data, aspeed_smc_test_erase_all);
195*3e62a32dSJamin Lin     qtest_add_data_func("/ast1030/smc/write_page",
196*3e62a32dSJamin Lin                         data, aspeed_smc_test_write_page);
1970f6e8aa4SJamin Lin     qtest_add_data_func("/ast1030/smc/read_page_mem",
198*3e62a32dSJamin Lin                         data, aspeed_smc_test_read_page_mem);
1990f6e8aa4SJamin Lin     qtest_add_data_func("/ast1030/smc/write_page_mem",
200*3e62a32dSJamin Lin                         data, aspeed_smc_test_write_page_mem);
2010f6e8aa4SJamin Lin     qtest_add_data_func("/ast1030/smc/read_status_reg",
202*3e62a32dSJamin Lin                         data, aspeed_smc_test_read_status_reg);
20308479f0cSJamin Lin     qtest_add_data_func("/ast1030/smc/write_page_qpi",
204*3e62a32dSJamin Lin                         data, aspeed_smc_test_write_page_qpi);
2050f6e8aa4SJamin Lin }
2060f6e8aa4SJamin Lin 
207755e984aSJamin Lin int main(int argc, char **argv)
208755e984aSJamin Lin {
209*3e62a32dSJamin Lin     AspeedSMCTestData palmetto_data;
210*3e62a32dSJamin Lin     AspeedSMCTestData ast2500_evb_data;
211*3e62a32dSJamin Lin     AspeedSMCTestData ast2600_evb_data;
212*3e62a32dSJamin Lin     AspeedSMCTestData ast1030_evb_data;
213755e984aSJamin Lin     int ret;
214755e984aSJamin Lin 
215755e984aSJamin Lin     g_test_init(&argc, &argv, NULL);
216755e984aSJamin Lin 
217975d4bafSJamin Lin     test_palmetto_bmc(&palmetto_data);
218658ebe13SJamin Lin     test_ast2500_evb(&ast2500_evb_data);
21984f7ea6dSJamin Lin     test_ast2600_evb(&ast2600_evb_data);
2200f6e8aa4SJamin Lin     test_ast1030_evb(&ast1030_evb_data);
221975d4bafSJamin Lin     ret = g_test_run();
222975d4bafSJamin Lin 
223975d4bafSJamin Lin     qtest_quit(palmetto_data.s);
224658ebe13SJamin Lin     qtest_quit(ast2500_evb_data.s);
22584f7ea6dSJamin Lin     qtest_quit(ast2600_evb_data.s);
2260f6e8aa4SJamin Lin     qtest_quit(ast1030_evb_data.s);
227975d4bafSJamin Lin     unlink(palmetto_data.tmp_path);
228658ebe13SJamin Lin     unlink(ast2500_evb_data.tmp_path);
22984f7ea6dSJamin Lin     unlink(ast2600_evb_data.tmp_path);
2300f6e8aa4SJamin Lin     unlink(ast1030_evb_data.tmp_path);
2317a2334f7SCédric Le Goater     return ret;
2327a2334f7SCédric Le Goater }
233