From 2ab95efa67ef72ac68079f18adc216b43a7809dc Mon Sep 17 00:00:00 2001 From: Bjarki Arge Andreasen Date: Sun, 17 Mar 2024 13:35:31 +0100 Subject: [PATCH] tests: kernel: Add sys_irq test suites Add test suites to validate the sys_irq API, shared IRQs and dynamic IRQs. Signed-off-by: Bjarki Arge Andreasen --- .../kernel/sys_irq/dynamic_irq/CMakeLists.txt | 10 ++ .../dynamic_irq/boards/rak5010_nrf52840.conf | 7 + .../boards/rak5010_nrf52840.overlay | 46 +++++++ tests/kernel/sys_irq/dynamic_irq/prj.conf | 10 ++ tests/kernel/sys_irq/dynamic_irq/src/irq.c | 121 +++++++++++++++++ .../kernel/sys_irq/dynamic_irq/testcase.yaml | 4 + tests/kernel/sys_irq/irq/CMakeLists.txt | 10 ++ .../sys_irq/irq/boards/rak5010_nrf52840.conf | 7 + .../irq/boards/rak5010_nrf52840.overlay | 46 +++++++ tests/kernel/sys_irq/irq/prj.conf | 9 ++ tests/kernel/sys_irq/irq/src/irq.c | 122 ++++++++++++++++++ tests/kernel/sys_irq/irq/testcase.yaml | 4 + .../kernel/sys_irq/shared_irq/CMakeLists.txt | 10 ++ .../shared_irq/boards/rak5010_nrf52840.conf | 9 ++ .../boards/rak5010_nrf52840.overlay | 46 +++++++ tests/kernel/sys_irq/shared_irq/prj.conf | 10 ++ tests/kernel/sys_irq/shared_irq/src/irq.c | 87 +++++++++++++ tests/kernel/sys_irq/shared_irq/testcase.yaml | 4 + 18 files changed, 562 insertions(+) create mode 100644 tests/kernel/sys_irq/dynamic_irq/CMakeLists.txt create mode 100644 tests/kernel/sys_irq/dynamic_irq/boards/rak5010_nrf52840.conf create mode 100644 tests/kernel/sys_irq/dynamic_irq/boards/rak5010_nrf52840.overlay create mode 100644 tests/kernel/sys_irq/dynamic_irq/prj.conf create mode 100644 tests/kernel/sys_irq/dynamic_irq/src/irq.c create mode 100644 tests/kernel/sys_irq/dynamic_irq/testcase.yaml create mode 100644 tests/kernel/sys_irq/irq/CMakeLists.txt create mode 100644 tests/kernel/sys_irq/irq/boards/rak5010_nrf52840.conf create mode 100644 tests/kernel/sys_irq/irq/boards/rak5010_nrf52840.overlay create mode 100644 tests/kernel/sys_irq/irq/prj.conf create mode 100644 tests/kernel/sys_irq/irq/src/irq.c create mode 100644 tests/kernel/sys_irq/irq/testcase.yaml create mode 100644 tests/kernel/sys_irq/shared_irq/CMakeLists.txt create mode 100644 tests/kernel/sys_irq/shared_irq/boards/rak5010_nrf52840.conf create mode 100644 tests/kernel/sys_irq/shared_irq/boards/rak5010_nrf52840.overlay create mode 100644 tests/kernel/sys_irq/shared_irq/prj.conf create mode 100644 tests/kernel/sys_irq/shared_irq/src/irq.c create mode 100644 tests/kernel/sys_irq/shared_irq/testcase.yaml diff --git a/tests/kernel/sys_irq/dynamic_irq/CMakeLists.txt b/tests/kernel/sys_irq/dynamic_irq/CMakeLists.txt new file mode 100644 index 00000000000000..2f419c2ad7e42f --- /dev/null +++ b/tests/kernel/sys_irq/dynamic_irq/CMakeLists.txt @@ -0,0 +1,10 @@ +# Copyright (c) 2024 Bjarki Arge Andreasen +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(test_sys_irq_dynamic_irq) + +target_sources(app PRIVATE + src/irq.c +) diff --git a/tests/kernel/sys_irq/dynamic_irq/boards/rak5010_nrf52840.conf b/tests/kernel/sys_irq/dynamic_irq/boards/rak5010_nrf52840.conf new file mode 100644 index 00000000000000..2e855a92801a71 --- /dev/null +++ b/tests/kernel/sys_irq/dynamic_irq/boards/rak5010_nrf52840.conf @@ -0,0 +1,7 @@ +# Copyright (c) 2024 Nordic Semiconductor +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_GEN_ISR_TABLES=n +CONFIG_GEN_IRQ_VECTOR_TABLE=n +CONFIG_INTC=y +CONFIG_SYS_IRQ=y diff --git a/tests/kernel/sys_irq/dynamic_irq/boards/rak5010_nrf52840.overlay b/tests/kernel/sys_irq/dynamic_irq/boards/rak5010_nrf52840.overlay new file mode 100644 index 00000000000000..bebaef84142b9a --- /dev/null +++ b/tests/kernel/sys_irq/dynamic_irq/boards/rak5010_nrf52840.overlay @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2024 Nordic Semiconductor + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + aliases { + test-intd0 = &spi1; + test-intd1 = &spi2; + }; +}; + +&spi1 { + status = "reserved"; +}; + +&spi2 { + status = "reserved"; +}; + +&rtc1 { + status = "reserved"; +}; + +&nvic { + interrupt-lines = <65>; +}; + +/* Console routed to IO1 and IO2 */ +&pinctrl { + uart1_default: uart1_default { + group1 { + psels = , + ; + }; + }; + + uart1_sleep: uart1_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/tests/kernel/sys_irq/dynamic_irq/prj.conf b/tests/kernel/sys_irq/dynamic_irq/prj.conf new file mode 100644 index 00000000000000..14f1cf187c3f57 --- /dev/null +++ b/tests/kernel/sys_irq/dynamic_irq/prj.conf @@ -0,0 +1,10 @@ +# Copyright (c) 2024 Bjarki Arge Andreasen +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_ZTEST=y +CONFIG_ZTEST_FAIL_FAST=y +CONFIG_INTC=y +CONFIG_SYS_IRQ=y +CONFIG_SYS_IRQ_DYNAMIC=y +CONFIG_LOG=y +CONFIG_SYS_IRQ_LOG_SPURIOUS=y diff --git a/tests/kernel/sys_irq/dynamic_irq/src/irq.c b/tests/kernel/sys_irq/dynamic_irq/src/irq.c new file mode 100644 index 00000000000000..112b8239747364 --- /dev/null +++ b/tests/kernel/sys_irq/dynamic_irq/src/irq.c @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2024 Bjarki Arge Andreasen + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +#define TEST_IRQ_MAX_DELAY K_MSEC(10) + +#define INTD0_NODE DT_ALIAS(test_intd0) +#define INTD1_NODE DT_ALIAS(test_intd1) + +#define INTD0_SYS_IRQN SYS_DT_IRQN(INTD0_NODE) +#define INTD1_SYS_IRQN SYS_DT_IRQN(INTD1_NODE) + +#define INTD0_IRQ_FLAGS SYS_DT_IRQ_FLAGS(INTD0_NODE) +#define INTD1_IRQ_FLAGS SYS_DT_IRQ_FLAGS(INTD1_NODE) + +BUILD_ASSERT(INTD0_SYS_IRQN != INTD1_SYS_IRQN, "INTDs must not share INTL"); +BUILD_ASSERT(DT_NODE_HAS_STATUS(INTD0_NODE, reserved), "INTD0 must have status reserved"); +BUILD_ASSERT(DT_NODE_HAS_STATUS(INTD1_NODE, reserved), "INTD1 must have status reserved"); + +static K_SEM_DEFINE(irq0_sem, 0, 1); +static K_SEM_DEFINE(irq1_sem, 0, 1); + +static uint32_t irq0_data; +static uint32_t irq1_data; +static struct sys_irq irq0; +static struct sys_irq irq1; + +static int irq0_handler(const void *data) +{ + zassert_equal(data, &irq0_data); + k_sem_give(&irq0_sem); + return SYS_IRQ_HANDLED; +} + +static int irq1_handler(const void *data) +{ + zassert_equal(data, &irq1_data); + k_sem_give(&irq1_sem); + return SYS_IRQ_HANDLED; +} + +ZTEST(sys_irq_irq, test__enable_then_req_then_trigger__irq) +{ + zassert_ok(sys_irq_enable(INTD0_SYS_IRQN)); + zassert_ok(sys_irq_enable(INTD1_SYS_IRQN)); + zassert_ok(sys_irq_request(INTD0_SYS_IRQN, &irq0, irq0_handler, &irq0_data)); + zassert_ok(sys_irq_request(INTD1_SYS_IRQN, &irq1, irq1_handler, &irq1_data)); + zassert_ok(sys_irq_trigger(INTD0_SYS_IRQN)); + zassert_equal(k_sem_take(&irq0_sem, TEST_IRQ_MAX_DELAY), 0); + zassert_ok(sys_irq_trigger(INTD1_SYS_IRQN)); + zassert_equal(k_sem_take(&irq1_sem, TEST_IRQ_MAX_DELAY), 0); +} + +ZTEST(sys_irq_irq, test__req_then_trigger__no_irq) +{ + zassert_ok(sys_irq_request(INTD0_SYS_IRQN, &irq0, irq0_handler, &irq0_data)); + zassert_ok(sys_irq_request(INTD1_SYS_IRQN, &irq1, irq1_handler, &irq1_data)); + zassert_ok(sys_irq_trigger(INTD0_SYS_IRQN)); + zassert_equal(k_sem_take(&irq0_sem, TEST_IRQ_MAX_DELAY), -EAGAIN); + zassert_ok(sys_irq_trigger(INTD1_SYS_IRQN)); + zassert_equal(k_sem_take(&irq1_sem, TEST_IRQ_MAX_DELAY), -EAGAIN); +} + +ZTEST(sys_irq_irq, test__trigger_then_req__no_irq) +{ + zassert_ok(sys_irq_trigger(INTD0_SYS_IRQN)); + zassert_ok(sys_irq_trigger(INTD1_SYS_IRQN)); + zassert_ok(sys_irq_request(INTD0_SYS_IRQN, &irq0, irq0_handler, &irq0_data)); + zassert_equal(k_sem_take(&irq0_sem, TEST_IRQ_MAX_DELAY), -EAGAIN); + zassert_ok(sys_irq_request(INTD1_SYS_IRQN, &irq1, irq1_handler, &irq1_data)); + zassert_equal(k_sem_take(&irq1_sem, TEST_IRQ_MAX_DELAY), -EAGAIN); +} + +ZTEST(sys_irq_irq, test__trigger_then_req_then_enable__no_irq) +{ + zassert_ok(sys_irq_trigger(INTD0_SYS_IRQN)); + zassert_ok(sys_irq_trigger(INTD1_SYS_IRQN)); + zassert_ok(sys_irq_request(INTD0_SYS_IRQN, &irq0, irq0_handler, &irq0_data)); + zassert_equal(k_sem_take(&irq0_sem, TEST_IRQ_MAX_DELAY), -EAGAIN); + zassert_ok(sys_irq_request(INTD1_SYS_IRQN, &irq1, irq1_handler, &irq1_data)); + zassert_equal(k_sem_take(&irq1_sem, TEST_IRQ_MAX_DELAY), -EAGAIN); + zassert_ok(sys_irq_enable(INTD0_SYS_IRQN)); + zassert_equal(k_sem_take(&irq0_sem, TEST_IRQ_MAX_DELAY), 0); + zassert_ok(sys_irq_enable(INTD1_SYS_IRQN)); + zassert_equal(k_sem_take(&irq1_sem, TEST_IRQ_MAX_DELAY), 0); +} + +void *test_init(void) +{ + zassert_ok(sys_irq_configure(INTD0_SYS_IRQN, INTD0_IRQ_FLAGS)); + zassert_ok(sys_irq_configure(INTD1_SYS_IRQN, INTD1_IRQ_FLAGS)); + return NULL; +} + +void test_before(void *f) +{ + ARG_UNUSED(f); + + k_sem_reset(&irq0_sem); + k_sem_reset(&irq1_sem); +} + +void test_after(void *f) +{ + ARG_UNUSED(f); + + zassert(sys_irq_disable(INTD0_SYS_IRQN) > -1, "retval must be positive"); + zassert(sys_irq_disable(INTD1_SYS_IRQN) > -1, "retval must be positive"); + zassert(sys_irq_clear(INTD0_SYS_IRQN) > -1, "retval must be positive"); + zassert(sys_irq_clear(INTD1_SYS_IRQN) > -1, "retval must be positive"); + zassert_ok(sys_irq_release(INTD0_SYS_IRQN, &irq0)); + zassert_ok(sys_irq_release(INTD1_SYS_IRQN, &irq1)); +} + +ZTEST_SUITE(sys_irq_irq, NULL, test_init, test_before, test_after, NULL); diff --git a/tests/kernel/sys_irq/dynamic_irq/testcase.yaml b/tests/kernel/sys_irq/dynamic_irq/testcase.yaml new file mode 100644 index 00000000000000..2e2101a0646597 --- /dev/null +++ b/tests/kernel/sys_irq/dynamic_irq/testcase.yaml @@ -0,0 +1,4 @@ +tests: + kernel.sys_irq.dynamic_irq: + platform_allow: + - rak5010/nrf52840 diff --git a/tests/kernel/sys_irq/irq/CMakeLists.txt b/tests/kernel/sys_irq/irq/CMakeLists.txt new file mode 100644 index 00000000000000..cdab4d4559bf27 --- /dev/null +++ b/tests/kernel/sys_irq/irq/CMakeLists.txt @@ -0,0 +1,10 @@ +# Copyright (c) 2024 Bjarki Arge Andreasen +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(test_sys_irq_irq) + +target_sources(app PRIVATE + src/irq.c +) diff --git a/tests/kernel/sys_irq/irq/boards/rak5010_nrf52840.conf b/tests/kernel/sys_irq/irq/boards/rak5010_nrf52840.conf new file mode 100644 index 00000000000000..2e855a92801a71 --- /dev/null +++ b/tests/kernel/sys_irq/irq/boards/rak5010_nrf52840.conf @@ -0,0 +1,7 @@ +# Copyright (c) 2024 Nordic Semiconductor +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_GEN_ISR_TABLES=n +CONFIG_GEN_IRQ_VECTOR_TABLE=n +CONFIG_INTC=y +CONFIG_SYS_IRQ=y diff --git a/tests/kernel/sys_irq/irq/boards/rak5010_nrf52840.overlay b/tests/kernel/sys_irq/irq/boards/rak5010_nrf52840.overlay new file mode 100644 index 00000000000000..bebaef84142b9a --- /dev/null +++ b/tests/kernel/sys_irq/irq/boards/rak5010_nrf52840.overlay @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2024 Nordic Semiconductor + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + aliases { + test-intd0 = &spi1; + test-intd1 = &spi2; + }; +}; + +&spi1 { + status = "reserved"; +}; + +&spi2 { + status = "reserved"; +}; + +&rtc1 { + status = "reserved"; +}; + +&nvic { + interrupt-lines = <65>; +}; + +/* Console routed to IO1 and IO2 */ +&pinctrl { + uart1_default: uart1_default { + group1 { + psels = , + ; + }; + }; + + uart1_sleep: uart1_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/tests/kernel/sys_irq/irq/prj.conf b/tests/kernel/sys_irq/irq/prj.conf new file mode 100644 index 00000000000000..f3baedd3f4d6dc --- /dev/null +++ b/tests/kernel/sys_irq/irq/prj.conf @@ -0,0 +1,9 @@ +# Copyright (c) 2024 Bjarki Arge Andreasen +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_ZTEST=y +CONFIG_ZTEST_FAIL_FAST=y +CONFIG_INTC=y +CONFIG_SYS_IRQ=y +CONFIG_LOG=y +CONFIG_SYS_IRQ_LOG_SPURIOUS=y diff --git a/tests/kernel/sys_irq/irq/src/irq.c b/tests/kernel/sys_irq/irq/src/irq.c new file mode 100644 index 00000000000000..209937744ab8b3 --- /dev/null +++ b/tests/kernel/sys_irq/irq/src/irq.c @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2024 Bjarki Arge Andreasen + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +#define TEST_IRQ_MAX_DELAY K_MSEC(10) + +#define INTD0_NODE DT_ALIAS(test_intd0) +#define INTD1_NODE DT_ALIAS(test_intd1) + +#define INTD0_SYS_IRQN SYS_DT_IRQN(INTD0_NODE) +#define INTD1_SYS_IRQN SYS_DT_IRQN(INTD1_NODE) + +#define INTD0_IRQ_FLAGS SYS_DT_IRQ_FLAGS(INTD0_NODE) +#define INTD1_IRQ_FLAGS SYS_DT_IRQ_FLAGS(INTD1_NODE) + +BUILD_ASSERT(INTD0_SYS_IRQN != INTD1_SYS_IRQN, "INTDs must not share INTL"); +BUILD_ASSERT(DT_NODE_HAS_STATUS(INTD0_NODE, reserved), "INTD0 must have status reserved"); +BUILD_ASSERT(DT_NODE_HAS_STATUS(INTD1_NODE, reserved), "INTD1 must have status reserved"); + +static K_SEM_DEFINE(irq0_sem, 0, 1); +static K_SEM_DEFINE(irq1_sem, 0, 1); + +static uint32_t irq0_data; +static uint32_t irq1_data; + +static int irq0_handler(const void *data) +{ + zassert_equal(data, &irq0_data); + k_sem_give(&irq0_sem); + return SYS_IRQ_HANDLED; +} + +static int irq1_handler(const void *data) +{ + zassert_equal(data, &irq1_data); + k_sem_give(&irq1_sem); + return SYS_IRQ_HANDLED; +} + +SYS_DT_DEFINE_IRQ_HANDLER(INTD0_NODE, irq0_handler, &irq0_data); +SYS_DT_DEFINE_IRQ_HANDLER(INTD1_NODE, irq1_handler, &irq1_data); + +ZTEST(sys_irq_irq, test__trigger_irq_while_disabled__no_irq) +{ + zassert_ok(sys_irq_trigger(INTD0_SYS_IRQN)); + zassert_equal(k_sem_take(&irq0_sem, TEST_IRQ_MAX_DELAY), -EAGAIN); + zassert_ok(sys_irq_trigger(INTD1_SYS_IRQN)); + zassert_equal(k_sem_take(&irq1_sem, TEST_IRQ_MAX_DELAY), -EAGAIN); +} + +ZTEST(sys_irq_irq, test__trigger_irq_while_enabled__irq) +{ + zassert_ok(sys_irq_enable(INTD0_SYS_IRQN)); + zassert_equal(k_sem_take(&irq0_sem, TEST_IRQ_MAX_DELAY), -EAGAIN); + zassert_ok(sys_irq_enable(INTD1_SYS_IRQN)); + zassert_equal(k_sem_take(&irq1_sem, TEST_IRQ_MAX_DELAY), -EAGAIN); + zassert_ok(sys_irq_trigger(INTD0_SYS_IRQN)); + zassert_equal(k_sem_take(&irq0_sem, TEST_IRQ_MAX_DELAY), 0); + zassert_ok(sys_irq_trigger(INTD1_SYS_IRQN)); + zassert_equal(k_sem_take(&irq1_sem, TEST_IRQ_MAX_DELAY), 0); +} + +ZTEST(sys_irq_irq, test__disable_disabled_irq__retval_0) +{ + zassert_equal(sys_irq_disable(INTD0_SYS_IRQN), 0); + zassert_equal(sys_irq_disable(INTD1_SYS_IRQN), 0); +} + +ZTEST(sys_irq_irq, test__disable_enabled_irq__retval_1) +{ + zassert_ok(sys_irq_enable(INTD0_SYS_IRQN)); + zassert_ok(sys_irq_enable(INTD1_SYS_IRQN)); + zassert_equal(sys_irq_disable(INTD0_SYS_IRQN), 1); + zassert_equal(sys_irq_disable(INTD1_SYS_IRQN), 1); +} + +ZTEST(sys_irq_irq, test__clear_cleared_irq__retval_0) +{ + zassert_equal(sys_irq_clear(INTD0_SYS_IRQN), 0); + zassert_equal(sys_irq_clear(INTD1_SYS_IRQN), 0); +} + +ZTEST(sys_irq_irq, test__clear_triggered_irq__retval_1) +{ + zassert_ok(sys_irq_trigger(INTD0_SYS_IRQN)); + zassert_ok(sys_irq_trigger(INTD1_SYS_IRQN)); + zassert_equal(sys_irq_clear(INTD0_SYS_IRQN), 1); + zassert_equal(sys_irq_clear(INTD1_SYS_IRQN), 1); +} + +void *test_init(void) +{ + zassert_ok(sys_irq_configure(INTD0_SYS_IRQN, INTD0_IRQ_FLAGS)); + zassert_equal(k_sem_take(&irq0_sem, TEST_IRQ_MAX_DELAY), -EAGAIN); + zassert_ok(sys_irq_configure(INTD1_SYS_IRQN, INTD1_IRQ_FLAGS)); + zassert_equal(k_sem_take(&irq1_sem, TEST_IRQ_MAX_DELAY), -EAGAIN); + zassert_ok(sys_irq_trigger(INTD0_SYS_IRQN)); + zassert_equal(k_sem_take(&irq0_sem, TEST_IRQ_MAX_DELAY), -EAGAIN); + zassert_ok(sys_irq_trigger(INTD1_SYS_IRQN)); + zassert_equal(k_sem_take(&irq1_sem, TEST_IRQ_MAX_DELAY), -EAGAIN); + return NULL; +} + +void test_before(void *f) +{ + ARG_UNUSED(f); + + zassert(sys_irq_disable(INTD0_SYS_IRQN) > -1, "retval must be positive"); + zassert(sys_irq_disable(INTD1_SYS_IRQN) > -1, "retval must be positive"); + zassert(sys_irq_clear(INTD0_SYS_IRQN) > -1, "retval must be positive"); + zassert(sys_irq_clear(INTD1_SYS_IRQN) > -1, "retval must be positive"); + k_sem_reset(&irq0_sem); + k_sem_reset(&irq1_sem); +} + +ZTEST_SUITE(sys_irq_irq, NULL, test_init, test_before, NULL, NULL); diff --git a/tests/kernel/sys_irq/irq/testcase.yaml b/tests/kernel/sys_irq/irq/testcase.yaml new file mode 100644 index 00000000000000..139be9204cd696 --- /dev/null +++ b/tests/kernel/sys_irq/irq/testcase.yaml @@ -0,0 +1,4 @@ +tests: + kernel.sys_irq.irq: + platform_allow: + - rak5010/nrf52840 diff --git a/tests/kernel/sys_irq/shared_irq/CMakeLists.txt b/tests/kernel/sys_irq/shared_irq/CMakeLists.txt new file mode 100644 index 00000000000000..b6655d2b03df68 --- /dev/null +++ b/tests/kernel/sys_irq/shared_irq/CMakeLists.txt @@ -0,0 +1,10 @@ +# Copyright (c) 2024 Bjarki Arge Andreasen +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(test_sys_irq_shared_irq) + +target_sources(app PRIVATE + src/irq.c +) diff --git a/tests/kernel/sys_irq/shared_irq/boards/rak5010_nrf52840.conf b/tests/kernel/sys_irq/shared_irq/boards/rak5010_nrf52840.conf new file mode 100644 index 00000000000000..6673d339808110 --- /dev/null +++ b/tests/kernel/sys_irq/shared_irq/boards/rak5010_nrf52840.conf @@ -0,0 +1,9 @@ +# Copyright (c) 2024 Nordic Semiconductor +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_GEN_ISR_TABLES=n +CONFIG_GEN_IRQ_VECTOR_TABLE=n +CONFIG_INTC=y +CONFIG_SYS_IRQ=y +CONFIG_SYS_IRQ_LOG_SPURIOUS=y +CONFIG_LOG=y diff --git a/tests/kernel/sys_irq/shared_irq/boards/rak5010_nrf52840.overlay b/tests/kernel/sys_irq/shared_irq/boards/rak5010_nrf52840.overlay new file mode 100644 index 00000000000000..394f09ad301c05 --- /dev/null +++ b/tests/kernel/sys_irq/shared_irq/boards/rak5010_nrf52840.overlay @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2024 Nordic Semiconductor + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/ { + aliases { + test-shared-intd0 = &spi1; + test-shared-intd1 = &i2c1; + }; +}; + +&spi1 { + status = "reserved"; +}; + +&i2c1 { + status = "reserved"; +}; + +&rtc1 { + status = "reserved"; +}; + +&nvic { + interrupt-lines = <65>; +}; + +/* Console routed to IO1 and IO2 */ +&pinctrl { + uart1_default: uart1_default { + group1 { + psels = , + ; + }; + }; + + uart1_sleep: uart1_sleep { + group1 { + psels = , + ; + low-power-enable; + }; + }; +}; diff --git a/tests/kernel/sys_irq/shared_irq/prj.conf b/tests/kernel/sys_irq/shared_irq/prj.conf new file mode 100644 index 00000000000000..455b23108189ce --- /dev/null +++ b/tests/kernel/sys_irq/shared_irq/prj.conf @@ -0,0 +1,10 @@ +# Copyright (c) 2024 Bjarki Arge Andreasen +# SPDX-License-Identifier: Apache-2.0 + +CONFIG_ZTEST=y +CONFIG_INTC=y +CONFIG_GEN_ISR_TABLES=n +CONFIG_GEN_IRQ_VECTOR_TABLE=n +CONFIG_SYS_IRQ=y +CONFIG_LOG=y +CONFIG_SYS_IRQ_LOG_SPURIOUS=y diff --git a/tests/kernel/sys_irq/shared_irq/src/irq.c b/tests/kernel/sys_irq/shared_irq/src/irq.c new file mode 100644 index 00000000000000..a5d20dccc839c2 --- /dev/null +++ b/tests/kernel/sys_irq/shared_irq/src/irq.c @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2024 Bjarki Arge Andreasen + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +#define TEST_IRQ_MAX_DELAY K_MSEC(10) + +#define INTD0_NODE DT_ALIAS(test_shared_intd0) +#define INTD1_NODE DT_ALIAS(test_shared_intd1) + +#define INTD0_SYS_IRQN SYS_DT_IRQN(INTD0_NODE) +#define INTD1_SYS_IRQN SYS_DT_IRQN(INTD1_NODE) + +#define INTD0_IRQ_FLAGS SYS_DT_IRQ_FLAGS(INTD0_NODE) +#define INTD1_IRQ_FLAGS SYS_DT_IRQ_FLAGS(INTD1_NODE) + +BUILD_ASSERT(INTD0_SYS_IRQN == INTD1_SYS_IRQN, "INTDs must share INTL"); +BUILD_ASSERT(INTD0_IRQ_FLAGS == INTD1_IRQ_FLAGS, "INTDs must share configuration flags"); +BUILD_ASSERT(DT_NODE_HAS_STATUS(INTD0_NODE, reserved), "INTD0 must have status reserved"); +BUILD_ASSERT(DT_NODE_HAS_STATUS(INTD1_NODE, reserved), "INTD1 must have status reserved"); + +static K_SEM_DEFINE(irq0_sem, 0, 1); +static K_SEM_DEFINE(irq1_sem, 0, 1); + +static uint32_t irq0_data; +static uint32_t irq1_data; + +static int irq0_handler(const void *data) +{ + zassert_equal(data, &irq0_data); + k_sem_give(&irq0_sem); + return *((const uint32_t *)data); +} + +static int irq1_handler(const void *data) +{ + zassert_equal(data, &irq1_data); + k_sem_give(&irq1_sem); + return *((const uint32_t *)data); +} + +SYS_DT_DEFINE_IRQ_HANDLER(INTD0_NODE, irq0_handler, &irq0_data); +SYS_DT_DEFINE_IRQ_HANDLER(INTD1_NODE, irq1_handler, &irq1_data); + +ZTEST(sys_irq_shared_irq, test__trigger_irq_intd0_origin__intd0_handles_irq) +{ + irq0_data = SYS_IRQ_HANDLED; + zassert_ok(sys_irq_enable(INTD0_SYS_IRQN)); + zassert_ok(sys_irq_trigger(INTD0_SYS_IRQN)); + zassert_equal(k_sem_take(&irq0_sem, TEST_IRQ_MAX_DELAY), 0); +} + +ZTEST(sys_irq_shared_irq, test__trigger_irq_intd1_origin__intd1_handles_irq) +{ + irq1_data = SYS_IRQ_HANDLED; + zassert_ok(sys_irq_enable(INTD0_SYS_IRQN)); + zassert_ok(sys_irq_trigger(INTD0_SYS_IRQN)); + zassert_equal(k_sem_take(&irq1_sem, TEST_IRQ_MAX_DELAY), 0); +} + +void *test_init(void) +{ + zassert_ok(sys_irq_configure(INTD0_SYS_IRQN, INTD0_IRQ_FLAGS)); + zassert_equal(k_sem_take(&irq0_sem, TEST_IRQ_MAX_DELAY), -EAGAIN); + return NULL; +} + +void test_before(void *f) +{ + ARG_UNUSED(f); + + zassert(sys_irq_disable(INTD0_SYS_IRQN) > -1, "retval must be positive"); + zassert(sys_irq_disable(INTD1_SYS_IRQN) > -1, "retval must be positive"); + zassert(sys_irq_clear(INTD0_SYS_IRQN) > -1, "retval must be positive"); + zassert(sys_irq_clear(INTD1_SYS_IRQN) > -1, "retval must be positive"); + k_sem_reset(&irq0_sem); + k_sem_reset(&irq1_sem); + irq0_data = SYS_IRQ_NONE; + irq1_data = SYS_IRQ_NONE; +} + +ZTEST_SUITE(sys_irq_shared_irq, NULL, test_init, test_before, NULL, NULL); diff --git a/tests/kernel/sys_irq/shared_irq/testcase.yaml b/tests/kernel/sys_irq/shared_irq/testcase.yaml new file mode 100644 index 00000000000000..90dc76eac6acd9 --- /dev/null +++ b/tests/kernel/sys_irq/shared_irq/testcase.yaml @@ -0,0 +1,4 @@ +tests: + kernel.sys_irq.shared_irq: + platform_allow: + - rak5010/nrf52840