xref: /qemu/tests/qtest/aspeed_fsi-test.c (revision 45bef95ca5e9d649e432f2acd82163fb5bccbe47)
145d8cdbdSNinad Palsule /*
245d8cdbdSNinad Palsule  * QTest testcases for IBM's Flexible Service Interface (FSI)
345d8cdbdSNinad Palsule  *
445d8cdbdSNinad Palsule  * Copyright (c) 2023 IBM Corporation
545d8cdbdSNinad Palsule  *
645d8cdbdSNinad Palsule  * Authors:
745d8cdbdSNinad Palsule  *   Ninad Palsule <ninad@linux.ibm.com>
845d8cdbdSNinad Palsule  *
945d8cdbdSNinad Palsule  * This work is licensed under the terms of the GNU GPL, version 2 or later.
1045d8cdbdSNinad Palsule  * See the COPYING file in the top-level directory.
1145d8cdbdSNinad Palsule  */
1245d8cdbdSNinad Palsule 
1345d8cdbdSNinad Palsule #include "qemu/osdep.h"
1445d8cdbdSNinad Palsule #include <glib/gstdio.h>
1545d8cdbdSNinad Palsule 
1645d8cdbdSNinad Palsule #include "qemu/module.h"
1745d8cdbdSNinad Palsule #include "libqtest-single.h"
1845d8cdbdSNinad Palsule 
1945d8cdbdSNinad Palsule /* Registers from ast2600 specifications */
2045d8cdbdSNinad Palsule #define ASPEED_FSI_ENGINER_TRIGGER   0x04
2145d8cdbdSNinad Palsule #define ASPEED_FSI_OPB0_BUS_SELECT   0x10
2245d8cdbdSNinad Palsule #define ASPEED_FSI_OPB1_BUS_SELECT   0x28
2345d8cdbdSNinad Palsule #define ASPEED_FSI_OPB0_RW_DIRECTION 0x14
2445d8cdbdSNinad Palsule #define ASPEED_FSI_OPB1_RW_DIRECTION 0x2c
2545d8cdbdSNinad Palsule #define ASPEED_FSI_OPB0_XFER_SIZE    0x18
2645d8cdbdSNinad Palsule #define ASPEED_FSI_OPB1_XFER_SIZE    0x30
2745d8cdbdSNinad Palsule #define ASPEED_FSI_OPB0_BUS_ADDR     0x1c
2845d8cdbdSNinad Palsule #define ASPEED_FSI_OPB1_BUS_ADDR     0x34
2945d8cdbdSNinad Palsule #define ASPEED_FSI_INTRRUPT_CLEAR    0x40
3045d8cdbdSNinad Palsule #define ASPEED_FSI_INTRRUPT_STATUS   0x48
3145d8cdbdSNinad Palsule #define ASPEED_FSI_OPB0_BUS_STATUS   0x80
3245d8cdbdSNinad Palsule #define ASPEED_FSI_OPB1_BUS_STATUS   0x8c
3345d8cdbdSNinad Palsule #define ASPEED_FSI_OPB0_READ_DATA    0x84
3445d8cdbdSNinad Palsule #define ASPEED_FSI_OPB1_READ_DATA    0x90
3545d8cdbdSNinad Palsule 
3645d8cdbdSNinad Palsule /*
3745d8cdbdSNinad Palsule  * FSI Base addresses from the ast2600 specifications.
3845d8cdbdSNinad Palsule  */
3945d8cdbdSNinad Palsule #define AST2600_OPB_FSI0_BASE_ADDR 0x1e79b000
4045d8cdbdSNinad Palsule #define AST2600_OPB_FSI1_BASE_ADDR 0x1e79b100
4145d8cdbdSNinad Palsule 
4245d8cdbdSNinad Palsule static uint32_t aspeed_fsi_base_addr;
4345d8cdbdSNinad Palsule 
aspeed_fsi_readl(QTestState * s,uint32_t reg)4445d8cdbdSNinad Palsule static uint32_t aspeed_fsi_readl(QTestState *s, uint32_t reg)
4545d8cdbdSNinad Palsule {
4645d8cdbdSNinad Palsule     return qtest_readl(s, aspeed_fsi_base_addr + reg);
4745d8cdbdSNinad Palsule }
4845d8cdbdSNinad Palsule 
aspeed_fsi_writel(QTestState * s,uint32_t reg,uint32_t val)4945d8cdbdSNinad Palsule static void aspeed_fsi_writel(QTestState *s, uint32_t reg, uint32_t val)
5045d8cdbdSNinad Palsule {
5145d8cdbdSNinad Palsule     qtest_writel(s, aspeed_fsi_base_addr + reg, val);
5245d8cdbdSNinad Palsule }
5345d8cdbdSNinad Palsule 
5445d8cdbdSNinad Palsule /* Setup base address and select register */
test_fsi_setup(QTestState * s,uint32_t base_addr)5545d8cdbdSNinad Palsule static void test_fsi_setup(QTestState *s, uint32_t base_addr)
5645d8cdbdSNinad Palsule {
5745d8cdbdSNinad Palsule     uint32_t curval;
5845d8cdbdSNinad Palsule 
5945d8cdbdSNinad Palsule     aspeed_fsi_base_addr = base_addr;
6045d8cdbdSNinad Palsule 
6145d8cdbdSNinad Palsule     /* Set the base select register */
6245d8cdbdSNinad Palsule     if (base_addr == AST2600_OPB_FSI0_BASE_ADDR) {
6345d8cdbdSNinad Palsule         /* Unselect FSI1 */
6445d8cdbdSNinad Palsule         aspeed_fsi_writel(s, ASPEED_FSI_OPB1_BUS_SELECT, 0x0);
6545d8cdbdSNinad Palsule         curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB1_BUS_SELECT);
66*58045186SInès Varhol         g_assert_cmphex(curval, ==, 0x0);
6745d8cdbdSNinad Palsule 
6845d8cdbdSNinad Palsule         /* Select FSI0 */
6945d8cdbdSNinad Palsule         aspeed_fsi_writel(s, ASPEED_FSI_OPB0_BUS_SELECT, 0x1);
7045d8cdbdSNinad Palsule         curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB0_BUS_SELECT);
71*58045186SInès Varhol         g_assert_cmphex(curval, ==, 0x1);
7245d8cdbdSNinad Palsule     } else if (base_addr == AST2600_OPB_FSI1_BASE_ADDR) {
7345d8cdbdSNinad Palsule         /* Unselect FSI0 */
7445d8cdbdSNinad Palsule         aspeed_fsi_writel(s, ASPEED_FSI_OPB0_BUS_SELECT, 0x0);
7545d8cdbdSNinad Palsule         curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB0_BUS_SELECT);
76*58045186SInès Varhol         g_assert_cmphex(curval, ==, 0x0);
7745d8cdbdSNinad Palsule 
7845d8cdbdSNinad Palsule         /* Select FSI1 */
7945d8cdbdSNinad Palsule         aspeed_fsi_writel(s, ASPEED_FSI_OPB1_BUS_SELECT, 0x1);
8045d8cdbdSNinad Palsule         curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB1_BUS_SELECT);
81*58045186SInès Varhol         g_assert_cmphex(curval, ==, 0x1);
8245d8cdbdSNinad Palsule     } else {
8345d8cdbdSNinad Palsule         g_assert_not_reached();
8445d8cdbdSNinad Palsule     }
8545d8cdbdSNinad Palsule }
8645d8cdbdSNinad Palsule 
test_fsi_reg_change(QTestState * s,uint32_t reg,uint32_t newval)8745d8cdbdSNinad Palsule static void test_fsi_reg_change(QTestState *s, uint32_t reg, uint32_t newval)
8845d8cdbdSNinad Palsule {
8945d8cdbdSNinad Palsule     uint32_t base;
9045d8cdbdSNinad Palsule     uint32_t curval;
9145d8cdbdSNinad Palsule 
9245d8cdbdSNinad Palsule     base = aspeed_fsi_readl(s, reg);
9345d8cdbdSNinad Palsule     aspeed_fsi_writel(s, reg, newval);
9445d8cdbdSNinad Palsule     curval = aspeed_fsi_readl(s, reg);
9545d8cdbdSNinad Palsule     g_assert_cmpuint(curval, ==, newval);
9645d8cdbdSNinad Palsule     aspeed_fsi_writel(s, reg, base);
9745d8cdbdSNinad Palsule     curval = aspeed_fsi_readl(s, reg);
9845d8cdbdSNinad Palsule     g_assert_cmpuint(curval, ==, base);
9945d8cdbdSNinad Palsule }
10045d8cdbdSNinad Palsule 
test_fsi0_master_regs(const void * data)10145d8cdbdSNinad Palsule static void test_fsi0_master_regs(const void *data)
10245d8cdbdSNinad Palsule {
10345d8cdbdSNinad Palsule     QTestState *s = (QTestState *)data;
10445d8cdbdSNinad Palsule 
10545d8cdbdSNinad Palsule     test_fsi_setup(s, AST2600_OPB_FSI0_BASE_ADDR);
10645d8cdbdSNinad Palsule 
10745d8cdbdSNinad Palsule     test_fsi_reg_change(s, ASPEED_FSI_OPB0_RW_DIRECTION, 0xF3F4F514);
10845d8cdbdSNinad Palsule     test_fsi_reg_change(s, ASPEED_FSI_OPB0_XFER_SIZE, 0xF3F4F518);
10945d8cdbdSNinad Palsule     test_fsi_reg_change(s, ASPEED_FSI_OPB0_BUS_ADDR, 0xF3F4F51c);
11045d8cdbdSNinad Palsule     test_fsi_reg_change(s, ASPEED_FSI_INTRRUPT_CLEAR, 0xF3F4F540);
11145d8cdbdSNinad Palsule     test_fsi_reg_change(s, ASPEED_FSI_INTRRUPT_STATUS, 0xF3F4F548);
11245d8cdbdSNinad Palsule     test_fsi_reg_change(s, ASPEED_FSI_OPB0_BUS_STATUS, 0xF3F4F580);
11345d8cdbdSNinad Palsule     test_fsi_reg_change(s, ASPEED_FSI_OPB0_READ_DATA, 0xF3F4F584);
11445d8cdbdSNinad Palsule }
11545d8cdbdSNinad Palsule 
test_fsi1_master_regs(const void * data)11645d8cdbdSNinad Palsule static void test_fsi1_master_regs(const void *data)
11745d8cdbdSNinad Palsule {
11845d8cdbdSNinad Palsule     QTestState *s = (QTestState *)data;
11945d8cdbdSNinad Palsule 
12045d8cdbdSNinad Palsule     test_fsi_setup(s, AST2600_OPB_FSI1_BASE_ADDR);
12145d8cdbdSNinad Palsule 
12245d8cdbdSNinad Palsule     test_fsi_reg_change(s, ASPEED_FSI_OPB1_RW_DIRECTION, 0xF3F4F514);
12345d8cdbdSNinad Palsule     test_fsi_reg_change(s, ASPEED_FSI_OPB1_XFER_SIZE, 0xF3F4F518);
12445d8cdbdSNinad Palsule     test_fsi_reg_change(s, ASPEED_FSI_OPB1_BUS_ADDR, 0xF3F4F51c);
12545d8cdbdSNinad Palsule     test_fsi_reg_change(s, ASPEED_FSI_INTRRUPT_CLEAR, 0xF3F4F540);
12645d8cdbdSNinad Palsule     test_fsi_reg_change(s, ASPEED_FSI_INTRRUPT_STATUS, 0xF3F4F548);
12745d8cdbdSNinad Palsule     test_fsi_reg_change(s, ASPEED_FSI_OPB1_BUS_STATUS, 0xF3F4F580);
12845d8cdbdSNinad Palsule     test_fsi_reg_change(s, ASPEED_FSI_OPB1_READ_DATA, 0xF3F4F584);
12945d8cdbdSNinad Palsule }
13045d8cdbdSNinad Palsule 
test_fsi0_getcfam_addr0(const void * data)13145d8cdbdSNinad Palsule static void test_fsi0_getcfam_addr0(const void *data)
13245d8cdbdSNinad Palsule {
13345d8cdbdSNinad Palsule     QTestState *s = (QTestState *)data;
13445d8cdbdSNinad Palsule     uint32_t curval;
13545d8cdbdSNinad Palsule 
13645d8cdbdSNinad Palsule     test_fsi_setup(s, AST2600_OPB_FSI0_BASE_ADDR);
13745d8cdbdSNinad Palsule 
13845d8cdbdSNinad Palsule     /* Master access direction read */
13945d8cdbdSNinad Palsule     aspeed_fsi_writel(s, ASPEED_FSI_OPB0_RW_DIRECTION, 0x1);
14045d8cdbdSNinad Palsule     /* word */
14145d8cdbdSNinad Palsule     aspeed_fsi_writel(s, ASPEED_FSI_OPB0_XFER_SIZE, 0x3);
14245d8cdbdSNinad Palsule     /* Address */
14345d8cdbdSNinad Palsule     aspeed_fsi_writel(s, ASPEED_FSI_OPB0_BUS_ADDR, 0xa0000000);
14445d8cdbdSNinad Palsule     aspeed_fsi_writel(s, ASPEED_FSI_INTRRUPT_CLEAR, 0x1);
14545d8cdbdSNinad Palsule     aspeed_fsi_writel(s, ASPEED_FSI_ENGINER_TRIGGER, 0x1);
14645d8cdbdSNinad Palsule 
14745d8cdbdSNinad Palsule     curval = aspeed_fsi_readl(s, ASPEED_FSI_INTRRUPT_STATUS);
148*58045186SInès Varhol     g_assert_cmphex(curval, ==, 0x10000);
14945d8cdbdSNinad Palsule     curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB0_BUS_STATUS);
150*58045186SInès Varhol     g_assert_cmphex(curval, ==, 0x0);
15145d8cdbdSNinad Palsule     curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB0_READ_DATA);
152*58045186SInès Varhol     g_assert_cmphex(curval, ==, 0x152d02c0);
15345d8cdbdSNinad Palsule }
15445d8cdbdSNinad Palsule 
test_fsi1_getcfam_addr0(const void * data)15545d8cdbdSNinad Palsule static void test_fsi1_getcfam_addr0(const void *data)
15645d8cdbdSNinad Palsule {
15745d8cdbdSNinad Palsule     QTestState *s = (QTestState *)data;
15845d8cdbdSNinad Palsule     uint32_t curval;
15945d8cdbdSNinad Palsule 
16045d8cdbdSNinad Palsule     test_fsi_setup(s, AST2600_OPB_FSI1_BASE_ADDR);
16145d8cdbdSNinad Palsule 
16245d8cdbdSNinad Palsule     /* Master access direction read */
16345d8cdbdSNinad Palsule     aspeed_fsi_writel(s, ASPEED_FSI_OPB1_RW_DIRECTION, 0x1);
16445d8cdbdSNinad Palsule 
16545d8cdbdSNinad Palsule     aspeed_fsi_writel(s, ASPEED_FSI_OPB1_XFER_SIZE, 0x3);
16645d8cdbdSNinad Palsule     aspeed_fsi_writel(s, ASPEED_FSI_OPB1_BUS_ADDR, 0xa0000000);
16745d8cdbdSNinad Palsule     aspeed_fsi_writel(s, ASPEED_FSI_INTRRUPT_CLEAR, 0x1);
16845d8cdbdSNinad Palsule     aspeed_fsi_writel(s, ASPEED_FSI_ENGINER_TRIGGER, 0x1);
16945d8cdbdSNinad Palsule 
17045d8cdbdSNinad Palsule     curval = aspeed_fsi_readl(s, ASPEED_FSI_INTRRUPT_STATUS);
171*58045186SInès Varhol     g_assert_cmphex(curval, ==, 0x20000);
17245d8cdbdSNinad Palsule     curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB1_BUS_STATUS);
173*58045186SInès Varhol     g_assert_cmphex(curval, ==, 0x0);
17445d8cdbdSNinad Palsule     curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB1_READ_DATA);
175*58045186SInès Varhol     g_assert_cmphex(curval, ==, 0x152d02c0);
17645d8cdbdSNinad Palsule }
17745d8cdbdSNinad Palsule 
main(int argc,char ** argv)17845d8cdbdSNinad Palsule int main(int argc, char **argv)
17945d8cdbdSNinad Palsule {
18045d8cdbdSNinad Palsule     int ret = -1;
18145d8cdbdSNinad Palsule     QTestState *s;
18245d8cdbdSNinad Palsule 
18345d8cdbdSNinad Palsule     g_test_init(&argc, &argv, NULL);
18445d8cdbdSNinad Palsule 
18545d8cdbdSNinad Palsule     s = qtest_init("-machine ast2600-evb ");
18645d8cdbdSNinad Palsule 
18745d8cdbdSNinad Palsule     /* Tests for OPB/FSI0 */
18845d8cdbdSNinad Palsule     qtest_add_data_func("/aspeed-fsi-test/test_fsi0_master_regs", s,
18945d8cdbdSNinad Palsule                         test_fsi0_master_regs);
19045d8cdbdSNinad Palsule 
19145d8cdbdSNinad Palsule     qtest_add_data_func("/aspeed-fsi-test/test_fsi0_getcfam_addr0", s,
19245d8cdbdSNinad Palsule                         test_fsi0_getcfam_addr0);
19345d8cdbdSNinad Palsule 
19445d8cdbdSNinad Palsule     /* Tests for OPB/FSI1 */
19545d8cdbdSNinad Palsule     qtest_add_data_func("/aspeed-fsi-test/test_fsi1_master_regs", s,
19645d8cdbdSNinad Palsule                         test_fsi1_master_regs);
19745d8cdbdSNinad Palsule 
19845d8cdbdSNinad Palsule     qtest_add_data_func("/aspeed-fsi-test/test_fsi1_getcfam_addr0", s,
19945d8cdbdSNinad Palsule                         test_fsi1_getcfam_addr0);
20045d8cdbdSNinad Palsule 
20145d8cdbdSNinad Palsule     ret = g_test_run();
20245d8cdbdSNinad Palsule     qtest_quit(s);
20345d8cdbdSNinad Palsule 
20445d8cdbdSNinad Palsule     return ret;
20545d8cdbdSNinad Palsule }
206