1*34fdd734SJamin Lin /* 2*34fdd734SJamin Lin * QTest testcase for the ASPEED AST2700 GPIO Controller. 3*34fdd734SJamin Lin * 4*34fdd734SJamin Lin * SPDX-License-Identifier: GPL-2.0-or-later 5*34fdd734SJamin Lin * Copyright (C) 2024 ASPEED Technology Inc. 6*34fdd734SJamin Lin */ 7*34fdd734SJamin Lin 8*34fdd734SJamin Lin #include "qemu/osdep.h" 9*34fdd734SJamin Lin #include "qemu/bitops.h" 10*34fdd734SJamin Lin #include "qemu/timer.h" 11*34fdd734SJamin Lin #include "qapi/qmp/qdict.h" 12*34fdd734SJamin Lin #include "libqtest-single.h" 13*34fdd734SJamin Lin 14*34fdd734SJamin Lin #define AST2700_GPIO_BASE 0x14C0B000 15*34fdd734SJamin Lin #define GPIOA0_CONTROL 0x180 16*34fdd734SJamin Lin 17*34fdd734SJamin Lin static void test_output_pins(const char *machine, const uint32_t base) 18*34fdd734SJamin Lin { 19*34fdd734SJamin Lin QTestState *s = qtest_init(machine); 20*34fdd734SJamin Lin uint32_t offset = 0; 21*34fdd734SJamin Lin uint32_t value = 0; 22*34fdd734SJamin Lin uint32_t pin = 0; 23*34fdd734SJamin Lin 24*34fdd734SJamin Lin for (char c = 'A'; c <= 'D'; c++) { 25*34fdd734SJamin Lin for (int i = 0; i < 8; i++) { 26*34fdd734SJamin Lin offset = base + (pin * 4); 27*34fdd734SJamin Lin 28*34fdd734SJamin Lin /* output direction and output hi */ 29*34fdd734SJamin Lin qtest_writel(s, offset, 0x00000003); 30*34fdd734SJamin Lin value = qtest_readl(s, offset); 31*34fdd734SJamin Lin g_assert_cmphex(value, ==, 0x00000003); 32*34fdd734SJamin Lin 33*34fdd734SJamin Lin /* output direction and output low */ 34*34fdd734SJamin Lin qtest_writel(s, offset, 0x00000002); 35*34fdd734SJamin Lin value = qtest_readl(s, offset); 36*34fdd734SJamin Lin g_assert_cmphex(value, ==, 0x00000002); 37*34fdd734SJamin Lin pin++; 38*34fdd734SJamin Lin } 39*34fdd734SJamin Lin } 40*34fdd734SJamin Lin 41*34fdd734SJamin Lin qtest_quit(s); 42*34fdd734SJamin Lin } 43*34fdd734SJamin Lin 44*34fdd734SJamin Lin static void test_input_pins(const char *machine, const uint32_t base) 45*34fdd734SJamin Lin { 46*34fdd734SJamin Lin QTestState *s = qtest_init(machine); 47*34fdd734SJamin Lin char name[16]; 48*34fdd734SJamin Lin uint32_t offset = 0; 49*34fdd734SJamin Lin uint32_t value = 0; 50*34fdd734SJamin Lin uint32_t pin = 0; 51*34fdd734SJamin Lin 52*34fdd734SJamin Lin for (char c = 'A'; c <= 'D'; c++) { 53*34fdd734SJamin Lin for (int i = 0; i < 8; i++) { 54*34fdd734SJamin Lin sprintf(name, "gpio%c%d", c, i); 55*34fdd734SJamin Lin offset = base + (pin * 4); 56*34fdd734SJamin Lin /* input direction */ 57*34fdd734SJamin Lin qtest_writel(s, offset, 0); 58*34fdd734SJamin Lin 59*34fdd734SJamin Lin /* set input */ 60*34fdd734SJamin Lin qtest_qom_set_bool(s, "/machine/soc/gpio", name, true); 61*34fdd734SJamin Lin value = qtest_readl(s, offset); 62*34fdd734SJamin Lin g_assert_cmphex(value, ==, 0x00002000); 63*34fdd734SJamin Lin 64*34fdd734SJamin Lin /* clear input */ 65*34fdd734SJamin Lin qtest_qom_set_bool(s, "/machine/soc/gpio", name, false); 66*34fdd734SJamin Lin value = qtest_readl(s, offset); 67*34fdd734SJamin Lin g_assert_cmphex(value, ==, 0); 68*34fdd734SJamin Lin pin++; 69*34fdd734SJamin Lin } 70*34fdd734SJamin Lin } 71*34fdd734SJamin Lin 72*34fdd734SJamin Lin qtest_quit(s); 73*34fdd734SJamin Lin } 74*34fdd734SJamin Lin 75*34fdd734SJamin Lin static void test_2700_input_pins(void) 76*34fdd734SJamin Lin { 77*34fdd734SJamin Lin test_input_pins("-machine ast2700-evb", 78*34fdd734SJamin Lin AST2700_GPIO_BASE + GPIOA0_CONTROL); 79*34fdd734SJamin Lin } 80*34fdd734SJamin Lin 81*34fdd734SJamin Lin static void test_2700_output_pins(void) 82*34fdd734SJamin Lin { 83*34fdd734SJamin Lin test_output_pins("-machine ast2700-evb", 84*34fdd734SJamin Lin AST2700_GPIO_BASE + GPIOA0_CONTROL); 85*34fdd734SJamin Lin } 86*34fdd734SJamin Lin 87*34fdd734SJamin Lin int main(int argc, char **argv) 88*34fdd734SJamin Lin { 89*34fdd734SJamin Lin g_test_init(&argc, &argv, NULL); 90*34fdd734SJamin Lin 91*34fdd734SJamin Lin qtest_add_func("/ast2700/gpio/input_pins", test_2700_input_pins); 92*34fdd734SJamin Lin qtest_add_func("/ast2700/gpio/output_pins", test_2700_output_pins); 93*34fdd734SJamin Lin 94*34fdd734SJamin Lin return g_test_run(); 95*34fdd734SJamin Lin } 96