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"
303e62a32dSJamin Lin #include "aspeed-smc-utils.h"
317a2334f7SCédric Le Goater
test_palmetto_bmc(AspeedSMCTestData * data)323e62a32dSJamin 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
563e62a32dSJamin Lin qtest_add_data_func("/ast2400/smc/read_jedec",
573e62a32dSJamin Lin data, aspeed_smc_test_read_jedec);
583e62a32dSJamin Lin qtest_add_data_func("/ast2400/smc/erase_sector",
593e62a32dSJamin Lin data, aspeed_smc_test_erase_sector);
603e62a32dSJamin Lin qtest_add_data_func("/ast2400/smc/erase_all",
613e62a32dSJamin Lin data, aspeed_smc_test_erase_all);
623e62a32dSJamin Lin qtest_add_data_func("/ast2400/smc/write_page",
633e62a32dSJamin Lin data, aspeed_smc_test_write_page);
64975d4bafSJamin Lin qtest_add_data_func("/ast2400/smc/read_page_mem",
653e62a32dSJamin Lin data, aspeed_smc_test_read_page_mem);
66975d4bafSJamin Lin qtest_add_data_func("/ast2400/smc/write_page_mem",
673e62a32dSJamin Lin data, aspeed_smc_test_write_page_mem);
68975d4bafSJamin Lin qtest_add_data_func("/ast2400/smc/read_status_reg",
693e62a32dSJamin Lin data, aspeed_smc_test_read_status_reg);
70975d4bafSJamin Lin qtest_add_data_func("/ast2400/smc/status_reg_write_protection",
713e62a32dSJamin Lin data, aspeed_smc_test_status_reg_write_protection);
72975d4bafSJamin Lin qtest_add_data_func("/ast2400/smc/write_block_protect",
733e62a32dSJamin Lin data, aspeed_smc_test_write_block_protect);
74975d4bafSJamin Lin qtest_add_data_func("/ast2400/smc/write_block_protect_bottom_bit",
753e62a32dSJamin Lin data, aspeed_smc_test_write_block_protect_bottom_bit);
76755e984aSJamin Lin }
77755e984aSJamin Lin
test_ast2500_evb(AspeedSMCTestData * data)783e62a32dSJamin 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
1033e62a32dSJamin Lin qtest_add_data_func("/ast2500/smc/read_jedec",
1043e62a32dSJamin Lin data, aspeed_smc_test_read_jedec);
1053e62a32dSJamin Lin qtest_add_data_func("/ast2500/smc/erase_sector",
1063e62a32dSJamin Lin data, aspeed_smc_test_erase_sector);
1073e62a32dSJamin Lin qtest_add_data_func("/ast2500/smc/erase_all",
1083e62a32dSJamin Lin data, aspeed_smc_test_erase_all);
1093e62a32dSJamin Lin qtest_add_data_func("/ast2500/smc/write_page",
1103e62a32dSJamin Lin data, aspeed_smc_test_write_page);
111658ebe13SJamin Lin qtest_add_data_func("/ast2500/smc/read_page_mem",
1123e62a32dSJamin Lin data, aspeed_smc_test_read_page_mem);
113658ebe13SJamin Lin qtest_add_data_func("/ast2500/smc/write_page_mem",
1143e62a32dSJamin Lin data, aspeed_smc_test_write_page_mem);
115658ebe13SJamin Lin qtest_add_data_func("/ast2500/smc/read_status_reg",
1163e62a32dSJamin Lin data, aspeed_smc_test_read_status_reg);
11708479f0cSJamin Lin qtest_add_data_func("/ast2500/smc/write_page_qpi",
1183e62a32dSJamin Lin data, aspeed_smc_test_write_page_qpi);
119658ebe13SJamin Lin }
12084f7ea6dSJamin Lin
test_ast2600_evb(AspeedSMCTestData * data)1213e62a32dSJamin 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
1463e62a32dSJamin Lin qtest_add_data_func("/ast2600/smc/read_jedec",
1473e62a32dSJamin Lin data, aspeed_smc_test_read_jedec);
1483e62a32dSJamin Lin qtest_add_data_func("/ast2600/smc/erase_sector",
1493e62a32dSJamin Lin data, aspeed_smc_test_erase_sector);
1503e62a32dSJamin Lin qtest_add_data_func("/ast2600/smc/erase_all",
1513e62a32dSJamin Lin data, aspeed_smc_test_erase_all);
1523e62a32dSJamin Lin qtest_add_data_func("/ast2600/smc/write_page",
1533e62a32dSJamin Lin data, aspeed_smc_test_write_page);
15484f7ea6dSJamin Lin qtest_add_data_func("/ast2600/smc/read_page_mem",
1553e62a32dSJamin Lin data, aspeed_smc_test_read_page_mem);
15684f7ea6dSJamin Lin qtest_add_data_func("/ast2600/smc/write_page_mem",
1573e62a32dSJamin Lin data, aspeed_smc_test_write_page_mem);
15884f7ea6dSJamin Lin qtest_add_data_func("/ast2600/smc/read_status_reg",
1593e62a32dSJamin Lin data, aspeed_smc_test_read_status_reg);
16008479f0cSJamin Lin qtest_add_data_func("/ast2600/smc/write_page_qpi",
1613e62a32dSJamin Lin data, aspeed_smc_test_write_page_qpi);
16284f7ea6dSJamin Lin }
1630f6e8aa4SJamin Lin
test_ast1030_evb(AspeedSMCTestData * data)1643e62a32dSJamin 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
1893e62a32dSJamin Lin qtest_add_data_func("/ast1030/smc/read_jedec",
1903e62a32dSJamin Lin data, aspeed_smc_test_read_jedec);
1913e62a32dSJamin Lin qtest_add_data_func("/ast1030/smc/erase_sector",
1923e62a32dSJamin Lin data, aspeed_smc_test_erase_sector);
1933e62a32dSJamin Lin qtest_add_data_func("/ast1030/smc/erase_all",
1943e62a32dSJamin Lin data, aspeed_smc_test_erase_all);
1953e62a32dSJamin Lin qtest_add_data_func("/ast1030/smc/write_page",
1963e62a32dSJamin Lin data, aspeed_smc_test_write_page);
1970f6e8aa4SJamin Lin qtest_add_data_func("/ast1030/smc/read_page_mem",
1983e62a32dSJamin Lin data, aspeed_smc_test_read_page_mem);
1990f6e8aa4SJamin Lin qtest_add_data_func("/ast1030/smc/write_page_mem",
2003e62a32dSJamin Lin data, aspeed_smc_test_write_page_mem);
2010f6e8aa4SJamin Lin qtest_add_data_func("/ast1030/smc/read_status_reg",
2023e62a32dSJamin Lin data, aspeed_smc_test_read_status_reg);
20308479f0cSJamin Lin qtest_add_data_func("/ast1030/smc/write_page_qpi",
2043e62a32dSJamin Lin data, aspeed_smc_test_write_page_qpi);
2050f6e8aa4SJamin Lin }
2060f6e8aa4SJamin Lin
main(int argc,char ** argv)207755e984aSJamin Lin int main(int argc, char **argv)
208755e984aSJamin Lin {
2093e62a32dSJamin Lin AspeedSMCTestData palmetto_data;
2103e62a32dSJamin Lin AspeedSMCTestData ast2500_evb_data;
2113e62a32dSJamin Lin AspeedSMCTestData ast2600_evb_data;
2123e62a32dSJamin 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);
231*d09c0939SJamin Lin g_free(palmetto_data.tmp_path);
232*d09c0939SJamin Lin g_free(ast2500_evb_data.tmp_path);
233*d09c0939SJamin Lin g_free(ast2600_evb_data.tmp_path);
234*d09c0939SJamin Lin g_free(ast1030_evb_data.tmp_path);
235*d09c0939SJamin Lin
2367a2334f7SCédric Le Goater return ret;
2377a2334f7SCédric Le Goater }
238