Hi Thomas, Cedric

> Subject: Re: [PATCH v6 8/8] hw/gpio/aspeed: Add test case for AST2700
> 
> On 30/09/2024 18.48, Cédric Le Goater wrote:
> > On 9/30/24 18:36, Thomas Huth wrote:
> >> On 30/09/2024 10.52, Jamin Lin wrote:
> >>> Add test case to test GPIO output and input pins from A0 to D7 for
> AST2700.
> >>>
> >>> Signed-off-by: Jamin Lin <jamin_...@aspeedtech.com>
> >>> ---
> >>>   tests/qtest/aspeed_gpio-test.c | 77
> >>> ++++++++++++++++++++++++++++++++--
> >>>   tests/qtest/meson.build        |  3 ++
> >>>   2 files changed, 76 insertions(+), 4 deletions(-)
> >>>
> >>> diff --git a/tests/qtest/aspeed_gpio-test.c
> >>> b/tests/qtest/aspeed_gpio-test.c index d38f51d719..03b3b1c2b2 100644
> >>> --- a/tests/qtest/aspeed_gpio-test.c
> >>> +++ b/tests/qtest/aspeed_gpio-test.c
> >>> @@ -33,6 +33,10 @@
> >>>   #define GPIO_ABCD_DATA_VALUE 0x000
> >>>   #define GPIO_ABCD_DIRECTION  0x004
> >>> +/* AST2700 */
> >>> +#define AST2700_GPIO_BASE 0x14C0B000 #define GPIOA0_CONTROL
> 0x180
> >>> +
> >>>   static void test_set_colocated_pins(const void *data)
> >>>   {
> >>>       QTestState *s = (QTestState *)data; @@ -72,17 +76,82 @@ static
> >>> void test_set_input_pins(const void *data)
> >>>       g_assert_cmphex(value, ==, 0xffffffff);
> >>>   }
> >>> +static void test_2700_output_pins(const void *data) {
> >>> +    QTestState *s = (QTestState *)data;
> >>> +    uint32_t offset = 0;
> >>> +    uint32_t value = 0;
> >>> +    uint32_t pin = 0;
> >>> +
> >>> +    for (char c = 'A'; c <= 'D'; c++) {
> >>> +        for (int i = 0; i < 8; i++) {
> >>> +            offset = AST2700_GPIO_BASE + GPIOA0_CONTROL +
> (pin *
> >>> +4);
> >>> +
> >>> +            /* output direction and output hi */
> >>> +            qtest_writel(s, offset, 0x00000003);
> >>> +            value = qtest_readl(s, offset);
> >>> +            g_assert_cmphex(value, ==, 0x00000003);
> >>> +
> >>> +            /* output direction and output low */
> >>> +            qtest_writel(s, offset, 0x00000002);
> >>> +            value = qtest_readl(s, offset);
> >>> +            g_assert_cmphex(value, ==, 0x00000002);
> >>> +            pin++;
> >>> +        }
> >>> +    }
> >>> +}
> >>> +
> >>> +static void test_2700_input_pins(const void *data) {
> >>> +    QTestState *s = (QTestState *)data;
> >>> +    char name[16];
> >>> +    uint32_t offset = 0;
> >>> +    uint32_t value = 0;
> >>> +    uint32_t pin = 0;
> >>> +
> >>> +    for (char c = 'A'; c <= 'D'; c++) {
> >>> +        for (int i = 0; i < 8; i++) {
> >>> +            sprintf(name, "gpio%c%d", c, i);
> >>> +            offset = AST2700_GPIO_BASE + GPIOA0_CONTROL +
> (pin *
> >>> +4);
> >>> +            /* input direction */
> >>> +            qtest_writel(s, offset, 0);
> >>> +
> >>> +            /* set input */
> >>> +            qtest_qom_set_bool(s, "/machine/soc/gpio", name,
> true);
> >>> +            value = qtest_readl(s, offset);
> >>> +            g_assert_cmphex(value, ==, 0x00002000);
> >>> +
> >>> +            /* clear input */
> >>> +            qtest_qom_set_bool(s, "/machine/soc/gpio", name,
> >>> +false);
> >>> +            value = qtest_readl(s, offset);
> >>> +            g_assert_cmphex(value, ==, 0);
> >>> +            pin++;
> >>> +        }
> >>> +    }
> >>> +}
> >>
> >> As far as I can see, there is nothing in these two functions that
> >> requires any of the other code in this file ...
> >>
> >>> +
> >>>   int main(int argc, char **argv)
> >>>   {
> >>> +    const char *arch = qtest_get_arch();
> >>>       QTestState *s;
> >>>       int r;
> >>>       g_test_init(&argc, &argv, NULL);
> >>> -    s = qtest_init("-machine ast2600-evb");
> >>> -    qtest_add_data_func("/ast2600/gpio/set_colocated_pins", s,
> >>> -                        test_set_colocated_pins);
> >>> -    qtest_add_data_func("/ast2600/gpio/set_input_pins", s,
> >>> test_set_input_pins);
> >>> +    if (strcmp(arch, "aarch64") == 0) {
> >>> +        s = qtest_init("-machine ast2700-evb");
> >>> +        qtest_add_data_func("/ast2700/gpio/input_pins",
> >>> +                            s, test_2700_input_pins);
> >>> +        qtest_add_data_func("/ast2700/gpio/out_pins", s,
> >>> test_2700_output_pins);
> >>> +    } else {
> >>> +        s = qtest_init("-machine ast2600-evb");
> >>> +        qtest_add_data_func("/ast2600/gpio/set_colocated_pins", s,
> >>> +                            test_set_colocated_pins);
> >>> +        qtest_add_data_func("/ast2600/gpio/set_input_pins", s,
> >>> +                            test_set_input_pins);
> >>> +    }
> >>
> >> ... so the more I look at this, the more I think your new test should
> >> reside in a separate file that only gets executed for aarch64, while
> >> this file here should stay for arm 32-bit. Or is there a real
> >> compelling reason for putting your code in this file here?
> >
> > Because it is related to the Aspeed GPIO controllers. Unless we want
> > to introduce a new set of test files for 64-bit Aspeed SoC controllers
> > ? why not.
> >
> > I am ok with both options. Option 1 is simpler to implement, but there
> > may be reasons to separate the tests based on architecture, although
> > I'm not aware of any at the moment. Would you rather prefer option 2 ?
> > How should we name the test file ?
> 
> Since all arm 32-bit tests are currently completely separate from the
> aarch64 tests, I think a separate file would be better, indeed.
> Simply call it ast2700-gpio-test.c ?
> 

Thanks for suggestion.
Will move it into new file, ast2700-gptio-test.c.

Jamin
>   Thomas

Reply via email to