From b3178a1149015dc382ef626107904bcc232659c4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Krzysztof=20Chru=C5=9Bci=C5=84ski?=
 <krzysztof.chruscinski@nordicsemi.no>
Date: Fri, 21 Mar 2025 13:10:03 +0100
Subject: [PATCH 1/4] debug: cpu_load: Add NRF_ prefix to CPU load module
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Zephyr is getting generic CPU load module and it is using
same Kconfig name. NCS CPU load module is Nordic specific
because it is using POWER SLEEPENTER,SLEEPEXIT events to track
idle state and CPU load. It is also not support on all targets
(nrf54h20, nRF54L Series).

Signed-off-by: Krzysztof Chruściński <krzysztof.chruscinski@nordicsemi.no>
---
 applications/nrf_desktop/doc/cpu_meas.rst     |  3 +-
 .../nrf_desktop/src/modules/Kconfig.cpu_meas  |  2 +-
 .../nrf_desktop/src/modules/cpu_meas.c        |  2 +-
 doc/nrf/libraries/debug/cpu_load.rst          |  2 +-
 .../Kconfig.trace_print_stats                 |  2 +-
 samples/cellular/modem_trace_backend/prj.conf |  2 +-
 subsys/debug/CMakeLists.txt                   |  2 +-
 subsys/debug/cpu_load/Kconfig                 | 54 ++++++++++---------
 subsys/debug/cpu_load/cpu_load.c              | 24 ++++-----
 tests/subsys/debug/cpu_load/prj.conf          |  4 +-
 .../subsys/debug/cpu_load/src/test_cpu_load.c |  2 +-
 tests/subsys/debug/cpu_load/testcase.yaml     |  2 +-
 12 files changed, 52 insertions(+), 49 deletions(-)

diff --git a/applications/nrf_desktop/doc/cpu_meas.rst b/applications/nrf_desktop/doc/cpu_meas.rst
index 3ba355eb5a03..6d9a3aef3e95 100644
--- a/applications/nrf_desktop/doc/cpu_meas.rst
+++ b/applications/nrf_desktop/doc/cpu_meas.rst
@@ -23,8 +23,7 @@ Configuration
 *************
 
 To enable this module, use the :ref:`CONFIG_DESKTOP_CPU_MEAS_ENABLE <config_desktop_app_options>` Kconfig option.
-This option selects the :kconfig:option:`CONFIG_CPU_LOAD` option.
-The :kconfig:option:`CONFIG_CPU_LOAD` option enables the :ref:`cpu_load` library that is used to perform the measurements.
+This option selects the :kconfig:option:`CONFIG_NRF_CPU_LOAD` option, which enables the :ref:`cpu_load` library that is used to perform the measurements.
 
 Set the time between subsequent CPU load measurements, in milliseconds, using the :ref:`CONFIG_DESKTOP_CPU_MEAS_PERIOD <config_desktop_app_options>` option.
 
diff --git a/applications/nrf_desktop/src/modules/Kconfig.cpu_meas b/applications/nrf_desktop/src/modules/Kconfig.cpu_meas
index 69543343b378..24f544ef937b 100644
--- a/applications/nrf_desktop/src/modules/Kconfig.cpu_meas
+++ b/applications/nrf_desktop/src/modules/Kconfig.cpu_meas
@@ -8,7 +8,7 @@ menu "CPU load measurement"
 
 config DESKTOP_CPU_MEAS_ENABLE
 	bool "Enable measuring CPU load"
-	select CPU_LOAD
+	select NRF_CPU_LOAD
 	help
 	  The CPU load is sent periodically using dedicated application event.
 
diff --git a/applications/nrf_desktop/src/modules/cpu_meas.c b/applications/nrf_desktop/src/modules/cpu_meas.c
index 942d95769879..422a79021291 100644
--- a/applications/nrf_desktop/src/modules/cpu_meas.c
+++ b/applications/nrf_desktop/src/modules/cpu_meas.c
@@ -40,7 +40,7 @@ static void init(void)
 	/* When this option is enabled, CPU load measurement is periodically
 	 * resetted. Only cpu_meas module should reset the measurement.
 	 */
-	BUILD_ASSERT(!IS_ENABLED(CONFIG_CPU_LOAD_LOG_PERIODIC));
+	BUILD_ASSERT(!IS_ENABLED(CONFIG_NRF_CPU_LOAD_LOG_PERIODIC));
 
 	static bool initialized;
 
diff --git a/doc/nrf/libraries/debug/cpu_load.rst b/doc/nrf/libraries/debug/cpu_load.rst
index 69c55602f55d..ccdb0f7484f1 100644
--- a/doc/nrf/libraries/debug/cpu_load.rst
+++ b/doc/nrf/libraries/debug/cpu_load.rst
@@ -17,7 +17,7 @@ To precisely measure the sleep period, the module requires the POWER peripheral
 The events are connected to a TIMER peripheral using PPI/DPPI.
 
 The sleep period is measured using the TIMER peripheral, which is clocked by default by the high frequency clock.
-Alternatively, it can be clocked using low frequency clock (see :kconfig:option:`CONFIG_CPU_LOAD_ALIGNED_CLOCKS`).
+Alternatively, it can be clocked using low frequency clock (see :kconfig:option:`CONFIG_NRF_CPU_LOAD_ALIGNED_CLOCKS`).
 It is then compared against the system clock, which is clocked by the low frequency clock.
 The accuracy of measurements depends on the accuracy of the given clock sources.
 
diff --git a/samples/cellular/modem_trace_backend/Kconfig.trace_print_stats b/samples/cellular/modem_trace_backend/Kconfig.trace_print_stats
index 2d2c7ccf3caf..dd666b4e43a0 100644
--- a/samples/cellular/modem_trace_backend/Kconfig.trace_print_stats
+++ b/samples/cellular/modem_trace_backend/Kconfig.trace_print_stats
@@ -11,7 +11,7 @@ choice NRF_MODEM_LIB_TRACE_BACKEND
 
 config NRF_MODEM_LIB_TRACE_BACKEND_CUSTOM
 	bool "Count modem traces and print to terminal"
-	depends on CPU_LOAD
+	depends on NRF_CPU_LOAD
 	depends on FPU
 	depends on NEWLIB_LIBC_FLOAT_PRINTF || PICOLIBC_IO_FLOAT
 	help
diff --git a/samples/cellular/modem_trace_backend/prj.conf b/samples/cellular/modem_trace_backend/prj.conf
index 0ee36afed65d..cc324d6d20fa 100644
--- a/samples/cellular/modem_trace_backend/prj.conf
+++ b/samples/cellular/modem_trace_backend/prj.conf
@@ -17,6 +17,6 @@ CONFIG_NRF_MODEM_LIB_TRACE=y
 CONFIG_NRF_MODEM_LIB_TRACE_BACKEND_CUSTOM=y
 CONFIG_CUSTOM_BACKEND_PRINT_PERIOD_MSEC=500
 
-CONFIG_CPU_LOAD=y
+CONFIG_NRF_CPU_LOAD=y
 CONFIG_FPU=y
 CONFIG_PICOLIBC_IO_FLOAT=y
diff --git a/subsys/debug/CMakeLists.txt b/subsys/debug/CMakeLists.txt
index dd1468146d38..63ab545b9762 100644
--- a/subsys/debug/CMakeLists.txt
+++ b/subsys/debug/CMakeLists.txt
@@ -4,6 +4,6 @@
 # SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
 #
 
-add_subdirectory_ifdef(CONFIG_CPU_LOAD		cpu_load)
+add_subdirectory_ifdef(CONFIG_NRF_CPU_LOAD	cpu_load)
 add_subdirectory_ifdef(CONFIG_ETB_TRACE		etb_trace)
 add_subdirectory_ifdef(CONFIG_PPI_TRACE		ppi_trace)
diff --git a/subsys/debug/cpu_load/Kconfig b/subsys/debug/cpu_load/Kconfig
index 9b6250be6b0a..14e004cd71d7 100644
--- a/subsys/debug/cpu_load/Kconfig
+++ b/subsys/debug/cpu_load/Kconfig
@@ -4,41 +4,45 @@
 # SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
 #
 
-menuconfig CPU_LOAD
+menuconfig NRF_CPU_LOAD
 	bool "Enable CPU load measurement"
-	select NRFX_PPI if HAS_HW_NRF_PPI
-	select NRFX_DPPI if HAS_HW_NRF_DPPIC
+	select NRFX_GPPI
+	#select NRFX_PPI if HAS_HW_NRF_PPI
+	#select NRFX_DPPI if HAS_HW_NRF_DPPIC
 	depends on !SOC_SERIES_NRF51X #Lack of required HW events
+	depends on !SOC_SERIES_NRF54HX #Lack of required HW events
+	depends on !RISCV #Lack of required HW events
 	help
 	  Enable the CPU load measurement instrumentation. This tool is using
-	  one TIMER peripheral and PPI to perform accurate CPU load measurement.
+	  POWER peripheral events with one TIMER peripheral and PPI to perform
+	  accurate CPU load measurement.
 
-if CPU_LOAD
+if NRF_CPU_LOAD
 
-module = CPU_LOAD
+module = NRF_CPU_LOAD
 module-str = CPU load measurement
 source "${ZEPHYR_BASE}/subsys/logging/Kconfig.template.log_config"
 
-config CPU_LOAD_CMDS
+config NRF_CPU_LOAD_CMDS
 	bool "Enable shell commands"
 	depends on SHELL
 	default y
 
 if LOG
 
-config CPU_LOAD_LOG_PERIODIC
+config NRF_CPU_LOAD_LOG_PERIODIC
 	bool "Periodically log current CPU load"
 	help
 	  INFO level must be enabled to get the log.
 
-config CPU_LOAD_LOG_INTERVAL
+config NRF_CPU_LOAD_LOG_INTERVAL
 	int "Logging interval for CPU load [ms]"
-	depends on CPU_LOAD_LOG_PERIODIC
+	depends on NRF_CPU_LOAD_LOG_PERIODIC
 	default 2000
 
 endif # LOG
 
-config CPU_LOAD_ALIGNED_CLOCKS
+config NRF_CPU_LOAD_ALIGNED_CLOCKS
 	bool "Enable aligned clock sources"
 	help
 	  After enabling this option, the sleep period measurement
@@ -50,7 +54,7 @@ config CPU_LOAD_ALIGNED_CLOCKS
 	  Enabling this option allows going to low power idle mode
 	  because the high frequency clock is not used by this module.
 
-config CPU_LOAD_USE_SHARED_DPPI_CHANNELS
+config NRF_CPU_LOAD_USE_SHARED_DPPI_CHANNELS
 	bool "Use shared DPPI channels"
 	depends on HAS_HW_NRF_DPPIC
 	help
@@ -64,37 +68,37 @@ config CPU_LOAD_USE_SHARED_DPPI_CHANNELS
 
 choice
 	prompt "Timer instance"
-	default CPU_LOAD_TIMER_2
+	default NRF_CPU_LOAD_TIMER_2
 
-config CPU_LOAD_TIMER_0
+config NRF_CPU_LOAD_TIMER_0
 	depends on $(dt_nodelabel_has_compat,timer0,$(DT_COMPAT_NORDIC_NRF_TIMER))
 	bool "Timer 0"
 	select NRFX_TIMER0
-config CPU_LOAD_TIMER_1
+config NRF_CPU_LOAD_TIMER_1
 	depends on $(dt_nodelabel_has_compat,timer1,$(DT_COMPAT_NORDIC_NRF_TIMER))
 	bool "Timer 1"
 	select NRFX_TIMER1
-config CPU_LOAD_TIMER_2
+config NRF_CPU_LOAD_TIMER_2
 	depends on $(dt_nodelabel_has_compat,timer2,$(DT_COMPAT_NORDIC_NRF_TIMER))
 	bool "Timer 2"
 	select NRFX_TIMER2
-config CPU_LOAD_TIMER_3
+config NRF_CPU_LOAD_TIMER_3
 	depends on $(dt_nodelabel_has_compat,timer3,$(DT_COMPAT_NORDIC_NRF_TIMER))
 	bool "Timer 3"
 	select NRFX_TIMER3
-config CPU_LOAD_TIMER_4
+config NRF_CPU_LOAD_TIMER_4
 	depends on $(dt_nodelabel_has_compat,timer4,$(DT_COMPAT_NORDIC_NRF_TIMER))
 	bool "Timer 4"
 	select NRFX_TIMER4
 
 endchoice
 
-config CPU_LOAD_TIMER_INSTANCE
+config NRF_CPU_LOAD_TIMER_INSTANCE
 	int
-	default 0 if CPU_LOAD_TIMER_0
-	default 1 if CPU_LOAD_TIMER_1
-	default 2 if CPU_LOAD_TIMER_2
-	default 3 if CPU_LOAD_TIMER_3
-	default 4 if CPU_LOAD_TIMER_4
+	default 0 if NRF_CPU_LOAD_TIMER_0
+	default 1 if NRF_CPU_LOAD_TIMER_1
+	default 2 if NRF_CPU_LOAD_TIMER_2
+	default 3 if NRF_CPU_LOAD_TIMER_3
+	default 4 if NRF_CPU_LOAD_TIMER_4
 
-endif # CPU_LOAD
+endif # NRF_CPU_LOAD
diff --git a/subsys/debug/cpu_load/cpu_load.c b/subsys/debug/cpu_load/cpu_load.c
index 144e2b0d95a9..04cdb48030f1 100644
--- a/subsys/debug/cpu_load/cpu_load.c
+++ b/subsys/debug/cpu_load/cpu_load.c
@@ -17,7 +17,7 @@
 #include <debug/ppi_trace.h>
 #include <zephyr/logging/log.h>
 
-LOG_MODULE_REGISTER(cpu_load, CONFIG_CPU_LOAD_LOG_LEVEL);
+LOG_MODULE_REGISTER(cpu_load, CONFIG_NRF_CPU_LOAD_LOG_LEVEL);
 
 /* Convert event address to associated publish register */
 #define PUBLISH_ADDR(evt) (volatile uint32_t *)(evt + 0x80)
@@ -26,20 +26,20 @@ LOG_MODULE_REGISTER(cpu_load, CONFIG_CPU_LOAD_LOG_LEVEL);
 #define CH_INVALID 0xFF
 
 /* Define to please compiler when periodic logging is disabled. */
-#ifdef CONFIG_CPU_LOAD_LOG_INTERVAL
-#define CPU_LOAD_LOG_INTERVAL CONFIG_CPU_LOAD_LOG_INTERVAL
+#ifdef CONFIG_NRF_CPU_LOAD_LOG_INTERVAL
+#define CPU_LOAD_LOG_INTERVAL CONFIG_NRF_CPU_LOAD_LOG_INTERVAL
 #else
 #define CPU_LOAD_LOG_INTERVAL 0
 #endif
 
-static nrfx_timer_t timer = NRFX_TIMER_INSTANCE(CONFIG_CPU_LOAD_TIMER_INSTANCE);
+static nrfx_timer_t timer = NRFX_TIMER_INSTANCE(CONFIG_NRF_CPU_LOAD_TIMER_INSTANCE);
 static bool ready;
 static struct k_work_delayable cpu_load_log;
 static uint32_t cycle_ref;
 static uint32_t shared_ch_mask;
 
 #define IS_CH_SHARED(ch) \
-	(IS_ENABLED(CONFIG_CPU_LOAD_USE_SHARED_DPPI_CHANNELS) && \
+	(IS_ENABLED(CONFIG_NRF_CPU_LOAD_USE_SHARED_DPPI_CHANNELS) && \
 	(BIT(ch) & shared_ch_mask))
 
 
@@ -51,7 +51,7 @@ static nrfx_err_t ppi_alloc(uint8_t *ch, uint32_t evt)
 	nrfx_dppi_t dppi = NRFX_DPPI_INSTANCE(0);
 
 	if (*PUBLISH_ADDR(evt) != 0) {
-		if (!IS_ENABLED(CONFIG_CPU_LOAD_USE_SHARED_DPPI_CHANNELS)) {
+		if (!IS_ENABLED(CONFIG_NRF_CPU_LOAD_USE_SHARED_DPPI_CHANNELS)) {
 			return NRFX_ERROR_BUSY;
 		}
 		/* Use mask of one of subscribe registers in the system,
@@ -75,7 +75,7 @@ static nrfx_err_t ppi_free(uint8_t ch)
 #ifdef DPPI_PRESENT
 	nrfx_dppi_t dppi = NRFX_DPPI_INSTANCE(0);
 
-	if (!IS_ENABLED(CONFIG_CPU_LOAD_USE_SHARED_DPPI_CHANNELS)
+	if (!IS_ENABLED(CONFIG_NRF_CPU_LOAD_USE_SHARED_DPPI_CHANNELS)
 		|| ((BIT(ch) & shared_ch_mask) == 0)) {
 		return nrfx_dppi_channel_free(&dppi, ch);
 	} else {
@@ -90,7 +90,7 @@ static void ppi_cleanup(uint8_t ch_tick, uint8_t ch_sleep, uint8_t ch_wakeup)
 {
 	nrfx_err_t err = NRFX_SUCCESS;
 
-	if (IS_ENABLED(CONFIG_CPU_LOAD_ALIGNED_CLOCKS)) {
+	if (IS_ENABLED(CONFIG_NRF_CPU_LOAD_ALIGNED_CLOCKS)) {
 		err = ppi_free(ch_tick);
 	}
 
@@ -147,7 +147,7 @@ int cpu_load_init(void)
 	config.frequency = NRFX_MHZ_TO_HZ(1);
 	config.bit_width = NRF_TIMER_BIT_WIDTH_32;
 
-	if (IS_ENABLED(CONFIG_CPU_LOAD_ALIGNED_CLOCKS)) {
+	if (IS_ENABLED(CONFIG_NRF_CPU_LOAD_ALIGNED_CLOCKS)) {
 		/* It's assumed that RTC1 is driving system clock. */
 		config.mode = NRF_TIMER_MODE_COUNTER;
 		err = ppi_alloc(&ch_tick,
@@ -203,7 +203,7 @@ int cpu_load_init(void)
 
 	cpu_load_reset();
 
-	if (IS_ENABLED(CONFIG_CPU_LOAD_LOG_PERIODIC)) {
+	if (IS_ENABLED(CONFIG_NRF_CPU_LOAD_LOG_PERIODIC)) {
 		ret = cpu_load_log_init();
 		if (ret >= 0) {
 			ret = 0;
@@ -223,7 +223,7 @@ void cpu_load_reset(void)
 
 static uint32_t sleep_ticks_to_us(uint32_t ticks)
 {
-	return IS_ENABLED(CONFIG_CPU_LOAD_ALIGNED_CLOCKS) ?
+	return IS_ENABLED(CONFIG_NRF_CPU_LOAD_ALIGNED_CLOCKS) ?
 	   (uint32_t)(((uint64_t)ticks * 1000000) / sys_clock_hw_cycles_per_sec()) :
 	   ticks;
 }
@@ -299,5 +299,5 @@ SHELL_STATIC_SUBCMD_SET_CREATE(sub_cmd_cpu_load,
 	SHELL_SUBCMD_SET_END
 );
 
-SHELL_COND_CMD_ARG_REGISTER(CONFIG_CPU_LOAD_CMDS, cpu_load, &sub_cmd_cpu_load,
+SHELL_COND_CMD_ARG_REGISTER(CONFIG_NRF_CPU_LOAD_CMDS, cpu_load, &sub_cmd_cpu_load,
 			"CPU load", cmd_cpu_load_get, 1, 1);
diff --git a/tests/subsys/debug/cpu_load/prj.conf b/tests/subsys/debug/cpu_load/prj.conf
index 03875455ae25..ffce7667349a 100644
--- a/tests/subsys/debug/cpu_load/prj.conf
+++ b/tests/subsys/debug/cpu_load/prj.conf
@@ -1,4 +1,4 @@
 CONFIG_ZTEST=y
-CONFIG_CPU_LOAD=y
+CONFIG_NRF_CPU_LOAD=y
 CONFIG_NRFX_TIMER1=y
-CONFIG_CPU_LOAD_USE_SHARED_DPPI_CHANNELS=y
+CONFIG_NRF_CPU_LOAD_USE_SHARED_DPPI_CHANNELS=y
diff --git a/tests/subsys/debug/cpu_load/src/test_cpu_load.c b/tests/subsys/debug/cpu_load/src/test_cpu_load.c
index d623c96ee757..dbd85b0164dc 100644
--- a/tests/subsys/debug/cpu_load/src/test_cpu_load.c
+++ b/tests/subsys/debug/cpu_load/src/test_cpu_load.c
@@ -57,7 +57,7 @@ ZTEST(cpu_load, test_cpu_load)
 	nrfx_gppi_channel_endpoints_setup(ch, evt, tsk);
 	nrfx_gppi_channels_enable(BIT(ch));
 
-	if (!IS_ENABLED(CONFIG_CPU_LOAD_USE_SHARED_DPPI_CHANNELS)) {
+	if (!IS_ENABLED(CONFIG_NRF_CPU_LOAD_USE_SHARED_DPPI_CHANNELS)) {
 		err = cpu_load_init();
 		zassert_equal(err, -ENODEV, "Unexpected err:%d", err);
 
diff --git a/tests/subsys/debug/cpu_load/testcase.yaml b/tests/subsys/debug/cpu_load/testcase.yaml
index 9ce602ac6769..47f15ab463fd 100644
--- a/tests/subsys/debug/cpu_load/testcase.yaml
+++ b/tests/subsys/debug/cpu_load/testcase.yaml
@@ -25,4 +25,4 @@ tests:
       - sysbuild
       - ci_tests_subsys_debug
     extra_configs:
-      - CONFIG_CPU_LOAD_USE_SHARED_DPPI_CHANNELS=y
+      - CONFIG_NRF_CPU_LOAD_USE_SHARED_DPPI_CHANNELS=y

From d4042b7c755bbeb3ce18f89c1461d0dce121982f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Krzysztof=20Chru=C5=9Bci=C5=84ski?=
 <krzysztof.chruscinski@nordicsemi.no>
Date: Fri, 21 Mar 2025 13:11:02 +0100
Subject: [PATCH 2/4] debug: cpu_load: Improve PPI handling
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Improve PPI handling to use GPPI where possible and DPPI directly
only in case of sharing DPPI channels.

Signed-off-by: Krzysztof Chruściński <krzysztof.chruscinski@nordicsemi.no>
---
 subsys/debug/cpu_load/cpu_load.c | 28 ++++++----------------------
 1 file changed, 6 insertions(+), 22 deletions(-)

diff --git a/subsys/debug/cpu_load/cpu_load.c b/subsys/debug/cpu_load/cpu_load.c
index 04cdb48030f1..6154677d8c44 100644
--- a/subsys/debug/cpu_load/cpu_load.c
+++ b/subsys/debug/cpu_load/cpu_load.c
@@ -5,11 +5,6 @@
  */
 #include <debug/cpu_load.h>
 #include <zephyr/shell/shell.h>
-#ifdef DPPI_PRESENT
-#include <nrfx_dppi.h>
-#else
-#include <nrfx_ppi.h>
-#endif
 #include <helpers/nrfx_gppi.h>
 #include <nrfx_timer.h>
 #include <hal/nrf_rtc.h>
@@ -46,10 +41,7 @@ static uint32_t shared_ch_mask;
 /** @brief Allocate (D)PPI channel. */
 static nrfx_err_t ppi_alloc(uint8_t *ch, uint32_t evt)
 {
-	nrfx_err_t err;
 #ifdef DPPI_PRESENT
-	nrfx_dppi_t dppi = NRFX_DPPI_INSTANCE(0);
-
 	if (*PUBLISH_ADDR(evt) != 0) {
 		if (!IS_ENABLED(CONFIG_NRF_CPU_LOAD_USE_SHARED_DPPI_CHANNELS)) {
 			return NRFX_ERROR_BUSY;
@@ -59,31 +51,23 @@ static nrfx_err_t ppi_alloc(uint8_t *ch, uint32_t evt)
 		 * channel id.
 		 */
 		*ch = *PUBLISH_ADDR(evt) & DPPIC_SUBSCRIBE_CHG_EN_CHIDX_Msk;
-		err = NRFX_SUCCESS;
 		shared_ch_mask |= BIT(*ch);
-	} else {
-		err = nrfx_dppi_channel_alloc(&dppi, ch);
+		return NRFX_SUCCESS;
 	}
-#else
-	err = nrfx_ppi_channel_alloc((nrf_ppi_channel_t *)ch);
 #endif
-	return err;
+	return nrfx_gppi_channel_alloc(ch);
 }
 
 static nrfx_err_t ppi_free(uint8_t ch)
 {
 #ifdef DPPI_PRESENT
-	nrfx_dppi_t dppi = NRFX_DPPI_INSTANCE(0);
-
-	if (!IS_ENABLED(CONFIG_NRF_CPU_LOAD_USE_SHARED_DPPI_CHANNELS)
-		|| ((BIT(ch) & shared_ch_mask) == 0)) {
-		return nrfx_dppi_channel_free(&dppi, ch);
-	} else {
+	if (IS_ENABLED(CONFIG_NRF_CPU_LOAD_USE_SHARED_DPPI_CHANNELS)
+		&& ((BIT(ch) & shared_ch_mask) == 0)) {
+		shared_ch_mask &= ~BIT(ch);
 		return NRFX_SUCCESS;
 	}
-#else
-	return nrfx_ppi_channel_free((nrf_ppi_channel_t)ch);
 #endif
+	return nrfx_gppi_channel_free(ch);
 }
 
 static void ppi_cleanup(uint8_t ch_tick, uint8_t ch_sleep, uint8_t ch_wakeup)

From e432ff3293b500709b926742c4446e37b17b7c7b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Krzysztof=20Chru=C5=9Bci=C5=84ski?=
 <krzysztof.chruscinski@nordicsemi.no>
Date: Fri, 21 Mar 2025 13:23:27 +0100
Subject: [PATCH 3/4] doc: nrf: release_notes: Add note about CONFIG_CPU_LOAD
 rename
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Add note about added prefix to cpu_load Kconfig options.

Signed-off-by: Krzysztof Chruściński <krzysztof.chruscinski@nordicsemi.no>
---
 .../releases/release-notes-3.0.0-preview1.rst                 | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/doc/nrf/releases_and_maturity/releases/release-notes-3.0.0-preview1.rst b/doc/nrf/releases_and_maturity/releases/release-notes-3.0.0-preview1.rst
index 766babd5c0bf..9f0c839940a3 100644
--- a/doc/nrf/releases_and_maturity/releases/release-notes-3.0.0-preview1.rst
+++ b/doc/nrf/releases_and_maturity/releases/release-notes-3.0.0-preview1.rst
@@ -625,7 +625,9 @@ Common Application Framework
 Debug libraries
 ---------------
 
-|no_changes_yet_note|
+* :ref:`cpu_load` library:
+
+  * Added prefix ``NRF_`` to all Kconfig options (for example, :kconfig:option:`CONFIG_NRF_CPU_LOAD`) to avoid conflict with Zephyr Kconfig option with the same name.
 
 DFU libraries
 -------------

From 8e99030e143d312c588a894384dabd6ad28a2fb3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Krzysztof=20Chru=C5=9Bci=C5=84ski?=
 <krzysztof.chruscinski@nordicsemi.no>
Date: Fri, 21 Mar 2025 13:13:44 +0100
Subject: [PATCH 4/4] manifest: Update Zephyr with cpu_load module
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Add cpu_load module from upstream.

Signed-off-by: Krzysztof Chruściński <krzysztof.chruscinski@nordicsemi.no>
---
 west.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/west.yml b/west.yml
index 29f48e2004c3..489d52a052a5 100644
--- a/west.yml
+++ b/west.yml
@@ -65,7 +65,7 @@ manifest:
     # https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/zephyr/guides/modules.html
     - name: zephyr
       repo-path: sdk-zephyr
-      revision: c9113a87822e123bd287568c957d92b35502e5d1
+      revision: pull/2657/head
       import:
         # In addition to the zephyr repository itself, NCS also
         # imports the contents of zephyr/west.yml at the above