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 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 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 */ 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 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 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 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 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 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 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