1*45d8cdbdSNinad Palsule /* 2*45d8cdbdSNinad Palsule * QTest testcases for IBM's Flexible Service Interface (FSI) 3*45d8cdbdSNinad Palsule * 4*45d8cdbdSNinad Palsule * Copyright (c) 2023 IBM Corporation 5*45d8cdbdSNinad Palsule * 6*45d8cdbdSNinad Palsule * Authors: 7*45d8cdbdSNinad Palsule * Ninad Palsule <ninad@linux.ibm.com> 8*45d8cdbdSNinad Palsule * 9*45d8cdbdSNinad Palsule * This work is licensed under the terms of the GNU GPL, version 2 or later. 10*45d8cdbdSNinad Palsule * See the COPYING file in the top-level directory. 11*45d8cdbdSNinad Palsule */ 12*45d8cdbdSNinad Palsule 13*45d8cdbdSNinad Palsule #include "qemu/osdep.h" 14*45d8cdbdSNinad Palsule #include <glib/gstdio.h> 15*45d8cdbdSNinad Palsule 16*45d8cdbdSNinad Palsule #include "qemu/module.h" 17*45d8cdbdSNinad Palsule #include "libqtest-single.h" 18*45d8cdbdSNinad Palsule 19*45d8cdbdSNinad Palsule /* Registers from ast2600 specifications */ 20*45d8cdbdSNinad Palsule #define ASPEED_FSI_ENGINER_TRIGGER 0x04 21*45d8cdbdSNinad Palsule #define ASPEED_FSI_OPB0_BUS_SELECT 0x10 22*45d8cdbdSNinad Palsule #define ASPEED_FSI_OPB1_BUS_SELECT 0x28 23*45d8cdbdSNinad Palsule #define ASPEED_FSI_OPB0_RW_DIRECTION 0x14 24*45d8cdbdSNinad Palsule #define ASPEED_FSI_OPB1_RW_DIRECTION 0x2c 25*45d8cdbdSNinad Palsule #define ASPEED_FSI_OPB0_XFER_SIZE 0x18 26*45d8cdbdSNinad Palsule #define ASPEED_FSI_OPB1_XFER_SIZE 0x30 27*45d8cdbdSNinad Palsule #define ASPEED_FSI_OPB0_BUS_ADDR 0x1c 28*45d8cdbdSNinad Palsule #define ASPEED_FSI_OPB1_BUS_ADDR 0x34 29*45d8cdbdSNinad Palsule #define ASPEED_FSI_INTRRUPT_CLEAR 0x40 30*45d8cdbdSNinad Palsule #define ASPEED_FSI_INTRRUPT_STATUS 0x48 31*45d8cdbdSNinad Palsule #define ASPEED_FSI_OPB0_BUS_STATUS 0x80 32*45d8cdbdSNinad Palsule #define ASPEED_FSI_OPB1_BUS_STATUS 0x8c 33*45d8cdbdSNinad Palsule #define ASPEED_FSI_OPB0_READ_DATA 0x84 34*45d8cdbdSNinad Palsule #define ASPEED_FSI_OPB1_READ_DATA 0x90 35*45d8cdbdSNinad Palsule 36*45d8cdbdSNinad Palsule /* 37*45d8cdbdSNinad Palsule * FSI Base addresses from the ast2600 specifications. 38*45d8cdbdSNinad Palsule */ 39*45d8cdbdSNinad Palsule #define AST2600_OPB_FSI0_BASE_ADDR 0x1e79b000 40*45d8cdbdSNinad Palsule #define AST2600_OPB_FSI1_BASE_ADDR 0x1e79b100 41*45d8cdbdSNinad Palsule 42*45d8cdbdSNinad Palsule static uint32_t aspeed_fsi_base_addr; 43*45d8cdbdSNinad Palsule 44*45d8cdbdSNinad Palsule static uint32_t aspeed_fsi_readl(QTestState *s, uint32_t reg) 45*45d8cdbdSNinad Palsule { 46*45d8cdbdSNinad Palsule return qtest_readl(s, aspeed_fsi_base_addr + reg); 47*45d8cdbdSNinad Palsule } 48*45d8cdbdSNinad Palsule 49*45d8cdbdSNinad Palsule static void aspeed_fsi_writel(QTestState *s, uint32_t reg, uint32_t val) 50*45d8cdbdSNinad Palsule { 51*45d8cdbdSNinad Palsule qtest_writel(s, aspeed_fsi_base_addr + reg, val); 52*45d8cdbdSNinad Palsule } 53*45d8cdbdSNinad Palsule 54*45d8cdbdSNinad Palsule /* Setup base address and select register */ 55*45d8cdbdSNinad Palsule static void test_fsi_setup(QTestState *s, uint32_t base_addr) 56*45d8cdbdSNinad Palsule { 57*45d8cdbdSNinad Palsule uint32_t curval; 58*45d8cdbdSNinad Palsule 59*45d8cdbdSNinad Palsule aspeed_fsi_base_addr = base_addr; 60*45d8cdbdSNinad Palsule 61*45d8cdbdSNinad Palsule /* Set the base select register */ 62*45d8cdbdSNinad Palsule if (base_addr == AST2600_OPB_FSI0_BASE_ADDR) { 63*45d8cdbdSNinad Palsule /* Unselect FSI1 */ 64*45d8cdbdSNinad Palsule aspeed_fsi_writel(s, ASPEED_FSI_OPB1_BUS_SELECT, 0x0); 65*45d8cdbdSNinad Palsule curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB1_BUS_SELECT); 66*45d8cdbdSNinad Palsule g_assert_cmpuint(curval, ==, 0x0); 67*45d8cdbdSNinad Palsule 68*45d8cdbdSNinad Palsule /* Select FSI0 */ 69*45d8cdbdSNinad Palsule aspeed_fsi_writel(s, ASPEED_FSI_OPB0_BUS_SELECT, 0x1); 70*45d8cdbdSNinad Palsule curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB0_BUS_SELECT); 71*45d8cdbdSNinad Palsule g_assert_cmpuint(curval, ==, 0x1); 72*45d8cdbdSNinad Palsule } else if (base_addr == AST2600_OPB_FSI1_BASE_ADDR) { 73*45d8cdbdSNinad Palsule /* Unselect FSI0 */ 74*45d8cdbdSNinad Palsule aspeed_fsi_writel(s, ASPEED_FSI_OPB0_BUS_SELECT, 0x0); 75*45d8cdbdSNinad Palsule curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB0_BUS_SELECT); 76*45d8cdbdSNinad Palsule g_assert_cmpuint(curval, ==, 0x0); 77*45d8cdbdSNinad Palsule 78*45d8cdbdSNinad Palsule /* Select FSI1 */ 79*45d8cdbdSNinad Palsule aspeed_fsi_writel(s, ASPEED_FSI_OPB1_BUS_SELECT, 0x1); 80*45d8cdbdSNinad Palsule curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB1_BUS_SELECT); 81*45d8cdbdSNinad Palsule g_assert_cmpuint(curval, ==, 0x1); 82*45d8cdbdSNinad Palsule } else { 83*45d8cdbdSNinad Palsule g_assert_not_reached(); 84*45d8cdbdSNinad Palsule } 85*45d8cdbdSNinad Palsule } 86*45d8cdbdSNinad Palsule 87*45d8cdbdSNinad Palsule static void test_fsi_reg_change(QTestState *s, uint32_t reg, uint32_t newval) 88*45d8cdbdSNinad Palsule { 89*45d8cdbdSNinad Palsule uint32_t base; 90*45d8cdbdSNinad Palsule uint32_t curval; 91*45d8cdbdSNinad Palsule 92*45d8cdbdSNinad Palsule base = aspeed_fsi_readl(s, reg); 93*45d8cdbdSNinad Palsule aspeed_fsi_writel(s, reg, newval); 94*45d8cdbdSNinad Palsule curval = aspeed_fsi_readl(s, reg); 95*45d8cdbdSNinad Palsule g_assert_cmpuint(curval, ==, newval); 96*45d8cdbdSNinad Palsule aspeed_fsi_writel(s, reg, base); 97*45d8cdbdSNinad Palsule curval = aspeed_fsi_readl(s, reg); 98*45d8cdbdSNinad Palsule g_assert_cmpuint(curval, ==, base); 99*45d8cdbdSNinad Palsule } 100*45d8cdbdSNinad Palsule 101*45d8cdbdSNinad Palsule static void test_fsi0_master_regs(const void *data) 102*45d8cdbdSNinad Palsule { 103*45d8cdbdSNinad Palsule QTestState *s = (QTestState *)data; 104*45d8cdbdSNinad Palsule 105*45d8cdbdSNinad Palsule test_fsi_setup(s, AST2600_OPB_FSI0_BASE_ADDR); 106*45d8cdbdSNinad Palsule 107*45d8cdbdSNinad Palsule test_fsi_reg_change(s, ASPEED_FSI_OPB0_RW_DIRECTION, 0xF3F4F514); 108*45d8cdbdSNinad Palsule test_fsi_reg_change(s, ASPEED_FSI_OPB0_XFER_SIZE, 0xF3F4F518); 109*45d8cdbdSNinad Palsule test_fsi_reg_change(s, ASPEED_FSI_OPB0_BUS_ADDR, 0xF3F4F51c); 110*45d8cdbdSNinad Palsule test_fsi_reg_change(s, ASPEED_FSI_INTRRUPT_CLEAR, 0xF3F4F540); 111*45d8cdbdSNinad Palsule test_fsi_reg_change(s, ASPEED_FSI_INTRRUPT_STATUS, 0xF3F4F548); 112*45d8cdbdSNinad Palsule test_fsi_reg_change(s, ASPEED_FSI_OPB0_BUS_STATUS, 0xF3F4F580); 113*45d8cdbdSNinad Palsule test_fsi_reg_change(s, ASPEED_FSI_OPB0_READ_DATA, 0xF3F4F584); 114*45d8cdbdSNinad Palsule } 115*45d8cdbdSNinad Palsule 116*45d8cdbdSNinad Palsule static void test_fsi1_master_regs(const void *data) 117*45d8cdbdSNinad Palsule { 118*45d8cdbdSNinad Palsule QTestState *s = (QTestState *)data; 119*45d8cdbdSNinad Palsule 120*45d8cdbdSNinad Palsule test_fsi_setup(s, AST2600_OPB_FSI1_BASE_ADDR); 121*45d8cdbdSNinad Palsule 122*45d8cdbdSNinad Palsule test_fsi_reg_change(s, ASPEED_FSI_OPB1_RW_DIRECTION, 0xF3F4F514); 123*45d8cdbdSNinad Palsule test_fsi_reg_change(s, ASPEED_FSI_OPB1_XFER_SIZE, 0xF3F4F518); 124*45d8cdbdSNinad Palsule test_fsi_reg_change(s, ASPEED_FSI_OPB1_BUS_ADDR, 0xF3F4F51c); 125*45d8cdbdSNinad Palsule test_fsi_reg_change(s, ASPEED_FSI_INTRRUPT_CLEAR, 0xF3F4F540); 126*45d8cdbdSNinad Palsule test_fsi_reg_change(s, ASPEED_FSI_INTRRUPT_STATUS, 0xF3F4F548); 127*45d8cdbdSNinad Palsule test_fsi_reg_change(s, ASPEED_FSI_OPB1_BUS_STATUS, 0xF3F4F580); 128*45d8cdbdSNinad Palsule test_fsi_reg_change(s, ASPEED_FSI_OPB1_READ_DATA, 0xF3F4F584); 129*45d8cdbdSNinad Palsule } 130*45d8cdbdSNinad Palsule 131*45d8cdbdSNinad Palsule static void test_fsi0_getcfam_addr0(const void *data) 132*45d8cdbdSNinad Palsule { 133*45d8cdbdSNinad Palsule QTestState *s = (QTestState *)data; 134*45d8cdbdSNinad Palsule uint32_t curval; 135*45d8cdbdSNinad Palsule 136*45d8cdbdSNinad Palsule test_fsi_setup(s, AST2600_OPB_FSI0_BASE_ADDR); 137*45d8cdbdSNinad Palsule 138*45d8cdbdSNinad Palsule /* Master access direction read */ 139*45d8cdbdSNinad Palsule aspeed_fsi_writel(s, ASPEED_FSI_OPB0_RW_DIRECTION, 0x1); 140*45d8cdbdSNinad Palsule /* word */ 141*45d8cdbdSNinad Palsule aspeed_fsi_writel(s, ASPEED_FSI_OPB0_XFER_SIZE, 0x3); 142*45d8cdbdSNinad Palsule /* Address */ 143*45d8cdbdSNinad Palsule aspeed_fsi_writel(s, ASPEED_FSI_OPB0_BUS_ADDR, 0xa0000000); 144*45d8cdbdSNinad Palsule aspeed_fsi_writel(s, ASPEED_FSI_INTRRUPT_CLEAR, 0x1); 145*45d8cdbdSNinad Palsule aspeed_fsi_writel(s, ASPEED_FSI_ENGINER_TRIGGER, 0x1); 146*45d8cdbdSNinad Palsule 147*45d8cdbdSNinad Palsule curval = aspeed_fsi_readl(s, ASPEED_FSI_INTRRUPT_STATUS); 148*45d8cdbdSNinad Palsule g_assert_cmpuint(curval, ==, 0x10000); 149*45d8cdbdSNinad Palsule curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB0_BUS_STATUS); 150*45d8cdbdSNinad Palsule g_assert_cmpuint(curval, ==, 0x0); 151*45d8cdbdSNinad Palsule curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB0_READ_DATA); 152*45d8cdbdSNinad Palsule g_assert_cmpuint(curval, ==, 0x152d02c0); 153*45d8cdbdSNinad Palsule } 154*45d8cdbdSNinad Palsule 155*45d8cdbdSNinad Palsule static void test_fsi1_getcfam_addr0(const void *data) 156*45d8cdbdSNinad Palsule { 157*45d8cdbdSNinad Palsule QTestState *s = (QTestState *)data; 158*45d8cdbdSNinad Palsule uint32_t curval; 159*45d8cdbdSNinad Palsule 160*45d8cdbdSNinad Palsule test_fsi_setup(s, AST2600_OPB_FSI1_BASE_ADDR); 161*45d8cdbdSNinad Palsule 162*45d8cdbdSNinad Palsule /* Master access direction read */ 163*45d8cdbdSNinad Palsule aspeed_fsi_writel(s, ASPEED_FSI_OPB1_RW_DIRECTION, 0x1); 164*45d8cdbdSNinad Palsule 165*45d8cdbdSNinad Palsule aspeed_fsi_writel(s, ASPEED_FSI_OPB1_XFER_SIZE, 0x3); 166*45d8cdbdSNinad Palsule aspeed_fsi_writel(s, ASPEED_FSI_OPB1_BUS_ADDR, 0xa0000000); 167*45d8cdbdSNinad Palsule aspeed_fsi_writel(s, ASPEED_FSI_INTRRUPT_CLEAR, 0x1); 168*45d8cdbdSNinad Palsule aspeed_fsi_writel(s, ASPEED_FSI_ENGINER_TRIGGER, 0x1); 169*45d8cdbdSNinad Palsule 170*45d8cdbdSNinad Palsule curval = aspeed_fsi_readl(s, ASPEED_FSI_INTRRUPT_STATUS); 171*45d8cdbdSNinad Palsule g_assert_cmpuint(curval, ==, 0x20000); 172*45d8cdbdSNinad Palsule curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB1_BUS_STATUS); 173*45d8cdbdSNinad Palsule g_assert_cmpuint(curval, ==, 0x0); 174*45d8cdbdSNinad Palsule curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB1_READ_DATA); 175*45d8cdbdSNinad Palsule g_assert_cmpuint(curval, ==, 0x152d02c0); 176*45d8cdbdSNinad Palsule } 177*45d8cdbdSNinad Palsule 178*45d8cdbdSNinad Palsule int main(int argc, char **argv) 179*45d8cdbdSNinad Palsule { 180*45d8cdbdSNinad Palsule int ret = -1; 181*45d8cdbdSNinad Palsule QTestState *s; 182*45d8cdbdSNinad Palsule 183*45d8cdbdSNinad Palsule g_test_init(&argc, &argv, NULL); 184*45d8cdbdSNinad Palsule 185*45d8cdbdSNinad Palsule s = qtest_init("-machine ast2600-evb "); 186*45d8cdbdSNinad Palsule 187*45d8cdbdSNinad Palsule /* Tests for OPB/FSI0 */ 188*45d8cdbdSNinad Palsule qtest_add_data_func("/aspeed-fsi-test/test_fsi0_master_regs", s, 189*45d8cdbdSNinad Palsule test_fsi0_master_regs); 190*45d8cdbdSNinad Palsule 191*45d8cdbdSNinad Palsule qtest_add_data_func("/aspeed-fsi-test/test_fsi0_getcfam_addr0", s, 192*45d8cdbdSNinad Palsule test_fsi0_getcfam_addr0); 193*45d8cdbdSNinad Palsule 194*45d8cdbdSNinad Palsule /* Tests for OPB/FSI1 */ 195*45d8cdbdSNinad Palsule qtest_add_data_func("/aspeed-fsi-test/test_fsi1_master_regs", s, 196*45d8cdbdSNinad Palsule test_fsi1_master_regs); 197*45d8cdbdSNinad Palsule 198*45d8cdbdSNinad Palsule qtest_add_data_func("/aspeed-fsi-test/test_fsi1_getcfam_addr0", s, 199*45d8cdbdSNinad Palsule test_fsi1_getcfam_addr0); 200*45d8cdbdSNinad Palsule 201*45d8cdbdSNinad Palsule ret = g_test_run(); 202*45d8cdbdSNinad Palsule qtest_quit(s); 203*45d8cdbdSNinad Palsule 204*45d8cdbdSNinad Palsule return ret; 205*45d8cdbdSNinad Palsule } 206