Skip to content

Commit

Permalink
hw/arm : Pass STM32L4x5 SYSCFG gpios to STM32L4x5 SoC
Browse files Browse the repository at this point in the history
Exposing SYSCFG inputs to the SoC is practical in order to wire the SoC
to the optional DM163 display from the board code (GPIOs outputs need
to be connected to both SYSCFG inputs and DM163 inputs).

STM32L4x5 SYSCFG in-irq interception needed to be changed accordingly.

Signed-off-by: Arnaud Minier <arnaud.minier@telecom-paris.fr>
Signed-off-by: Inès Varhol <ines.varhol@telecom-paris.fr>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Message-id: 20240424200929.240921-3-ines.varhol@telecom-paris.fr
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
  • Loading branch information
inesvar authored and pm215 committed Apr 30, 2024
1 parent c771f88 commit 5b5b014
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 14 deletions.
6 changes: 4 additions & 2 deletions hw/arm/stm32l4x5_soc.c
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
/*
* STM32L4x5 SoC family
*
* Copyright (c) 2023 Arnaud Minier <arnaud.minier@telecom-paris.fr>
* Copyright (c) 2023 Inès Varhol <ines.varhol@telecom-paris.fr>
* Copyright (c) 2023-2024 Arnaud Minier <arnaud.minier@telecom-paris.fr>
* Copyright (c) 2023-2024 Inès Varhol <ines.varhol@telecom-paris.fr>
*
* SPDX-License-Identifier: GPL-2.0-or-later
*
Expand Down Expand Up @@ -250,6 +250,8 @@ static void stm32l4x5_soc_realize(DeviceState *dev_soc, Error **errp)
}
}

qdev_pass_gpios(DEVICE(&s->syscfg), dev_soc, NULL);

/* EXTI device */
busdev = SYS_BUS_DEVICE(&s->exti);
if (!sysbus_realize(busdev, errp)) {
Expand Down
13 changes: 8 additions & 5 deletions tests/qtest/stm32l4x5_gpio-test.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@
#define OTYPER_PUSH_PULL 0
#define OTYPER_OPEN_DRAIN 1

/* SoC forwards GPIOs to SysCfg */
#define SYSCFG "/machine/soc"

const uint32_t moder_reset[NUM_GPIOS] = {
0xABFFFFFF,
0xFFFFFEBF,
Expand Down Expand Up @@ -284,7 +287,7 @@ static void test_gpio_output_mode(const void *data)
uint32_t gpio = test_gpio_addr(data);
unsigned int gpio_id = get_gpio_id(gpio);

qtest_irq_intercept_in(global_qtest, "/machine/soc/syscfg");
qtest_irq_intercept_in(global_qtest, SYSCFG);

/* Set a bit in ODR and check nothing happens */
gpio_set_bit(gpio, ODR, pin, 1);
Expand Down Expand Up @@ -319,7 +322,7 @@ static void test_gpio_input_mode(const void *data)
uint32_t gpio = test_gpio_addr(data);
unsigned int gpio_id = get_gpio_id(gpio);

qtest_irq_intercept_in(global_qtest, "/machine/soc/syscfg");
qtest_irq_intercept_in(global_qtest, SYSCFG);

/* Configure a line as input, raise it, and check that the pin is high */
gpio_set_2bits(gpio, MODER, pin, MODER_INPUT);
Expand Down Expand Up @@ -348,7 +351,7 @@ static void test_pull_up_pull_down(const void *data)
uint32_t gpio = test_gpio_addr(data);
unsigned int gpio_id = get_gpio_id(gpio);

qtest_irq_intercept_in(global_qtest, "/machine/soc/syscfg");
qtest_irq_intercept_in(global_qtest, SYSCFG);

/* Configure a line as input with pull-up, check the line is set high */
gpio_set_2bits(gpio, MODER, pin, MODER_INPUT);
Expand Down Expand Up @@ -378,7 +381,7 @@ static void test_push_pull(const void *data)
uint32_t gpio = test_gpio_addr(data);
uint32_t gpio2 = GPIO_BASE_ADDR + (GPIO_H - gpio);

qtest_irq_intercept_in(global_qtest, "/machine/soc/syscfg");
qtest_irq_intercept_in(global_qtest, SYSCFG);

/* Setting a line high externally, configuring it in push-pull output */
/* And checking the pin was disconnected */
Expand Down Expand Up @@ -425,7 +428,7 @@ static void test_open_drain(const void *data)
uint32_t gpio = test_gpio_addr(data);
uint32_t gpio2 = GPIO_BASE_ADDR + (GPIO_H - gpio);

qtest_irq_intercept_in(global_qtest, "/machine/soc/syscfg");
qtest_irq_intercept_in(global_qtest, SYSCFG);

/* Setting a line high externally, configuring it in open-drain output */
/* And checking the pin was disconnected */
Expand Down
17 changes: 10 additions & 7 deletions tests/qtest/stm32l4x5_syscfg-test.c
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
/*
* QTest testcase for STM32L4x5_SYSCFG
*
* Copyright (c) 2023 Arnaud Minier <arnaud.minier@telecom-paris.fr>
* Copyright (c) 2023 Inès Varhol <ines.varhol@telecom-paris.fr>
* Copyright (c) 2024 Arnaud Minier <arnaud.minier@telecom-paris.fr>
* Copyright (c) 2024 Inès Varhol <ines.varhol@telecom-paris.fr>
*
* This work is licensed under the terms of the GNU GPL, version 2 or later.
* See the COPYING file in the top-level directory.
Expand All @@ -25,6 +25,10 @@
#define SYSCFG_SWPR2 0x28
#define INVALID_ADDR 0x2C

/* SoC forwards GPIOs to SysCfg */
#define SYSCFG "/machine/soc"
#define EXTI "/machine/soc/exti"

static void syscfg_writel(unsigned int offset, uint32_t value)
{
writel(SYSCFG_BASE_ADDR + offset, value);
Expand All @@ -37,8 +41,7 @@ static uint32_t syscfg_readl(unsigned int offset)

static void syscfg_set_irq(int num, int level)
{
qtest_set_irq_in(global_qtest, "/machine/soc/syscfg",
NULL, num, level);
qtest_set_irq_in(global_qtest, SYSCFG, NULL, num, level);
}

static void system_reset(void)
Expand Down Expand Up @@ -197,7 +200,7 @@ static void test_interrupt(void)
* Test that GPIO rising lines result in an irq
* with the right configuration
*/
qtest_irq_intercept_in(global_qtest, "/machine/soc/exti");
qtest_irq_intercept_in(global_qtest, EXTI);

/* GPIOA is the default source for EXTI lines 0 to 15 */

Expand Down Expand Up @@ -230,7 +233,7 @@ static void test_irq_pin_multiplexer(void)
* Test that syscfg irq sets the right exti irq
*/

qtest_irq_intercept_in(global_qtest, "/machine/soc/exti");
qtest_irq_intercept_in(global_qtest, EXTI);

syscfg_set_irq(0, 1);

Expand All @@ -257,7 +260,7 @@ static void test_irq_gpio_multiplexer(void)
* Test that an irq is generated only by the right GPIO
*/

qtest_irq_intercept_in(global_qtest, "/machine/soc/exti");
qtest_irq_intercept_in(global_qtest, EXTI);

/* GPIOA is the default source for EXTI lines 0 to 15 */

Expand Down

0 comments on commit 5b5b014

Please sign in to comment.