Skip to content

Commit

Permalink
tests: benchmarks: multicore: Add PM tests with FLPR core
Browse files Browse the repository at this point in the history
Add test that confirms Power Management on FLPR core.

Signed-off-by: Sebastian Głąb <[email protected]>
  • Loading branch information
nordic-segl committed Jan 14, 2025
1 parent c361c8a commit 3407756
Show file tree
Hide file tree
Showing 18 changed files with 348 additions and 97 deletions.
19 changes: 19 additions & 0 deletions tests/benchmarks/multicore/idle_flpr/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#
# Copyright (c) 2025 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#

cmake_minimum_required(VERSION 3.20.0)

find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})

if(NOT SYSBUILD)
message(FATAL_ERROR
" This is a multi-image application that should be built using sysbuild.\n"
" Add --sysbuild argument to west build command to prepare all the images.")
endif()

project(idle_flpr)

target_sources(app PRIVATE src/main.c)
15 changes: 15 additions & 0 deletions tests/benchmarks/multicore/idle_flpr/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#
# Copyright (c) 2025 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#

config TEST_SLEEP_DURATION_MS
int "Core sleep duration (miliseconds)"
default 1000
help
Set sleep duration to TEST_SLEEP_DURATION_MS miliseconds.
Based on the value of 'min-residency-us' specified for each power state defined in the DTS,
core enters the lowest possible power state.

source "Kconfig.zephyr"
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/*
* Copyright (c) 2025 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/

&cpuflpr_vpr {
status = "okay";
};

&uart120 {
status = "reserved";
interrupt-parent = <&cpuflpr_clic>;
};

/ {
aliases {
/delete-property/ led1;
};
};

/delete-node/ &led1;

&gpiote130 {
status = "okay";
owned-channels = <0>;
};
8 changes: 8 additions & 0 deletions tests/benchmarks/multicore/idle_flpr/prj.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
CONFIG_BOOT_BANNER=n
CONFIG_NCS_BOOT_BANNER=n

CONFIG_LOG=y
CONFIG_ASSERT=y
CONFIG_GPIO=y

CONFIG_NRF_REGTOOL_VERBOSITY=1
18 changes: 18 additions & 0 deletions tests/benchmarks/multicore/idle_flpr/prj_s2ram.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
CONFIG_PM=y
CONFIG_PM_S2RAM=y
CONFIG_PM_S2RAM_CUSTOM_MARKING=y
CONFIG_POWEROFF=y

CONFIG_PM_DEVICE=y
CONFIG_PM_DEVICE_RUNTIME=y

CONFIG_BOOT_BANNER=n
CONFIG_NCS_BOOT_BANNER=n
CONFIG_PRINTK=n
CONFIG_LOG=n
CONFIG_CONSOLE=n
CONFIG_UART_CONSOLE=n
CONFIG_SERIAL=n

CONFIG_ASSERT=y
CONFIG_GPIO=y
17 changes: 17 additions & 0 deletions tests/benchmarks/multicore/idle_flpr/remote/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#
# Copyright (c) 2025 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#

cmake_minimum_required(VERSION 3.20.0)

find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(remote)

target_sources(app PRIVATE src/main.c)

if((DEFINED CONFIG_SOC_NRF54H20_CPUFLPR) OR (DEFINED CONFIG_SOC_NRF54H20_ENGB_CPUFLPR))
message(STATUS "Power Mode handler for RISC V is included.")
target_sources(app PRIVATE ../../common/power_off.c)
endif()
21 changes: 21 additions & 0 deletions tests/benchmarks/multicore/idle_flpr/remote/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#
# Copyright (c) 2025 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#

config TEST_SLEEP_DURATION_MS
int "Core sleep duration (miliseconds)"
default 1000
help
Set sleep duration to TEST_SLEEP_DURATION_MS miliseconds.
Based on the value of 'min-residency-us' specified for each power state defined in the DTS,
core enters the lowest possible power state.

config APP_PROVIDE_PM_HOOKS
bool "Application provides PM hooks"
default y
select HAS_PM
select HAS_POWEROFF

source "Kconfig.zephyr"
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*
* Copyright (c) 2025 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/

/ {
cpus {
power-states {
wait: wait {
compatible = "zephyr,power-state";
power-state-name = "standby";
substate-id = <0>;
min-residency-us = <20000>;
};

hibernate: hibernate {
compatible = "zephyr,power-state";
power-state-name = "suspend-to-ram";
substate-id = <0>;
min-residency-us = <400000>;
};
};
};
};

&cpu {
cpu-power-states = <&wait &hibernate>;
};
11 changes: 11 additions & 0 deletions tests/benchmarks/multicore/idle_flpr/remote/prj.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
CONFIG_LOG=y
CONFIG_CONSOLE=n
CONFIG_UART_CONSOLE=n
CONFIG_SERIAL=n
CONFIG_BOOT_BANNER=n
CONFIG_NCS_BOOT_BANNER=n
CONFIG_PRINTK=n

CONFIG_ASSERT=y

CONFIG_NRF_REGTOOL_VERBOSITY=1
13 changes: 13 additions & 0 deletions tests/benchmarks/multicore/idle_flpr/remote/prj_s2ram.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
CONFIG_PM=y
CONFIG_POWEROFF=y

CONFIG_PM_DEVICE=y
CONFIG_PM_DEVICE_RUNTIME=y

CONFIG_CONSOLE=n
CONFIG_UART_CONSOLE=n
CONFIG_SERIAL=n
CONFIG_BOOT_BANNER=n
CONFIG_NCS_BOOT_BANNER=n

CONFIG_ASSERT=y
17 changes: 17 additions & 0 deletions tests/benchmarks/multicore/idle_flpr/remote/src/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
/*
* Copyright (c) 2025 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/
#include <zephyr/kernel.h>

#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(idle_flpr, LOG_LEVEL_INF);

int main(void)
{
LOG_INF("Multicore idle_flpr test on %s", CONFIG_BOARD_TARGET);
LOG_INF("Main sleeps for %d ms", CONFIG_TEST_SLEEP_DURATION_MS);

return 0;
}
80 changes: 80 additions & 0 deletions tests/benchmarks/multicore/idle_flpr/src/main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
/*
* Copyright (c) 2025 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
*/
#include <zephyr/kernel.h>
#include <zephyr/drivers/gpio.h>

#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(idle_flpr, LOG_LEVEL_INF);

static const struct gpio_dt_spec led = GPIO_DT_SPEC_GET(DT_ALIAS(led0), gpios);

/* Variables used to make CPU active for ~1 second */
static struct k_timer my_timer;
static bool timer_expired;

void my_timer_handler(struct k_timer *dummy)
{
timer_expired = true;
}

int main(void)
{
int counter = 0;
int ret;

LOG_INF("Multicore idle_flpr test on %s", CONFIG_BOARD_TARGET);
LOG_INF("Main sleeps for %d ms", CONFIG_TEST_SLEEP_DURATION_MS);

ret = gpio_is_ready_dt(&led);
if (!ret) {
LOG_ERR("LED is not ready");
}
__ASSERT(ret, "LED is not ready\n");

ret = gpio_pin_configure_dt(&led, GPIO_OUTPUT_ACTIVE);
if (ret < 0) {
LOG_ERR("Unable to configure GPIO as output");
}
__ASSERT(ret == 0, "Unable to configure GPIO as output\n");

k_timer_init(&my_timer, my_timer_handler, NULL);

/* Run test forever */
while (1) {
timer_expired = false;

/* start a one-shot timer that expires after 1 second */
k_timer_start(&my_timer, K_MSEC(1000), K_NO_WAIT);

/* Turn ON LED */
ret = gpio_pin_set_dt(&led, 1);
if (ret < 0) {
LOG_ERR("Unable to turn on LED");
}
__ASSERT(ret == 0, "Unable to turn on LED\n");

/* Keep CPU active for ~ 1 second */
while (!timer_expired) {
k_busy_wait(10000);
k_yield();
}

/* Turn OFF LED */
ret = gpio_pin_set_dt(&led, 0);
if (ret < 0) {
LOG_ERR("Unable to turn off LED");
}
__ASSERT(ret == 0, "Unable to turn off LED\n");

LOG_INF("Run %d", counter);
counter++;

/* Sleep / enter low power state */
k_msleep(CONFIG_TEST_SLEEP_DURATION_MS);
}

return 0;
}
20 changes: 20 additions & 0 deletions tests/benchmarks/multicore/idle_flpr/sysbuild.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#
# Copyright (c) 2025 Nordic Semiconductor ASA
#
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
#

# Add remote project
ExternalZephyrProject_Add(
APPLICATION remote_rad
SOURCE_DIR ${SYSBUILD_NRF_MODULE_DIR}/tests/benchmarks/power_consumption/common/remote_sleep_forever
BOARD ${SB_CONFIG_BOARD}/${SB_CONFIG_SOC}/cpurad
BOARD_REVISION ${BOARD_REVISION}
)

ExternalZephyrProject_Add(
APPLICATION remote_flpr
SOURCE_DIR ${APP_DIR}/remote
BOARD ${SB_CONFIG_BOARD}/${SB_CONFIG_SOC}/cpuflpr
BOARD_REVISION ${BOARD_REVISION}
)
50 changes: 50 additions & 0 deletions tests/benchmarks/multicore/idle_flpr/testcase.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
common:
sysbuild: true
tags:
- ci_build
- ci_tests_benchmarks_multicore
platform_allow:
- nrf54h20dk/nrf54h20/cpuapp
integration_platforms:
- nrf54h20dk/nrf54h20/cpuapp

tests:
benchmarks.multicore.idle_flpr.no_sleep:
required_snippets:
- nordic-log-stm
harness: console
harness_config:
type: multi_line
ordered: true
regex:
- "app/idle_flpr: Multicore idle_flpr test on"
- "flpr/idle_flpr: Multicore idle_flpr test on"
- "idle_flpr: Run 0"
- "idle_flpr: Run 1"

benchmarks.multicore.idle_flpr.idle:
tags: ppk_power_measure
extra_args:
- idle_flpr_CONF_FILE=prj_s2ram.conf
- remote_rad_CONF_FILE=prj_s2ram.conf
- remote_flpr_CONF_FILE=prj_s2ram.conf
- idle_flpr_CONFIG_TEST_SLEEP_DURATION_MS=500
- remote_rad_CONFIG_TEST_SLEEP_DURATION_MS=500
- remote_flpr_CONFIG_TEST_SLEEP_DURATION_MS=500
harness: pytest
harness_config:
fixture: ppk_power_measure
pytest_root:
- "${CUSTOM_ROOT_TEST_DIR}/test_measure_power_consumption.py::test_measure_and_data_dump_ppr_and_idle"

benchmarks.multicore.idle_flpr.s2ram:
tags: ppk_power_measure
extra_args:
- idle_flpr_CONF_FILE=prj_s2ram.conf
- remote_rad_CONF_FILE=prj_s2ram.conf
- remote_flpr_CONF_FILE=prj_s2ram.conf
harness: pytest
harness_config:
fixture: ppk_power_measure
pytest_root:
- "${CUSTOM_ROOT_TEST_DIR}/test_measure_power_consumption.py::test_measure_and_data_dump_ppr_and_s2ram"
4 changes: 2 additions & 2 deletions tests/benchmarks/multicore/idle_ppr/remote/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ project(remote)

target_sources(app PRIVATE ../src/main.c)

if(DEFINED CONFIG_SOC_NRF54H20_CPUPPR)
if((DEFINED CONFIG_SOC_NRF54H20_CPUPPR) OR (DEFINED CONFIG_SOC_NRF54H20_ENGB_CPUPPR))
message(STATUS "Power Mode handler for RISC V is included.")
target_sources(app PRIVATE ../src/power_off.c)
target_sources(app PRIVATE ../../common/power_off.c)
endif()
2 changes: 1 addition & 1 deletion tests/benchmarks/multicore/idle_stm/remote/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,5 @@ target_sources(app PRIVATE ../src/main.c)

if((DEFINED CONFIG_SOC_NRF54H20_CPUPPR) OR (DEFINED CONFIG_SOC_NRF54H20_ENGB_CPUPPR))
message(STATUS "Power Mode handler for RISC V is included.")
target_sources(app PRIVATE ../src/power_off.c)
target_sources(app PRIVATE ../../common/power_off.c)
endif()
Loading

0 comments on commit 3407756

Please sign in to comment.