summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile6
-rw-r--r--bl31/bl31.mk5
-rw-r--r--changelog.yaml3
-rw-r--r--docs/components/context-management-library.rst33
-rw-r--r--docs/components/firme.rst2
-rw-r--r--docs/plat/rockchip.rst1
-rw-r--r--docs/porting-guide.rst59
-rw-r--r--drivers/arm/gic/gic.mk6
-rw-r--r--drivers/auth/auth_mod.c6
-rw-r--r--drivers/io/io_fip.c2
-rw-r--r--drivers/nxp/ddr/nxp-ddr/ddr.c78
-rw-r--r--drivers/nxp/ddr/nxp-ddr/ddr.mk8
-rw-r--r--drivers/nxp/ddr/nxp-ddr/ddrc.c15
-rw-r--r--drivers/st/bsec/bsec3.c2
-rw-r--r--drivers/st/clk/clk-stm32-core.c44
-rw-r--r--drivers/st/clk/clk-stm32-core.h2
-rw-r--r--drivers/st/clk/clk-stm32mp2.c16
-rw-r--r--drivers/st/clk/stm32mp1_clk.c18
-rw-r--r--drivers/st/crypto/stm32_rng.c6
-rw-r--r--drivers/st/ddr/stm32mp_ddr.c4
-rw-r--r--drivers/st/gpio/stm32_gpio.c18
-rw-r--r--drivers/st/mmc/stm32_sdmmc2.c6
-rw-r--r--drivers/st/pmic/stm32mp_pmic2.c20
-rw-r--r--drivers/st/reset/stm32mp2_reset.c4
-rw-r--r--drivers/st/rif/stm32_rifsc.c2
-rw-r--r--include/arch/aarch32/arch.h9
-rw-r--r--include/arch/aarch64/arch.h9
-rw-r--r--include/arch/aarch64/arch_helpers.h4
-rw-r--r--include/arch/aarch64/el3_common_macros.S2
-rw-r--r--include/common/bl_common.ld.h4
-rw-r--r--include/drivers/arm/gicv3.h6
-rw-r--r--include/drivers/auth/auth_mod.h6
-rw-r--r--include/drivers/partition/partition.h4
-rw-r--r--include/drivers/st/regulator.h4
-rw-r--r--include/drivers/st/stm32_sdmmc2.h4
-rw-r--r--include/drivers/st/stm32mp_ddr.h4
-rw-r--r--include/drivers/st/stm32mp_pmic.h9
-rw-r--r--include/lib/cpus/aarch64/cpu_macros.S4
-rw-r--r--include/lib/el3_runtime/aarch64/context.h24
-rw-r--r--include/lib/el3_runtime/context_mgmt.h6
-rw-r--r--include/lib/el3_runtime/cpu_data.h16
-rw-r--r--include/lib/xlat_tables/xlat_tables_v2.h4
-rw-r--r--include/lib/xlat_tables/xlat_tables_v2_helpers.h6
-rw-r--r--include/plat/common/platform.h1
-rw-r--r--include/services/firme/firme_mecid.h61
-rw-r--r--include/services/firme_svc.h63
-rw-r--r--lib/cpus/aarch32/cortex_a15.S4
-rw-r--r--lib/cpus/aarch32/cortex_a17.S4
-rw-r--r--lib/cpus/aarch32/cortex_a9.S4
-rw-r--r--lib/cpus/aarch64/c1_premium.S4
-rw-r--r--lib/cpus/aarch64/c1_ultra.S4
-rw-r--r--lib/cpus/aarch64/cortex_a57.S4
-rw-r--r--lib/cpus/aarch64/cortex_a710.S6
-rw-r--r--lib/cpus/aarch64/cortex_a715.S2
-rw-r--r--lib/cpus/aarch64/cortex_a72.S6
-rw-r--r--lib/cpus/aarch64/cortex_a73.S6
-rw-r--r--lib/cpus/aarch64/cortex_a75.S6
-rw-r--r--lib/cpus/aarch64/cortex_a76.S2
-rw-r--r--lib/cpus/aarch64/cortex_a76ae.S2
-rw-r--r--lib/cpus/aarch64/cortex_a77.S2
-rw-r--r--lib/cpus/aarch64/cortex_a78.S2
-rw-r--r--lib/cpus/aarch64/cortex_a78_ae.S2
-rw-r--r--lib/cpus/aarch64/cortex_a78c.S2
-rw-r--r--lib/cpus/aarch64/cortex_x1.S3
-rw-r--r--lib/cpus/aarch64/cortex_x2.S6
-rw-r--r--lib/cpus/aarch64/cortex_x3.S6
-rw-r--r--lib/cpus/aarch64/cortex_x4.S4
-rw-r--r--lib/cpus/aarch64/cortex_x925.S4
-rw-r--r--lib/cpus/aarch64/denver.S4
-rw-r--r--lib/cpus/aarch64/neoverse_n1.S2
-rw-r--r--lib/cpus/aarch64/neoverse_n2.S6
-rw-r--r--lib/cpus/aarch64/neoverse_v1.S2
-rw-r--r--lib/cpus/aarch64/neoverse_v2.S6
-rw-r--r--lib/cpus/aarch64/neoverse_v3.S4
-rw-r--r--lib/cpus/errata_report.c4
-rw-r--r--lib/el3_runtime/aarch32/context_mgmt.c2
-rw-r--r--lib/el3_runtime/aarch64/context.S10
-rw-r--r--lib/el3_runtime/aarch64/context_mgmt.c51
-rw-r--r--lib/extensions/pauth/pauth.c6
-rw-r--r--lib/extensions/pmuv3/aarch64/pmuv3.c6
-rw-r--r--lib/psci/psci_common.c4
-rw-r--r--lib/xlat_tables_v2/xlat_tables_context.c4
-rw-r--r--plat/arm/board/fvp/fvp_common.c16
-rw-r--r--plat/arm/board/neoverse_rd/platform/rdv3/rdv3_common.c14
-rw-r--r--plat/arm/common/arm_bl31_setup.c2
-rw-r--r--plat/arm/common/arm_common.c2
-rw-r--r--plat/arm/common/arm_common.mk8
-rw-r--r--plat/arm/common/arm_pci_svc.c44
-rw-r--r--plat/arm/common/arm_pm.c3
-rw-r--r--plat/arm/common/sp_min/arm_sp_min_setup.c2
-rw-r--r--plat/arm/common/tsp/arm_tsp_setup.c4
-rw-r--r--plat/imx/imx8m/imx8m_smc_validation.c42
-rw-r--r--plat/imx/imx8m/imx8mm/platform.mk1
-rw-r--r--plat/imx/imx8m/imx8mn/platform.mk1
-rw-r--r--plat/imx/imx8m/imx8mp/platform.mk1
-rw-r--r--plat/imx/imx8m/imx8mq/platform.mk1
-rw-r--r--plat/imx/imx8m/imx_hab.c68
-rw-r--r--plat/qemu/common/qemu_common.c13
-rw-r--r--plat/qemu/qemu/include/platform_def.h6
-rw-r--r--plat/rockchip/common/include/plat_private.h13
-rw-r--r--plat/rockchip/rv1126b/drivers/dmc/dmc_ddrc_rv1126b.h352
-rw-r--r--plat/rockchip/rv1126b/drivers/dmc/dmc_rv1126b.h297
-rw-r--r--plat/rockchip/rv1126b/drivers/dmc/suspend.c55
-rw-r--r--plat/rockchip/rv1126b/drivers/pmu/plat_pmu_macros.S16
-rw-r--r--plat/rockchip/rv1126b/drivers/pmu/pm_pd_regs.c166
-rw-r--r--plat/rockchip/rv1126b/drivers/pmu/pm_pd_regs.h22
-rw-r--r--plat/rockchip/rv1126b/drivers/pmu/pmu.c963
-rw-r--r--plat/rockchip/rv1126b/drivers/pmu/pmu.h512
-rw-r--r--plat/rockchip/rv1126b/drivers/secure/secure.c93
-rw-r--r--plat/rockchip/rv1126b/drivers/secure/secure.h43
-rw-r--r--plat/rockchip/rv1126b/drivers/soc/soc.c114
-rw-r--r--plat/rockchip/rv1126b/drivers/soc/soc.h225
-rw-r--r--plat/rockchip/rv1126b/include/plat.ld.S40
-rw-r--r--plat/rockchip/rv1126b/include/plat_sip_calls.h11
-rw-r--r--plat/rockchip/rv1126b/include/platform_def.h118
-rw-r--r--plat/rockchip/rv1126b/plat_sip_calls.c31
-rw-r--r--plat/rockchip/rv1126b/platform.mk114
-rw-r--r--plat/rockchip/rv1126b/rv1126b_def.h182
-rw-r--r--plat/rockchip/rv1126b/scmi/rv1126b_clk.c186
-rw-r--r--plat/rockchip/rv1126b/scmi/rv1126b_clk.h794
-rw-r--r--plat/rpi/rpi4/platform.mk1
-rw-r--r--plat/rpi/rpi5/platform.mk1
-rw-r--r--plat/st/common/stm32mp_common.c13
-rw-r--r--plat/st/stm32mp1/platform.mk23
-rw-r--r--plat/st/stm32mp2/platform.mk20
-rw-r--r--plat/ti/common/include/ti_platform_defs.h6
-rw-r--r--plat/xilinx/zynqmp/pm_service/zynqmp_pm_api_sys.c6
-rw-r--r--services/std_svc/firme/firme_base_service.c12
-rw-r--r--services/std_svc/firme/firme_main.c40
-rw-r--r--services/std_svc/firme/firme_mecid.c96
-rw-r--r--services/std_svc/pci_svc.c2
-rw-r--r--services/std_svc/rmmd/rmmd_main.c44
-rw-r--r--services/std_svc/std_svc_setup.c6
133 files changed, 5244 insertions, 413 deletions
diff --git a/Makefile b/Makefile
index d32a9798a..0d092368c 100644
--- a/Makefile
+++ b/Makefile
@@ -653,6 +653,8 @@ $(eval $(call assert_booleans,\
LFA_SUPPORT \
SUPPORT_SP_LIVE_ACTIVATION \
TEST_IO_SHORT_READ_FI \
+ SDEI_SUPPORT \
+ SMC_PCI_SUPPORT \
)))
# Numeric_Flags
@@ -738,6 +740,7 @@ $(eval $(call assert_numerics,\
IMPDEF_SYSREG_TRAP \
W \
TEST_IO_SHORT_READ_FI_IMAGE_ID \
+ USE_GIC_DRIVER \
)))
ifdef KEY_SIZE
@@ -936,6 +939,9 @@ $(eval $(call add_defines,\
SUPPORT_SP_LIVE_ACTIVATION \
TEST_IO_SHORT_READ_FI \
TEST_IO_SHORT_READ_FI_IMAGE_ID \
+ SDEI_SUPPORT \
+ USE_GIC_DRIVER \
+ SMC_PCI_SUPPORT \
)))
ifeq (${PLATFORM_REPORT_CTX_MEM_USE}, 1)
diff --git a/bl31/bl31.mk b/bl31/bl31.mk
index 69c348f9a..29b79e173 100644
--- a/bl31/bl31.mk
+++ b/bl31/bl31.mk
@@ -216,7 +216,8 @@ endif
ifeq (${FIRME_SUPPORT},1)
BL31_SOURCES += services/std_svc/firme/firme_main.c \
services/std_svc/firme/firme_base_service.c \
- services/std_svc/firme/firme_granule_management_service.c
+ services/std_svc/firme/firme_granule_management_service.c \
+ services/std_svc/firme/firme_mecid.c
endif
BL31_DEFAULT_LINKER_SCRIPT_SOURCE := bl31/bl31.ld.S
@@ -243,7 +244,6 @@ $(eval $(call assert_booleans,\
CRASH_REPORTING \
EL3_EXCEPTION_HANDLING \
FIRME_SUPPORT \
- SDEI_SUPPORT \
USE_DSU_DRIVER \
)))
@@ -257,7 +257,6 @@ $(eval $(call add_defines,\
$(sort \
CRASH_REPORTING \
EL3_EXCEPTION_HANDLING \
- SDEI_SUPPORT \
USE_DSU_DRIVER \
FIRME_SUPPORT \
)))
diff --git a/changelog.yaml b/changelog.yaml
index 9c7c75b57..16eee6cb1 100644
--- a/changelog.yaml
+++ b/changelog.yaml
@@ -643,6 +643,9 @@ subsections:
- title: RK3588
scope: rk3588
+ - title: RV1126B
+ scope: rv1126b
+
- title: Socionext
scope: socionext
diff --git a/docs/components/context-management-library.rst b/docs/components/context-management-library.rst
index e613bc4e0..9417a4b89 100644
--- a/docs/components/context-management-library.rst
+++ b/docs/components/context-management-library.rst
@@ -252,30 +252,9 @@ CPU Context and Memory allocation
CPU Context
~~~~~~~~~~~
The members of the context structure used by the EL3 firmware to preserve the
-state of CPU across exception levels for a given security state are listed below.
-
-.. code:: c
-
- typedef struct cpu_context {
- gp_regs_t gpregs_ctx;
- el3_state_t el3state_ctx;
-
- cve_2018_3639_t cve_2018_3639_ctx;
-
- #if ERRATA_SPECULATIVE_AT
- errata_speculative_at_t errata_speculative_at_ctx;
- #endif
-
- #if CTX_INCLUDE_PAUTH_REGS
- pauth_t pauth_ctx;
- #endif
-
- #if (CTX_INCLUDE_EL2_REGS && IMAGE_BL31)
- el2_sysregs_t el2_sysregs_ctx;
- #else
- el1_sysregs_t el1_sysregs_ctx;
- #endif
- } cpu_context_t;
+state of CPU across exception levels for a given security state are listed in
+the cpu_context structure, located in `lib/el3_runtime/aarch32/context.h`_ or
+`lib/el3_runtime/aarch64/context.h`_.
Context Memory Allocation
~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -521,7 +500,7 @@ structure and is intended to manage specific EL3 registers.
typedef struct per_world_context {
uint64_t ctx_cptr_el3;
uint64_t ctx_mpam3_el3;
- #if (ENABLE_FEAT_IDTE3 && IMAGE_BL31)
+ #if (ENABLE_FEAT_IDTE3 && defined(IMAGE_BL31))
perworld_idregs_t idregs;
#endif
} per_world_context_t;
@@ -598,4 +577,6 @@ entrypaths and at all the possible exception handlers routing to EL3 at runtime.
.. |Root Context Sequence| image:: ../resources/diagrams/root_context_sequence.png
.. _Trustzone for AArch64: https://developer.arm.com/documentation/102418/0101/TrustZone-in-the-processor/Switching-between-Security-states
.. _Security States with RME: https://developer.arm.com/documentation/den0126/0100/Security-states
-.. _lib/el3_runtime/(aarch32/aarch64): https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/tree/lib/el3_runtime
+.. _lib/el3_runtime/(aarch32/aarch64): https://git.trustedfirmware.org/TF-A/trusted-firmware-a.git/+/master/lib/el3_runtime
+.. _lib/el3_runtime/aarch32/context.h: https://git.trustedfirmware.org/plugins/gitiles/TF-A/trusted-firmware-a.git/+/master/include/lib/el3_runtime/aarch32/context.h
+.. _lib/el3_runtime/aarch64/context.h: https://git.trustedfirmware.org/plugins/gitiles/TF-A/trusted-firmware-a.git/+/master/include/lib/el3_runtime/aarch64/context.h
diff --git a/docs/components/firme.rst b/docs/components/firme.rst
index ad090b85a..7ab5211a5 100644
--- a/docs/components/firme.rst
+++ b/docs/components/firme.rst
@@ -58,7 +58,7 @@ Current status
operation.
- The IDE key management, MECID management, attestation, and integrated device
management services are not implemented yet.
-- ``FIRME_GM_GPI_OP_CONTINUE`` is mandatory in the ``1.0 alp2`` specification,
+- ``FIRME_GM_GPI_OP_CONTINUE_FID`` is mandatory in the ``1.0 alp2`` specification,
but it is not implemented yet.
As a result, the current implementation tracks FIRME ``1.0 alp2`` for
diff --git a/docs/plat/rockchip.rst b/docs/plat/rockchip.rst
index 016bed707..2e130a790 100644
--- a/docs/plat/rockchip.rst
+++ b/docs/plat/rockchip.rst
@@ -13,6 +13,7 @@ This includes right now:
- rk3566/rk3568: Quad-Core Cortex-A55
- rk3576: Octa-Core Cortex-A53/A72
- rk3588: Octa-Core Cortex-A55/A76
+- rv1126b: Quad-Core Cortex-A53
Boot Sequence
diff --git a/docs/porting-guide.rst b/docs/porting-guide.rst
index 9dcb72f93..67d7769f4 100644
--- a/docs/porting-guide.rst
+++ b/docs/porting-guide.rst
@@ -515,17 +515,6 @@ must also be defined:
With this macro, multiple block devices could be supported at the same
time.
-If the platform needs to allocate data within the per-cpu data framework in
-BL31, it should define the following macro. Currently this is only required if
-the platform decides not to use the coherent memory section by undefining the
-``USE_COHERENT_MEM`` build flag. In this case, the framework allocates the
-required memory within the the per-cpu data to minimize wastage.
-
-- **#define : PLAT_PCPU_DATA_SIZE**
-
- Defines the memory (in bytes) to be reserved within the per-cpu data
- structure for use by the platform layer.
-
The following constants are optional. They should be defined when the platform
memory layout implies some image overlaying like in Arm standard platforms.
@@ -2365,24 +2354,54 @@ RMM image and stores it in the area specified by manifest.
When ENABLE_RMM is disabled, this function is not used.
-Function : plat_rmmd_mecid_key_update() [when ENABLE_RMM == 1]
+Function : plat_firme_get_common_mecid_width() [when FIRME_SUPPORT == 1]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+::
+
+ Argument : void
+ Return : uint8_t
+
+This function is invoked by BL31's FIRME MECID management service during
+initialization to obtain the system MECID width. This is the smallest supported
+MECID width for the entire system.
+
+The returned value uses the same encoding as ``MECIDR_EL2.MECIDWidthm1``. That
+is, it is the system MECID width minus one. The common MECID width is defined as
+the smallest MECID width supported across the entire system (see rule IQDYKJ in
+the M.b version of the Arm ARM for details). The FIRME MECID management service
+advertises the returned value in FIRME MECID feature register 1.
+
+This function needs to be implemented by a platform if it enables FIRME support
+and advertises the FIRME MECID management service.
+
+Function : plat_firme_mec_refresh() [when FIRME_SUPPORT == 1]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
::
- Argument : uint16_t, unsigned int
+ Argument : uint16_t, uint8_t
Return : int
-This function is invoked by BL31's RMMD when there is a request from the RMM
-monitor to update the tweak for the encryption key associated to a MECID.
+This function is invoked by BL31's FIRME MECID management service when there is
+a request to refresh the Memory Encryption Context (MEC) associated with a
+MECID.
+
+The first parameter (``uint16_t mecid``) contains the MECID whose associated
+MEC is to be refreshed. The second parameter (``uint8_t reason``) specifies the
+reason for the refresh. Possible values are:
+``MEC_REFRESH_REASON_REALM_CREATE`` for Realm creation and
+``MEC_REFRESH_REASON_REALM_DESTROY`` for Realm destruction.
-The first parameter (``uint16_t mecid``) contains the MECID for which the
-encryption key is to be updated. The second argument specifies the reason
-for key update. Possible values are: 0 - Realm creation, 1 - Realm destruction.
+The FIRME MECID management service validates that FEAT_MEC is supported and
+that the MECID fits within the common MECID width before calling this function.
-Return value is 0 upon success and -EFAULT otherwise.
+The function returns a FIRME status code. It should return ``FIRME_SUCCESS`` on
+success, or an appropriate negative FIRME error code such as
+``FIRME_INVALID_PARAMETERS``, ``FIRME_DENIED`` or ``FIRME_RETRY`` on failure.
-This function needs to be implemented by a platform if it enables RME.
+This function needs to be implemented by a platform if it enables FIRME support
+and advertises the FIRME MECID management service.
Function : plat_rmmd_reserve_memory() [when ENABLE_RMM == 1]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/drivers/arm/gic/gic.mk b/drivers/arm/gic/gic.mk
index 8b28f219b..a79537f5f 100644
--- a/drivers/arm/gic/gic.mk
+++ b/drivers/arm/gic/gic.mk
@@ -1,5 +1,5 @@
#
-# Copyright (c) 2025, Arm Limited and Contributors. All rights reserved.
+# Copyright (c) 2025-2026, Arm Limited and Contributors. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
@@ -38,7 +38,3 @@ BL31_SOURCES += ${GIC_SOURCES}
else
BL32_SOURCES += ${GIC_SOURCES}
endif
-
-$(eval $(call add_defines,\
- USE_GIC_DRIVER \
-))
diff --git a/drivers/auth/auth_mod.c b/drivers/auth/auth_mod.c
index 4c3b49891..2e97f42c6 100644
--- a/drivers/auth/auth_mod.c
+++ b/drivers/auth/auth_mod.c
@@ -390,13 +390,13 @@ static int auth_nvctr(const auth_method_param_nv_ctr_t *param,
/* Invalid NV-counter */
return 1;
} else if (*cert_nv_ctr > plat_nv_ctr) {
-#if PSA_FWU_SUPPORT && IMAGE_BL2
+#if PSA_FWU_SUPPORT && defined(IMAGE_BL2)
if (fwu_get_active_bank_state() == FWU_BANK_STATE_ACCEPTED) {
*need_nv_ctr_upgrade = true;
} else {
*need_nv_ctr_upgrade = false;
}
-#elif PSA_FWU_SUPPORT && IMAGE_BL1
+#elif PSA_FWU_SUPPORT && defined(IMAGE_BL1)
/* The check is for bl1 only */
if (bl1_plat_is_shared_nv_ctr() == false) {
/* If NV ctr is not shared, it can be upgraded */
@@ -407,7 +407,7 @@ static int auth_nvctr(const auth_method_param_nv_ctr_t *param,
}
#else
*need_nv_ctr_upgrade = true;
-#endif /* PSA_FWU_SUPPORT && IMAGE_BL2 */
+#endif /* PSA_FWU_SUPPORT && defined(IMAGE_BL2) */
}
return 0;
diff --git a/drivers/io/io_fip.c b/drivers/io/io_fip.c
index dd7800507..f06e98a2f 100644
--- a/drivers/io/io_fip.c
+++ b/drivers/io/io_fip.c
@@ -309,7 +309,7 @@ static int fip_file_open(io_dev_info_t *dev_info, const uintptr_t spec,
int result;
uintptr_t backend_handle;
const io_uuid_spec_t *uuid_spec = (io_uuid_spec_t *)spec;
- static const uuid_t uuid_null = { {0} }; /* Double braces for clang */
+ static const uuid_t uuid_null = { 0U };
size_t bytes_read;
size_t toc_offset;
size_t fip_size;
diff --git a/drivers/nxp/ddr/nxp-ddr/ddr.c b/drivers/nxp/ddr/nxp-ddr/ddr.c
index 17c2bbb2a..4346ce646 100644
--- a/drivers/nxp/ddr/nxp-ddr/ddr.c
+++ b/drivers/nxp/ddr/nxp-ddr/ddr.c
@@ -6,6 +6,7 @@
#include <errno.h>
#include <inttypes.h>
+#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
@@ -571,8 +572,85 @@ static int parse_spd(struct ddr_info *priv)
if (spd_idx != 0 && spd_checksum[0] !=
spd_checksum[spd_idx]) {
+#if defined(NXP_DDR_DUAL_DIMM_TOLERANT)
+ /* DDR4 SPD bytes that have impacts */
+ static const unsigned int timing_bytes[] = {
+
+ /* device key + organisation */
+ 2, /* mem_type DDR3 / DDR4 / LPDDR4 key */
+ 4, /* density_banks SDRAM density + bank groups */
+ 5, /* addressing row/col bit counts */
+ 6, /* package_type SDP / DDP / 3DS / QDP */
+ 7, /* opt_feature MAW, fault detect */
+ 8, /* thermal_ref refresh interval mode */
+ 9, /* oth_opt_features PPR / soft-PPR */
+ 11, /* module_vdd nominal voltage (DDR4 = 1.2 V) */
+ 12, /* organization ranks + DRAM width (x4/x8/x16) */
+ 13, /* bus_width primary bus width + ECC bit */
+ 14, /* therm_sensor on-DIMM temp-sensor presence */
+
+ /* DDR4 base timing block - MTB units (MTB = 125 ps) */
+ 17, /* timebases MTB/FTB select (0x00 on DDR4) */
+ 18, /* tck_min min SDRAM cycle time -> speed bin */
+ 19, /* tck_max max SDRAM cycle time */
+ 20, /* caslat_b1 supported CAS latencies, byte 1 */
+ 21, /* caslat_b2 supported CAS latencies, byte 2 */
+ 22, /* caslat_b3 supported CAS latencies, byte 3 */
+ 23, /* caslat_b4 supported CAS latencies, byte 4 */
+ 24, /* taa_min min CAS latency time -> CL pick */
+ 25, /* trcd_min RAS-to-CAS delay */
+ 26, /* trp_min row precharge time */
+ 27, /* tras_trc_ext upper nibbles for tRAS / tRC */
+ 28, /* tras_min_lsb active-to-precharge LSB */
+ 29, /* trc_min_lsb row-cycle time LSB */
+ 30, /* trfc1_min_lsb refresh recovery 1x mode LSB */
+ 31, /* trfc1_min_msb refresh recovery 1x mode MSB */
+ 32, /* trfc2_min_lsb refresh recovery 2x mode LSB */
+ 33, /* trfc2_min_msb refresh recovery 2x mode MSB */
+ 34, /* trfc4_min_lsb refresh recovery 4x mode LSB */
+ 35, /* trfc4_min_msb refresh recovery 4x mode MSB */
+ 36, /* tfaw_msb four-activate-window upper nibble */
+ 37, /* tfaw_min four-activate-window LSB */
+ 38, /* trrds_min act-to-act, different bank groups */
+ 39, /* trrdl_min act-to-act, same bank group */
+ 40, /* tccdl_min CAS-to-CAS, same bank group */
+
+ /* DDR4 fine timing - FTB units (1 ps), signed deltas */
+ 117, /* fine_tccdl_min adds to byte 40 (tccdl_min) */
+ 118, /* fine_trrdl_min adds to byte 39 (trrdl_min) */
+ 119, /* fine_trrds_min adds to byte 38 (trrds_min) */
+ 120, /* fine_trc_min adds to byte 27/29 (trc) */
+ 121, /* fine_trp_min adds to byte 26 (trp) */
+ 122, /* fine_trcd_min adds to byte 25 (trcd) */
+ 123, /* fine_taa_min adds to byte 24 (taa) */
+ 124, /* fine_tck_max adds to byte 19 (tck_max) */
+ 125, /* fine_tck_min adds to byte 18 (tck_min) */
+ };
+ const unsigned char *pa =
+ (const unsigned char *)&spd[0];
+ const unsigned char *pb =
+ (const unsigned char *)&spd[spd_idx];
+ bool timing_ok = true;
+ unsigned int t;
+
+ for (t = 0U; t < ARRAY_SIZE(timing_bytes); t++) {
+ unsigned int bx = timing_bytes[t];
+
+ if (pa[bx] != pb[bx]) {
+ ERROR("DDR SPD timing byte %u: 0x%02x vs 0x%02x\n",
+ bx, pa[bx], pb[bx]);
+ timing_ok = false;
+ }
+ }
+ if (!timing_ok) {
+ ERROR("Not identical DIMMs (timing-relevant mismatch).\n");
+ return -EINVAL;
+ }
+ NOTICE("DDR SPDs differ for non-timing bytes only -> accepting\n");
+#else
ERROR("Not identical DIMMs.\n");
return -EINVAL;
+#endif
}
conf->dimm_in_use[j] = 1;
valid_mask |= 1 << addr_idx;
diff --git a/drivers/nxp/ddr/nxp-ddr/ddr.mk b/drivers/nxp/ddr/nxp-ddr/ddr.mk
index be9163384..35d615dbd 100644
--- a/drivers/nxp/ddr/nxp-ddr/ddr.mk
+++ b/drivers/nxp/ddr/nxp-ddr/ddr.mk
@@ -74,6 +74,14 @@ ifeq ($(DEBUG_DDR_INPUT_CONFIG), yes)
$(eval $(call add_define, DEBUG_DDR_INPUT_CONFIG))
endif
+# Tolerant SPD compare workaround is for a dual-DIMM pair whose
+# base/module CRCs differ but whose timing-relevant bytes match
+# Default off: a CRC mismatch is a hard error unless a board
+# wants to be tolerant for such cases.
+ifeq ($(NXP_DDR_DUAL_DIMM_TOLERANT), yes)
+$(eval $(call add_define,NXP_DDR_DUAL_DIMM_TOLERANT))
+endif
+
DDR_CNTLR_SOURCES := $(PLAT_DRIVERS_PATH)/ddr/nxp-ddr/ddr.c \
$(PLAT_DRIVERS_PATH)/ddr/nxp-ddr/ddrc.c \
$(PLAT_DRIVERS_PATH)/ddr/nxp-ddr/dimm.c \
diff --git a/drivers/nxp/ddr/nxp-ddr/ddrc.c b/drivers/nxp/ddr/nxp-ddr/ddrc.c
index 4133fac1a..24cc0775e 100644
--- a/drivers/nxp/ddr/nxp-ddr/ddrc.c
+++ b/drivers/nxp/ddr/nxp-ddr/ddrc.c
@@ -426,19 +426,18 @@ after_reset:
mb();
isb();
} else {
- /* wait for PHY complete */
- timeout = 40;
- while (((ddr_in32(&ddr->ddr_dsr2) & 0x4) != 0) &&
+ /* Wait up to 50 ms for DDR_DSR2[2] PHY_INIT_CMPLT to be set. */
+ timeout = 100;
+ while (((ddr_in32(&ddr->ddr_dsr2) & 0x4) == 0) &&
(timeout > 0)) {
udelay(500);
timeout--;
}
- if (timeout <= 0) {
- printf("PHY handshake timeout, ddr_dsr2 = %x\n",
- ddr_in32(&ddr->ddr_dsr2));
+ if (timeout > 0) {
+ debug("PHY init complete (DSR2[2]=1) in ~%d ms\n",
+ (100 - timeout) / 2);
} else {
- debug("PHY handshake completed, timer remains %d\n",
- timeout);
+ WARN("PHY init NOT complete after 50 ms (DSR2[2]=0) -> proceeding, training will report any real fault\n");
}
}
diff --git a/drivers/st/bsec/bsec3.c b/drivers/st/bsec/bsec3.c
index 67370278f..a6b2717f8 100644
--- a/drivers/st/bsec/bsec3.c
+++ b/drivers/st/bsec/bsec3.c
@@ -42,7 +42,7 @@ static uint32_t otp_bank(uint32_t otp)
static uint32_t otp_bit_mask(uint32_t otp)
{
- return BIT(otp & BSEC_OTP_MASK);
+ return BIT_32(otp & BSEC_OTP_MASK);
}
/*
diff --git a/drivers/st/clk/clk-stm32-core.c b/drivers/st/clk/clk-stm32-core.c
index a4bddbf4d..a5e6b1de6 100644
--- a/drivers/st/clk/clk-stm32-core.c
+++ b/drivers/st/clk/clk-stm32-core.c
@@ -71,7 +71,7 @@ static int clk_gate_enable(struct stm32_clk_priv *priv, int id)
const struct clk_stm32 *clk = _clk_get(priv, id);
struct clk_gate_cfg *cfg = clk->clock_cfg;
- mmio_setbits_32(priv->base + cfg->offset, BIT(cfg->bit_idx));
+ mmio_setbits_32(priv->base + cfg->offset, BIT_32(cfg->bit_idx));
/* Make sure the clock register has been written */
(void)mmio_read_32(priv->base + cfg->offset);
@@ -86,7 +86,7 @@ static void clk_gate_disable(struct stm32_clk_priv *priv, int id)
dmbsy(); /* Ensure previous transactions are performed. */
- mmio_clrbits_32(priv->base + cfg->offset, BIT(cfg->bit_idx));
+ mmio_clrbits_32(priv->base + cfg->offset, BIT_32(cfg->bit_idx));
/* Make sure the clock register has been written */
(void)mmio_read_32(priv->base + cfg->offset);
@@ -97,7 +97,7 @@ static bool clk_gate_is_enabled(struct stm32_clk_priv *priv, int id)
const struct clk_stm32 *clk = _clk_get(priv, id);
struct clk_gate_cfg *cfg = clk->clock_cfg;
- return ((mmio_read_32(priv->base + cfg->offset) & BIT(cfg->bit_idx)) != 0U);
+ return ((mmio_read_32(priv->base + cfg->offset) & BIT_32(cfg->bit_idx)) != 0U);
}
const struct stm32_clk_ops clk_gate_ops = {
@@ -112,9 +112,9 @@ void _clk_stm32_gate_disable(struct stm32_clk_priv *priv, uint16_t gate_id)
uintptr_t addr = priv->base + gate->offset;
if (gate->set_clr != 0U) {
- mmio_write_32(addr + RCC_MP_ENCLRR_OFFSET, BIT(gate->bit_idx));
+ mmio_write_32(addr + RCC_MP_ENCLRR_OFFSET, BIT_32(gate->bit_idx));
} else {
- mmio_clrbits_32(addr, BIT(gate->bit_idx));
+ mmio_clrbits_32(addr, BIT_32(gate->bit_idx));
}
}
@@ -124,10 +124,10 @@ int _clk_stm32_gate_enable(struct stm32_clk_priv *priv, uint16_t gate_id)
uintptr_t addr = priv->base + gate->offset;
if (gate->set_clr != 0U) {
- mmio_write_32(addr, BIT(gate->bit_idx));
+ mmio_write_32(addr, BIT_32(gate->bit_idx));
} else {
- mmio_setbits_32(addr, BIT(gate->bit_idx));
+ mmio_setbits_32(addr, BIT_32(gate->bit_idx));
}
return 0;
@@ -151,7 +151,7 @@ static const struct stm32_clk_ops *_clk_get_ops(struct stm32_clk_priv *priv, int
return priv->ops_array[clk->ops];
}
-#define clk_div_mask(_width) GENMASK(((_width) - 1U), 0U)
+#define clk_div_mask(_width) GENMASK_32(((_width) - 1U), 0U)
static unsigned int _get_table_div(const struct clk_div_table *table,
unsigned int val)
@@ -176,11 +176,11 @@ static unsigned int _get_div(const struct clk_div_table *table,
}
if ((flags & CLK_DIVIDER_POWER_OF_TWO) != 0UL) {
- return BIT(val);
+ return BIT_32(val);
}
if ((flags & CLK_DIVIDER_MAX_AT_ZERO) != 0UL) {
- return (val != 0U) ? val : BIT(width);
+ return (val != 0U) ? val : BIT_32(width);
}
if (table != NULL) {
@@ -208,7 +208,7 @@ int clk_mux_set_parent(struct stm32_clk_priv *priv, uint16_t pid, uint8_t sel)
timeout = timeout_init_us(CLKSRC_TIMEOUT);
- mask = BIT(mux->bitrdy);
+ mask = BIT_32(mux->bitrdy);
while ((mmio_read_32(address) & mask) == 0U) {
if (timeout_elapsed(timeout)) {
@@ -708,7 +708,7 @@ int clk_stm32_set_div(struct stm32_clk_priv *priv, uint32_t div_id, uint32_t val
}
timeout = timeout_init_us(CLKSRC_TIMEOUT);
- mask = BIT(divider->bitrdy);
+ mask = BIT_32(divider->bitrdy);
while ((mmio_read_32(address) & mask) == 0U) {
if (timeout_elapsed(timeout)) {
@@ -724,12 +724,12 @@ int _clk_stm32_gate_wait_ready(struct stm32_clk_priv *priv, uint16_t gate_id,
{
const struct gate_cfg *gate = &priv->gates[gate_id];
uintptr_t address = priv->base + gate->offset;
- uint32_t mask_rdy = BIT(gate->bit_idx);
+ uint32_t mask_rdy = BIT_32(gate->bit_idx);
uint64_t timeout;
uint32_t mask_test;
if (ready_on) {
- mask_test = BIT(gate->bit_idx);
+ mask_test = BIT_32(gate->bit_idx);
} else {
mask_test = 0U;
}
@@ -757,10 +757,10 @@ int clk_stm32_gate_enable(struct stm32_clk_priv *priv, int id)
uintptr_t addr = priv->base + gate->offset;
if (gate->set_clr != 0U) {
- mmio_write_32(addr, BIT(gate->bit_idx));
+ mmio_write_32(addr, BIT_32(gate->bit_idx));
} else {
- mmio_setbits_32(addr, BIT(gate->bit_idx));
+ mmio_setbits_32(addr, BIT_32(gate->bit_idx));
}
return 0;
@@ -774,21 +774,21 @@ void clk_stm32_gate_disable(struct stm32_clk_priv *priv, int id)
uintptr_t addr = priv->base + gate->offset;
if (gate->set_clr != 0U) {
- mmio_write_32(addr + RCC_MP_ENCLRR_OFFSET, BIT(gate->bit_idx));
+ mmio_write_32(addr + RCC_MP_ENCLRR_OFFSET, BIT_32(gate->bit_idx));
} else {
- mmio_clrbits_32(addr, BIT(gate->bit_idx));
+ mmio_clrbits_32(addr, BIT_32(gate->bit_idx));
}
}
bool _clk_stm32_gate_is_enabled(struct stm32_clk_priv *priv, int gate_id)
{
const struct gate_cfg *gate;
- uint32_t addr;
+ uintptr_t addr;
gate = &priv->gates[gate_id];
addr = priv->base + gate->offset;
- return ((mmio_read_32(addr) & BIT(gate->bit_idx)) != 0U);
+ return ((mmio_read_32(addr) & BIT_32(gate->bit_idx)) != 0U);
}
bool clk_stm32_gate_is_enabled(struct stm32_clk_priv *priv, int id)
@@ -826,8 +826,8 @@ unsigned long fixed_factor_recalc_rate(struct stm32_clk_priv *priv,
return (unsigned long)(rate / cfg->div);
};
-#define APB_DIV_MASK GENMASK(2, 0)
-#define TIM_PRE_MASK BIT(0)
+#define APB_DIV_MASK GENMASK_32(2, 0)
+#define TIM_PRE_MASK BIT_32(0)
static unsigned long timer_recalc_rate(struct stm32_clk_priv *priv,
int id, unsigned long prate)
diff --git a/drivers/st/clk/clk-stm32-core.h b/drivers/st/clk/clk-stm32-core.h
index 93d4c37e4..0f8878594 100644
--- a/drivers/st/clk/clk-stm32-core.h
+++ b/drivers/st/clk/clk-stm32-core.h
@@ -139,7 +139,7 @@ struct clk_gate_cfg {
#define DIV_NO_BIT_RDY UINT8_MAX
#define MASK_WIDTH_SHIFT(_width, _shift) \
- GENMASK(((_width) + (_shift) - 1U), (_shift))
+ GENMASK_32(((_width) + (_shift) - 1U), (_shift))
void clk_stm32_rcc_regs_lock(void);
void clk_stm32_rcc_regs_unlock(void);
diff --git a/drivers/st/clk/clk-stm32mp2.c b/drivers/st/clk/clk-stm32mp2.c
index f9460016d..f34739ae9 100644
--- a/drivers/st/clk/clk-stm32mp2.c
+++ b/drivers/st/clk/clk-stm32mp2.c
@@ -727,11 +727,11 @@ static void clk_oscillator_set_bypass(struct stm32_clk_priv *priv, int id,
address = priv->base + bypass_data->offset;
if (digbyp) {
- mmio_setbits_32(address, BIT(bypass_data->bit_digbyp));
+ mmio_setbits_32(address, BIT_32(bypass_data->bit_digbyp));
}
if (bypass || digbyp) {
- mmio_setbits_32(address, BIT(bypass_data->bit_byp));
+ mmio_setbits_32(address, BIT_32(bypass_data->bit_byp));
}
}
@@ -750,7 +750,7 @@ static void clk_oscillator_set_css(struct stm32_clk_priv *priv, int id,
address = priv->base + css_data->offset;
if (css) {
- mmio_setbits_32(address, BIT(css_data->bit_css));
+ mmio_setbits_32(address, BIT_32(css_data->bit_css));
}
}
@@ -770,7 +770,7 @@ static void clk_oscillator_set_drive(struct stm32_clk_priv *priv, int id,
address = priv->base + drive_data->offset;
- mask = (BIT(drive_data->drv_width) - 1U) << drive_data->drv_shift;
+ mask = (BIT_32(drive_data->drv_width) - 1U) << drive_data->drv_shift;
/*
* Warning: not recommended to switch directly from "high drive"
@@ -2137,10 +2137,10 @@ static int wait_predivsr(uint16_t channel)
if (channel < __WORD_BIT) {
previvsr = rcc_base + RCC_PREDIVSR1;
- channel_bit = BIT(channel);
+ channel_bit = BIT_32(channel);
} else {
previvsr = rcc_base + RCC_PREDIVSR2;
- channel_bit = BIT(channel - __WORD_BIT);
+ channel_bit = BIT_32(channel - __WORD_BIT);
}
timeout = timeout_init_us(CLKDIV_TIMEOUT);
@@ -2165,10 +2165,10 @@ static int wait_findivsr(uint16_t channel)
if (channel < __WORD_BIT) {
finvivsr = rcc_base + RCC_FINDIVSR1;
- channel_bit = BIT(channel);
+ channel_bit = BIT_32(channel);
} else {
finvivsr = rcc_base + RCC_FINDIVSR2;
- channel_bit = BIT(channel - __WORD_BIT);
+ channel_bit = BIT_32(channel - __WORD_BIT);
}
timeout = timeout_init_us(CLKDIV_TIMEOUT);
diff --git a/drivers/st/clk/stm32mp1_clk.c b/drivers/st/clk/stm32mp1_clk.c
index 45bdc88ba..1c50d75da 100644
--- a/drivers/st/clk/stm32mp1_clk.c
+++ b/drivers/st/clk/stm32mp1_clk.c
@@ -211,22 +211,6 @@ static const struct mux_cfg parent_mp15[MUX_NB] = {
#define MASK_WIDTH_SHIFT(_width, _shift) \
GENMASK(((_width) + (_shift) - 1U), (_shift))
-int clk_mux_get_parent(struct stm32_clk_priv *priv, uint32_t mux_id)
-{
- const struct mux_cfg *mux;
- uint32_t mask;
-
- if (mux_id >= priv->nb_parents) {
- panic();
- }
-
- mux = &priv->parents[mux_id];
-
- mask = MASK_WIDTH_SHIFT(mux->width, mux->shift);
-
- return (mmio_read_32(priv->base + mux->offset) & mask) >> mux->shift;
-}
-
static int clk_mux_set_parent(struct stm32_clk_priv *priv, uint16_t pid, uint8_t sel)
{
const struct mux_cfg *mux = &priv->parents[pid];
@@ -264,7 +248,7 @@ static int stm32_clk_configure_mux(struct stm32_clk_priv *priv, uint32_t val)
return clk_mux_set_parent(priv, mux, sel);
}
-int clk_stm32_set_div(struct stm32_clk_priv *priv, uint32_t div_id, uint32_t value)
+static int clk_stm32_set_div(struct stm32_clk_priv *priv, uint32_t div_id, uint32_t value)
{
const struct div_cfg *divider;
uintptr_t address;
diff --git a/drivers/st/crypto/stm32_rng.c b/drivers/st/crypto/stm32_rng.c
index 9e5135869..c6e89a105 100644
--- a/drivers/st/crypto/stm32_rng.c
+++ b/drivers/st/crypto/stm32_rng.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022-2025, STMicroelectronics - All Rights Reserved
+ * Copyright (c) 2022-2026, STMicroelectronics - All Rights Reserved
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -320,14 +320,14 @@ int stm32_rng_init(void)
if (dt_rng.reset >= 0) {
- ret = stm32mp_reset_assert((unsigned long)dt_rng.reset, TIMEOUT_US_1MS);
+ ret = stm32mp_reset_assert((uint32_t)dt_rng.reset, TIMEOUT_US_1MS);
if (ret != 0) {
panic();
}
udelay(20);
- ret = stm32mp_reset_deassert((unsigned long)dt_rng.reset, TIMEOUT_US_1MS);
+ ret = stm32mp_reset_deassert((uint32_t)dt_rng.reset, TIMEOUT_US_1MS);
if (ret != 0) {
panic();
}
diff --git a/drivers/st/ddr/stm32mp_ddr.c b/drivers/st/ddr/stm32mp_ddr.c
index d25c22572..bbe29da72 100644
--- a/drivers/st/ddr/stm32mp_ddr.c
+++ b/drivers/st/ddr/stm32mp_ddr.c
@@ -44,7 +44,7 @@ void stm32mp_ddr_set_reg(const struct stm32mp_ddr_priv *priv, enum stm32mp_ddr_r
ddr_registers[type].name, i);
panic();
} else {
-#ifdef STM32MP2X
+#if STM32MP2X
if (desc[i].qd) {
stm32mp_ddr_start_sw_done(priv->ctl);
}
@@ -52,7 +52,7 @@ void stm32mp_ddr_set_reg(const struct stm32mp_ddr_priv *priv, enum stm32mp_ddr_r
value = *((uint32_t *)((uintptr_t)param +
desc[i].par_offset));
mmio_write_32(ptr, value);
-#ifdef STM32MP2X
+#if STM32MP2X
if (desc[i].qd) {
stm32mp_ddr_wait_sw_done_ack(priv->ctl);
}
diff --git a/drivers/st/gpio/stm32_gpio.c b/drivers/st/gpio/stm32_gpio.c
index 2d64de322..45b28ff1a 100644
--- a/drivers/st/gpio/stm32_gpio.c
+++ b/drivers/st/gpio/stm32_gpio.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2024, STMicroelectronics - All Rights Reserved
+ * Copyright (c) 2016-2026, STMicroelectronics - All Rights Reserved
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -282,16 +282,16 @@ static void set_gpio(uint32_t bank, uint32_t pin, uint32_t mode, uint32_t type,
clk_disable(clock);
-#ifdef STM32MP1X
+#if STM32MP1X
if (status == DT_SECURE) {
stm32mp_register_secure_gpio(bank, pin);
-#if !IMAGE_BL2
+#ifndef IMAGE_BL2
set_gpio_secure_cfg(bank, pin, true);
#endif
} else {
stm32mp_register_non_secure_gpio(bank, pin);
-#if !IMAGE_BL2
+#ifndef IMAGE_BL2
set_gpio_secure_cfg(bank, pin, false);
#endif
}
@@ -310,9 +310,9 @@ void set_gpio_secure_cfg(uint32_t bank, uint32_t pin, bool secure)
clk_enable(clock);
if (secure) {
- mmio_setbits_32(base + GPIO_SECR_OFFSET, BIT(pin));
+ mmio_setbits_32(base + GPIO_SECR_OFFSET, BIT_32(pin));
} else {
- mmio_clrbits_32(base + GPIO_SECR_OFFSET, BIT(pin));
+ mmio_clrbits_32(base + GPIO_SECR_OFFSET, BIT_32(pin));
}
clk_disable(clock);
@@ -336,9 +336,9 @@ void set_gpio_level(uint32_t bank, uint32_t pin, enum gpio_level level)
clk_enable(clock);
if (level == GPIO_LEVEL_HIGH) {
- mmio_write_32(base + GPIO_BSRR_OFFSET, BIT(pin));
+ mmio_write_32(base + GPIO_BSRR_OFFSET, BIT_32(pin));
} else {
- mmio_write_32(base + GPIO_BSRR_OFFSET, BIT(pin + 16U));
+ mmio_write_32(base + GPIO_BSRR_OFFSET, BIT_32(pin + 16U));
}
VERBOSE("GPIO %u level set to 0x%x\n", bank,
@@ -357,7 +357,7 @@ enum gpio_level get_gpio_level(uint32_t bank, uint32_t pin)
clk_enable(clock);
- if (mmio_read_32(base + GPIO_IDR_OFFSET) & BIT(pin)) {
+ if (mmio_read_32(base + GPIO_IDR_OFFSET) & BIT_32(pin)) {
level = GPIO_LEVEL_HIGH;
}
diff --git a/drivers/st/mmc/stm32_sdmmc2.c b/drivers/st/mmc/stm32_sdmmc2.c
index e07d9e7f8..d3db6ce13 100644
--- a/drivers/st/mmc/stm32_sdmmc2.c
+++ b/drivers/st/mmc/stm32_sdmmc2.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2024, STMicroelectronics - All Rights Reserved
+ * Copyright (c) 2018-2026, STMicroelectronics - All Rights Reserved
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -129,7 +129,7 @@
#define DT_SDMMC2_COMPAT "st,stm32-sdmmc2"
#endif
-#ifdef STM32MP1X
+#if STM32MP1X
#define SDMMC_FIFO_SIZE 64U
#else
#define SDMMC_FIFO_SIZE 1024U
@@ -163,7 +163,7 @@ static struct stm32_sdmmc2_params sdmmc2_params;
static bool next_cmd_is_acmd;
#pragma weak plat_sdmmc2_use_dma
-bool plat_sdmmc2_use_dma(unsigned int instance, unsigned int memory)
+bool plat_sdmmc2_use_dma(uintptr_t instance, uintptr_t memory)
{
return false;
}
diff --git a/drivers/st/pmic/stm32mp_pmic2.c b/drivers/st/pmic/stm32mp_pmic2.c
index 27488ee88..3309311c2 100644
--- a/drivers/st/pmic/stm32mp_pmic2.c
+++ b/drivers/st/pmic/stm32mp_pmic2.c
@@ -23,7 +23,7 @@
#define PMIC_NODE_NOT_FOUND 1
struct regul_handle_s {
- const uint32_t id;
+ const uint8_t id;
uint16_t bypass_mv;
};
@@ -198,11 +198,6 @@ void pmic_switch_off(void)
panic();
}
-int pmic_voltages_init(void)
-{
- return 0;
-}
-
static int pmic2_set_state(const struct regul_description *desc, bool enable)
{
struct regul_handle_s *regul = (struct regul_handle_s *)desc->driver_data;
@@ -310,26 +305,25 @@ static int pmic2_list_voltages(const struct regul_description *desc,
static int pmic2_set_flag(const struct regul_description *desc, uint16_t flag)
{
struct regul_handle_s *regul = (struct regul_handle_s *)desc->driver_data;
- uint32_t id = regul->id;
int ret = -EPERM;
VERBOSE("%s: set_flag 0x%x\n", desc->node_name, flag);
switch (flag) {
case REGUL_PULL_DOWN:
- ret = stpmic2_regulator_set_prop(pmic2, id, STPMIC2_PULL_DOWN, 1U);
+ ret = stpmic2_regulator_set_prop(pmic2, regul->id, STPMIC2_PULL_DOWN, 1U);
break;
case REGUL_OCP:
- ret = stpmic2_regulator_set_prop(pmic2, id, STPMIC2_OCP, 1U);
+ ret = stpmic2_regulator_set_prop(pmic2, regul->id, STPMIC2_OCP, 1U);
break;
case REGUL_SINK_SOURCE:
- ret = stpmic2_regulator_set_prop(pmic2, id, STPMIC2_SINK_SOURCE, 1U);
+ ret = stpmic2_regulator_set_prop(pmic2, regul->id, STPMIC2_SINK_SOURCE, 1U);
break;
case REGUL_ENABLE_BYPASS:
- ret = stpmic2_regulator_set_prop(pmic2, id, STPMIC2_BYPASS, 1U);
+ ret = stpmic2_regulator_set_prop(pmic2, regul->id, STPMIC2_BYPASS, 1U);
break;
case REGUL_MASK_RESET:
- ret = stpmic2_regulator_set_prop(pmic2, id, STPMIC2_MASK_RESET, 1U);
+ ret = stpmic2_regulator_set_prop(pmic2, regul->id, STPMIC2_MASK_RESET, 1U);
break;
default:
ERROR("Invalid flag %u", flag);
@@ -546,7 +540,7 @@ void initialize_pmic(void)
return;
}
-#if IMAGE_BL2
+#ifdef IMAGE_BL2
#if LOG_LEVEL >= LOG_LEVEL_INFO
if (stpmic2_get_version(pmic2, &val) != 0) {
ERROR("Failed to access PMIC\n");
diff --git a/drivers/st/reset/stm32mp2_reset.c b/drivers/st/reset/stm32mp2_reset.c
index 0918df59e..d8619aa6b 100644
--- a/drivers/st/reset/stm32mp2_reset.c
+++ b/drivers/st/reset/stm32mp2_reset.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2024, STMicroelectronics - All Rights Reserved
+ * Copyright (c) 2024-2026, STMicroelectronics - All Rights Reserved
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -28,7 +28,7 @@ static uint8_t id2reg_bit_pos(unsigned int reset_id)
static int reset_toggle(uint32_t id, unsigned int to_us, bool reset_status)
{
uint32_t offset = id2reg_offset(id);
- uint32_t bitmsk = BIT(id2reg_bit_pos(id));
+ uint32_t bitmsk = BIT_32(id2reg_bit_pos(id));
uint32_t bit_check;
uintptr_t rcc_base = stm32mp_rcc_base();
diff --git a/drivers/st/rif/stm32_rifsc.c b/drivers/st/rif/stm32_rifsc.c
index f025c31bd..977781745 100644
--- a/drivers/st/rif/stm32_rifsc.c
+++ b/drivers/st/rif/stm32_rifsc.c
@@ -29,7 +29,7 @@ void stm32_rifsc_ip_configure(int rimu_id, int rifsc_id, uint32_t param)
assert(rifsc_id < STM32MP25_RIFSC_MAX_ID);
#endif /* STM32MP25 */
- bit = BIT(rifsc_id % U(32));
+ bit = BIT_32(rifsc_id % U(32));
/* Set peripheral accesses to Secure/Privilege only */
mmio_setbits_32(RIFSC_BASE + _RIFSC_RISC_SECCFGR(rifsc_id), bit);
diff --git a/include/arch/aarch32/arch.h b/include/arch/aarch32/arch.h
index 3f0d3a7d2..0ddad2733 100644
--- a/include/arch/aarch32/arch.h
+++ b/include/arch/aarch32/arch.h
@@ -80,6 +80,15 @@
#endif
/*******************************************************************************
+ * Definitions for CPU system register interface to GIC
+ ******************************************************************************/
+/* ICC_SRE bit definitions */
+#define ICC_SRE_EN_BIT BIT_32(3)
+#define ICC_SRE_DIB_BIT BIT_32(2)
+#define ICC_SRE_DFB_BIT BIT_32(1)
+#define ICC_SRE_SRE_BIT BIT_32(0)
+
+/*******************************************************************************
* Generic timer memory mapped registers & offsets
******************************************************************************/
#define CNTCR_OFF U(0x000)
diff --git a/include/arch/aarch64/arch.h b/include/arch/aarch64/arch.h
index bbd04ded1..4dbf8c0a1 100644
--- a/include/arch/aarch64/arch.h
+++ b/include/arch/aarch64/arch.h
@@ -124,6 +124,12 @@
#define ICC_EOIR1_EL1 S3_0_c12_c12_1
#define ICC_SGI0R_EL1 S3_0_c12_c11_7
+/* ICC_SRE bit definitions */
+#define ICC_SRE_EN_BIT BIT_32(3)
+#define ICC_SRE_DIB_BIT BIT_32(2)
+#define ICC_SRE_DFB_BIT BIT_32(1)
+#define ICC_SRE_SRE_BIT BIT_32(0)
+
/*******************************************************************************
* Definitions for EL2 system registers for save/restore routine
******************************************************************************/
@@ -1992,8 +1998,9 @@
* FEAT_MEC - Memory Encryption Contexts
******************************************************************************/
#define MECIDR_EL2 S3_4_C10_C8_7
-#define MECIDR_EL2_MECIDWidthm1_MASK U(0xf)
#define MECIDR_EL2_MECIDWidthm1_SHIFT U(0)
+#define MECIDR_EL2_MECIDWidthm1_WIDTH U(4)
+#define MECIDR_EL2_MECIDWidthm1_MASK GENMASK(3, 0)
/******************************************************************************
* FEAT_FGWTE3 - Fine Grained Write Trap
diff --git a/include/arch/aarch64/arch_helpers.h b/include/arch/aarch64/arch_helpers.h
index c799b0c53..ba2a627c8 100644
--- a/include/arch/aarch64/arch_helpers.h
+++ b/include/arch/aarch64/arch_helpers.h
@@ -272,7 +272,7 @@ void disable_mpu_icache_el2(void);
#define write_daifset(val) SYSREG_WRITE_CONST(daifset, val)
-#if ENABLE_FEAT_D128 && !IMAGE_BL32
+#if ENABLE_FEAT_D128 && !defined(IMAGE_BL32)
/* Don't use mrrs/msrr read/write implementation with tspd,
* While using SPD=tspd, tspd compiles with current arch_helpers
* thus trying to use mrrs/msrr read/write from Secure-world.
@@ -305,7 +305,7 @@ DEFINE_SYSREG_RW_FUNCS(vttbr_el2)
DEFINE_RENAME_SYSREG_RW_FUNCS(rcwmask_el1, RCWMASK_EL1)
DEFINE_RENAME_SYSREG_RW_FUNCS(rcwsmask_el1, RCWSMASK_EL1)
-#endif /* ENABLE_FEAT_D128 && !IMAGE_BL32 */
+#endif /* ENABLE_FEAT_D128 && !defined(IMAGE_BL32) */
DEFINE_IDREG_READ_FUNC(id_pfr0_el1)
DEFINE_IDREG_READ_FUNC(id_pfr1_el1)
diff --git a/include/arch/aarch64/el3_common_macros.S b/include/arch/aarch64/el3_common_macros.S
index aa1d197fb..2181b731a 100644
--- a/include/arch/aarch64/el3_common_macros.S
+++ b/include/arch/aarch64/el3_common_macros.S
@@ -78,7 +78,7 @@ feat_sctlr2_not_supported\@:
* ---------------------------------------------------------------------
*/
mov_imm x0, SCR_RESET_VAL
-#if IMAGE_BL31 && defined(SPD_spmd) && SPMD_SPM_AT_SEL2
+#if defined(IMAGE_BL31) && defined(SPD_spmd) && SPMD_SPM_AT_SEL2
mrs x1, id_aa64pfr0_el1
and x1, x1, #MASK(ID_AA64PFR0_SEL2)
cbz x1, 1f
diff --git a/include/common/bl_common.ld.h b/include/common/bl_common.ld.h
index 2273bc54b..282751b5c 100644
--- a/include/common/bl_common.ld.h
+++ b/include/common/bl_common.ld.h
@@ -84,7 +84,7 @@
/*
* The base xlat table
*
- * It is put into the rodata section if PLAT_RO_XLAT_TABLES=1,
+ * It is put into the rodata section if PLAT_RO_XLAT_TABLES is defined,
* or into the bss section otherwise.
*/
#define BASE_XLAT_TABLE \
@@ -93,7 +93,7 @@
*(.base_xlat_table) \
__BASE_XLAT_TABLE_END__ = .;
-#if PLAT_RO_XLAT_TABLES
+#ifdef PLAT_RO_XLAT_TABLES
#define BASE_XLAT_TABLE_RO BASE_XLAT_TABLE
#define BASE_XLAT_TABLE_BSS
#else
diff --git a/include/drivers/arm/gicv3.h b/include/drivers/arm/gicv3.h
index 07d632f8f..8669f97f4 100644
--- a/include/drivers/arm/gicv3.h
+++ b/include/drivers/arm/gicv3.h
@@ -274,12 +274,6 @@
/*******************************************************************************
* GICv3 and 3.1 CPU interface registers & constants
******************************************************************************/
-/* ICC_SRE bit definitions */
-#define ICC_SRE_EN_BIT BIT_32(3)
-#define ICC_SRE_DIB_BIT BIT_32(2)
-#define ICC_SRE_DFB_BIT BIT_32(1)
-#define ICC_SRE_SRE_BIT BIT_32(0)
-
/* ICC_IGRPEN1_EL3 bit definitions */
#define IGRPEN1_EL3_ENABLE_G1NS_SHIFT 0
#define IGRPEN1_EL3_ENABLE_G1S_SHIFT 1
diff --git a/include/drivers/auth/auth_mod.h b/include/drivers/auth/auth_mod.h
index 28aa40784..a58aa76de 100644
--- a/include/drivers/auth/auth_mod.h
+++ b/include/drivers/auth/auth_mod.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2023, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2015-2026, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -18,7 +18,7 @@
*/
#define IMG_FLAG_AUTHENTICATED (1 << 0)
-#if COT_DESC_IN_DTB && !IMAGE_BL1
+#if COT_DESC_IN_DTB && !defined(IMAGE_BL1)
/*
* Authentication image descriptor
*/
@@ -40,7 +40,7 @@ typedef struct auth_img_desc_s {
const auth_method_desc_t *const img_auth_methods;
const auth_param_desc_t *const authenticated_data;
} auth_img_desc_t;
-#endif /* COT_DESC_IN_DTB && !IMAGE_BL1 */
+#endif /* COT_DESC_IN_DTB && !defined(IMAGE_BL1) */
/* Public functions */
#if TRUSTED_BOARD_BOOT
diff --git a/include/drivers/partition/partition.h b/include/drivers/partition/partition.h
index ed6d13399..6c5b40a73 100644
--- a/include/drivers/partition/partition.h
+++ b/include/drivers/partition/partition.h
@@ -13,13 +13,13 @@
#include <drivers/partition/efi.h>
#include <tools_share/uuid.h>
-#if !PLAT_PARTITION_MAX_ENTRIES
+#if !defined(PLAT_PARTITION_MAX_ENTRIES) || !PLAT_PARTITION_MAX_ENTRIES
# define PLAT_PARTITION_MAX_ENTRIES 128
#endif /* PLAT_PARTITION_MAX_ENTRIES */
CASSERT(PLAT_PARTITION_MAX_ENTRIES <= 128, assert_plat_partition_max_entries);
-#if !PLAT_PARTITION_BLOCK_SIZE
+#if !defined(PLAT_PARTITION_BLOCK_SIZE) || !PLAT_PARTITION_BLOCK_SIZE
# define PLAT_PARTITION_BLOCK_SIZE 512
#endif /* PLAT_PARTITION_BLOCK_SIZE */
diff --git a/include/drivers/st/regulator.h b/include/drivers/st/regulator.h
index bf583e224..d07f84912 100644
--- a/include/drivers/st/regulator.h
+++ b/include/drivers/st/regulator.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021, STMicroelectronics - All Rights Reserved
+ * Copyright (c) 2021-2026, STMicroelectronics - All Rights Reserved
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -68,7 +68,7 @@ int regulator_set_flag(struct rdev *rdev, uint16_t flag);
struct regul_description {
const char *node_name;
const struct regul_ops *ops;
- const void *driver_data;
+ void *driver_data;
const char *supply_name;
const uint32_t enable_ramp_delay;
};
diff --git a/include/drivers/st/stm32_sdmmc2.h b/include/drivers/st/stm32_sdmmc2.h
index c83f62509..9f5e7af66 100644
--- a/include/drivers/st/stm32_sdmmc2.h
+++ b/include/drivers/st/stm32_sdmmc2.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2021, STMicroelectronics - All Rights Reserved
+ * Copyright (c) 2017-2026, STMicroelectronics - All Rights Reserved
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -30,6 +30,6 @@ struct stm32_sdmmc2_params {
unsigned long long stm32_sdmmc2_mmc_get_device_size(void);
int stm32_sdmmc2_mmc_init(struct stm32_sdmmc2_params *params);
-bool plat_sdmmc2_use_dma(unsigned int instance, unsigned int memory);
+bool plat_sdmmc2_use_dma(uintptr_t instance, uintptr_t memory);
#endif /* STM32_SDMMC2_H */
diff --git a/include/drivers/st/stm32mp_ddr.h b/include/drivers/st/stm32mp_ddr.h
index 970ff19e8..d1bbd2b1f 100644
--- a/include/drivers/st/stm32mp_ddr.h
+++ b/include/drivers/st/stm32mp_ddr.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2022-2024, STMicroelectronics - All Rights Reserved
+ * Copyright (C) 2022-2026, STMicroelectronics - All Rights Reserved
*
* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
*/
@@ -28,7 +28,7 @@ enum stm32mp_ddr_reg_type {
struct stm32mp_ddr_reg_desc {
uint16_t offset; /* Offset for base address */
uint8_t par_offset; /* Offset for parameter array */
-#ifdef STM32MP2X
+#if STM32MP2X
bool qd; /* quasi-dynamic register if true */
#endif
};
diff --git a/include/drivers/st/stm32mp_pmic.h b/include/drivers/st/stm32mp_pmic.h
index ba25a6ed1..cd185497d 100644
--- a/include/drivers/st/stm32mp_pmic.h
+++ b/include/drivers/st/stm32mp_pmic.h
@@ -33,7 +33,7 @@ bool initialize_pmic_i2c(void);
*/
void initialize_pmic(void);
-#if DEBUG
+#if DEBUG && !STM32MP_STPMIC1L
void print_pmic_info_and_debug(void);
#else
static inline void print_pmic_info_and_debug(void)
@@ -46,7 +46,14 @@ static inline void print_pmic_info_and_debug(void)
*
* Returns 0 on success, and negative values on errors
*/
+#if STM32MP_STPMIC1L
+static inline int pmic_voltages_init(void)
+{
+ return 0;
+}
+#else
int pmic_voltages_init(void);
+#endif
/*
* pmic_switch_off - switch off the platform with PMIC
diff --git a/include/lib/cpus/aarch64/cpu_macros.S b/include/lib/cpus/aarch64/cpu_macros.S
index a25e20cfb..334ab7cc4 100644
--- a/include/lib/cpus/aarch64/cpu_macros.S
+++ b/include/lib/cpus/aarch64/cpu_macros.S
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2025, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2014-2026, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -547,7 +547,7 @@
.endm
-#if __clang_major__ < 17
+#if defined(__clang_major__) && __clang_major__ < 17
/*
* A problem with clang version < 17 can cause resolving nested
* 'cfi_startproc' to fail compilation.
diff --git a/include/lib/el3_runtime/aarch64/context.h b/include/lib/el3_runtime/aarch64/context.h
index 7a6eebacc..bf08036b0 100644
--- a/include/lib/el3_runtime/aarch64/context.h
+++ b/include/lib/el3_runtime/aarch64/context.h
@@ -7,15 +7,15 @@
#ifndef CONTEXT_H
#define CONTEXT_H
-#if (CTX_INCLUDE_EL2_REGS && IMAGE_BL31)
-#include <lib/el3_runtime/context_el2.h>
-#else
+#if !(CTX_INCLUDE_EL2_REGS && defined(IMAGE_BL31))
/**
* El1 context is required either when:
- * IMAGE_BL1 || ((!CTX_INCLUDE_EL2_REGS) && IMAGE_BL31)
+ * defined(IMAGE_BL1) || ((!CTX_INCLUDE_EL2_REGS) && defined(IMAGE_BL31))
*/
#include <lib/el3_runtime/context_el1.h>
-#endif /* (CTX_INCLUDE_EL2_REGS && IMAGE_BL31) */
+#else
+#include <lib/el3_runtime/context_el2.h>
+#endif /* !(CTX_INCLUDE_EL2_REGS && defined(IMAGE_BL31)) */
#include <lib/el3_runtime/simd_ctx.h>
#include <lib/utils_def.h>
@@ -188,12 +188,12 @@
******************************************************************************/
#define CTX_CPTR_EL3 U(0x0)
#define CTX_MPAM3_EL3 U(0x8)
-#if (ENABLE_FEAT_IDTE3 && IMAGE_BL31)
+#if (ENABLE_FEAT_IDTE3 && defined(IMAGE_BL31))
#define CTX_IDREGS_EL3 U(0x10)
#define CTX_PERWORLD_EL3STATE_END U(0x80)
#else
#define CTX_PERWORLD_EL3STATE_END U(0x10)
-#endif /* ENABLE_FEAT_IDTE3 && IMAGE_BL31 */
+#endif /* ENABLE_FEAT_IDTE3 && defined(IMAGE_BL31) */
#ifndef __ASSEMBLER__
@@ -315,7 +315,7 @@ typedef struct cpu_context {
ddc_cap_t ddc_el0;
-#if (CTX_INCLUDE_EL2_REGS && IMAGE_BL31)
+#if (CTX_INCLUDE_EL2_REGS && defined(IMAGE_BL31))
el2_sysregs_t el2_sysregs_ctx;
#else
/* El1 context should be included only either for IMAGE_BL1,
@@ -339,7 +339,7 @@ typedef struct cpu_context {
typedef struct per_world_context {
uint64_t ctx_cptr_el3;
uint64_t ctx_mpam3_el3;
-#if (ENABLE_FEAT_IDTE3 && IMAGE_BL31)
+#if (ENABLE_FEAT_IDTE3 && defined(IMAGE_BL31))
perworld_idregs_t idregs;
#endif
} per_world_context_t;
@@ -363,7 +363,7 @@ extern per_world_context_t per_world_context[CPU_CONTEXT_NUM];
/* Macros to access members of the 'cpu_context_t' structure */
#define get_el3state_ctx(h) (&((cpu_context_t *) h)->el3state_ctx)
-#if (CTX_INCLUDE_EL2_REGS && IMAGE_BL31)
+#if (CTX_INCLUDE_EL2_REGS && defined(IMAGE_BL31))
#define get_el2_sysregs_ctx(h) (&((cpu_context_t *) h)->el2_sysregs_ctx)
#else
#define get_el1_sysregs_ctx(h) (&((cpu_context_t *) h)->el1_sysregs_ctx)
@@ -434,7 +434,7 @@ void fpregs_context_restore(simd_regs_t *regs);
* |______________________|______________________|____________________________|
* ============================================================================
******************************************************************************/
-#if (IMAGE_BL1 || ((ERRATA_SPECULATIVE_AT) || (!CTX_INCLUDE_EL2_REGS)))
+#if (defined(IMAGE_BL1) || ((ERRATA_SPECULATIVE_AT) || (!CTX_INCLUDE_EL2_REGS)))
static inline void write_ctx_sctlr_el1_reg_errata(cpu_context_t *ctx, u_register_t val)
{
@@ -476,7 +476,7 @@ static inline u_register_t read_ctx_tcr_el1_reg_errata(cpu_context_t *ctx)
#endif /* ERRATA_SPECULATIVE_AT */
}
-#endif /* (IMAGE_BL1 || ((ERRATA_SPECULATIVE_AT) || (!CTX_INCLUDE_EL2_REGS))) */
+#endif /* (defined(IMAGE_BL1) || ((ERRATA_SPECULATIVE_AT) || (!CTX_INCLUDE_EL2_REGS))) */
#endif /* __ASSEMBLER__ */
diff --git a/include/lib/el3_runtime/context_mgmt.h b/include/lib/el3_runtime/context_mgmt.h
index 99bfbbab3..013d60dd2 100644
--- a/include/lib/el3_runtime/context_mgmt.h
+++ b/include/lib/el3_runtime/context_mgmt.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2025, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2013-2026, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -41,7 +41,7 @@ void cm_init_percpu_once_regs(void);
void cm_sysregs_context_save_amu(unsigned int security_state);
void cm_sysregs_context_restore_amu(unsigned int security_state);
-#if (CTX_INCLUDE_EL2_REGS && IMAGE_BL31)
+#if (CTX_INCLUDE_EL2_REGS && defined(IMAGE_BL31))
void cm_el2_sysregs_context_save_gic(uint32_t security_state);
void cm_el2_sysregs_context_restore_gic(uint32_t security_state);
void cm_el2_sysregs_context_save(uint32_t security_state);
@@ -49,7 +49,7 @@ void cm_el2_sysregs_context_restore(uint32_t security_state);
#else
void cm_el1_sysregs_context_save(uint32_t security_state);
void cm_el1_sysregs_context_restore(uint32_t security_state);
-#endif /* (CTX_INCLUDE_EL2_REGS && IMAGE_BL31) */
+#endif /* (CTX_INCLUDE_EL2_REGS && defined(IMAGE_BL31)) */
void cm_set_elr_el3(uint32_t security_state, uintptr_t entrypoint);
void cm_set_elr_spsr_el3(uint32_t security_state,
diff --git a/include/lib/el3_runtime/cpu_data.h b/include/lib/el3_runtime/cpu_data.h
index 3f9c2f9f4..ef25b3a4d 100644
--- a/include/lib/el3_runtime/cpu_data.h
+++ b/include/lib/el3_runtime/cpu_data.h
@@ -48,13 +48,6 @@
#define CPU_DATA_CPU_DATA_PMF_TS_SIZE 0
#define CPU_DATA_CPU_DATA_PMF_TS_ALIGN 1
#endif /* ENABLE_RUNTIME_INSTRUMENTATION */
-#ifdef PLAT_PCPU_DATA_SIZE
-#define CPU_DATA_PLATFORM_CPU_DATA_SIZE PLAT_PCPU_DATA_SIZE
-#define CPU_DATA_PLATFORM_CPU_DATA_ALIGN 1
-#else /* PLAT_PCPU_DATA_SIZE */
-#define CPU_DATA_PLATFORM_CPU_DATA_SIZE 0
-#define CPU_DATA_PLATFORM_CPU_DATA_ALIGN 1
-#endif /* PLAT_PCPU_DATA_SIZE */
#if EL3_EXCEPTION_HANDLING
/* buffer space for EHF data is sizeof(pe_exc_data_t) */
#define CPU_DATA_EHF_DATA_SIZE 8
@@ -80,8 +73,7 @@
#define CPU_DATA_PSCI_SVC_CPU_DATA ROUND_UP_2EVAL((CPU_DATA_CPU_OPS_PTR + CPU_DATA_CPU_OPS_PTR_SIZE), CPU_DATA_PSCI_SVC_CPU_DATA_ALIGN)
#define CPU_DATA_APIAKEY ROUND_UP_2EVAL((CPU_DATA_PSCI_SVC_CPU_DATA + CPU_DATA_PSCI_SVC_CPU_DATA_SIZE), CPU_DATA_APIAKEY_ALIGN)
#define CPU_DATA_CPU_DATA_PMF_TS ROUND_UP_2EVAL((CPU_DATA_APIAKEY + CPU_DATA_APIAKEY_SIZE), CPU_DATA_CPU_DATA_PMF_TS_ALIGN)
-#define CPU_DATA_PLATFORM_CPU_DATA ROUND_UP_2EVAL((CPU_DATA_CPU_DATA_PMF_TS + CPU_DATA_CPU_DATA_PMF_TS_SIZE), CPU_DATA_PLATFORM_CPU_DATA_ALIGN)
-#define CPU_DATA_EHF_DATA ROUND_UP_2EVAL((CPU_DATA_PLATFORM_CPU_DATA + CPU_DATA_PLATFORM_CPU_DATA_SIZE), CPU_DATA_EHF_DATA_ALIGN)
+#define CPU_DATA_EHF_DATA ROUND_UP_2EVAL((CPU_DATA_CPU_DATA_PMF_TS + CPU_DATA_CPU_DATA_PMF_TS_SIZE), CPU_DATA_EHF_DATA_ALIGN)
#define CPU_DATA_PCPU_IDREGS ROUND_UP_2EVAL((CPU_DATA_EHF_DATA + CPU_DATA_EHF_DATA_SIZE), CPU_DATA_PCPU_IDREGS_ALIGN)
#define CPU_DATA_SIZE ROUND_UP_2EVAL((CPU_DATA_PCPU_IDREGS + CPU_DATA_PCPU_IDREGS_SIZE), CPU_DATA_SIZE_ALIGN)
@@ -132,9 +124,6 @@ typedef struct cpu_data {
#if ENABLE_RUNTIME_INSTRUMENTATION
uint64_t cpu_data_pmf_ts[CPU_DATA_PMF_TS_COUNT];
#endif
-#if PLAT_PCPU_DATA_SIZE
- uint8_t platform_cpu_data[PLAT_PCPU_DATA_SIZE];
-#endif
#if EL3_EXCEPTION_HANDLING
pe_exc_data_t ehf_data;
#endif
@@ -160,9 +149,6 @@ CPU_DATA_ASSERT_OFFSET(APIAKEY, apiakey);
#if ENABLE_RUNTIME_INSTRUMENTATION
CPU_DATA_ASSERT_OFFSET(CPU_DATA_PMF_TS, cpu_data_pmf_ts);
#endif
-#if PLAT_PCPU_DATA_SIZE
-CPU_DATA_ASSERT_OFFSET(PLATFORM_CPU_DATA, platform_cpu_data);
-#endif
#if EL3_EXCEPTION_HANDLING
CPU_DATA_ASSERT_OFFSET(EHF_DATA, ehf_data);
#endif
diff --git a/include/lib/xlat_tables/xlat_tables_v2.h b/include/lib/xlat_tables/xlat_tables_v2.h
index 04e6e1521..bfc4e5ce0 100644
--- a/include/lib/xlat_tables/xlat_tables_v2.h
+++ b/include/lib/xlat_tables/xlat_tables_v2.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2025, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2017-2026, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -390,7 +390,7 @@ int xlat_change_mem_attributes_ctx(const xlat_ctx_t *ctx, uintptr_t base_va,
size_t size, uint32_t attr);
int xlat_change_mem_attributes(uintptr_t base_va, size_t size, uint32_t attr);
-#if PLAT_RO_XLAT_TABLES
+#ifdef PLAT_RO_XLAT_TABLES
/*
* Change the memory attributes of the memory region encompassing the higher
* level translation tables to secure read-only data.
diff --git a/include/lib/xlat_tables/xlat_tables_v2_helpers.h b/include/lib/xlat_tables/xlat_tables_v2_helpers.h
index 992c94e58..77277615f 100644
--- a/include/lib/xlat_tables/xlat_tables_v2_helpers.h
+++ b/include/lib/xlat_tables/xlat_tables_v2_helpers.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2020, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2017-2026, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -71,7 +71,7 @@ struct xlat_ctx {
*/
uint64_t (*tables)[XLAT_TABLE_ENTRIES];
int tables_num;
-#if PLAT_RO_XLAT_TABLES
+#ifdef PLAT_RO_XLAT_TABLES
bool readonly_tables;
#endif
/*
@@ -126,7 +126,7 @@ struct xlat_ctx {
/* do nothing */
#endif /* PLAT_XLAT_TABLES_DYNAMIC */
-#if PLAT_RO_XLAT_TABLES
+#ifdef PLAT_RO_XLAT_TABLES
#define XLAT_CTX_INIT_TABLE_ATTR() \
.readonly_tables = false,
#else
diff --git a/include/plat/common/platform.h b/include/plat/common/platform.h
index 4d4682cd6..b953c2893 100644
--- a/include/plat/common/platform.h
+++ b/include/plat/common/platform.h
@@ -409,7 +409,6 @@ int plat_rmmd_el3_token_sign_push_req(
int plat_rmmd_el3_token_sign_pull_resp(struct el3_token_sign_response *resp);
size_t plat_rmmd_get_el3_rmm_shared_mem(uintptr_t *shared);
int plat_rmmd_load_manifest(struct rmm_manifest *manifest);
-int plat_rmmd_mecid_key_update(uint16_t mecid, unsigned int reason);
uintptr_t plat_rmmd_reserve_memory(size_t size, unsigned long alignment);
/* The following 4 functions are to be implemented if
diff --git a/include/services/firme/firme_mecid.h b/include/services/firme/firme_mecid.h
new file mode 100644
index 000000000..7ec043350
--- /dev/null
+++ b/include/services/firme/firme_mecid.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2026, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef FIRME_MEC_H
+#define FIRME_MEC_H
+
+#include <stdint.h>
+
+#include <services/firme/firme_abi.h>
+
+#define FIRME_MECID_MGMT_VERSION_MAJOR U(1)
+#define FIRME_MECID_MGMT_VERSION_MINOR U(0)
+
+#define FIRME_MEC_FNUM_REFRESH U(0x7)
+
+/*
+ * FIRME_MEC_REFRESH
+ *
+ * This function refreshes the MEC linked to a given MECID by invalidating the
+ * existing MEC, generating a new one, and associating the new MEC with that MECID.
+ *
+ * Supported from v1.0
+ *
+ * Arguments
+ * arg0(w0): Function ID 0xC4000407
+ * arg1(x1): MEC params Bits[63:48]: Reserved (SBZ).
+ * Bits[47:32]: MECID.
+ * Bits[31:1]: Reserved (SBZ).
+ * Bits[0]: MEC refresh reason.
+ * – 0b’0: Realm creation.
+ * – 0b’1: Realm destruction
+ *
+ * Return
+ * ret0(x0): Status FIRME_SUCCESS
+ * FIRME_NOT_SUPPORTED
+ * FIRME_INVALID_PARAMETERS
+ * FIRME_RETRY
+ */
+#define FIRME_MEC_REFRESH_FID FIRME_FID(FIRME_MEC_FNUM_REFRESH)
+
+#define MEC_REFRESH_REASON_REALM_CREATE U(0)
+#define MEC_REFRESH_REASON_REALM_DESTROY U(1)
+
+#define MEC_PARAM_MECID_SHIFT U(32)
+#define MEC_PARAM_MECID_WIDTH U(16)
+#define MEC_PARAM_MECID_MASK MASK(MEC_PARAM_MECID)
+
+#define FIRME_MECID_FEATURE_REG_COUNT U(2)
+#define FIRME_MECID_FEAT_REG0_MEC_REFRESH_BIT BIT(0)
+#define FIRME_MECID_FEAT_REG1_COMMON_MECID_WIDTH_BITS_SHIFT U(0)
+#define FIRME_MECID_FEAT_REG1_COMMON_MECID_WIDTH_BITS_WIDTH U(4)
+#define FIRME_MECID_FEAT_REG1_COMMON_MECID_WIDTH_BITS_MASK MASK(FIRME_MECID_FEAT_REG1_COMMON_MECID_WIDTH_BITS)
+
+int32_t firme_mecid_service_init(void);
+int plat_firme_mec_refresh(uint16_t mecid, uint8_t reason);
+uint8_t plat_firme_get_common_mecid_width(void);
+
+#endif /* FIRME_MEC_H */
diff --git a/include/services/firme_svc.h b/include/services/firme_svc.h
index c229d116b..483de0862 100644
--- a/include/services/firme_svc.h
+++ b/include/services/firme_svc.h
@@ -110,7 +110,10 @@ typedef struct {
#define FIRME_BASE_MAX_SH_BUF_PG_CNT_MASK U(0x3FFF)
#define FIRME_BASE_SERVICE_LIST_SHIFT U(16)
#define FIRME_BASE_SERVICE_LIST_MASK U(0xFFFF)
-#define FIRME_BASE_SERVICE_GRANULE_MGMT_BIT BIT(16)
+#define FIRME_BASE_SERVICE_BIT(_id) BIT((_id) + \
+ FIRME_BASE_SERVICE_LIST_SHIFT)
+#define FIRME_BASE_SERVICE_GRANULE_MGMT_BIT FIRME_BASE_SERVICE_BIT(0)
+#define FIRME_BASE_SERVICE_MECID_BIT FIRME_BASE_SERVICE_BIT(2)
/* Granule management service feature register definitions. */
#define FIRME_GM_GPI_SET_BIT BIT(0)
@@ -194,36 +197,56 @@ typedef struct {
/* These are unimplemented so far and will be added in the future. */
/* Granule management service ABIs */
-#define FIRME_GM_GPI_OP_CONTINUE SMC64_FIRME_FID(U(0x12))
-#define FIRME_GM_L1_GPT_CREATE SMC64_FIRME_FID(U(0xE))
-#define FIRME_GM_L1_GPT_DESTROY SMC64_FIRME_FID(U(0xF))
+#define FIRME_GM_GPI_OP_CONTINUE_FID SMC64_FIRME_FID(U(0x12))
+#define FIRME_GM_L1_GPT_CREATE_FID SMC64_FIRME_FID(U(0xE))
+#define FIRME_GM_L1_GPT_DESTROY_FID SMC64_FIRME_FID(U(0xF))
/* IDE key management service */
-#define FIRME_IDE_KEYSET_PROG SMC64_FIRME_FID(U(0x3))
-#define FIRME_IDE_KEYSET_GO SMC64_FIRME_FID(U(0x4))
-#define FIRME_IDE_KEYSET_STOP SMC64_FIRME_FID(U(0x5))
-#define FIRME_IDE_KEYSET_POLL SMC64_FIRME_FID(U(0x6))
+#define FIRME_IDE_KEYSET_PROG_FID SMC64_FIRME_FID(U(0x3))
+#define FIRME_IDE_KEYSET_GO_FID SMC64_FIRME_FID(U(0x4))
+#define FIRME_IDE_KEYSET_STOP_FID SMC64_FIRME_FID(U(0x5))
+#define FIRME_IDE_KEYSET_POLL_FID SMC64_FIRME_FID(U(0x6))
/* MECID management service */
-#define FIRME_MEC_REFRESH SMC64_FIRME_FID(U(0x7))
+#define FIRME_MEC_REFRESH_FID SMC64_FIRME_FID(U(0x7))
+
+#define MEC_REFRESH_REASON_REALM_CREATE U(0)
+#define MEC_REFRESH_REASON_REALM_DESTROY U(1)
+
+#define MEC_PARAM_MECID_SHIFT U(32)
+#define MEC_PARAM_MECID_WIDTH U(16)
+#define MEC_PARAM_MECID_MASK MASK(MEC_PARAM_MECID)
+
+#define FIRME_MECID_FEATURE_REG_COUNT U(2)
+#define FIRME_MECID_FEAT_REG0_MEC_REFRESH_BIT BIT(0)
+#define FIRME_MECID_FEAT_REG1_COMMON_MECID_WIDTH_BITS_SHIFT U(0)
+#define FIRME_MECID_FEAT_REG1_COMMON_MECID_WIDTH_BITS_WIDTH U(4)
+#define FIRME_MECID_FEAT_REG1_COMMON_MECID_WIDTH_BITS_MASK MASK(FIRME_MECID_FEAT_REG1_COMMON_MECID_WIDTH_BITS)
/* Attestation service */
-#define FIRME_ATTEST_PAT_GET SMC64_FIRME_FID(U(0x8))
-#define FIRME_ATTEST_RAK_GET SMC64_FIRME_FID(U(0x9))
-#define FIRME_ATTEST_RAT_SIGN SMC64_FIRME_FID(U(0xA))
-#define FIRME_ATTEST_PAT_EXT_CLAIMS_STAGE SMC64_FIRME_FID(U(0xB))
-#define FIRME_ATTEST_PAT_EXT_CLAIMS_CLEAR SMC64_FIRME_FID(U(0xC))
-#define FIRME_ATTEST_PAT_EXT_CLAIMS_FINALISE SMC64_FIRME_FID(U(0xD))
+#define FIRME_ATTEST_PAT_GET_FID SMC64_FIRME_FID(U(0x8))
+#define FIRME_ATTEST_RAK_GET_FID SMC64_FIRME_FID(U(0x9))
+#define FIRME_ATTEST_RAT_SIGN_FID SMC64_FIRME_FID(U(0xA))
+#define FIRME_ATTEST_PAT_EXT_CLAIMS_STAGE_FID SMC64_FIRME_FID(U(0xB))
+#define FIRME_ATTEST_PAT_EXT_CLAIMS_CLEAR_FID SMC64_FIRME_FID(U(0xC))
+#define FIRME_ATTEST_PAT_EXT_CLAIMS_FINALISE_FID SMC64_FIRME_FID(U(0xD))
/* Integrated device management service */
-#define FIRME_IDEV_OP_START SMC64_FIRME_FID(U(0x10))
-#define FIRME_IDEV_OP_CONTINUE SMC64_FIRME_FID(U(0x11))
+#define FIRME_IDEV_OP_START_FID SMC64_FIRME_FID(U(0x10))
+#define FIRME_IDEV_OP_CONTINUE_FID SMC64_FIRME_FID(U(0x11))
/* Top level handler for FIRME SMC calls. */
+int32_t firme_init(void);
+
uint64_t firme_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3,
uint64_t x4, void *cookie, void *handle, uint64_t flags);
firme_service_info_t *firme_granule_mgmt_service_get_info(void);
+firme_service_info_t *firme_mecid_service_get_info(void);
+
+int32_t firme_mecid_service_init(void);
+int plat_firme_mec_refresh(uint16_t mecid, uint8_t reason);
+uint8_t plat_firme_get_common_mecid_width(void);
u_register_t firme_base_service_handler(firme_instance_e instance, uint32_t smc_fid,
uint64_t x1, uint64_t x2, uint64_t x3,
@@ -236,4 +259,10 @@ u_register_t firme_granule_mgmt_service_handler(firme_instance_e instance,
uint64_t x4, void *cookie,
void *handle, uint64_t flags);
+u_register_t firme_mecid_service_handler(firme_instance_e instance,
+ uint32_t smc_fid, uint64_t x1,
+ uint64_t x2, uint64_t x3,
+ uint64_t x4, void *cookie,
+ void *handle, uint64_t flags);
+
#endif /* FIRME_SVC_H */
diff --git a/lib/cpus/aarch32/cortex_a15.S b/lib/cpus/aarch32/cortex_a15.S
index 53489ad19..f0f9c7039 100644
--- a/lib/cpus/aarch32/cortex_a15.S
+++ b/lib/cpus/aarch32/cortex_a15.S
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2024, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2016-2026, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -124,7 +124,7 @@ func cortex_a15_reset_func
bl errata_a15_827671_wa
#endif
-#if IMAGE_BL32 && (WORKAROUND_CVE_2017_5715 || WORKAROUND_CVE_2022_23960)
+#if defined(IMAGE_BL32) && (WORKAROUND_CVE_2017_5715 || WORKAROUND_CVE_2022_23960)
ldcopr r0, ACTLR
orr r0, #CORTEX_A15_ACTLR_INV_BTB_BIT
stcopr r0, ACTLR
diff --git a/lib/cpus/aarch32/cortex_a17.S b/lib/cpus/aarch32/cortex_a17.S
index 05e96169e..910962918 100644
--- a/lib/cpus/aarch32/cortex_a17.S
+++ b/lib/cpus/aarch32/cortex_a17.S
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2024, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2017-2026, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -121,7 +121,7 @@ func cortex_a17_reset_func
bl errata_a17_852423_wa
#endif
-#if IMAGE_BL32 && WORKAROUND_CVE_2017_5715
+#if defined(IMAGE_BL32) && WORKAROUND_CVE_2017_5715
ldr r0, =wa_cve_2017_5715_bpiall_vbar
stcopr r0, VBAR
stcopr r0, MVBAR
diff --git a/lib/cpus/aarch32/cortex_a9.S b/lib/cpus/aarch32/cortex_a9.S
index dc5ff2703..526433f68 100644
--- a/lib/cpus/aarch32/cortex_a9.S
+++ b/lib/cpus/aarch32/cortex_a9.S
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2024, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2016-2026, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -58,7 +58,7 @@ endfunc check_errata_cve_2017_5715
add_erratum_entry cortex_a9, CVE(2017, 5715), WORKAROUND_CVE_2017_5715
func cortex_a9_reset_func
-#if IMAGE_BL32 && WORKAROUND_CVE_2017_5715
+#if defined(IMAGE_BL32) && WORKAROUND_CVE_2017_5715
ldr r0, =wa_cve_2017_5715_bpiall_vbar
stcopr r0, VBAR
stcopr r0, MVBAR
diff --git a/lib/cpus/aarch64/c1_premium.S b/lib/cpus/aarch64/c1_premium.S
index 38bc0561f..f6683eeef 100644
--- a/lib/cpus/aarch64/c1_premium.S
+++ b/lib/cpus/aarch64/c1_premium.S
@@ -110,7 +110,7 @@ check_erratum_ls c1_premium, CVE(2024, 7881), CPU_REV(0, 0)
* Enables mitigation for CVE-2025-0647.
*/
workaround_reset_start c1_premium, CVE(2025, 647), WORKAROUND_CVE_2025_0647
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
mov x0, #WA_PATCH_SLOT(3)
bl wa_cve_2025_0647_instruction_patch
#endif /* IMAGE_BL31 */
@@ -174,7 +174,7 @@ func c1_premium_cpu_reg_dump
ret
endfunc c1_premium_cpu_reg_dump
-#if WORKAROUND_CVE_2025_0647 && IMAGE_BL31
+#if WORKAROUND_CVE_2025_0647 && defined(IMAGE_BL31)
declare_cpu_ops_eh c1_premium, C1_PREMIUM_MIDR, \
c1_premium_reset_func, \
c1_premium_impl_defined_el3_handler, \
diff --git a/lib/cpus/aarch64/c1_ultra.S b/lib/cpus/aarch64/c1_ultra.S
index c02c787c6..e593bc4dd 100644
--- a/lib/cpus/aarch64/c1_ultra.S
+++ b/lib/cpus/aarch64/c1_ultra.S
@@ -113,7 +113,7 @@ check_erratum_ls c1_ultra, CVE(2024, 7881), CPU_REV(0, 0)
* Enables mitigation for CVE-2025-0647.
*/
workaround_reset_start c1_ultra, CVE(2025, 647), WORKAROUND_CVE_2025_0647
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
mov x0, #WA_PATCH_SLOT(3)
bl wa_cve_2025_0647_instruction_patch
#endif /* IMAGE_BL31 */
@@ -183,7 +183,7 @@ func c1_ultra_cpu_reg_dump
ret
endfunc c1_ultra_cpu_reg_dump
-#if WORKAROUND_CVE_2025_0647 && IMAGE_BL31
+#if WORKAROUND_CVE_2025_0647 && defined(IMAGE_BL31)
declare_cpu_ops_eh c1_ultra, C1_ULTRA_MIDR, \
c1_ultra_reset_func, \
c1_ultra_impl_defined_el3_handler, \
diff --git a/lib/cpus/aarch64/cortex_a57.S b/lib/cpus/aarch64/cortex_a57.S
index 53621d1a7..d93017ce1 100644
--- a/lib/cpus/aarch64/cortex_a57.S
+++ b/lib/cpus/aarch64/cortex_a57.S
@@ -162,7 +162,7 @@ check_erratum_chosen cortex_a57, ERRATUM(1319537), ERRATA_A57_1319537
add_erratum_entry cortex_a57, ERRATUM(1319537), ERRATA_A57_1319537
workaround_reset_start cortex_a57, CVE(2017, 5715), WORKAROUND_CVE_2017_5715
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
override_vector_table wa_cve_2017_5715_mmu_vbar
#endif
workaround_reset_end cortex_a57, CVE(2017, 5715)
@@ -178,7 +178,7 @@ workaround_reset_end cortex_a57, CVE(2018, 3639)
check_erratum_chosen cortex_a57, CVE(2018, 3639), WORKAROUND_CVE_2018_3639
workaround_reset_start cortex_a57, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
override_vector_table wa_cve_2017_5715_mmu_vbar
#endif
workaround_reset_end cortex_a57, CVE(2022, 23960)
diff --git a/lib/cpus/aarch64/cortex_a710.S b/lib/cpus/aarch64/cortex_a710.S
index 4e919d467..13c056316 100644
--- a/lib/cpus/aarch64/cortex_a710.S
+++ b/lib/cpus/aarch64/cortex_a710.S
@@ -300,7 +300,7 @@ add_erratum_entry cortex_a710, ERRATUM(3701772), ERRATA_A710_3701772
check_erratum_ls cortex_a710, ERRATUM(3701772), CPU_REV(2, 1)
workaround_reset_start cortex_a710, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
/*
* The Cortex-A710 generic vectors are overridden to apply errata
* mitigation on exception entry from lower ELs.
@@ -323,7 +323,7 @@ check_erratum_ls cortex_a710, CVE(2024, 5660), CPU_REV(2, 1)
* Enables mitigation for CVE-2025-0647.
*/
workaround_reset_start cortex_a710, CVE(2025, 647), WORKAROUND_CVE_2025_0647
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
mov x0, #(WA_USE_T32_OPCODE | WA_PATCH_SLOT(0))
bl wa_cve_2025_0647_instruction_patch
#endif /* IMAGE_BL31 */
@@ -391,7 +391,7 @@ func cortex_a710_cpu_reg_dump
ret
endfunc cortex_a710_cpu_reg_dump
-#if WORKAROUND_CVE_2025_0647 && IMAGE_BL31
+#if WORKAROUND_CVE_2025_0647 && defined(IMAGE_BL31)
declare_cpu_ops_eh cortex_a710, CORTEX_A710_MIDR, \
cortex_a710_reset_func, \
cortex_a710_impl_defined_el3_handler, \
diff --git a/lib/cpus/aarch64/cortex_a715.S b/lib/cpus/aarch64/cortex_a715.S
index f744c59d0..520be90bd 100644
--- a/lib/cpus/aarch64/cortex_a715.S
+++ b/lib/cpus/aarch64/cortex_a715.S
@@ -212,7 +212,7 @@ workaround_reset_end cortex_a715, ERRATUM(3711916)
check_erratum_ls cortex_a715, ERRATUM(3711916), CPU_REV(1, 3)
workaround_reset_start cortex_a715, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
/*
* The Cortex-A715 generic vectors are overridden to apply errata
* mitigation on exception entry from lower ELs.
diff --git a/lib/cpus/aarch64/cortex_a72.S b/lib/cpus/aarch64/cortex_a72.S
index c6fe63169..2c4be6af4 100644
--- a/lib/cpus/aarch64/cortex_a72.S
+++ b/lib/cpus/aarch64/cortex_a72.S
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2025, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2015-2026, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -81,7 +81,7 @@ check_erratum_chosen cortex_a72, ERRATUM(1319367), ERRATA_A72_1319367
add_erratum_entry cortex_a72, ERRATUM(1319367), ERRATA_A72_1319367
workaround_reset_start cortex_a72, CVE(2017, 5715), WORKAROUND_CVE_2017_5715
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
override_vector_table wa_cve_2017_5715_mmu_vbar
#endif
workaround_reset_end cortex_a72, CVE(2017, 5715)
@@ -97,7 +97,7 @@ workaround_reset_end cortex_a72, CVE(2018, 3639)
check_erratum_chosen cortex_a72, CVE(2018, 3639), WORKAROUND_CVE_2018_3639
workaround_reset_start cortex_a72, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
/* Skip installing vector table again if already done for CVE(2017, 5715) */
/*
* The Cortex-A72 generic vectors are overridden to apply the
diff --git a/lib/cpus/aarch64/cortex_a73.S b/lib/cpus/aarch64/cortex_a73.S
index 3af37d471..fcc29f40c 100644
--- a/lib/cpus/aarch64/cortex_a73.S
+++ b/lib/cpus/aarch64/cortex_a73.S
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016-2025, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2016-2026, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -41,7 +41,7 @@ workaround_reset_end cortex_a73, ERRATUM(855423)
check_erratum_ls cortex_a73, ERRATUM(855423), CPU_REV(0, 1)
workaround_reset_start cortex_a73, CVE(2017, 5715), WORKAROUND_CVE_2017_5715
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
override_vector_table wa_cve_2017_5715_bpiall_vbar
#endif /* IMAGE_BL31 */
workaround_reset_end cortex_a73, CVE(2017, 5715)
@@ -56,7 +56,7 @@ workaround_reset_end cortex_a73, CVE(2018, 3639)
check_erratum_chosen cortex_a73, CVE(2018, 3639), WORKAROUND_CVE_2018_3639
workaround_reset_start cortex_a73, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
/* Skip installing vector table again for CVE_2022_23960 */
adr x0, wa_cve_2017_5715_bpiall_vbar
mrs x1, vbar_el3
diff --git a/lib/cpus/aarch64/cortex_a75.S b/lib/cpus/aarch64/cortex_a75.S
index c835d94b1..e3bf290b0 100644
--- a/lib/cpus/aarch64/cortex_a75.S
+++ b/lib/cpus/aarch64/cortex_a75.S
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2025, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2017-2026, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -56,7 +56,7 @@ check_erratum_custom_start cortex_a75, ERRATUM(936184)
check_erratum_custom_end cortex_a75, ERRATUM(936184)
workaround_reset_start cortex_a75, CVE(2017, 5715), WORKAROUND_CVE_2017_5715
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
override_vector_table wa_cve_2017_5715_bpiall_vbar
#endif /* IMAGE_BL31 */
workaround_reset_end cortex_a75, CVE(2017, 5715)
@@ -71,7 +71,7 @@ workaround_reset_end cortex_a75, CVE(2018, 3639)
check_erratum_chosen cortex_a75, CVE(2018, 3639), WORKAROUND_CVE_2018_3639
workaround_reset_start cortex_a75, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
/* Skip installing vector table again if already done for CVE(2017, 5715) */
adr x0, wa_cve_2017_5715_bpiall_vbar
mrs x1, vbar_el3
diff --git a/lib/cpus/aarch64/cortex_a76.S b/lib/cpus/aarch64/cortex_a76.S
index 49af2ed1b..18ec13007 100644
--- a/lib/cpus/aarch64/cortex_a76.S
+++ b/lib/cpus/aarch64/cortex_a76.S
@@ -521,7 +521,7 @@ cpu_reset_func_start cortex_a76
#endif /* DYNAMIC_WORKAROUND_CVE_2018_3639 */
#endif /* WORKAROUND_CVE_2018_3639 */
-#if IMAGE_BL31 && WORKAROUND_CVE_2022_23960
+#if defined(IMAGE_BL31) && WORKAROUND_CVE_2022_23960
/*
* The Cortex-A76 generic vectors are overridden to apply errata
* mitigation on exception entry from lower ELs. This will be bypassed
diff --git a/lib/cpus/aarch64/cortex_a76ae.S b/lib/cpus/aarch64/cortex_a76ae.S
index 5d7bc4a23..5b48d92ce 100644
--- a/lib/cpus/aarch64/cortex_a76ae.S
+++ b/lib/cpus/aarch64/cortex_a76ae.S
@@ -94,7 +94,7 @@ add_erratum_entry cortex_a76ae, CVE(2025, 10263), WORKAROUND_CVE_2025_10263
check_erratum_chosen cortex_a76ae, CVE(2025, 10263), WORKAROUND_CVE_2025_10263
workaround_reset_start cortex_a76ae, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
/*
* The Cortex-A76ae generic vectors are overridden to apply errata
* mitigation on exception entry from lower ELs.
diff --git a/lib/cpus/aarch64/cortex_a77.S b/lib/cpus/aarch64/cortex_a77.S
index a0127bfd3..4a242d870 100644
--- a/lib/cpus/aarch64/cortex_a77.S
+++ b/lib/cpus/aarch64/cortex_a77.S
@@ -174,7 +174,7 @@ workaround_reset_end cortex_a77, ERRATUM(3888015)
check_erratum_chosen cortex_a77, ERRATUM(3888015), ERRATA_A77_3888015
workaround_reset_start cortex_a77, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
/*
* The Cortex-A77 generic vectors are overridden to apply errata
* mitigation on exception entry from lower ELs.
diff --git a/lib/cpus/aarch64/cortex_a78.S b/lib/cpus/aarch64/cortex_a78.S
index b1ecc93a9..b3b3156d1 100644
--- a/lib/cpus/aarch64/cortex_a78.S
+++ b/lib/cpus/aarch64/cortex_a78.S
@@ -244,7 +244,7 @@ workaround_reset_end cortex_a78, ERRATUM(4302972)
check_erratum_chosen cortex_a78, ERRATUM(4302972), ERRATA_A78_4302972
workaround_reset_start cortex_a78, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
/*
* The Cortex-X1 generic vectors are overridden to apply errata
* mitigation on exception entry from lower ELs.
diff --git a/lib/cpus/aarch64/cortex_a78_ae.S b/lib/cpus/aarch64/cortex_a78_ae.S
index a53aba048..4a682c154 100644
--- a/lib/cpus/aarch64/cortex_a78_ae.S
+++ b/lib/cpus/aarch64/cortex_a78_ae.S
@@ -151,7 +151,7 @@ workaround_reset_end cortex_a78_ae, ERRATUM(4302973)
check_erratum_chosen cortex_a78_ae, ERRATUM(4302973), ERRATA_A78_AE_4302973
workaround_reset_start cortex_a78_ae, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
/*
* The Cortex-A78AE generic vectors are overridden to apply errata
* mitigation on exception entry from lower ELs.
diff --git a/lib/cpus/aarch64/cortex_a78c.S b/lib/cpus/aarch64/cortex_a78c.S
index a8303de18..074f81d8c 100644
--- a/lib/cpus/aarch64/cortex_a78c.S
+++ b/lib/cpus/aarch64/cortex_a78c.S
@@ -182,7 +182,7 @@ check_erratum_chosen cortex_a78c, ERRATUM(4302974), ERRATA_A78C_4302974
check_erratum_chosen cortex_a78c, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
workaround_reset_start cortex_a78c, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
/*
* The Cortex-A78c generic vectors are overridden to apply errata
* mitigation on exception entry from lower ELs.
diff --git a/lib/cpus/aarch64/cortex_x1.S b/lib/cpus/aarch64/cortex_x1.S
index 17c7ccad0..de96fcf77 100644
--- a/lib/cpus/aarch64/cortex_x1.S
+++ b/lib/cpus/aarch64/cortex_x1.S
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2022-2024, Google LLC. All rights reserved.
+ * Copyright (c) 2026, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -223,7 +224,7 @@ check_erratum_chosen cortex_x1, ERRATUM(4302972), ERRATA_X1_4302972
check_erratum_chosen cortex_x1, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
workaround_reset_start cortex_x1, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
/*
* The Cortex-X1 generic vectors are overridden to apply errata
* mitigation on exception entry from lower ELs.
diff --git a/lib/cpus/aarch64/cortex_x2.S b/lib/cpus/aarch64/cortex_x2.S
index d7bfea7be..b6aa8f7e1 100644
--- a/lib/cpus/aarch64/cortex_x2.S
+++ b/lib/cpus/aarch64/cortex_x2.S
@@ -281,7 +281,7 @@ workaround_reset_end cortex_x2, ERRATUM(4302969)
check_erratum_ls cortex_x2, ERRATUM(4302969), CPU_REV(2, 1)
workaround_reset_start cortex_x2, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
/*
* The Cortex-X2 generic vectors are overridden to apply errata
* mitigation on exception entry from lower ELs.
@@ -304,7 +304,7 @@ check_erratum_chosen cortex_x2, CVE(2024, 5660), WORKAROUND_CVE_2024_5660
* Enables mitigation for CVE-2025-0647.
*/
workaround_reset_start cortex_x2, CVE(2025, 647), WORKAROUND_CVE_2025_0647
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
mov x0, #(WA_USE_T32_OPCODE | WA_PATCH_SLOT(0))
bl wa_cve_2025_0647_instruction_patch
#endif /* IMAGE_BL31 */
@@ -372,7 +372,7 @@ func cortex_x2_cpu_reg_dump
ret
endfunc cortex_x2_cpu_reg_dump
-#if WORKAROUND_CVE_2025_0647 && IMAGE_BL31
+#if WORKAROUND_CVE_2025_0647 && defined(IMAGE_BL31)
declare_cpu_ops_eh cortex_x2, CORTEX_X2_MIDR, \
cortex_x2_reset_func, \
cortex_x2_impl_defined_el3_handler, \
diff --git a/lib/cpus/aarch64/cortex_x3.S b/lib/cpus/aarch64/cortex_x3.S
index 7c01bccd4..71f4d18a1 100644
--- a/lib/cpus/aarch64/cortex_x3.S
+++ b/lib/cpus/aarch64/cortex_x3.S
@@ -169,7 +169,7 @@ workaround_reset_end cortex_x3, ERRATUM(4302966)
check_erratum_ls cortex_x3, ERRATUM(4302966), CPU_REV(1, 2)
workaround_reset_start cortex_x3, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
override_vector_table wa_cve_vbar_cortex_x3
#endif /* IMAGE_BL31 */
workaround_reset_end cortex_x3, CVE(2022, 23960)
@@ -200,7 +200,7 @@ check_erratum_ls cortex_x3, CVE(2024, 7881), CPU_REV(1, 2)
* Enables mitigation for CVE-2025-0647.
*/
workaround_reset_start cortex_x3, CVE(2025, 647), WORKAROUND_CVE_2025_0647
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
mov x0, #WA_PATCH_SLOT(3)
bl wa_cve_2025_0647_instruction_patch
#endif /* IMAGE_BL31 */
@@ -264,7 +264,7 @@ func cortex_x3_cpu_reg_dump
ret
endfunc cortex_x3_cpu_reg_dump
-#if WORKAROUND_CVE_2025_0647 && IMAGE_BL31
+#if WORKAROUND_CVE_2025_0647 && defined(IMAGE_BL31)
declare_cpu_ops_eh cortex_x3, CORTEX_X3_MIDR, \
cortex_x3_reset_func, \
cortex_x3_impl_defined_el3_handler, \
diff --git a/lib/cpus/aarch64/cortex_x4.S b/lib/cpus/aarch64/cortex_x4.S
index 5b2c7902d..75526a814 100644
--- a/lib/cpus/aarch64/cortex_x4.S
+++ b/lib/cpus/aarch64/cortex_x4.S
@@ -191,7 +191,7 @@ check_erratum_ls cortex_x4, CVE(2024, 7881), CPU_REV(0, 2)
* Enables mitigation for CVE-2025-0647.
*/
workaround_reset_start cortex_x4, CVE(2025, 647), WORKAROUND_CVE_2025_0647
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
mov x0, #WA_PATCH_SLOT(3)
bl wa_cve_2025_0647_instruction_patch
#endif /* IMAGE_BL31 */
@@ -256,7 +256,7 @@ func cortex_x4_cpu_reg_dump
ret
endfunc cortex_x4_cpu_reg_dump
-#if WORKAROUND_CVE_2025_0647 && IMAGE_BL31
+#if WORKAROUND_CVE_2025_0647 && defined(IMAGE_BL31)
declare_cpu_ops_eh cortex_x4, CORTEX_X4_MIDR, \
cortex_x4_reset_func, \
cortex_x4_impl_defined_el3_handler, \
diff --git a/lib/cpus/aarch64/cortex_x925.S b/lib/cpus/aarch64/cortex_x925.S
index 98b2d9e64..e5ff2f751 100644
--- a/lib/cpus/aarch64/cortex_x925.S
+++ b/lib/cpus/aarch64/cortex_x925.S
@@ -123,7 +123,7 @@ check_erratum_ls cortex_x925, CVE(2024, 7881), CPU_REV(0, 1)
* Enables mitigation for CVE-2025-0647.
*/
workaround_reset_start cortex_x925, CVE(2025, 647), WORKAROUND_CVE_2025_0647
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
mov x0, #WA_PATCH_SLOT(3)
bl wa_cve_2025_0647_instruction_patch
#endif /* IMAGE_BL31 */
@@ -186,7 +186,7 @@ func cortex_x925_cpu_reg_dump
ret
endfunc cortex_x925_cpu_reg_dump
-#if WORKAROUND_CVE_2025_0647 && IMAGE_BL31
+#if WORKAROUND_CVE_2025_0647 && defined(IMAGE_BL31)
declare_cpu_ops_eh cortex_x925, CORTEX_X925_MIDR, \
cortex_x925_reset_func, \
cortex_x925_impl_defined_el3_handler, \
diff --git a/lib/cpus/aarch64/denver.S b/lib/cpus/aarch64/denver.S
index 22cd3ba4b..ffb9326e8 100644
--- a/lib/cpus/aarch64/denver.S
+++ b/lib/cpus/aarch64/denver.S
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2025, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2015-2026, Arm Limited and Contributors. All rights reserved.
* Copyright (c) 2020-2022, NVIDIA Corporation. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
@@ -210,7 +210,7 @@ func denver_disable_dco
endfunc denver_disable_dco
workaround_reset_start denver, CVE(2017, 5715), WORKAROUND_CVE_2017_5715
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
adr x1, workaround_bpflush_runtime_exceptions
msr vbar_el3, x1
#endif
diff --git a/lib/cpus/aarch64/neoverse_n1.S b/lib/cpus/aarch64/neoverse_n1.S
index 2db854018..729b1f5d3 100644
--- a/lib/cpus/aarch64/neoverse_n1.S
+++ b/lib/cpus/aarch64/neoverse_n1.S
@@ -204,7 +204,7 @@ workaround_reset_end neoverse_n1, ERRATUM(3888013)
check_erratum_chosen neoverse_n1, ERRATUM(3888013), ERRATA_N1_3888013
workaround_reset_start neoverse_n1, CVE(2022, 23960), WORKAROUND_CVE_2022_23960
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
/*
* The Neoverse-N1 generic vectors are overridden to apply errata
* mitigation on exception entry from lower ELs.
diff --git a/lib/cpus/aarch64/neoverse_n2.S b/lib/cpus/aarch64/neoverse_n2.S
index a3d3f470b..e81c9872e 100644
--- a/lib/cpus/aarch64/neoverse_n2.S
+++ b/lib/cpus/aarch64/neoverse_n2.S
@@ -250,7 +250,7 @@ workaround_reset_end neoverse_n2, ERRATUM(4302970)
check_erratum_ls neoverse_n2, ERRATUM(4302970), CPU_REV(0, 3)
workaround_reset_start neoverse_n2, CVE(2022,23960), WORKAROUND_CVE_2022_23960
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
/*
* The Neoverse-N2 generic vectors are overridden to apply errata
* mitigation on exception entry from lower ELs.
@@ -273,7 +273,7 @@ check_erratum_ls neoverse_n2, CVE(2024, 5660), CPU_REV(0, 3)
* Enables mitigation for CVE-2025-0647.
*/
workaround_reset_start neoverse_n2, CVE(2025, 647), WORKAROUND_CVE_2025_0647
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
mov x0, #(WA_USE_T32_OPCODE | WA_PATCH_SLOT(0))
bl wa_cve_2025_0647_instruction_patch
#endif /* IMAGE_BL31 */
@@ -370,7 +370,7 @@ func neoverse_n2_cpu_reg_dump
ret
endfunc neoverse_n2_cpu_reg_dump
-#if WORKAROUND_CVE_2025_0647 && IMAGE_BL31
+#if WORKAROUND_CVE_2025_0647 && defined(IMAGE_BL31)
declare_cpu_ops_eh neoverse_n2, NEOVERSE_N2_MIDR, \
neoverse_n2_reset_func, \
neoverse_n2_impl_defined_el3_handler, \
diff --git a/lib/cpus/aarch64/neoverse_v1.S b/lib/cpus/aarch64/neoverse_v1.S
index aaf3f201c..9ecc8d137 100644
--- a/lib/cpus/aarch64/neoverse_v1.S
+++ b/lib/cpus/aarch64/neoverse_v1.S
@@ -268,7 +268,7 @@ workaround_reset_end neoverse_v1, ERRATUM(3888016)
check_erratum_chosen neoverse_v1, ERRATUM(3888016), ERRATA_V1_3888016
workaround_reset_start neoverse_v1, CVE(2022,23960), WORKAROUND_CVE_2022_23960
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
/*
* The Neoverse-V1 generic vectors are overridden to apply errata
* mitigation on exception entry from lower ELs.
diff --git a/lib/cpus/aarch64/neoverse_v2.S b/lib/cpus/aarch64/neoverse_v2.S
index 64570057a..a4eede382 100644
--- a/lib/cpus/aarch64/neoverse_v2.S
+++ b/lib/cpus/aarch64/neoverse_v2.S
@@ -116,7 +116,7 @@ workaround_reset_end neoverse_v2, ERRATUM(4302968)
check_erratum_ls neoverse_v2, ERRATUM(4302968), CPU_REV(0, 2)
workaround_reset_start neoverse_v2, CVE(2022,23960), WORKAROUND_CVE_2022_23960
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
/*
* The Neoverse-V2 generic vectors are overridden to apply errata
* mitigation on exception entry from lower ELs.
@@ -155,7 +155,7 @@ check_erratum_ls neoverse_v2, CVE(2024, 7881), CPU_REV(0, 2)
* Enables mitigation for CVE-2025-0647.
*/
workaround_reset_start neoverse_v2, CVE(2025, 647), WORKAROUND_CVE_2025_0647
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
mov x0, #WA_PATCH_SLOT(3)
bl wa_cve_2025_0647_instruction_patch
#endif /* IMAGE_BL31 */
@@ -223,7 +223,7 @@ func neoverse_v2_cpu_reg_dump
ret
endfunc neoverse_v2_cpu_reg_dump
-#if WORKAROUND_CVE_2025_0647 && IMAGE_BL31
+#if WORKAROUND_CVE_2025_0647 && defined(IMAGE_BL31)
declare_cpu_ops_eh neoverse_v2, NEOVERSE_V2_MIDR, \
neoverse_v2_reset_func, \
neoverse_v2_impl_defined_el3_handler, \
diff --git a/lib/cpus/aarch64/neoverse_v3.S b/lib/cpus/aarch64/neoverse_v3.S
index da99801f4..1528486c2 100644
--- a/lib/cpus/aarch64/neoverse_v3.S
+++ b/lib/cpus/aarch64/neoverse_v3.S
@@ -122,7 +122,7 @@ check_erratum_ls neoverse_v3, CVE(2024, 7881), CPU_REV(0, 1)
* Enables mitigation for CVE-2025-0647.
*/
workaround_reset_start neoverse_v3, CVE(2025, 647), WORKAROUND_CVE_2025_0647
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
mov x0, #WA_PATCH_SLOT(3)
bl wa_cve_2025_0647_instruction_patch
#endif /* IMAGE_BL31 */
@@ -186,7 +186,7 @@ func neoverse_v3_cpu_reg_dump
ret
endfunc neoverse_v3_cpu_reg_dump
-#if WORKAROUND_CVE_2025_0647 && IMAGE_BL31
+#if WORKAROUND_CVE_2025_0647 && defined(IMAGE_BL31)
declare_cpu_ops_eh neoverse_v3, NEOVERSE_V3_VNAE_MIDR, \
neoverse_v3_reset_func, \
neoverse_v3_impl_defined_el3_handler, \
diff --git a/lib/cpus/errata_report.c b/lib/cpus/errata_report.c
index 7d0843086..9ac9908e6 100644
--- a/lib/cpus/errata_report.c
+++ b/lib/cpus/errata_report.c
@@ -96,7 +96,7 @@ static void generic_errata_report(struct cpu_ops *cpu_ops)
*/
void print_errata_status(void)
{
-#if IMAGE_BL1
+#ifdef IMAGE_BL1
struct cpu_ops *cpu_ops = get_cpu_ops_ptr();
#else
struct cpu_ops *cpu_ops = get_cpu_data(cpu_ops_ptr);
@@ -104,7 +104,7 @@ void print_errata_status(void)
assert(cpu_ops != NULL);
-#if !IMAGE_BL1
+#ifndef IMAGE_BL1
/*
* Try to acquire the lock. The first CPU of each type to do so will
* report errata. The others need not do anything. Never release the
diff --git a/lib/el3_runtime/aarch32/context_mgmt.c b/lib/el3_runtime/aarch32/context_mgmt.c
index 3ff367049..942f7d2dd 100644
--- a/lib/el3_runtime/aarch32/context_mgmt.c
+++ b/lib/el3_runtime/aarch32/context_mgmt.c
@@ -136,7 +136,7 @@ void cm_setup_context(cpu_context_t *ctx, const entry_point_info_t *ep)
******************************************************************************/
static void enable_extensions_nonsecure(bool el2_unused)
{
-#if IMAGE_BL32
+#ifdef IMAGE_BL32
if (is_feat_amu_supported()) {
amu_enable(el2_unused);
}
diff --git a/lib/el3_runtime/aarch64/context.S b/lib/el3_runtime/aarch64/context.S
index ff4ea2b90..e9438bad6 100644
--- a/lib/el3_runtime/aarch64/context.S
+++ b/lib/el3_runtime/aarch64/context.S
@@ -379,14 +379,14 @@ no_amu_save_\@:
stp x26, x27, [x19, #CTX_PACDBKEY_LO]
stp x28, x29, [x19, #CTX_PACGAKEY_LO]
#if ENABLE_PAUTH
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
/* tpidr_el3 contains the address of the cpu_data structure */
per_cpu_cur percpu_data, x9, x10
/* Load APIAKey from cpu_data */
ldp x10, x11, [x9, #CPU_DATA_APIAKEY]
#endif /* IMAGE_BL31 */
-#if IMAGE_BL1
+#ifdef IMAGE_BL1
/* BL1 does not use cpu_data and has dedicated storage */
adr_l x9, bl1_apiakey
ldp x10, x11, [x9]
@@ -645,7 +645,7 @@ func el3_exit
ldp x19, x20, [x9, #CTX_CPTR_EL3]
msr cptr_el3, x19
-#if ENABLE_FEAT_MPAM && IMAGE_BL31
+#if ENABLE_FEAT_MPAM && defined(IMAGE_BL31)
#if ENABLE_FEAT_MPAM == 2
is_feat_mpam_present_asm x7, x8
cbz x7, no_mpam
@@ -655,7 +655,7 @@ func el3_exit
no_mpam:
#endif
-#if IMAGE_BL31 && DYNAMIC_WORKAROUND_CVE_2018_3639
+#if defined(IMAGE_BL31) && DYNAMIC_WORKAROUND_CVE_2018_3639
/* ----------------------------------------------------------
* Restore mitigation state as it was on entry to EL3
* ----------------------------------------------------------
@@ -666,7 +666,7 @@ no_mpam:
1:
#endif /* IMAGE_BL31 && DYNAMIC_WORKAROUND_CVE_2018_3639 */
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
synchronize_errors
#endif /* IMAGE_BL31 */
diff --git a/lib/el3_runtime/aarch64/context_mgmt.c b/lib/el3_runtime/aarch64/context_mgmt.c
index 44dbb4ee1..044efa37c 100644
--- a/lib/el3_runtime/aarch64/context_mgmt.c
+++ b/lib/el3_runtime/aarch64/context_mgmt.c
@@ -18,7 +18,6 @@
#include <common/bl_common.h>
#include <common/debug.h>
#include <context.h>
-#include <drivers/arm/gicv3.h>
#include <lib/cpus/cpu_ops.h>
#include <lib/cpus/errata.h>
#include <lib/el3_runtime/context_mgmt.h>
@@ -60,7 +59,7 @@ static void manage_extensions_secure(cpu_context_t *ctx);
*/
static void setup_el1_context(cpu_context_t *ctx, const struct entry_point_info *ep)
{
-#if ((IMAGE_BL1) || (IMAGE_BL31 && (!CTX_INCLUDE_EL2_REGS)))
+#if (defined(IMAGE_BL1) || (defined(IMAGE_BL31) && (!CTX_INCLUDE_EL2_REGS)))
u_register_t sctlr_elx, actlr_elx;
/*
@@ -115,7 +114,7 @@ static void setup_el1_context(cpu_context_t *ctx, const struct entry_point_info
*/
actlr_elx = read_actlr_el1();
write_el1_ctx_common(get_el1_sysregs_ctx(ctx), actlr_el1, actlr_elx);
-#endif /* (IMAGE_BL1) || (IMAGE_BL31 && (!CTX_INCLUDE_EL2_REGS)) */
+#endif /* (defined(IMAGE_BL1) || (defined(IMAGE_BL31) && (!CTX_INCLUDE_EL2_REGS)) */
}
/*
@@ -126,7 +125,7 @@ static void setup_el1_context(cpu_context_t *ctx, const struct entry_point_info
*/
static void setup_el2_context(cpu_context_t *ctx)
{
-#if CTX_INCLUDE_EL2_REGS && IMAGE_BL31
+#if CTX_INCLUDE_EL2_REGS && defined(IMAGE_BL31)
el2_sysregs_t *el2_ctx = get_el2_sysregs_ctx(ctx);
/*
@@ -181,7 +180,7 @@ static void setup_el2_context(cpu_context_t *ctx)
*/
static void setup_el2_regs(void)
{
-#if !(CTX_INCLUDE_EL2_REGS && IMAGE_BL31)
+#if !(CTX_INCLUDE_EL2_REGS && defined(IMAGE_BL31))
if (is_feat_hcx_supported()) {
write_hcrx_el2(HCRX_EL2_INIT_VAL);
}
@@ -232,7 +231,7 @@ static void setup_secure_context(cpu_context_t *ctx, const struct entry_point_in
manage_extensions_secure(ctx);
}
-#if ENABLE_RMM && IMAGE_BL31
+#if ENABLE_RMM && defined(IMAGE_BL31)
/******************************************************************************
* This function performs initializations that are specific to REALM state
* and updates the cpu context specified by 'ctx'.
@@ -304,7 +303,7 @@ static void setup_realm_context(cpu_context_t *ctx, const struct entry_point_inf
trbe_disable_realm(ctx);
}
}
-#endif /* ENABLE_RMM && IMAGE_BL31 */
+#endif /* ENABLE_RMM && defined(IMAGE_BL31) */
/******************************************************************************
* This function performs initializations that are specific to NON-SECURE state
@@ -597,7 +596,7 @@ static void setup_context_common(cpu_context_t *ctx, const entry_point_info_t *e
scr_el3 |= SCR_TWEDEn_BIT;
}
-#if IMAGE_BL31 && defined(SPD_spmd) && SPMD_SPM_AT_SEL2
+#if defined(IMAGE_BL31) && defined(SPD_spmd) && SPMD_SPM_AT_SEL2
/* Enable S-EL2 if FEAT_SEL2 is implemented for all the contexts. */
if (is_feat_sel2_supported()) {
scr_el3 |= SCR_EEL2_BIT;
@@ -647,7 +646,7 @@ static void setup_context_common(cpu_context_t *ctx, const entry_point_info_t *e
write_ctx_reg(state, CTX_MDCR_EL3, mdcr_el3);
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
/* Enable FEAT_TRF for Non-Secure and prohibit for Secure state. */
if (is_feat_trf_supported()) {
trf_enable(ctx);
@@ -725,7 +724,7 @@ void cm_setup_context(cpu_context_t *ctx, const entry_point_info_t *ep)
case SECURE:
setup_secure_context(ctx, ep);
break;
-#if ENABLE_RMM && IMAGE_BL31
+#if ENABLE_RMM && defined(IMAGE_BL31)
case REALM:
setup_realm_context(ctx, ep);
break;
@@ -751,7 +750,7 @@ void __no_pauth cm_manage_extensions_el3(unsigned int my_idx)
pauth_init_enable_el3();
}
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
if (is_feat_sve_supported()) {
sve_init_el3();
}
@@ -822,7 +821,7 @@ static void manage_extensions_nonsecure_per_world(void)
{
cm_el3_arch_init_per_world(&per_world_context[CPU_CONTEXT_NS]);
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
if (is_feat_sme_supported()) {
sme_enable_per_world(&per_world_context[CPU_CONTEXT_NS]);
}
@@ -858,7 +857,7 @@ static void manage_extensions_secure_per_world(void)
{
cm_el3_arch_init_per_world(&per_world_context[CPU_CONTEXT_SECURE]);
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
if (is_feat_sme_supported()) {
if (ENABLE_SME_FOR_SWD) {
@@ -904,7 +903,7 @@ static void manage_extensions_secure_per_world(void)
static void manage_extensions_realm_per_world(void)
{
-#if ENABLE_RMM && IMAGE_BL31
+#if ENABLE_RMM && defined(IMAGE_BL31)
cm_el3_arch_init_per_world(&per_world_context[CPU_CONTEXT_REALM]);
if (is_feat_sve_supported()) {
@@ -943,7 +942,7 @@ static void manage_extensions_realm_per_world(void)
if (is_feat_idte3_supported()) {
idte3_init_cached_idregs_per_world(CPU_CONTEXT_REALM);
}
-#endif /* ENABLE_RMM && IMAGE_BL31 */
+#endif /* ENABLE_RMM && defined(IMAGE_BL31) */
}
void cm_manage_extensions_per_world(void)
@@ -955,7 +954,7 @@ void cm_manage_extensions_per_world(void)
void cm_init_percpu_once_regs(void)
{
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
if (is_feat_idte3_supported()) {
idte3_init_percpu_once_regs(CPU_CONTEXT_NS);
idte3_init_percpu_once_regs(CPU_CONTEXT_SECURE);
@@ -971,7 +970,7 @@ void cm_init_percpu_once_regs(void)
******************************************************************************/
static void manage_extensions_nonsecure(cpu_context_t *ctx)
{
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
/* NOTE: registers are not context switched */
if (is_feat_amu_supported()) {
amu_enable(ctx);
@@ -1014,7 +1013,7 @@ static void manage_extensions_nonsecure(cpu_context_t *ctx)
******************************************************************************/
static void manage_extensions_nonsecure_el2_unused(void)
{
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
if (is_feat_spe_supported()) {
spe_init_el2_unused();
}
@@ -1065,7 +1064,7 @@ static void manage_extensions_nonsecure_el2_unused(void)
******************************************************************************/
static void manage_extensions_secure(cpu_context_t *ctx)
{
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
if (is_feat_sme_supported()) {
if (ENABLE_SME_FOR_SWD) {
/*
@@ -1267,7 +1266,7 @@ void cm_prepare_el3_exit(size_t security_state)
write_fgwte3_el3(FGWTE3_EL3_LATE_INIT_VAL);
}
}
-#if !CTX_INCLUDE_EL2_REGS || IMAGE_BL1
+#if !CTX_INCLUDE_EL2_REGS || defined(IMAGE_BL1)
/* Restore EL1 system registers, only when CTX_INCLUDE_EL2_REGS=0 */
cm_el1_sysregs_context_restore(security_state);
#endif
@@ -1291,7 +1290,7 @@ void cm_sysregs_context_restore_amu(unsigned int security_state)
write_amevcntr03_el0(ctx->amevcntr03_el0);
}
-#if (CTX_INCLUDE_EL2_REGS && IMAGE_BL31)
+#if (CTX_INCLUDE_EL2_REGS && defined(IMAGE_BL31))
static void el2_sysregs_context_save_fgt(el2_sysregs_t *ctx)
{
@@ -1788,7 +1787,7 @@ void cm_el2_sysregs_context_restore(uint32_t security_state)
******************************************************************************/
void cm_prepare_el3_exit_ns(void)
{
-#if (CTX_INCLUDE_EL2_REGS && IMAGE_BL31)
+#if (CTX_INCLUDE_EL2_REGS && defined(IMAGE_BL31))
#if ENABLE_ASSERTIONS
cpu_context_t *ctx = cm_get_context(NON_SECURE);
assert(ctx != NULL);
@@ -1805,14 +1804,14 @@ void cm_prepare_el3_exit_ns(void)
cm_set_next_eret_context(NON_SECURE);
#else
cm_prepare_el3_exit(NON_SECURE);
-#endif /* (CTX_INCLUDE_EL2_REGS && IMAGE_BL31) */
+#endif /* (CTX_INCLUDE_EL2_REGS && defined(IMAGE_BL31)) */
if (is_feat_amu_supported()) {
cm_sysregs_context_restore_amu(NON_SECURE);
}
}
-#if ((IMAGE_BL1) || (IMAGE_BL31 && (!CTX_INCLUDE_EL2_REGS)))
+#if (defined(IMAGE_BL1) || (defined(IMAGE_BL31) && (!CTX_INCLUDE_EL2_REGS)))
/*******************************************************************************
* The next set of six functions are used by runtime services to save and restore
* EL1 context on the 'cpu_context' structure for the specified security state.
@@ -2057,7 +2056,7 @@ void cm_el1_sysregs_context_save(uint32_t security_state)
el1_sysregs_context_save(get_el1_sysregs_ctx(ctx));
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
if (is_feat_amu_supported()) {
cm_sysregs_context_save_amu(security_state);
}
@@ -2079,7 +2078,7 @@ void cm_el1_sysregs_context_restore(uint32_t security_state)
el1_sysregs_context_restore(get_el1_sysregs_ctx(ctx));
-#if IMAGE_BL31
+#ifdef IMAGE_BL31
if (is_feat_amu_supported()) {
cm_sysregs_context_restore_amu(security_state);
}
diff --git a/lib/extensions/pauth/pauth.c b/lib/extensions/pauth/pauth.c
index 0a99dcfac..03d81f0d8 100644
--- a/lib/extensions/pauth/pauth.c
+++ b/lib/extensions/pauth/pauth.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2025, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2025-2026, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -33,7 +33,7 @@ void pauth_init(void)
write_apiakeylo_el1(key_lo);
write_apiakeyhi_el1(key_hi);
-#if IMAGE_BL31
+#if defined(IMAGE_BL31)
/*
* In the warmboot entrypoint, cpu_data may have been used before data
* caching was enabled. Flush the caches so nothing stale is
@@ -48,7 +48,7 @@ void pauth_init(void)
#if !(HW_ASSISTED_COHERENCY || WARMBOOT_ENABLE_DCACHE_EARLY)
flush_cpu_data(apiakey);
#endif
-#elif IMAGE_BL1
+#elif defined(IMAGE_BL1)
bl1_apiakey[0] = key_lo;
bl1_apiakey[1] = key_hi;
#endif
diff --git a/lib/extensions/pmuv3/aarch64/pmuv3.c b/lib/extensions/pmuv3/aarch64/pmuv3.c
index 4cd81e42c..cde891f91 100644
--- a/lib/extensions/pmuv3/aarch64/pmuv3.c
+++ b/lib/extensions/pmuv3/aarch64/pmuv3.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2023-2024, Arm Limited. All rights reserved.
+ * Copyright (c) 2023-2026, Arm Limited. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -37,13 +37,13 @@ static u_register_t mtpmu_disable_el3(u_register_t mdcr_el3)
void pmuv3_enable(cpu_context_t *ctx)
{
-#if (CTX_INCLUDE_EL2_REGS && IMAGE_BL31)
+#if (CTX_INCLUDE_EL2_REGS && defined(IMAGE_BL31))
u_register_t mdcr_el2_val;
mdcr_el2_val = read_el2_ctx_common(get_el2_sysregs_ctx(ctx), mdcr_el2);
mdcr_el2_val = init_mdcr_el2_hpmn(mdcr_el2_val);
write_el2_ctx_common(get_el2_sysregs_ctx(ctx), mdcr_el2, mdcr_el2_val);
-#endif /* (CTX_INCLUDE_EL2_REGS && IMAGE_BL31) */
+#endif /* (CTX_INCLUDE_EL2_REGS && defined(IMAGE_BL31)) */
el3_state_t *state = get_el3state_ctx(ctx);
u_register_t mdcr_el3_val = read_ctx_reg(state, CTX_MDCR_EL3);
diff --git a/lib/psci/psci_common.c b/lib/psci/psci_common.c
index 8afc13b0e..d0ab2132a 100644
--- a/lib/psci/psci_common.c
+++ b/lib/psci/psci_common.c
@@ -751,6 +751,10 @@ int psci_validate_state_coordination(unsigned int cpu_idx, unsigned int end_pwrl
* specified power level.
*/
lvl = state_info->last_at_pwrlvl;
+ if (lvl > PLAT_MAX_PWR_LVL) {
+ return PSCI_E_INVALID_PARAMS;
+ }
+
if (lvl > end_pwrlvl) {
if (!psci_is_last_cpu_to_idle_at_pwrlvl(cpu_idx, lvl)) {
rc = PSCI_E_DENIED;
diff --git a/lib/xlat_tables_v2/xlat_tables_context.c b/lib/xlat_tables_v2/xlat_tables_context.c
index 81e53eeae..d6f809006 100644
--- a/lib/xlat_tables_v2/xlat_tables_context.c
+++ b/lib/xlat_tables_v2/xlat_tables_context.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2025, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2017-2026, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -120,7 +120,7 @@ int xlat_change_mem_attributes(uintptr_t base_va, size_t size, uint32_t attr)
return xlat_change_mem_attributes_ctx(&tf_xlat_ctx, base_va, size, attr);
}
-#if PLAT_RO_XLAT_TABLES
+#ifdef PLAT_RO_XLAT_TABLES
/* Change the memory attributes of the descriptors which resolve the address
* range that belongs to the translation tables themselves, which are by default
* mapped as part of read-write data in the BL image's memory.
diff --git a/plat/arm/board/fvp/fvp_common.c b/plat/arm/board/fvp/fvp_common.c
index af32ad20f..0e8f0ac14 100644
--- a/plat/arm/board/fvp/fvp_common.c
+++ b/plat/arm/board/fvp/fvp_common.c
@@ -1,10 +1,11 @@
/*
- * Copyright (c) 2013-2025, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2013-2026, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <assert.h>
+#include <stdint.h>
#include <string.h>
#include <arch.h>
@@ -23,6 +24,7 @@
#include <platform_def.h>
#include <services/arm_arch_svc.h>
#include <services/rmm_core_manifest.h>
+#include <services/firme_svc.h>
#if SPM_MM
#include <services/spm_mm_partition.h>
#endif
@@ -1065,7 +1067,7 @@ int plat_rmmd_load_manifest(struct rmm_manifest *manifest)
/*
* Update encryption key associated with @mecid.
*/
-int plat_rmmd_mecid_key_update(uint16_t mecid, unsigned int reason)
+int plat_firme_mec_refresh(uint16_t mecid, uint8_t reason)
{
/*
* FVP does not provide an interface to change the encryption key associated
@@ -1073,4 +1075,14 @@ int plat_rmmd_mecid_key_update(uint16_t mecid, unsigned int reason)
*/
return 0;
}
+
+uint8_t plat_firme_get_common_mecid_width(void)
+{
+
+ /*
+ * Use the PE MECID width as the system MECID width is expected to be the same for all
+ * system components on FVP.
+ */
+ return (uint8_t)EXTRACT(MECIDR_EL2_MECIDWidthm1, read_mecidr_el2());
+}
#endif /* ENABLE_RMM */
diff --git a/plat/arm/board/neoverse_rd/platform/rdv3/rdv3_common.c b/plat/arm/board/neoverse_rd/platform/rdv3/rdv3_common.c
index 8a7ddc420..d0c3a7dd6 100644
--- a/plat/arm/board/neoverse_rd/platform/rdv3/rdv3_common.c
+++ b/plat/arm/board/neoverse_rd/platform/rdv3/rdv3_common.c
@@ -4,12 +4,15 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
+#include <stdint.h>
+
#include <common/debug.h>
#include <drivers/arm/gic600_multichip.h>
#include <drivers/arm/mhu.h>
#include <drivers/arm/sfcp.h>
#include <plat/arm/common/plat_arm.h>
#include <plat/common/platform.h>
+#include <services/firme_svc.h>
#include <platform_def.h>
#include <nrd_plat.h>
@@ -188,15 +191,22 @@ int plat_rmmd_load_manifest(struct rmm_manifest *manifest)
/*
* Update encryption key associated with @mecid.
*/
-int plat_rmmd_mecid_key_update(uint16_t mecid, unsigned int reason)
+int plat_firme_mec_refresh(uint16_t mecid, uint8_t reason)
{
/*
* RDV3 does not support FEAT_MEC.
- * This empty hook is for compilation to succeed.
+ * FIXME: This hook is needed to maintain backward compatibility with RMMD. Drop once we
+ * have more fine grained control over what services are exposed and how.
*/
return 0;
}
+uint8_t plat_firme_get_common_mecid_width(void)
+{
+ /* RDV3 does not support FEAT_MEC. */
+ return 0U;
+}
+
int plat_spmd_handle_group0_interrupt(uint32_t intid)
{
/*
diff --git a/plat/arm/common/arm_bl31_setup.c b/plat/arm/common/arm_bl31_setup.c
index ced1a2805..f9f10146c 100644
--- a/plat/arm/common/arm_bl31_setup.c
+++ b/plat/arm/common/arm_bl31_setup.c
@@ -443,7 +443,7 @@ void arm_bl31_plat_runtime_setup(void)
arm_free_init_memory();
#endif
-#if PLAT_RO_XLAT_TABLES
+#ifdef PLAT_RO_XLAT_TABLES
arm_xlat_make_tables_readonly();
#endif
}
diff --git a/plat/arm/common/arm_common.c b/plat/arm/common/arm_common.c
index 3c92ef268..115290ddc 100644
--- a/plat/arm/common/arm_common.c
+++ b/plat/arm/common/arm_common.c
@@ -44,7 +44,7 @@ uintptr_t arm_gicr_base_addrs[2] = {
* image's translation tables are located such that the tables will have
* read-only permissions.
******************************************************************************/
-#if PLAT_RO_XLAT_TABLES
+#ifdef PLAT_RO_XLAT_TABLES
void arm_xlat_make_tables_readonly(void)
{
int rc = xlat_make_tables_readonly();
diff --git a/plat/arm/common/arm_common.mk b/plat/arm/common/arm_common.mk
index c5ea6b0bc..ba171015a 100644
--- a/plat/arm/common/arm_common.mk
+++ b/plat/arm/common/arm_common.mk
@@ -359,10 +359,18 @@ BL31_SOURCES += plat/arm/common/aarch64/execution_state_switch.c\
plat/arm/common/arm_sip_svc_validation.c \
plat/arm/common/plat_arm_sip_svc.c \
${ARM_SVC_HANDLER_SRCS}
+
+ifeq ($(SMC_PCI_SUPPORT), 1)
+BL31_SOURCES += plat/arm/common/arm_pci_svc.c
+endif
else
BL32_SOURCES += plat/arm/common/arm_sip_svc.c \
plat/arm/common/plat_arm_sip_svc.c \
${ARM_SVC_HANDLER_SRCS}
+
+ifeq ($(SMC_PCI_SUPPORT), 1)
+BL32_SOURCES += plat/arm/common/arm_pci_svc.c
+endif
endif
endif
diff --git a/plat/arm/common/arm_pci_svc.c b/plat/arm/common/arm_pci_svc.c
new file mode 100644
index 000000000..879910b28
--- /dev/null
+++ b/plat/arm/common/arm_pci_svc.c
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2026, Arm Limited and Contributors. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <stdint.h>
+
+#include <services/pci_svc.h>
+
+uint32_t pci_read_config(uint32_t addr, uint32_t off, uint32_t sz, uint32_t *val)
+{
+ uint32_t ret = SMC_PCI_CALL_SUCCESS;
+
+ (void)addr;
+ (void)off;
+ (void)sz;
+ (void)val;
+
+ return ret;
+}
+
+uint32_t pci_write_config(uint32_t addr, uint32_t off, uint32_t sz, uint32_t val)
+{
+ uint32_t ret = SMC_PCI_CALL_SUCCESS;
+
+ (void)addr;
+ (void)off;
+ (void)sz;
+ (void)val;
+
+ return ret;
+}
+
+uint32_t pci_get_bus_for_seg(uint32_t seg, uint32_t *bus_range, uint32_t *nseg)
+{
+ uint32_t ret = SMC_PCI_CALL_SUCCESS;
+
+ (void)seg;
+ (void)bus_range;
+ (void)nseg;
+
+ return ret;
+}
diff --git a/plat/arm/common/arm_pm.c b/plat/arm/common/arm_pm.c
index e8d15f76e..b98c7a16a 100644
--- a/plat/arm/common/arm_pm.c
+++ b/plat/arm/common/arm_pm.c
@@ -103,6 +103,9 @@ int arm_validate_power_state(unsigned int power_state,
}
#if PSCI_OS_INIT_MODE
req_state->last_at_pwrlvl = state_id & ARM_LOCAL_PSTATE_MASK;
+ if (req_state->last_at_pwrlvl > PLAT_MAX_PWR_LVL) {
+ return PSCI_E_INVALID_PARAMS;
+ }
#endif /* __PSCI_OS_INIT_MODE__ */
return PSCI_E_SUCCESS;
diff --git a/plat/arm/common/sp_min/arm_sp_min_setup.c b/plat/arm/common/sp_min/arm_sp_min_setup.c
index 763f2e296..9eb516094 100644
--- a/plat/arm/common/sp_min/arm_sp_min_setup.c
+++ b/plat/arm/common/sp_min/arm_sp_min_setup.c
@@ -193,7 +193,7 @@ void arm_sp_min_plat_runtime_setup(void)
/* Initialize the runtime console */
arm_console_runtime_init();
-#if PLAT_RO_XLAT_TABLES
+#ifdef PLAT_RO_XLAT_TABLES
arm_xlat_make_tables_readonly();
#endif
}
diff --git a/plat/arm/common/tsp/arm_tsp_setup.c b/plat/arm/common/tsp/arm_tsp_setup.c
index f804edbc4..82c944c91 100644
--- a/plat/arm/common/tsp/arm_tsp_setup.c
+++ b/plat/arm/common/tsp/arm_tsp_setup.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2025, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2015-2026, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -128,7 +128,7 @@ void tsp_plat_arch_setup(void)
setup_page_tables(bl_regions, plat_arm_get_mmap());
enable_mmu_el1(0);
-#if PLAT_RO_XLAT_TABLES
+#ifdef PLAT_RO_XLAT_TABLES
arm_xlat_make_tables_readonly();
#endif
}
diff --git a/plat/imx/imx8m/imx8m_smc_validation.c b/plat/imx/imx8m/imx8m_smc_validation.c
new file mode 100644
index 000000000..5efe33250
--- /dev/null
+++ b/plat/imx/imx8m/imx8m_smc_validation.c
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2026 NXP
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+
+#include <common/smc_validation_framework.h>
+
+#include <platform_def.h>
+
+/*
+ * plat_is_valid_ns_address_range() - i.MX8M override.
+ *
+ * Accept only the DRAM region as valid Non-Secure memory, excluding the
+ * BL32 (OP-TEE) carve-out. This prevents NS callers from passing
+ * pointers into OCRAM (BL31), ROM, MMIO, or secure BL32 memory
+ * regions through SMC arguments.
+ */
+bool plat_is_valid_ns_address_range(uintptr_t base, size_t size)
+{
+ uintptr_t end = base + size;
+
+ /* Reject addresses outside DRAM */
+ if ((base < IMX_DRAM_BASE) ||
+ (end > ((uintptr_t)IMX_DRAM_BASE + IMX_DRAM_SIZE))) {
+ return false;
+ }
+
+#if defined(BL32_BASE) && defined(BL32_SIZE)
+ /* Reject addresses that overlap the BL32 (OP-TEE) region */
+ if ((end > BL32_BASE) &&
+ (base < (BL32_BASE + BL32_SIZE))) {
+ return false;
+ }
+#endif
+
+ return true;
+}
diff --git a/plat/imx/imx8m/imx8mm/platform.mk b/plat/imx/imx8m/imx8mm/platform.mk
index f494e47b8..4cad97697 100644
--- a/plat/imx/imx8m/imx8mm/platform.mk
+++ b/plat/imx/imx8m/imx8mm/platform.mk
@@ -34,6 +34,7 @@ BL31_SOURCES += common/desc_image_load.c \
plat/imx/common/imx8_helpers.S \
plat/imx/imx8m/gpc_common.c \
plat/imx/imx8m/imx_hab.c \
+ plat/imx/imx8m/imx8m_smc_validation.c \
plat/imx/imx8m/imx_aipstz.c \
plat/imx/imx8m/imx_rdc.c \
plat/imx/imx8m/imx8m_csu.c \
diff --git a/plat/imx/imx8m/imx8mn/platform.mk b/plat/imx/imx8m/imx8mn/platform.mk
index 6a9d22e12..9cf5b05a6 100644
--- a/plat/imx/imx8m/imx8mn/platform.mk
+++ b/plat/imx/imx8m/imx8mn/platform.mk
@@ -29,6 +29,7 @@ BL31_SOURCES += common/desc_image_load.c \
plat/imx/common/imx8_helpers.S \
plat/imx/imx8m/gpc_common.c \
plat/imx/imx8m/imx_hab.c \
+ plat/imx/imx8m/imx8m_smc_validation.c \
plat/imx/imx8m/imx_aipstz.c \
plat/imx/imx8m/imx_rdc.c \
plat/imx/imx8m/imx8m_caam.c \
diff --git a/plat/imx/imx8m/imx8mp/platform.mk b/plat/imx/imx8m/imx8mp/platform.mk
index 11fc01b0b..7ec417f63 100644
--- a/plat/imx/imx8m/imx8mp/platform.mk
+++ b/plat/imx/imx8m/imx8mp/platform.mk
@@ -31,6 +31,7 @@ BL31_SOURCES += common/desc_image_load.c \
plat/imx/common/imx8_helpers.S \
plat/imx/imx8m/gpc_common.c \
plat/imx/imx8m/imx_hab.c \
+ plat/imx/imx8m/imx8m_smc_validation.c \
plat/imx/imx8m/imx_aipstz.c \
plat/imx/imx8m/imx_rdc.c \
plat/imx/imx8m/imx8m_caam.c \
diff --git a/plat/imx/imx8m/imx8mq/platform.mk b/plat/imx/imx8m/imx8mq/platform.mk
index 76fc07107..17437da04 100644
--- a/plat/imx/imx8m/imx8mq/platform.mk
+++ b/plat/imx/imx8m/imx8mq/platform.mk
@@ -30,6 +30,7 @@ BL31_SOURCES += plat/imx/common/imx8_helpers.S \
plat/imx/imx8m/imx8mq/imx8mq_psci.c \
plat/imx/imx8m/gpc_common.c \
plat/imx/imx8m/imx_hab.c \
+ plat/imx/imx8m/imx8m_smc_validation.c \
plat/imx/imx8m/imx_aipstz.c \
plat/imx/imx8m/imx8m_caam.c \
plat/imx/imx8m/imx8m_ccm.c \
diff --git a/plat/imx/imx8m/imx_hab.c b/plat/imx/imx8m/imx_hab.c
index 222046fb9..d34d495bf 100644
--- a/plat/imx/imx8m/imx_hab.c
+++ b/plat/imx/imx8m/imx_hab.c
@@ -5,7 +5,10 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
+#include <common/debug.h>
#include <common/runtime_svc.h>
+#include <common/smc_validation_framework.h>
+
#include <imx_sip_svc.h>
#define HAB_CID_ATF U(2) /* TF-A Caller ID */
@@ -80,7 +83,8 @@ struct hab_rvt_api {
size_t *bytes, hab_loader_callback_f_t loader, uint32_t srkmask, int skip_dcd);
};
-struct hab_rvt_api *g_hab_rvt_api = (struct hab_rvt_api *)HAB_RVT_BASE;
+static const struct hab_rvt_api *g_hab_rvt_api =
+ (const struct hab_rvt_api *)HAB_RVT_BASE;
/*******************************************************************************
* Handler for servicing HAB SMC calls
@@ -102,12 +106,66 @@ int imx_hab_handler(uint32_t smc_fid,
case IMX_SIP_HAB_AUTH_IMG:
return (unsigned long)g_hab_rvt_api->authenticate_image(HAB_CID_ATF,
x2, (void **)x3, (size_t *)x4, NULL);
+
case IMX_SIP_HAB_REPORT_EVENT:
- return g_hab_rvt_api->report_event(HAB_FAILURE,
- (uint32_t)x2, (uint8_t *)x3, (size_t *)x4);
+ {
+ uintptr_t event_buf = (uintptr_t)x3;
+ uintptr_t bytes_ptr = (uintptr_t)x4;
+
+ if (smc_validate_mem_range(bytes_ptr, sizeof(size_t)) != SMC_OK) {
+ WARN("HAB: REPORT_EVENT bytes_ptr 0x%lx failed NS check\n",
+ bytes_ptr);
+ return (int)HAB_FAILURE;
+ }
+
+ size_t max_bytes = *(size_t *)bytes_ptr;
+
+ if (smc_validate_mem_range(event_buf, max_bytes) != SMC_OK) {
+ WARN("HAB: REPORT_EVENT buf 0x%lx+0x%zx failed NS check\n",
+ event_buf, max_bytes);
+ return (int)HAB_FAILURE;
+ }
+
+ enum hab_status status = g_hab_rvt_api->report_event(
+ HAB_FAILURE, (uint32_t)x2,
+ (uint8_t *)event_buf, &max_bytes);
+
+ *(size_t *)bytes_ptr = max_bytes;
+
+ return (int)status;
+ }
+
case IMX_SIP_HAB_REPORT_STATUS:
- return g_hab_rvt_api->report_status((enum hab_config *)x2,
- (enum hab_state *)x3);
+ {
+ uintptr_t config_ptr = (uintptr_t)x2;
+ uintptr_t state_ptr = (uintptr_t)x3;
+
+ if (smc_validate_mem_range(config_ptr,
+ sizeof(enum hab_config)) != SMC_OK) {
+ WARN("HAB: REPORT_STATUS config_ptr 0x%lx failed NS check\n",
+ config_ptr);
+ return (int)HAB_FAILURE;
+ }
+
+ if (smc_validate_mem_range(state_ptr,
+ sizeof(enum hab_state)) != SMC_OK) {
+ WARN("HAB: REPORT_STATUS state_ptr 0x%lx failed NS check\n",
+ state_ptr);
+ return (int)HAB_FAILURE;
+ }
+
+ enum hab_config config_local;
+ enum hab_state state_local;
+
+ enum hab_status status = g_hab_rvt_api->report_status(
+ &config_local, &state_local);
+
+ *(enum hab_config *)config_ptr = config_local;
+ *(enum hab_state *)state_ptr = state_local;
+
+ return (int)status;
+ }
+
case IMX_SIP_HAB_FAILSAFE:
g_hab_rvt_api->failsafe();
break;
diff --git a/plat/qemu/common/qemu_common.c b/plat/qemu/common/qemu_common.c
index f5e19b9b1..3c19f6ba5 100644
--- a/plat/qemu/common/qemu_common.c
+++ b/plat/qemu/common/qemu_common.c
@@ -1,18 +1,21 @@
/*
- * Copyright (c) 2015-2025, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2015-2026, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
+#include <stdint.h>
#include <string.h>
#include <platform_def.h>
+#include <arch.h>
#include <arch_helpers.h>
#include <common/bl_common.h>
#include <lib/xlat_tables/xlat_tables_v2.h>
#include <services/el3_spmc_ffa_memory.h>
+#include <services/firme_svc.h>
#if ENABLE_RMM
#include <services/rmm_core_manifest.h>
#endif
@@ -760,7 +763,7 @@ int plat_rmmd_load_manifest(struct rmm_manifest *manifest)
/*
* Update encryption key associated with @mecid.
*/
-int plat_rmmd_mecid_key_update(uint16_t mecid, unsigned int reason)
+int plat_firme_mec_refresh(uint16_t mecid, uint8_t reason)
{
/*
* QEMU does not provide an interface to change the encryption key
@@ -768,6 +771,12 @@ int plat_rmmd_mecid_key_update(uint16_t mecid, unsigned int reason)
*/
return 0;
}
+
+uint8_t plat_firme_get_common_mecid_width(void)
+{
+ /* Safe default value for common MECID width. */
+ return (uint8_t)EXTRACT(MECIDR_EL2_MECIDWidthm1, read_mecidr_el2());
+}
#endif /* ENABLE_RMM */
/**
diff --git a/plat/qemu/qemu/include/platform_def.h b/plat/qemu/qemu/include/platform_def.h
index 72f343eb5..14e3823d3 100644
--- a/plat/qemu/qemu/include/platform_def.h
+++ b/plat/qemu/qemu/include/platform_def.h
@@ -112,9 +112,11 @@
#define BL_RAM_SIZE (SEC_SRAM_SIZE - SHARED_RAM_SIZE)
#define TB_FW_CONFIG_BASE BL_RAM_BASE
-#define TB_FW_CONFIG_LIMIT (TB_FW_CONFIG_BASE + PAGE_SIZE)
+#define TB_FW_CONFIG_SIZE PAGE_SIZE
+#define TB_FW_CONFIG_LIMIT (TB_FW_CONFIG_BASE + TB_FW_CONFIG_SIZE)
#define TOS_FW_CONFIG_BASE TB_FW_CONFIG_LIMIT
-#define TOS_FW_CONFIG_LIMIT (TOS_FW_CONFIG_BASE + PAGE_SIZE)
+#define TOS_FW_CONFIG_SIZE PAGE_SIZE
+#define TOS_FW_CONFIG_LIMIT (TOS_FW_CONFIG_BASE + TOS_FW_CONFIG_SIZE)
/*
* BL1 specific defines.
diff --git a/plat/rockchip/common/include/plat_private.h b/plat/rockchip/common/include/plat_private.h
index 7dcbec9c9..9df44094a 100644
--- a/plat/rockchip/common/include/plat_private.h
+++ b/plat/rockchip/common/include/plat_private.h
@@ -145,6 +145,19 @@ uint32_t rockchip_get_uart_baudrate(void);
uint32_t rockchip_get_uart_clock(void);
void rockchip_init_scmi_server(void);
+
+static inline uint64_t rockchip_get_sp(void)
+{
+ uint64_t save_sp;
+
+ __asm__ volatile("mov %0, sp" : "=r" (save_sp) : :);
+ return save_sp;
+}
+
+static inline void rockchip_set_sp(uint64_t set_sp)
+{
+ __asm__ volatile("mov sp, %0" : : "r" (set_sp) :);
+}
#endif /* __ASSEMBLER__ */
/******************************************************************************
diff --git a/plat/rockchip/rv1126b/drivers/dmc/dmc_ddrc_rv1126b.h b/plat/rockchip/rv1126b/drivers/dmc/dmc_ddrc_rv1126b.h
new file mode 100644
index 000000000..29e49b0a3
--- /dev/null
+++ b/plat/rockchip/rv1126b/drivers/dmc/dmc_ddrc_rv1126b.h
@@ -0,0 +1,352 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Copyright (c) 2026, Rockchip Electronics Co., Ltd.
+ */
+
+#ifndef __PLAT_ROCKCHIP_DMC_DDRC_RV1126B_H__
+#define __PLAT_ROCKCHIP_DMC_DDRC_RV1126B_H__
+
+/* DDR pctl registers define */
+#define DDRC_REGS_FREQ(n) (((n) > 0) ? (0x1000 * ((n) + 1)) : 0)
+
+#define DDRC_MSTR 0x0
+#define DDRC_STAT 0x4
+#define DDRC_MSTR1 0x8
+#define DDRC_MRCTRL0 0x10
+#define DDRC_MRCTRL1 0x14
+#define DDRC_MRSTAT 0x18
+#define DDRC_MRCTRL2 0x1c
+#define DDRC_DERATEEN 0x20
+#define DDRC_DERATEINT 0x24
+#define DDRC_MSTR2 0x28
+#define DDRC_PWRCTL 0x30
+#define DDRC_PWRTMG 0x34
+#define DDRC_HWLPCTL 0x38
+#define DDRC_RFSHCTL0 0x50
+#define DDRC_RFSHCTL1 0x54
+#define DDRC_RFSHCTL2 0x58
+#define DDRC_RFSHCTL4 0x5c
+#define DDRC_RFSHCTL3 0x60
+#define DDRC_RFSHTMG 0x64
+#define DDRC_RFSHTMG1 0x68
+#define DDRC_RFSHCTL5 0x6c
+#define DDRC_ECCCFG0 0x70
+#define DDRC_ECCCFG1 0x74
+#define DDRC_ECCSTAT 0x78
+#define DDRC_ECCCTL 0x7c
+#define DDRC_ECCERRCNT 0x80
+#define DDRC_ECCCADDR0 0x84
+#define DDRC_ECCCADDR1 0x88
+#define DDRC_ECCCSYN0 0x8c
+#define DDRC_ECCCSYN1 0x90
+#define DDRC_ECCCSYN2 0x94
+#define DDRC_ECCBITMASK0 0x98
+#define DDRC_ECCBITMASK1 0x9c
+#define DDRC_ECCBITMASK2 0xa0
+#define DDRC_ECCUADR0 0xa4
+#define DDRC_ECCUADR1 0xa8
+#define DDRC_ECCUSYNC0 0xac
+#define DDRC_ECCUSYNC1 0xb0
+#define DDRC_ECCUSYNC2 0xb4
+#define DDRC_ECCPOSISONADDR0 0xb8
+#define DDRC_ECCPOSISONADDR1 0xbc
+#define DDRC_INIT0 0xd0
+#define DDRC_INIT1 0xd4
+#define DDRC_INIT2 0xd8
+#define DDRC_INIT3 0xdc
+#define DDRC_INIT4 0xe0
+#define DDRC_INIT5 0xe4
+#define DDRC_INIT6 0xe8
+#define DDRC_INIT7 0xec
+#define DDRC_DIMMCTL 0xf0
+#define DDRC_RANKCTL 0xf4
+#define DDRC_RANKCTL1 0xf8
+#define DDRC_CHCTL 0xfc
+#define DDRC_DRAMTMG0 0x100
+#define DDRC_DRAMTMG1 0x104
+#define DDRC_DRAMTMG2 0x108
+#define DDRC_DRAMTMG3 0x10c
+#define DDRC_DRAMTMG4 0x110
+#define DDRC_DRAMTMG5 0x114
+#define DDRC_DRAMTMG6 0x118
+#define DDRC_DRAMTMG7 0x11c
+#define DDRC_DRAMTMG8 0x120
+#define DDRC_DRAMTMG9 0x124
+#define DDRC_DRAMTMG10 0x128
+#define DDRC_DRAMTMG11 0x12c
+#define DDRC_DRAMTMG12 0x130
+#define DDRC_DRAMTMG13 0x134
+#define DDRC_DRAMTMG14 0x138
+#define DDRC_DRAMTMG15 0x13c
+#define DDRC_DRAMTMG16 0x140
+#define DDRC_ZQCTL0 0x180
+#define DDRC_ZQCTL1 0x184
+#define DDRC_ZQCTL2 0x188
+#define DDRC_ZQSTAT 0x18c
+#define DDRC_DFITMG0 0x190
+#define DDRC_DFITMG1 0x194
+#define DDRC_DFILPCFG0 0x198
+#define DDRC_DFILPCFG1 0x19c
+#define DDRC_DFIUPD0 0x1a0
+#define DDRC_DFIUPD1 0x1a4
+#define DDRC_DFIUPD2 0x1a8
+#define DDRC_DFIMISC 0x1b0
+#define DDRC_DFITMG2 0x1b4
+#define DDRC_DFITMG3 0x1b8
+#define DDRC_DFISTAT 0x1bc
+#define DDRC_DBICTL 0x1c0
+#define DDRC_ADDRMAP0 0x200
+#define DDRC_ADDRMAP1 0x204
+#define DDRC_ADDRMAP2 0x208
+#define DDRC_ADDRMAP3 0x20c
+#define DDRC_ADDRMAP4 0x210
+#define DDRC_ADDRMAP5 0x214
+#define DDRC_ADDRMAP6 0x218
+#define DDRC_ADDRMAP7 0x21c
+#define DDRC_ADDRMAP8 0x220
+#define DDRC_ADDRMAP9 0x224
+#define DDRC_ADDRMAP10 0x228
+#define DDRC_ADDRMAP11 0x22c
+#define DDRC_ODTCFG 0x240
+#define DDRC_ODTMAP 0x244
+#define DDRC_SCHED 0x250
+#define DDRC_SCHED1 0x254
+#define DDRC_PERFHPR1 0x25c
+#define DDRC_PERFLPR1 0x264
+#define DDRC_PERFWR1 0x26c
+#define DDRC_SCHED3 0x270
+#define DDRC_SCHED4 0x274
+#define DDRC_DQMAP0 0x280
+#define DDRC_DQMAP1 0x284
+#define DDRC_DQMAP2 0x288
+#define DDRC_DQMAP3 0x28c
+#define DDRC_DQMAP4 0x290
+#define DDRC_DQMAP5 0x294
+#define DDRC_DBG0 0x300
+#define DDRC_DBG1 0x304
+#define DDRC_DBGCAM 0x308
+#define DDRC_DBGCMD 0x30c
+#define DDRC_DBGSTAT 0x310
+#define DDRC_SWCTL 0x320
+#define DDRC_SWSTAT 0x324
+#define DDRC_POISONCFG 0x36c
+#define DDRC_POISONSTAT 0x370
+#define DDRC_ADVECCINDEX 0x374
+#define DDRC_ADVECCSTAT 0x378
+#define DDRC_PSTAT 0x3fc
+#define DDRC_PCCFG 0x400
+#define DDRC_PCFGR(n) (0x404 + (n) * 0xb0)
+#define DDRC_PCFGW(n) (0x408 + (n) * 0xb0)
+#define DDRC_PCTRL(n) (0x490 + (n) * 0xb0)
+#define DDRC_PCFGQOS0(n) (0x494 + (n) * 0xb0)
+#define DDRC_PCFGQOS1(n) (0x498 + (n) * 0xb0)
+#define DDRC_PCFGWQOS0(n) (0x49c + (n) * 0xb0)
+#define DDRC_PCFGWQOS1(n) (0x4a0 + (n) * 0xb0)
+#define DDRC_SBRCTL 0xf24
+#define DDRC_SBRSTAT 0xf28
+#define DDRC_SBRWDATA0 0xf2c
+#define DDRC_SBRWDATA1 0xf30
+#define DDRC_PDCH 0xf34
+#define DDRC_SBRSTART0 0xf38
+#define DDRC_SBRSTART1 0xf3c
+#define DDRC_SBRRANGE0 0xf40
+#define DDRC_SBRRANGE1 0xf44
+#define DDRC_SBRSTART0DCH1 0xf48
+#define DDRC_SBRSTART1DCH1 0xf4c
+#define DDRC_SBRRANGE0DCH1 0xf50
+#define DDRC_SBRRANGE1DCH1 0xf54
+
+/* DDRC_MSTR */
+#define DDRC_FREQUENCY_MODE_MASK (0x1)
+#define DDRC_FREQUENCY_MODE_SHIFT (29)
+#define DDRC_FREQUENCY_MODE BIT(29)
+#define DDRC_DLL_OFF_MODE BIT(15)
+/* DDRC_MRSTAT */
+#define DDRC_MR_WR_BUSY BIT(0)
+/* DDRC_STAT */
+#define DDRC_SELFREF_TYPE_MASK (0x3 << 4)
+#define DDRC_SELFREF_TYPE_SR_NOT_AUTO (0x2 << 4)
+#define DDRC_OPERATING_MODE_MASK (7)
+#define DDRC_OPERATING_MODE_INIT (0x1)
+#define DDRC_OPERATING_MODE_SR (3)
+/* DDRC_MRCTRL0 */
+#define DDRC_MR_WR BIT(31)
+#define DDRC_MR_ADDR_SHIFT (12)
+#define DDRC_MR_RANK_SHIFT (4)
+#define DDRC_MR_TYPE_WR (0)
+#define DDRC_MR_TYPE_RD (1)
+/* DDRC_MRCTRL1 */
+#define DDRC_MR_ADDRESS_SHIFT (8)
+#define DDRC_MR_DATA_MASK (0xff)
+/* DDRC_MRSTAT */
+#define DDRC_MR_WR_BUSY BIT(0)
+/* DDRC_DERATEEN */
+#define DDRC_DERATE_MR4_PAUSE_FC BIT(13)
+#define DDRC_DERATE_ENABLE (1)
+/* DDRC_MSTR2 */
+#define DDRC_TARGET_FREQUENCY_SHIFT (0)
+#define DDRC_TARGET_FREQUENCY_MASK (0x3)
+/* DDRC_PWRCTL */
+#define DDRC_SELFREF_SW BIT(5)
+#define DDRC_DFI_DRAM_CLK_DIS BIT(3)
+#define DDRC_POWERDOWN_EN BIT(1)
+#define DDRC_SELFREF_EN (1)
+#define DDRC_POWERDOWN_MASK (0x1)
+#define DDRC_POWERDOWN_SHIFT (1)
+#define DDRC_SELFREF_MASK (0x1)
+#define DDRC_SELFREF_SHIFT (0)
+/* DDRC_RFSHCTL0 */
+#define DDRC_PER_BANK_REFRESH BIT(2)
+/* DDRC_PWRTMG */
+#define DDRC_SELFREF_TO_X32_MASK (0xff)
+#define DDRC_SELFREF_TO_X32_SHIFT (16)
+#define DDRC_POWERDOWN_TO_X32_MASK (0x1f)
+#define DDRC_POWERDOWN_TO_X32_SHIFT (0)
+/* ECCCFG0 */
+#define DDRC_ECC_MODE_MASK (0x7)
+#define DDRC_ECC_MODE_DIS (0)
+#define DDRC_ECC_MODE_SEC (0x4)
+#define DDRC_ECC_MODE_ADV (0x5)
+/* ECCERRCNT */
+#define DDRC_ECC_UNCORR_ERR_CNT_MASK (0xffff)
+#define DDRC_ECC_UNCORR_ERR_CNT_SHIFT (16)
+#define DDRC_ECC_CORR_ERR_CNT_MASK (0xffff)
+#define DDRC_ECC_CORR_ERR_CNT_SHIFT (0)
+/* ECCCADDR0 */
+#define ECC_CORR_RANK_SHIFT (24)
+#define ECC_CORR_RANK_MASK (0x3)
+#define ECC_CORR_ROW_MASK (0x3ffff)
+/* ECCCADDR1 */
+#define ECC_CORR_CID_SHIFT (28)
+#define ECC_CORR_CID_MASK (0x3)
+#define ECC_CORR_BG_SHIFT (24)
+#define ECC_CORR_BG_MASK (0x3)
+#define ECC_CORR_BANK_SHIFT (16)
+#define ECC_CORR_BANK_MASK (0x7)
+#define ECC_CORR_COL_MASK (0xfff)
+/* ECCUADDR0 */
+#define ECC_UNCORR_RANK_SHIFT (24)
+#define ECC_UNCORR_RANK_MASK (0x3)
+#define ECC_UNCORR_ROW_MASK (0x3ffff)
+/* ECCUADDR1 */
+#define ECC_UNCORR_CID_SHIFT (28)
+#define ECC_UNCORR_CID_MASK (0x3)
+#define ECC_UNCORR_BG_SHIFT (24)
+#define ECC_UNCORR_BG_MASK (0x3)
+#define ECC_UNCORR_BANK_SHIFT (16)
+#define ECC_UNCORR_BANK_MASK (0x7)
+#define ECC_UNCORR_COL_MASK (0xfff)
+/* DDRC_ECCPOISONADDR0 */
+#define ECC_POISON_RANK_SHIFT (24)
+#define ECC_POISON_COL_SHIFT (0)
+#define ECC_POISON_RANK_MASK (1)
+#define ECC_POISON_COL_MASK (0xfff)
+/* DDRC_ECCPOISONADDR1 */
+#define ECC_POISON_BG_SHIFT (28)
+#define ECC_POISON_BK_SHIFT (24)
+#define ECC_POISON_ROW_SHIFT (0)
+#define ECC_POISON_BG_MASK (0x3)
+#define ECC_POISON_BK_MASK (0x7)
+#define ECC_POISON_ROW_MASK (0x3ffff)
+/* DDRC_INIT0 */
+#define DDRC_POST_CKE_X1024_MASK (0x3ff)
+#define DDRC_POST_CKE_X1024_SHIFT (16)
+/* DDRC_INIT2 */
+#define DDRC_IDLE_AFTR_RST_X32_MASK (0xff)
+#define DDRC_IDLE_AFTR_RST_X32_SHIFT (8)
+/* DDRC_INIT3 */
+#define DDRC_DDR34_MR0_SHIFT (16)
+#define DDRC_LPDDR234_MR1_SHIFT (16)
+#define DDRC_DDR34_MR1_SHIFT (0)
+#define DDRC_LPDDR234_MR2_SHIFT (0)
+/* DDRC_INIT4 */
+#define DDRC_DDR34_MR2_SHIFT (16)
+#define DDRC_LPDDR234_MR3_SHIFT (16)
+#define DDRC_DDR34_MR3_SHIFT (0)
+#define DDRC_LPDDR4_MR13_SHIFT (0)
+/* DDRC_INIT5 */
+#define DDRC_DEV_ZQINIT_X32_MASK (0xff)
+#define DDRC_DEV_ZQINIT_X32_SHIFT (16)
+#define DDRC_MAX_AUTO_INIT_X1024_MASK (0x3ff)
+#define DDRC_MAX_AUTO_INIT_X1024_SHIFT (0)
+/* DDRC_INIT6 */
+#define DDRC_DDR4_MR4_SHIFT (16)
+#define DDRC_LPDDR4_MR11_SHIFT (16)
+#define DDRC_DDR4_MR5_SHIFT (0)
+#define DDRC_LPDDR4_MR12_SHIFT (0)
+/* DDRC_INIT7 */
+#define DDRC_LPDDR4_MR22_SHIFT (16)
+#define DDRC_DDR4_MR6_SHIFT (0)
+#define DDRC_LPDDR4_MR14_SHIFT (0)
+#define DDRC_MR_MASK (0xffff)
+/* DDRC_RFSHCTL3 */
+#define DDRC_DIS_AUTO_REFRESH BIT(0)
+/* DDRC_ZQCTL0 */
+#define DDRC_DIS_AUTO_ZQ BIT(31)
+#define DDRC_DIS_SRX_ZQCL BIT(30)
+#define ZQ_RESISTOR_SHARED BIT(29)
+/* DDRC_DFILPCFG0 */
+#define DDRC_DFI_LP_EN_SR BIT(8)
+#define DDRC_DFI_LP_EN_SR_MASK BIT(8)
+#define DDRC_DFI_LP_EN_SR_SHIFT (8)
+/* DDRC_DFIMISC */
+#define DDRC_DFI_INIT_START BIT(5)
+#define DDRC_DFI_INIT_COMPLETE_EN BIT(0)
+/* DDRC_DFISTAT */
+#define DDRC_DFI_LP_ACK BIT(1)
+#define DDRC_DFI_INIT_COMPLETE (1)
+/* DDRC_DBG1 */
+#define DDRC_DIS_HIF BIT(1)
+/* DDRC_DBGCAM */
+#define DDRC_DBG_WR_Q_EMPTY BIT(26)
+#define DDRC_DBG_RD_Q_EMPTY BIT(25)
+#define DDRC_DBG_W_Q_DEPTH_MASK (0xff << 16)
+#define DDRC_DBG_W_Q_DEPTH_EMPTY (0x0 << 16)
+#define DDRC_DBG_LPR_Q_DEPTH_MASK (0xff << 8)
+#define DDRC_DBG_LPR_Q_DEPTH_EMPTY (0x0 << 8)
+#define DDRC_DBG_MASK (DDRC_DBG_WR_Q_EMPTY | DDRC_DBG_RD_Q_EMPTY | \
+ DDRC_DBG_W_Q_DEPTH_MASK | DDRC_DBG_LPR_Q_DEPTH_MASK)
+#define DDRC_DBG_EMPTY (DDRC_DBG_WR_Q_EMPTY | DDRC_DBG_RD_Q_EMPTY | \
+ DDRC_DBG_W_Q_DEPTH_EMPTY | DDRC_DBG_LPR_Q_DEPTH_EMPTY)
+/* DDRC_DBGCMD */
+#define DDRC_RANK1_REFRESH BIT(1)
+#define DDRC_RANK0_REFRESH BIT(0)
+/* DDRC_DBGSTAT */
+#define DDRC_RANK1_REFRESH_BUSY BIT(1)
+#define DDRC_RANK0_REFRESH_BUSY BIT(0)
+/* DDRC_SWCTL */
+#define DDRC_SW_DONE (0x1)
+#define DDRC_SW_DONE_CLEAR (0x0)
+/* DDRC_SWSTAT */
+#define DDRC_SW_DONE_ACK BIT(0)
+/* DDRC_PSTAT */
+#define DDRC_WR_PORT_BUSY_0 BIT(16)
+#define DDRC_RD_PORT_BUSY_0 BIT(0)
+/* DDRC_PCTRLn */
+#define DDRC_PORT_EN BIT(0)
+/* DDRC_ECCCFG0 */
+#define DDRC_ECC_MODE_MASK (0x7)
+#define DDRC_ECC_MODE_DIS (0)
+#define DDRC_ECC_MODE_SEC (0x4)
+#define DDRC_ECC_MODE_ADV (0x5)
+#define DDRC_ECC_MODE_SHIFT (0)
+#define DDRC_ECC_TEST_MODE BIT(3)
+#define DDRC_ECC_DIS_SCRUB BIT(4)
+#define DDRC_ECC_TYPE_SIDEBAND (0)
+#define DDRC_ECC_TYPE_INLINE (1)
+#define DDRC_ECC_TYPE_MASK (1)
+#define DDRC_ECC_TYPE_SHIFT (5)
+/* DDRC_ECCPOISONADDR0 */
+#define DDRC_ECC_POISON_RANK_SHIFT (24)
+#define DDRC_ECC_POISON_COL_SHIFT (0)
+#define DDRC_ECC_POISON_RANK_MASK (1)
+#define DDRC_ECC_POISON_COL_MASK (0xfff)
+/* DDRC_ECCPOISONADDR1 */
+#define DDRC_ECC_POISON_BG_SHIFT (28)
+#define DDRC_ECC_POISON_BK_SHIFT (24)
+#define DDRC_ECC_POISON_ROW_SHIFT (0)
+#define DDRC_ECC_POISON_BG_MASK (0x3)
+#define DDRC_ECC_POISON_BK_MASK (0x7)
+#define DDRC_ECC_POISON_ROW_MASK (0x3ffff)
+
+#endif /* __PLAT_ROCKCHIP_DMC_DDRC_RV1126B_H__ */
diff --git a/plat/rockchip/rv1126b/drivers/dmc/dmc_rv1126b.h b/plat/rockchip/rv1126b/drivers/dmc/dmc_rv1126b.h
new file mode 100644
index 000000000..8f6fcee07
--- /dev/null
+++ b/plat/rockchip/rv1126b/drivers/dmc/dmc_rv1126b.h
@@ -0,0 +1,297 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Copyright (c) 2026, Rockchip Electronics Co., Ltd.
+ */
+
+#ifndef __PLAT_ROCKCHIP_DMC_RV1126B_H__
+#define __PLAT_ROCKCHIP_DMC_RV1126B_H__
+
+#include <plat_private.h>
+
+enum {
+ DLL_ON_2_ON,
+ DLL_ON_2_OFF,
+ DLL_OFF_2_ON,
+ DLL_OFF_2_OFF,
+};
+
+/* DDR PHY Register */
+#define PHY_BYTE_REG_OFS(n) ((n) * 0x180 + 0x400)
+/* PHY_REG0x0 */
+#define PHY_MAX_BYTE (4)
+#define PHY_DQ_WIDTH_MASK (0xf)
+#define PHY_DQ_WIDTH_SHIFT (8)
+/* PHY_REG0x44 */
+#define PHY_FREQ_CHOOSE_OP_T_SHIFT 30
+/* PHY_REG0x84 */
+#define PHY_TRAIN_REG_UPDATE_EN BIT(18)
+/* PHY_REG0xd0 */
+#define PHY_POSTDIV_EN_SHIFT(fsp) (3 + 8 * (fsp))
+#define PHY_POSTDIV_EN_MASK (1)
+#define PHY_POSTDIV_SHIFT(fsp) (4 + 8 * (fsp))
+#define PHY_POSTDIV_MASK (0x7)
+
+/* TOPCRU*/
+#define TOPCRU_GATE_CON06 0x818
+/* TOPCRU_GATE_CON06 */
+#define DCLK_VOP_SRC_EN BIT(12)
+
+/* DDRGRF Register */
+/* DDR_GRF_CON0 */
+#define GRF_CON_DFI_INIT_START(n) BITS_WITH_WMASK(n, 0x1, 1)
+#define DFI_INIT_START_SEL_DDRCTL BIT_CLR_WMSK(0)
+#define DFI_INIT_START_SEL_GRF BIT_SET_WMSK(0)
+/* DDR_GRF_CON21 */
+#define CSYSREQ_DDRC_PMU (((0x1 << 12) << 16) | (0x1 << 12))
+#define CSYSREQ_DDRC_CTL (((0x1 << 12) << 16) | (0x0 << 12))
+
+/* DDR_CRU */
+#define DDR_CRU_DDR_SOFTRST_CON00 0xa00
+/* DDR_CRU_DDR_SOFTRST_CON00 */
+#define PRESETN_DDRPHY(n) ((0x1 << (8 + 16)) | ((n) << 8))
+#define PRESETN_DDRC(n) ((0x1 << (2 + 16)) | ((n) << 2))
+#define PRESETN_DDR_BIU(n) ((0x1 << (1 + 16)) | ((n) << 1))
+
+/* SUBDDR_CRU */
+#define SUBDDR_CRU_DPLL_CON(n) ((n) * 4)
+#define SUBDDR_CLKSEL_CON00 0x300
+#define SUBDDR_GATE_CON00 0x800
+#define SUBDDR_SOFTRST_CON00 0xa00
+/* SUBDDR_CRU_DPLL_CON0 0x0000 */
+#define PB(n) ((0x1 << (15 + 16)) | ((n) << 15))
+#define POSTDIV1_SHIFT 12
+#define POSTDIV1_MASK 0x7
+#define POSTDIV1(n) ((0x7 << (12 + 16)) | ((n) << 12))
+#define FBDIV_SHIFT 0
+#define FBDIV_MASK 0xfff
+#define FBDIV(n) ((0xfff << 16) | (n))
+/* SUBDDR_CRU_DPLL_CON1 0x0004 */
+#define PLLPDSEL(n) ((0x1 << (15 + 16)) | ((n) << 15))
+#define PLLPD1(n) ((0x1 << (14 + 16)) | ((n) << 14))
+#define PLLPD0(n) ((0x1 << (13 + 16)) | ((n) << 13))
+#define DSMPD(n) ((0x1 << (12 + 16)) | ((n) << 12))
+#define PLL_LOCK(n) (((n) >> 10) & 0x1)
+#define POSTDIV2_SHIFT 6
+#define POSTDIV2_MASK 0x7
+#define POSTDIV2(n) ((0x7 << (6 + 16)) | ((n) << 6))
+#define REFDIV_SHIFT 0
+#define REFDIV_MASK 0x3f
+#define REFDIV(n) ((0x3F << 16) | (n))
+/* SUBDDR_CRU_DPLL_CON3 0x000c */
+#define SSMOD_SPREAD(n) ((0x1f << (8 + 16)) | ((n) << 8))
+#define SSMOD_DIVVAL(n) ((0xf << (4 + 16)) | ((n) << 4))
+#define SSMOD_DOWNSPREAD(n) ((0x1 << (3 + 16)) | ((n) << 3))
+#define SSMOD_RESET(n) ((0x1 << (2 + 16)) | ((n) << 2))
+#define SSMOD_DIS_SSCG(n) ((0x1 << (1 + 16)) | ((n) << 1))
+#define SSMOD_BP(n) ((0x1 << (0 + 16)) | ((n) << 0))
+/* SUBDDR_CLKSEL_CON00 0x0300 */
+#define CLK_DPLL 0
+#define ACLK_SYSMEM_SRC 1
+#define CLK1X_PLL_ROOT_SEL(n) ((0x1 << (1 + 16)) | ((n) << 1))
+/* SUBDDR_SOFTRST_CON00 0x0a00 */
+#define RESETN_DDRPHY(n) ((0x1 << (13 + 16)) | ((n) << 13))
+#define RESETN_CORE_DDRC(n) ((0x1 << (7 + 16)) | ((n) << 7))
+#define ARESETN_DDRSCH(n) ((0xf << (3 + 16)) | (((n) == 0 ? 0x0 : 0xf) << 3))
+#define ARESETN_DDR_BIU(n) ((0x1 << (2 + 16)) | ((n) << 2))
+
+/* PMU1 registers */
+#define PMU_DDR_PWR_SFTCON 0x110
+#define PMU_DDR_STS 0x144
+/* PMU_DDR_PWR_SFTCON */
+#define SW_DDRIO_RSTIOV_EXIT (BIT(4 + 16) | BIT(4))
+#define SW_DDRIO_RSTIOV_EN (BIT(3 + 16) | BIT(3))
+#define SW_DDRIO_RSTIOV_DIS (BIT(3 + 16))
+#define SW_DDRIO_RET_EXIT (BIT(2 + 16) | BIT(2))
+#define SW_DDRIO_RET_EN (BIT(1 + 16) | BIT(1))
+#define SW_DDRIO_RET_DIS (BIT(1 + 16))
+#define DDR_SREF_C_SFTENA (BIT(0 + 16) | BIT(0))
+#define DDR_SREF_C_SFTENA_DIS (BIT(0 + 16))
+/* PMU_DDR_STS */
+#define DDRCTL_C_SYSACTIVE BIT(3)
+#define DDRCTL_C_SYSACK BIT(2)
+#define DDRIO_RSTIOV BIT(1)
+#define DDRIO_RETON BIT(0)
+
+/* PMU2 registers */
+#define PMU2_BIU_IDLE_SFTCON0 0x0110
+#define PMU2_BIU_IDLE_ACK_STS0 0x0120
+#define PMU2_BIU_IDLE_STS0 0x0128
+#define PMU2_BIU_GATEMASK_CON0 0x0130
+#define PMU2_PWR_GATE_STS 0x0230
+/* PMU2_BIU_IDLE_SFTCON0 */
+#define IDLE_REQ_DDR(set) ((set) << 0)
+#define IDLE_REQ_DDR_MASK (0x1 << (0 + 16))
+#define IDLE_REQ_VEPU(set) ((set) << 4)
+#define IDLE_REQ_VEPU_MASK (0x1 << (4 + 16))
+#define IDLE_REQ_VCP(set) ((set) << 5)
+#define IDLE_REQ_VCP_MASK (0x1 << (5 + 16))
+#define IDLE_REQ_VDO(set) ((set) << 9)
+#define IDLE_REQ_VDO_MASK (0x1 << (9 + 16))
+/* PMU2_BIU_IDLE_STS0 */
+#define IDLE_DDR (0x1 << 0)
+#define IDLE_VEPU (0x1 << 4)
+#define IDLE_VCP (0x1 << 5)
+#define IDLE_VDO (0x1 << 9)
+/* PMU2_BIU_GATEMASK_CON0 */
+#define BIT_AUTO_VDO_ENA ((0x1 << 9) | (0x1 << (9 + 16)))
+#define BIT_AUTO_VCP_ENA ((0x1 << 5) | (0x1 << (5 + 16)))
+#define BIT_AUTO_VEPU_ENA ((0x1 << 4) | (0x1 << (4 + 16)))
+/* PMU2_PWR_GATE_STS */
+#define PD_VDO_DWN_STAT (0x1 << 1)
+
+/* SYSGRG */
+#define GRF_BIU_CON0 0x0030
+#define GRF_BIU_CON1 0x0034
+
+/* SYS_SGRF */
+#define SYS_SGRF_AXI_SECURE_SGRF_CON0 0x0018
+/* SYS_SGRF_AXI_SECURE_SGRF_CON0 */
+#define SECURE_CTRL_AWPROT_DCF_SHIFT 3
+#define SECURE_CTRL_ARPROT_DCF_SHIFT 2
+
+/* GRF_BIU_CONx */
+#define ERROR_RESPONSE 0
+#define STALL_RESPONSE 1
+
+/* PMUGRF_SOC_CON0 */
+#define PMUGRF_DDRPHY_BUFFEREN_EN BITS_WITH_WMASK(0x1, 0x3, 9)
+#define PMUGRF_DDRPHY_BUFFEREN_DIS BITS_WITH_WMASK(0x3, 0x3, 9)
+#define PMUGRF_DDRPHY_BUFFEREN_SEL_PMU ((0x3 << (16 + 9)) | (0x2 << 9))
+
+/* BUSCRU_BASE Register */
+#define BUSCRU_BUS_GATE_CON02 0x808
+/* BUSCRU_BUS_GATE_CON02 */
+#define ACLK_DCF_EN_SHIFT 1
+#define PCLK_DCF_EN_SHIFT 0
+
+/* VDOCRU registers */
+#define VDO_GATE_CON00 0x800
+/* VDO_GATE_CON00 */
+#define HCLK_VOP_EN BIT(11)
+#define ACLK_VOP_EN BIT(10)
+
+/* VOP_LITE registers */
+#define VOP_SYS_CTRL2 (0x18)
+#define VOP_LINE_FLAG (0x30)
+#define VOP_INTR_CLEAR (0x38)
+#define VOP_INTR_STATUS (0x3c)
+#define VOP_DSP_HTOTAL_HS_END (0x100)
+#define VOP_DSP_VTOTAL_HS_END (0x108)
+#define VOP_WIN2_CTRL0 (0x190)
+#define VOP_SCAN_LINE_NUM (0x1f0)
+/* VOP_SYS_CTRL2 */
+#define IMD_VOP_STANDBY_EN BIT(1)
+/* VOP_INTR_CLEAR */
+#define LINE_FLAG0_INTR_CLR BIT_SET_WMSK(3)
+/* VOP_INTR_STATUS */
+#define LINE_FLAG0_INTR_RAW_STS BIT(19)
+#define LINE_FLAG0_INTR_STS BIT(3)
+/* VOP_WIN2_CTRL0 */
+#define WIN_EN BIT(0)
+
+struct rv1126b_sdram_channel {
+ unsigned char rank;
+ unsigned char col;
+ /* 3:8bank, 2:4bank */
+ unsigned char bk;
+ /* channel buswidth, 2:32bit, 1:16bit, 0:8bit */
+ unsigned char bw;
+ /* die buswidth, 2:32bit, 1:16bit, 0:8bit */
+ unsigned char dbw;
+ unsigned char row_3_4;
+ unsigned char cs0_row;
+ unsigned char cs1_row;
+ unsigned char cs0_high16bit_row;
+ unsigned char cs1_high16bit_row;
+ unsigned int ddrconfig;
+};
+
+struct rv1126b_ddr_pctl_regs {
+ uint32_t pctl[95][2];
+ /* for pctl_f1, pctl_f2, pctl_f3 */
+ uint32_t pctl_f[3][28][2];
+};
+
+struct rv1126b_ddr_phy_regs {
+ uint32_t phy[55][2];
+};
+
+struct rv1126b_ddr_related_regs {
+ uint32_t noc_devicesize;
+ uint32_t ddrgrf[15][2];
+ uint32_t cru_dpll_con[4];
+ uint32_t subddrcru_subddrgate0;
+ uint32_t sgrf_soc_con2;
+};
+
+struct rv1126b_ddr_skew {
+ uint8_t ca_skew[32];
+ uint8_t cs1_ca_skew[12];
+ uint8_t cs2_3_ca_skew[2][12];
+ uint8_t cs_dq_skew[4][4][22];
+ uint8_t cs_rx_dqs_cyc[4][4];
+ uint8_t cs_rx_dqs_oph[4][4];
+ uint8_t cs_rx_dqs_dll[4][4];
+};
+
+struct rv1126b_dmc_config {
+ unsigned int dramtype;
+};
+
+/*
+ * Same as struct rv1126b_fsp_param in
+ * u-boot-ddr/arch/arm/include/asm/arch-rockchip/sdram_rv1126b.h
+ */
+struct rv1126b_fsp_param {
+ uint32_t flag;
+ uint32_t freq_mhz;
+
+ /* DPLL */
+ uint32_t dpll_con[5];
+
+ /* dram size */
+ uint32_t dq_odt;
+ uint32_t ca_odt;
+ uint32_t ds_pdds;
+ uint32_t vref_ca[2];
+ uint32_t vref_dq[2];
+
+ /* phy side, [0] for pull up, [1] for pull down */
+ uint32_t wr_dq_drv[2];
+ uint32_t wr_ca_drv[2];
+ uint32_t wr_ck_drv[2];
+ uint32_t wr_cs_drv[2];
+ uint32_t rd_odt[2];
+ uint32_t vref_inner;
+ uint32_t vref_out;
+ uint32_t lp4_drv_pd_en;
+ uint32_t rx_rcv_mode;
+ uint32_t phy_wdqsoff_on_length;
+ uint32_t phy_hold_timing;
+
+ uint32_t phy_pllpostdiv;
+ uint32_t phy_pllpostdiven;
+ uint32_t phy_al;
+ uint32_t phy_cl;
+ uint32_t phy_cwl;
+ uint32_t reserved[2];
+
+ struct rv1126b_ddr_skew skew;
+};
+
+#define MAX_IDX 4
+#define FSP_FLAG 0xfead0001
+/*
+ * Borrow share memory space to temporarily store FSP parame.
+ * In the stage of DDR init write FSP parame to this space.
+ * In the stage of trust init move FSP parame to SRAM space from share memory space.
+ */
+#define FSP_PARAM_BASE SHARE_MEM_BASE
+
+uint32_t dmc_get_dramtype(void);
+__pmusramfunc void dmc_enter_lp(void);
+void dmc_save(void);
+__pmusramfunc void dmc_restore(void);
+void dmc_init(void);
+
+#endif /* __PLAT_ROCKCHIP_DMC_RV1126B_H__ */
diff --git a/plat/rockchip/rv1126b/drivers/dmc/suspend.c b/plat/rockchip/rv1126b/drivers/dmc/suspend.c
new file mode 100644
index 000000000..525b089eb
--- /dev/null
+++ b/plat/rockchip/rv1126b/drivers/dmc/suspend.c
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: BSD-3-Clause
+/*
+ * Copyright (c) 2026, Rockchip Electronics Co., Ltd.
+ */
+
+#include <common/debug.h>
+
+#include <dmc_ddrc_rv1126b.h>
+#include <dmc_rv1126b.h>
+#include <plat_private.h>
+#include <platform_def.h>
+#include <pmu.h>
+#include <soc.h>
+
+/* ddr phy registers define */
+#define PHY_REG(n) (DDRPHY_BASE + n)
+
+static __pmusramdata uint32_t save_lp_stat;
+
+static __pmusramfunc uint32_t low_power_update(uint32_t en)
+{
+ uint32_t lp_stat = 0;
+
+ if (en == 1) {
+ mmio_clrbits_32(PHY_REG(0x84), BIT(15));
+ mmio_setbits_32(DDRCTL_BASE + DDRC_PWRCTL, en & 0xf);
+ } else {
+ lp_stat = mmio_read_32(DDRCTL_BASE + DDRC_PWRCTL) & 0xf;
+ mmio_clrbits_32(DDRCTL_BASE + DDRC_PWRCTL, 0xf);
+ mmio_setbits_32(PHY_REG(0x84), BIT(15));
+ }
+
+ return lp_stat;
+}
+
+__pmusramfunc void dmc_enter_lp(void)
+{
+ save_lp_stat = low_power_update(0);
+
+ /* into self_refresh */
+ mmio_write_32(PMU1_BASE + PMU_DDR_PWR_SFTCON, DDR_SREF_C_SFTENA);
+ while (!(mmio_read_32(PMU1_BASE + PMU_DDR_STS) & DDRCTL_C_SYSACK))
+ continue;
+}
+
+__pmusramfunc void dmc_restore(void)
+{
+ /* exit self_refresh */
+ mmio_write_32(DDRGRF_BASE + DDRGRF_CON(21), CSYSREQ_DDRC_PMU);
+ mmio_write_32(PMU1_BASE + PMU_DDR_PWR_SFTCON, DDR_SREF_C_SFTENA_DIS);
+ while (mmio_read_32(PMU1_BASE + PMU_DDR_STS) & DDRCTL_C_SYSACK)
+ continue;
+
+ low_power_update(save_lp_stat);
+}
diff --git a/plat/rockchip/rv1126b/drivers/pmu/plat_pmu_macros.S b/plat/rockchip/rv1126b/drivers/pmu/plat_pmu_macros.S
new file mode 100644
index 000000000..a61cf80a1
--- /dev/null
+++ b/plat/rockchip/rv1126b/drivers/pmu/plat_pmu_macros.S
@@ -0,0 +1,16 @@
+// SPDX-License-Identifier: BSD-3-Clause
+/*
+ * Copyright (c) 2026, Rockchip Electronics Co., Ltd.
+ */
+
+#include <arch.h>
+#include <asm_macros.S>
+#include <platform_def.h>
+
+.globl clst_warmboot_data
+
+.macro func_rockchip_clst_warmboot
+.endm
+
+.macro rockchip_clst_warmboot_data
+.endm
diff --git a/plat/rockchip/rv1126b/drivers/pmu/pm_pd_regs.c b/plat/rockchip/rv1126b/drivers/pmu/pm_pd_regs.c
new file mode 100644
index 000000000..1854e4bf1
--- /dev/null
+++ b/plat/rockchip/rv1126b/drivers/pmu/pm_pd_regs.c
@@ -0,0 +1,166 @@
+// SPDX-License-Identifier: BSD-3-Clause
+/*
+ * Copyright (c) 2026, Rockchip Electronics Co., Ltd.
+ */
+
+#include <assert.h>
+#include <errno.h>
+
+#include <arch_helpers.h>
+#include <bl31/bl31.h>
+#include <common/debug.h>
+#include <drivers/console.h>
+#include <drivers/delay_timer.h>
+#include <lib/mmio.h>
+#include <platform.h>
+
+#include <plat_pm_helpers.h>
+#include <plat_private.h>
+#include <platform_def.h>
+#include <pm_pd_regs.h>
+#include <pmu.h>
+#include <soc.h>
+
+#define WMSK_VAL 0xffff0000
+
+static struct reg_region pd_aiisp_reg_rgns[] = {
+ /* qos */
+ REG_REGION(0x08, 0x18, 4, 0x203b0000, 0)
+};
+
+static struct reg_region pd_vdo_reg_rgns[] = {
+ /* vdo_cru */
+ REG_REGION(0x300, 0x300, 4, VDOCRU_BASE, WMSK_VAL),
+
+ /* vdo_grf */
+ REG_REGION(0x000, 0x014, 4, VDOGRF_BASE, WMSK_VAL),
+
+ /* qos */
+ REG_REGION(0x08, 0x18, 4, 0x20380000, 0),
+ REG_REGION(0x08, 0x18, 4, 0x20380100, 0),
+ REG_REGION(0x08, 0x18, 4, 0x20380200, 0),
+ REG_REGION(0x08, 0x18, 4, 0x20380300, 0),
+ REG_REGION(0x08, 0x18, 4, 0x20380400, 0),
+
+ /* shaping */
+ REG_REGION(0x08, 0x08, 4, 0x20380080, 0),
+ REG_REGION(0x08, 0x08, 4, 0x20380180, 0),
+ REG_REGION(0x08, 0x08, 4, 0x20380280, 0),
+ REG_REGION(0x08, 0x08, 4, 0x20380380, 0),
+ REG_REGION(0x08, 0x08, 4, 0x20380480, 0),
+};
+
+static struct reg_region vd_npu_reg_rgns[] = {
+ /* npu pvtpll*/
+ REG_REGION(0x24, 0x24, 4, PVTPLL_NPU_BASE, WMSK_VAL),
+ REG_REGION(0x20, 0x20, 4, PVTPLL_NPU_BASE, WMSK_VAL),
+
+ /* npu_cru */
+ REG_REGION(0x300, 0x300, 4, NPUCRU_BASE, WMSK_VAL),
+
+ /* npu_grf */
+ REG_REGION(0x000, 0x004, 4, NPUGRF_BASE, WMSK_VAL),
+ REG_REGION(0x008, 0x00c, 4, NPUGRF_BASE, 0),
+ REG_REGION(0x010, 0x018, 4, NPUGRF_BASE, WMSK_VAL),
+
+ /* qos */
+ REG_REGION(0x08, 0x18, 4, 0x20340000, 0),
+
+ /* shaping */
+ REG_REGION(0x08, 0x08, 4, 0x20340080, 0),
+};
+
+static struct reg_region vd_core_reg_rgns[] = {
+ /* cpu pvtpll */
+ REG_REGION(0x24, 0x24, 4, PVTPLL_CORE_BASE, WMSK_VAL),
+ REG_REGION(0x20, 0x20, 4, PVTPLL_CORE_BASE, WMSK_VAL),
+
+ /* core_cru */
+ REG_REGION(0x300, 0x308, 4, CORECRU_BASE, WMSK_VAL),
+ REG_REGION(0xd00, 0xd00, 4, CORECRU_BASE, 0),
+ REG_REGION(0xd04, 0xd04, 4, CORECRU_BASE, WMSK_VAL),
+
+ /* core_grf */
+ REG_REGION(0x000, 0x004, 4, COREGRF_BASE, WMSK_VAL),
+
+ /* qos */
+ REG_REGION(0x08, 0x18, 4, 0x20310000, 0),
+
+ /* shaping */
+ REG_REGION(0x08, 0x08, 4, 0x20310080, 0),
+};
+
+static uint32_t npu_clk_gt_save, vdo_clk_gt_save[VDO_CRU_CLKGATE_CON_CNT];
+
+void pd_aiisp_save(void)
+{
+ rockchip_reg_rgn_save(pd_aiisp_reg_rgns, ARRAY_SIZE(pd_aiisp_reg_rgns));
+}
+
+void pd_aiisp_restore(void)
+{
+ rockchip_reg_rgn_restore(pd_aiisp_reg_rgns, ARRAY_SIZE(pd_aiisp_reg_rgns));
+}
+
+void pd_vdo_save(void)
+{
+ int i;
+
+ for (i = 0; i < VDO_CRU_CLKGATE_CON_CNT; i++) {
+ vdo_clk_gt_save[i] = mmio_read_32(VDOCRU_BASE + VDO_CRU_CLKGATE_CON(i));
+ mmio_write_32(VDOCRU_BASE + VDO_CRU_CLKGATE_CON(i), 0xffff0000);
+ }
+
+ rockchip_reg_rgn_save(pd_vdo_reg_rgns, ARRAY_SIZE(pd_vdo_reg_rgns));
+}
+
+void pd_vdo_restore(void)
+{
+ int i;
+
+ rockchip_reg_rgn_restore(pd_vdo_reg_rgns, ARRAY_SIZE(pd_vdo_reg_rgns));
+
+ for (i = 0; i < VDO_CRU_CLKGATE_CON_CNT; i++)
+ mmio_write_32(VDOCRU_BASE + VDO_CRU_CLKGATE_CON(i),
+ WITH_16BITS_WMSK(vdo_clk_gt_save[i]));
+}
+
+void vd_npu_save(void)
+{
+ npu_clk_gt_save = mmio_read_32(NPUCRU_BASE + NPU_CRU_CLKGATE_CON0);
+
+ mmio_write_32(NPUCRU_BASE + NPU_CRU_CLKGATE_CON0, 0xffff0000);
+
+ rockchip_reg_rgn_save(vd_npu_reg_rgns, ARRAY_SIZE(vd_npu_reg_rgns));
+}
+
+void vd_npu_restore(void)
+{
+ rockchip_reg_rgn_restore(vd_npu_reg_rgns, ARRAY_SIZE(vd_npu_reg_rgns));
+
+ mmio_write_32(NPUCRU_BASE + NPU_CRU_CLKGATE_CON0, WITH_16BITS_WMSK(npu_clk_gt_save));
+}
+
+void vd_core_save(void)
+{
+ rockchip_reg_rgn_save(vd_core_reg_rgns, ARRAY_SIZE(vd_core_reg_rgns));
+}
+
+void vd_core_restore(void)
+{
+ /* slow mode */
+ mmio_write_32(TOPCRU_BASE + 0x280, 0x003f0000);
+
+ rockchip_reg_rgn_restore(vd_core_reg_rgns, ARRAY_SIZE(vd_core_reg_rgns));
+
+ /* switch to pll */
+ mmio_write_32(TOPCRU_BASE + 0x280, 0x003f0015);
+}
+
+void pm_reg_rgns_init(void)
+{
+ rockchip_alloc_region_mem(pd_aiisp_reg_rgns, ARRAY_SIZE(pd_aiisp_reg_rgns));
+ rockchip_alloc_region_mem(pd_vdo_reg_rgns, ARRAY_SIZE(pd_vdo_reg_rgns));
+ rockchip_alloc_region_mem(vd_npu_reg_rgns, ARRAY_SIZE(vd_npu_reg_rgns));
+ rockchip_alloc_region_mem(vd_core_reg_rgns, ARRAY_SIZE(vd_core_reg_rgns));
+}
diff --git a/plat/rockchip/rv1126b/drivers/pmu/pm_pd_regs.h b/plat/rockchip/rv1126b/drivers/pmu/pm_pd_regs.h
new file mode 100644
index 000000000..1e56024da
--- /dev/null
+++ b/plat/rockchip/rv1126b/drivers/pmu/pm_pd_regs.h
@@ -0,0 +1,22 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Copyright (c) 2026, Rockchip Electronics Co., Ltd.
+ */
+
+#ifndef PM_PD_REGS_H
+#define PM_PD_REGS_H
+
+#include <stdint.h>
+
+void pd_aiisp_save(void);
+void pd_aiisp_restore(void);
+void pd_vdo_save(void);
+void pd_vdo_restore(void);
+void vd_npu_save(void);
+void vd_npu_restore(void);
+void vd_core_save(void);
+void vd_core_restore(void);
+
+void pm_reg_rgns_init(void);
+
+#endif
diff --git a/plat/rockchip/rv1126b/drivers/pmu/pmu.c b/plat/rockchip/rv1126b/drivers/pmu/pmu.c
new file mode 100644
index 000000000..1de73cb7c
--- /dev/null
+++ b/plat/rockchip/rv1126b/drivers/pmu/pmu.c
@@ -0,0 +1,963 @@
+// SPDX-License-Identifier: BSD-3-Clause
+/*
+ * Copyright (c) 2026, Rockchip Electronics Co., Ltd.
+ */
+
+#include <assert.h>
+#include <errno.h>
+
+#include <arch_helpers.h>
+#include <bl31/bl31.h>
+#include <common/debug.h>
+#include <drivers/console.h>
+#include <drivers/delay_timer.h>
+#include <lib/mmio.h>
+#include <plat/common/platform.h>
+
+#include <cpus_on_fixed_addr.h>
+#include <dmc_rv1126b.h>
+#include <plat_pm_helpers.h>
+#include <plat_private.h>
+#include <platform_def.h>
+#include <pm_pd_regs.h>
+#include <pmu.h>
+#include <secure.h>
+#include <soc.h>
+
+static struct psram_data_t *psram_sleep_cfg =
+ (struct psram_data_t *)&sys_sleep_flag_sram;
+
+struct rv1126b_sleep_ddr_data {
+ uint32_t cru_mode_con, secure_cru_mode;
+ uint32_t gpio0a_iomux_l, gpio0a_iomux_h, gpio0b_iomux_l, gpio0b_iomux_h,
+ gpio0c_iomux_l, gpio0c_iomux_h, gpio0d_iomux_l;
+ uint32_t gpio0_ddr_l, gpio0_ddr_h, gpio0_dr_l, gpio0_dr_h;
+ uint32_t gpio0a_pull, gpio0b_pull, gpio0c_pull, gpio0d_pull;
+ uint32_t gpio0_dbclk_div_con;
+ uint32_t pmu2_pwrgt_sft_con0;
+ uint32_t pmugrf_soc_con0, pmugrf_soc_con1, pmugrf_soc_con4, pmugrf_soc_con5,
+ pmugrf_soc_con6, pmugrf_soc_con7;
+ uint32_t pmu0cru_sel_con1;
+ uint32_t pmu_pd_st, bus_idle_st;
+ uint32_t sys_sgrf_con;
+ uint32_t sleep_clk_freq_khz, sleep_pin_en_msk, sleep_pin_act_low_msk;
+ uint32_t ddrgrf_con21;
+};
+
+static struct rv1126b_sleep_ddr_data ddr_data;
+
+struct rv1126b_sleep_pmusram_data {
+ uint32_t idle_msk[2];
+};
+
+static __pmusramdata struct rv1126b_sleep_pmusram_data pmusram_data;
+
+void rockchip_plat_mmu_el3(void)
+{
+}
+
+static int check_cpu_wfie(uint32_t cpu)
+{
+ uint32_t loop = 0;
+ uint32_t msk = 0x11 << cpu;
+
+ while ((mmio_read_32(COREGRF_BASE + CPUGRF_STATUS(0)) & msk) == 0 &&
+ loop < WFEI_CHECK_LOOP) {
+ udelay(1);
+ loop++;
+ }
+
+ if (loop >= WFEI_CHECK_LOOP) {
+ WARN("%s: error, cpu%d (0x%x)!\n", __func__, cpu,
+ mmio_read_32(COREGRF_BASE + CPUGRF_STATUS(0)));
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static inline uint32_t cpu_power_domain_st(uint32_t cpu)
+{
+ return !!(mmio_read_32(PMU_BASE + PMU2_CLUSTER_PWR_ST) &
+ BIT(cpu + 8));
+}
+
+static int cpu_power_domain_ctr(uint32_t cpu, uint32_t pd_state)
+{
+ uint32_t loop = 0;
+ int ret = 0;
+
+ mmio_write_32(PMU_BASE + PMU2_CPU_PWR_SFTCON(cpu),
+ BITS_WITH_WMASK(pd_state, 0x1, 0));
+
+ dsb();
+ while ((cpu_power_domain_st(cpu) != pd_state) && (loop < PD_CTR_LOOP)) {
+ udelay(1);
+ loop++;
+ }
+
+ if (cpu_power_domain_st(cpu) != pd_state) {
+ WARN("%s: %d, %d, error!\n", __func__, cpu, pd_state);
+ ret = -EINVAL;
+ }
+
+ return ret;
+}
+
+static inline uint32_t get_cpus_pwr_domain_cfg_info(uint32_t cpu_id)
+{
+ uint32_t val;
+
+ if (mmio_read_32(PMU_BASE + PMU2_CPU_PWR_SFTCON(cpu_id)) & BIT(0))
+ return core_pwr_pd;
+
+ val = mmio_read_32(PMU_BASE + PMU2_CPU_AUTO_PWR_CON(cpu_id));
+ if ((val & BIT(pmu_cpu_pm_en)) != 0) {
+ if ((val & BIT(core_pwr_wfi_int)) != 0)
+ return core_pwr_wfi_int;
+ else if ((val & BIT(pmu_cpu_pm_sft_wakeup_en)) != 0)
+ return core_pwr_wfi_reset;
+ else
+ return core_pwr_wfi;
+ } else {
+ return -1;
+ }
+}
+
+static int cpus_power_domain_on(uint32_t cpu_id)
+{
+ uint32_t cfg_info;
+ /*
+ * There are two ways to powering on or off on core.
+ * 1) Control it power domain into on or off in PMU_PWRDN_CON reg
+ * 2) Enable the core power manage in PMU_CORE_PM_CON reg,
+ * then, if the core enter into wfi, it power domain will be
+ * powered off automatically.
+ */
+
+ cfg_info = get_cpus_pwr_domain_cfg_info(cpu_id);
+
+ if (cfg_info == core_pwr_pd) {
+ /* disable core_pm cfg */
+ mmio_write_32(PMU_BASE + PMU2_CPU_AUTO_PWR_CON(cpu_id),
+ BITS_WITH_WMASK(0, 0xf, 0));
+ /* if the cores have be on, power off it firstly */
+ if (cpu_power_domain_st(cpu_id) == pmu_pd_on)
+ cpu_power_domain_ctr(cpu_id, pmu_pd_off);
+
+ cpu_power_domain_ctr(cpu_id, pmu_pd_on);
+ } else {
+ if (cpu_power_domain_st(cpu_id) == pmu_pd_on) {
+ WARN("%s: cpu%d is not in off,!\n", __func__, cpu_id);
+ return -EINVAL;
+ }
+
+ mmio_write_32(PMU_BASE + PMU2_CPU_AUTO_PWR_CON(cpu_id),
+ BITS_WITH_WMASK(1, 0x1, pmu_cpu_pm_sft_wakeup_en));
+ dsb();
+ }
+
+ return 0;
+}
+
+static int cpus_power_domain_off(uint32_t cpu_id, uint32_t pd_cfg)
+{
+ uint32_t core_pm_value;
+
+ if (cpu_power_domain_st(cpu_id) == pmu_pd_off)
+ return 0;
+
+ if (pd_cfg == core_pwr_pd) {
+ if (check_cpu_wfie(cpu_id) != 0)
+ return -EINVAL;
+
+ /* disable core_pm cfg */
+ mmio_write_32(PMU_BASE + PMU2_CPU_AUTO_PWR_CON(cpu_id),
+ BITS_WITH_WMASK(0, 0xf, 0));
+
+ cpu_power_domain_ctr(cpu_id, pmu_pd_off);
+ } else {
+ core_pm_value = BIT(pmu_cpu_pm_en) | BIT(pmu_cpu_pm_dis_int);
+ if (pd_cfg == core_pwr_wfi_int)
+ core_pm_value |= BIT(pmu_cpu_pm_int_wakeup_en);
+ else if (pd_cfg == core_pwr_wfi_reset)
+ core_pm_value |= BIT(pmu_cpu_pm_sft_wakeup_en);
+
+ mmio_write_32(PMU_BASE + PMU2_CPU_AUTO_PWR_CON(cpu_id),
+ BITS_WITH_WMASK(core_pm_value, 0xf, 0));
+ dsb();
+ }
+
+ return 0;
+}
+
+int rockchip_soc_cores_pwr_dm_on(unsigned long mpidr, uint64_t entrypoint)
+{
+ uint32_t cpu_id = plat_core_pos_by_mpidr(mpidr);
+
+ assert(cpu_id < PLATFORM_CORE_COUNT);
+ assert(cpuson_flags[cpu_id] == 0);
+ cpuson_flags[cpu_id] = PMU_CPU_HOTPLUG;
+ cpuson_entry_point[cpu_id] = entrypoint;
+ dsb();
+
+ cpus_power_domain_on(cpu_id);
+
+ return PSCI_E_SUCCESS;
+}
+
+int rockchip_soc_cores_pwr_dm_off(void)
+{
+ uint32_t cpu_id = plat_my_core_pos();
+
+ cpus_power_domain_off(cpu_id, core_pwr_wfi);
+
+ return PSCI_E_SUCCESS;
+}
+
+int rockchip_soc_cores_pwr_dm_on_finish(void)
+{
+ uint32_t cpu_id = plat_my_core_pos();
+
+ mmio_write_32(PMU_BASE + PMU2_CPU_AUTO_PWR_CON(cpu_id),
+ BITS_WITH_WMASK(0, 0xf, 0));
+
+ return PSCI_E_SUCCESS;
+}
+
+int rockchip_soc_cores_pwr_dm_suspend(void)
+{
+ uint32_t cpu_id = plat_my_core_pos();
+
+ assert(cpu_id < PLATFORM_CORE_COUNT);
+ assert(cpuson_flags[cpu_id] == 0);
+ cpuson_flags[cpu_id] = PMU_CPU_AUTO_PWRDN;
+ cpuson_entry_point[cpu_id] = plat_get_sec_entrypoint();
+ dsb();
+
+ cpus_power_domain_off(cpu_id, core_pwr_wfi_int);
+
+ return PSCI_E_SUCCESS;
+}
+
+int rockchip_soc_cores_pwr_dm_resume(void)
+{
+ uint32_t cpu_id = plat_my_core_pos();
+
+ /* Disable core_pm */
+ mmio_write_32(PMU_BASE + PMU2_CPU_AUTO_PWR_CON(cpu_id),
+ BITS_WITH_WMASK(0, 0xf, 0));
+
+ return PSCI_E_SUCCESS;
+}
+
+void nonboot_cpus_off(void)
+{
+ uint32_t boot_cpu, cpu;
+
+ boot_cpu = plat_my_core_pos();
+
+ /* turn off noboot cpus */
+ for (cpu = 0; cpu < PLATFORM_CORE_COUNT; cpu++) {
+ if (cpu == boot_cpu)
+ continue;
+
+ cpus_power_domain_off(cpu, core_pwr_pd);
+ }
+}
+
+__pmusramfunc void pmusram_pmu_bus_idle_req_msk(uint32_t msk, uint32_t state)
+{
+ if (state == pmu_bus_idle)
+ state = msk;
+ else
+ state = 0x0;
+
+ mmio_write_32(PMU_BASE + PMU2_BUS_IDLE_SFTCON,
+ BITS_WITH_WMASK(state, msk, 0));
+
+ while (pmu_bus_idle_st_msk(msk) != state ||
+ pmu_bus_idle_ack_msk(msk) != state)
+ ;
+}
+
+static __pmusramfunc void ddr_resume(void)
+{
+ /* switch to pll */
+ mmio_write_32(TOPCRU_BASE + 0x280, 0x003f0015);
+
+ /* hptimer 32k disable */
+ mmio_write_32(PMUSGRF_BASE + PMUSGRF_SOC_CON(0),
+ BITS_WITH_WMASK(0, 0x1, 8));
+
+ /* hptimer is 24M here */
+ write_cntfrq_el0(24000000);
+
+ pmusram_pmu_bus_idle_req_msk(pmusram_data.idle_msk[1], pmu_bus_active);
+ pmusram_pmu_bus_idle_req_msk(pmusram_data.idle_msk[0], pmu_bus_active);
+
+ dmc_restore();
+}
+
+static uint32_t clk_save[CRU_CLKGATE_CON_CNT + PERI_CRU_CLKGATE_CON_CNT +
+ BUS_CRU_CLKGATE_CON_CNT + BUS_SCRU_CLKGATE_CON_CNT +
+ PMU0CRU_CLKGATE_CON_CNT + PMU1CRU_CLKGATE_CON_CNT +
+ CORE_CRU_CLKGATE_CON_CNT + VI_CRU_CLKGATE_CON_CNT +
+ VEPU_CRU_CLKGATE_CON_CNT + VCP_CRU_CLKGATE_CON_CNT +
+ PMUSCRU_CLKGATE_CON_CNT];
+
+static const uint16_t top_clk_ungt_msk[CRU_CLKGATE_CON_CNT] = {
+ 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xffff, 0xffff, 0xffff, 0xffff,
+ 0xfffc, 0xffff, 0xffff, 0xffff, /* Don't open wdt clk (cru_gt8[0:1]) */
+ 0xffff, 0xffff, 0xffff, 0xff87, /* Don't open mipi clk (cru_gt15[0:1]) */
+};
+
+void clk_gate_con_disable(void)
+{
+ int i;
+
+ for (i = 0; i < CRU_CLKGATE_CON_CNT; i++) {
+ mmio_write_32(TOPCRU_BASE + CRU_CLKGATE_CON(i),
+ (uint32_t)top_clk_ungt_msk[i] << 16);
+ }
+
+ for (i = 0; i < PERI_CRU_CLKGATE_CON_CNT; i++)
+ mmio_write_32(PERICRU_BASE + PERI_CRU_CLKGATE_CON(i), 0xffff0000);
+
+ for (i = 0; i < BUS_CRU_CLKGATE_CON_CNT; i++)
+ mmio_write_32(BUSCRU_BASE + BUS_CRU_CLKGATE_CON(i), 0xffff0000);
+
+ for (i = 0; i < BUS_SCRU_CLKGATE_CON_CNT; i++)
+ mmio_write_32(BUSCRU_BASE + BUS_SCRU_CLKGATE_CON(i), 0xffff0000);
+
+ for (i = 0; i < PMU0CRU_CLKGATE_CON_CNT; i++)
+ mmio_write_32(PMU0CRU_BASE + PMU0CRU_CLKGATE_CON(i), 0xffff0000);
+
+ for (i = 0; i < PMU1CRU_CLKGATE_CON_CNT; i++)
+ mmio_write_32(PMU1CRU_BASE + PMU1CRU_CLKGATE_CON(i), 0xffff0000);
+
+ for (i = 0; i < CORE_CRU_CLKGATE_CON_CNT; i++)
+ mmio_write_32(CORECRU_BASE + CORE_CRU_CLKGATE_CON(i), 0xffff0000);
+
+ for (i = 0; i < VI_CRU_CLKGATE_CON_CNT; i++)
+ mmio_write_32(VICRU_BASE + VI_CRU_CLKGATE_CON(i), 0xffff0000);
+
+ for (i = 0; i < VEPU_CRU_CLKGATE_CON_CNT; i++)
+ mmio_write_32(VEPUCRU_BASE + VEPU_CRU_CLKGATE_CON(i), 0xffff0000);
+
+ for (i = 0; i < VCP_CRU_CLKGATE_CON_CNT; i++)
+ mmio_write_32(VCPCRU_BASE + VCP_CRU_CLKGATE_CON(i), 0xffff0000);
+
+ mmio_write_32(PMUSCRU_BASE + PMUSCRU_CLKGATE_CON0, 0xffff0000);
+}
+
+void clk_gate_con_save(void)
+{
+ int i, j = 0;
+
+ for (i = 0; i < CRU_CLKGATE_CON_CNT; i++, j++)
+ clk_save[j] = mmio_read_32(TOPCRU_BASE + CRU_CLKGATE_CON(i));
+
+ for (i = 0; i < PERI_CRU_CLKGATE_CON_CNT; i++, j++)
+ clk_save[j] = mmio_read_32(PERICRU_BASE + PERI_CRU_CLKGATE_CON(i));
+
+ for (i = 0; i < BUS_CRU_CLKGATE_CON_CNT; i++, j++)
+ clk_save[j] = mmio_read_32(BUSCRU_BASE + BUS_CRU_CLKGATE_CON(i));
+
+ for (i = 0; i < BUS_SCRU_CLKGATE_CON_CNT; i++, j++)
+ clk_save[j] = mmio_read_32(BUSCRU_BASE + BUS_SCRU_CLKGATE_CON(i));
+
+ for (i = 0; i < PMU0CRU_CLKGATE_CON_CNT; i++, j++)
+ clk_save[j] = mmio_read_32(PMU0CRU_BASE + PMU0CRU_CLKGATE_CON(i));
+
+ for (i = 0; i < PMU1CRU_CLKGATE_CON_CNT; i++, j++)
+ clk_save[j] = mmio_read_32(PMU1CRU_BASE + PMU1CRU_CLKGATE_CON(i));
+
+ for (i = 0; i < CORE_CRU_CLKGATE_CON_CNT; i++, j++)
+ clk_save[j] = mmio_read_32(CORECRU_BASE + CORE_CRU_CLKGATE_CON(i));
+
+ for (i = 0; i < VI_CRU_CLKGATE_CON_CNT; i++, j++)
+ clk_save[j] = mmio_read_32(VICRU_BASE + VI_CRU_CLKGATE_CON(i));
+
+ for (i = 0; i < VEPU_CRU_CLKGATE_CON_CNT; i++, j++)
+ clk_save[j] = mmio_read_32(VEPUCRU_BASE + VEPU_CRU_CLKGATE_CON(i));
+
+ for (i = 0; i < VCP_CRU_CLKGATE_CON_CNT; i++, j++)
+ clk_save[j] = mmio_read_32(VCPCRU_BASE + VCP_CRU_CLKGATE_CON(i));
+
+ clk_save[j] = mmio_read_32(PMUSCRU_BASE + PMUSCRU_CLKGATE_CON0);
+}
+
+void clk_gate_con_restore(void)
+{
+ int i, j = 0;
+
+ for (i = 0; i < CRU_CLKGATE_CON_CNT; i++, j++)
+ mmio_write_32(TOPCRU_BASE + CRU_CLKGATE_CON(i),
+ WITH_16BITS_WMSK(clk_save[j]));
+
+ for (i = 0; i < PERI_CRU_CLKGATE_CON_CNT; i++, j++)
+ mmio_write_32(PERICRU_BASE + PERI_CRU_CLKGATE_CON(i),
+ WITH_16BITS_WMSK(clk_save[j]));
+
+ for (i = 0; i < BUS_CRU_CLKGATE_CON_CNT; i++, j++)
+ mmio_write_32(BUSCRU_BASE + BUS_CRU_CLKGATE_CON(i),
+ WITH_16BITS_WMSK(clk_save[j]));
+
+ for (i = 0; i < BUS_SCRU_CLKGATE_CON_CNT; i++, j++)
+ mmio_write_32(BUSCRU_BASE + BUS_SCRU_CLKGATE_CON(i),
+ WITH_16BITS_WMSK(clk_save[j]));
+
+ for (i = 0; i < PMU0CRU_CLKGATE_CON_CNT; i++, j++)
+ mmio_write_32(PMU0CRU_BASE + PMU0CRU_CLKGATE_CON(i),
+ WITH_16BITS_WMSK(clk_save[j]));
+
+ for (i = 0; i < PMU1CRU_CLKGATE_CON_CNT; i++, j++)
+ mmio_write_32(PMU1CRU_BASE + PMU1CRU_CLKGATE_CON(i),
+ WITH_16BITS_WMSK(clk_save[j]));
+
+ for (i = 0; i < CORE_CRU_CLKGATE_CON_CNT; i++, j++)
+ mmio_write_32(CORECRU_BASE + CORE_CRU_CLKGATE_CON(i),
+ WITH_16BITS_WMSK(clk_save[j]));
+
+ for (i = 0; i < VI_CRU_CLKGATE_CON_CNT; i++, j++)
+ mmio_write_32(VICRU_BASE + VI_CRU_CLKGATE_CON(i),
+ WITH_16BITS_WMSK(clk_save[j]));
+
+ for (i = 0; i < VEPU_CRU_CLKGATE_CON_CNT; i++, j++)
+ mmio_write_32(VEPUCRU_BASE + VEPU_CRU_CLKGATE_CON(i),
+ WITH_16BITS_WMSK(clk_save[j]));
+
+ for (i = 0; i < VCP_CRU_CLKGATE_CON_CNT; i++, j++)
+ mmio_write_32(VCPCRU_BASE + VCP_CRU_CLKGATE_CON(i),
+ WITH_16BITS_WMSK(clk_save[j]));
+
+ mmio_write_32(PMUSCRU_BASE + PMUSCRU_CLKGATE_CON0, WITH_16BITS_WMSK(clk_save[j]));
+}
+
+void pmu_bus_idle_req(uint32_t bus, uint32_t state)
+{
+ uint32_t wait_cnt = 0;
+
+ mmio_write_32(PMU_BASE + PMU2_BUS_IDLE_SFTCON,
+ BITS_WITH_WMASK(state, 0x1, bus));
+
+ while (pmu_bus_idle_st(bus) != state ||
+ pmu_bus_idle_ack(bus) != state) {
+ if (++wait_cnt > BUS_IDLE_LOOP)
+ break;
+ udelay(1);
+ }
+
+ if (wait_cnt > BUS_IDLE_LOOP)
+ WARN("%s: can't wait state %d for bus %d (0x%x)\n",
+ __func__, state, bus,
+ mmio_read_32(PMU_BASE + PMU2_BUS_IDLE_ST));
+}
+
+static inline uint32_t pmu_power_domain_st(uint32_t pd)
+{
+ return mmio_read_32(PMU_BASE + PMU2_PWR_GATE_ST) & BIT(pd) ?
+ pmu_pd_off :
+ pmu_pd_on;
+}
+
+int pmu_power_domain_ctr(uint32_t pd, uint32_t pd_state)
+{
+ uint32_t loop = 0;
+ int ret = 0;
+
+ mmio_write_32(PMU_BASE + PMU2_PWR_GATE_SFTCON,
+ BITS_WITH_WMASK(pd_state, 0x1, pd));
+ dsb();
+
+ while ((pmu_power_domain_st(pd) != pd_state) && (loop < PD_CTR_LOOP)) {
+ udelay(1);
+ loop++;
+ }
+
+ if (pmu_power_domain_st(pd) != pd_state) {
+ WARN("%s: %d, %d, (0x%x) error!\n", __func__, pd, pd_state,
+ mmio_read_32(PMU_BASE + PMU2_PWR_GATE_ST));
+ ret = -EINVAL;
+ }
+
+ return ret;
+}
+
+static int pmu_set_power_domain(uint32_t pd_id, uint32_t pd_state)
+{
+ uint32_t state;
+
+ if (pmu_power_domain_st(pd_id) == pd_state)
+ goto out;
+
+ if (pd_state == pmu_pd_on)
+ pmu_power_domain_ctr(pd_id, pd_state);
+
+ state = (pd_state == pmu_pd_off) ? pmu_bus_idle : pmu_bus_active;
+
+ switch (pd_id) {
+ case pmu_pd_npu:
+ pmu_bus_idle_req(pmu_bus_id_npu, state);
+ break;
+ case pmu_pd_vdo:
+ pmu_bus_idle_req(pmu_bus_id_vdo, state);
+ break;
+ case pmu_pd_aiisp:
+ pmu_bus_idle_req(pmu_bus_id_aisp, state);
+ break;
+ default:
+ break;
+ }
+
+ if (pd_state == pmu_pd_off)
+ pmu_power_domain_ctr(pd_id, pd_state);
+
+out:
+ return 0;
+}
+
+static void pmu_power_domains_suspend(void)
+{
+ ddr_data.pmu_pd_st = mmio_read_32(PMU_BASE + PMU2_PWR_GATE_ST);
+ ddr_data.bus_idle_st = mmio_read_32(PMU_BASE + PMU2_BUS_IDLE_ST);
+ ddr_data.pmu2_pwrgt_sft_con0 = mmio_read_32(PMU_BASE + PMU2_PWR_GATE_SFTCON);
+
+ if ((ddr_data.pmu_pd_st & BIT(pmu_pd_aiisp)) == 0) {
+ pd_aiisp_save();
+ pmu_set_power_domain(pmu_pd_aiisp, pmu_pd_off);
+ }
+
+ if ((ddr_data.pmu_pd_st & BIT(pmu_pd_vdo)) == 0) {
+ pd_vdo_save();
+ pmu_set_power_domain(pmu_pd_vdo, pmu_pd_off);
+ }
+
+ if ((ddr_data.pmu_pd_st & BIT(pmu_pd_npu)) == 0) {
+ vd_npu_save();
+ pmu_set_power_domain(pmu_pd_npu, pmu_pd_off);
+ }
+}
+
+static void pmu_power_domains_resume(void)
+{
+ int i;
+
+ for (i = 0; i < pmu_pd_id_max; i++)
+ pmu_set_power_domain(i, !!(ddr_data.pmu_pd_st & BIT(i)));
+
+ for (i = 0; i < pmu_bus_id_max; i++)
+ pmu_bus_idle_req(i, !!(ddr_data.bus_idle_st & BIT(i)));
+
+ if ((ddr_data.pmu_pd_st & BIT(pmu_pd_aiisp)) == 0)
+ pd_aiisp_restore();
+
+ if ((ddr_data.pmu_pd_st & BIT(pmu_pd_vdo)) == 0)
+ pd_vdo_restore();
+
+ if ((ddr_data.pmu_pd_st & BIT(pmu_pd_npu)) == 0)
+ vd_npu_restore();
+}
+
+static void ddr_sleep_config(void)
+{
+ ddr_data.ddrgrf_con21 = mmio_read_32(DDRGRF_BASE + DDRGRF_CON(21));
+
+ /* [7:4]-csysreq_aclk_pmu enable */
+ mmio_write_32(DDRGRF_BASE + DDRGRF_CON(21), BITS_WITH_WMASK(0xf, 0xf, 4));
+ /* [12 ]-csysreq_ddrc_pmu enable */
+ mmio_write_32(DDRGRF_BASE + DDRGRF_CON(21), BITS_WITH_WMASK(0x1, 0x1, 12));
+
+ mmio_write_32(PMUGRF_BASE + PMUGRF_SOC_CON(0), BITS_WITH_WMASK(0x0, 0x1, 9));
+}
+
+static void ddr_sleep_config_restore(void)
+{
+ mmio_write_32(DDRGRF_BASE + DDRGRF_CON(21), WITH_16BITS_WMSK(ddr_data.ddrgrf_con21));
+}
+
+static void pmu_sleep_config(void)
+{
+ uint32_t clk_freq_khz = 24000;
+ uint32_t pmu1_wkup_int_con = 0;
+ uint32_t pmu0_pwr_con, pmu1_pwr_con;
+ uint32_t pmu1_pll_con, pmu1_cru_con[2], pmu1_ddr_ch_pwr_con, pmu1_ddr_axi_pwr_con;
+ uint32_t pmu2_scu_con, pmu2_scu_sftcon, pmu2_cpu_auto_con;
+ uint32_t pmu2_bus_idle_con, pmu2_pwr_gt_con;
+
+ pmu1_wkup_int_con = BIT(pmu_wkup_cpu0_int) |
+ BIT(pmu_wkup_gpio0_int) |
+ 0;
+
+ if (mmio_read_32(PMU_BASE + PMU1_WAKEUP_TIMEOUT) != 0)
+ pmu1_wkup_int_con |= BIT(pmu_wkup_timeout);
+
+ pmu0_pwr_con = 0;
+
+ pmu1_pwr_con =
+ BIT(pmu_powermode_en) |
+ /* BIT(pmu_scu0_byp) | */
+ /* BIT(pmu_scu1_byp) | */
+ /* BIT(pmu_bus_byp) | */
+ /* BIT(pmu_ddr_byp) | */
+ /* BIT(pmu_pwrgt_byp) | */
+ /* BIT(pmu_cru_byp) | */
+ BIT(pmu_pdpmu1_byp) |
+ /* BIT(pmu_wfi_byp) | */
+ BIT(pmu_slp_cnt_en) |
+ /* BIT(pmu_wkup_pmu_sft_en) | */
+ 0;
+
+ pmu1_ddr_ch_pwr_con =
+ /* BIT(pmu_ddr_sref_c_en) | */
+ /* BIT(pmu_ddr_ioret_en) | */
+ /* BIT(pmu_ddr_ioret_exit_en) | */
+ /* BIT(pmu_ddr_rstiov_en) | */
+ /* BIT(pmu_ddr_rstiov_exit_en) | */
+ BIT(pmu_ddrctl_c_auto_gating_en) |
+ BIT(pmu_ddrphy_auto_gating_en) |
+ 0;
+
+ pmu1_ddr_axi_pwr_con =
+ /* BIT(pmu_ddr_sref_a_ch0_en) | */
+ /* BIT(pmu_ddr_sref_a_ch1_en) | */
+ /* BIT(pmu_ddr_sref_a_ch2_en) | */
+ /* BIT(pmu_ddr_sref_a_ch3_en) | */
+ 0;
+
+ pmu1_cru_con[0] =
+ BIT(pmu_alive_osc_mode_en) |
+ /* BIT(pmu_power_off_en) | */
+ /* BIT(pmu_pwm_switch_en) | */
+ /* BIT(pmu_pwm_gpio_ioe_en) | */
+ /* BIT(pmu_pwm_switch_io) | */
+ /* BIT(pmu_pwm_clkgt_en) | */
+ 0;
+
+ pmu1_cru_con[1] =
+ /* BIT(pmu_peri_clksrc_gt_en) | */
+ BIT(pmu_vepu_clksrc_gt_en) |
+ BIT(pmu_vcp_clksrc_gt_en) |
+ BIT(pmu_vi_clksrc_gt_en) |
+ BIT(pmu_npu_clksrc_gt_en) |
+ BIT(pmu_vdo_clksrc_gt_en) |
+ BIT(pmu_aisp_clksrc_gt_en) |
+ BIT(pmu_core_clksrc_gt_en) |
+ BIT(pmu_ddr_clksrc_gt_en) |
+ /* BIT(pmu_bus_clksrc_gt_en) | */
+ 0;
+
+ pmu1_pll_con =
+ BIT(pmu_gpll_pd_en) |
+ BIT(pmu_dpll_pd_en) |
+ BIT(pmu_cpll_pd_en) |
+ BIT(pmu_ppll_pd_en) |
+ 0;
+
+ pmu2_scu_con =
+ BIT(pmu_l2_flush_en) |
+ BIT(pmu_l2_ilde_en) |
+ BIT(pmu_scu_pd_en) |
+ BIT(pmu_scu_pwroff_en) |
+ BIT(pmu_clst_cpu_pd_en) |
+ BIT(pmu_clst_clksrc_gt_en) |
+ 0;
+
+ pmu2_scu_sftcon =
+ BIT(pmu_scu_vol_gate) |
+ BIT(pmu_scu_dwn_ack_sel) |
+ 0;
+
+ pmu2_cpu_auto_con =
+ BIT(pmu_cpu_pm_int_wakeup_en) |
+ BIT(pmu_cpu_cluster_wakeup_en) |
+ 0;
+
+ pmu2_bus_idle_con =
+ /* BIT(pmu_bus_id_vepu) | */
+ /* BIT(pmu_bus_id_vi) | */
+ BIT(pmu_bus_id_vcp) |
+ BIT(pmu_bus_id_cru) |
+ /* BIT(pmu_bus_id_peri) | */
+ BIT(pmu_bus_id_bus) |
+ /* BIT(pmu_bus_id_cfgddr) | */
+ /* BIT(pmu_bus_id_subddr) | */
+ /* BIT(pmu_bus_id_ddr) | */
+ 0;
+
+ pmu2_pwr_gt_con = 0;
+
+ /* pmu count */
+ mmio_write_32(PMU_BASE + PMU1_OSC_STABLE_CNT, clk_freq_khz * 4);
+ mmio_write_32(PMU_BASE + PMU1_PMIC_STABLE_CNT, clk_freq_khz * 6);
+ mmio_write_32(PMU_BASE + PMU1_SLEEP_CNT, clk_freq_khz * 15);
+
+ /* Pmu's clk has switched to 24M back When pmu FSM counts
+ * the follow counters, so we should use 24M to calculate
+ * these counters.
+ */
+ mmio_write_32(PMU_BASE + PMU1_WAKEUP_RST_CLR_CNT, 0);
+ mmio_write_32(PMU_BASE + PMU1_PLL_LOCK_CNT, 1200);
+ mmio_write_32(PMU_BASE + PMU1_PWM_SWITCH_CNT, 24000 * 2);
+
+ mmio_write_32(PMU_BASE + PMU2_SCU_STABLE_CNT, 0);
+ mmio_write_32(PMU_BASE + PMU2_SCU_PWRUP_CNT, 0);
+ mmio_write_32(PMU_BASE + PMU2_SCU_PWRDN_CNT, 0);
+
+ /* bus / pd */
+ mmio_write_32(PMU_BASE + PMU2_BUS_IDLE_CON, WITH_16BITS_WMSK(pmu2_bus_idle_con));
+ mmio_write_32(PMU_BASE + PMU2_PWR_GATE_CON, WITH_16BITS_WMSK(pmu2_pwr_gt_con));
+
+ /* clust idle */
+ mmio_write_32(PMU_BASE + PMU2_CLUSTER_IDLE_CON, 0x000f000f);
+ mmio_write_32(PMU_BASE + PMU2_SCU_PWR_CON, WITH_16BITS_WMSK(pmu2_scu_con));
+ mmio_write_32(PMU_BASE + PMU2_SCU_PWR_SFTCON, WITH_16BITS_WMSK(pmu2_scu_sftcon));
+ mmio_write_32(PMU_BASE + PMU2_CPU_AUTO_PWR_CON(0), WITH_16BITS_WMSK(pmu2_cpu_auto_con));
+
+ /* ddr pwr con0 */
+ mmio_write_32(PMU_BASE + PMU1_DDR_CH0PWR_CON, WITH_16BITS_WMSK(pmu1_ddr_ch_pwr_con));
+ mmio_write_32(PMU_BASE + PMU1_DDR_AXIPWR_CON, WITH_16BITS_WMSK(pmu1_ddr_axi_pwr_con));
+
+ /* cru pwr con */
+ mmio_write_32(PMU_BASE + PMU1_CRU_PWR_CON(0), WITH_16BITS_WMSK(pmu1_cru_con[0]));
+ mmio_write_32(PMU_BASE + PMU1_CRU_PWR_CON(1), WITH_16BITS_WMSK(pmu1_cru_con[1]));
+
+ /* pll con */
+ mmio_write_32(PMU_BASE + PMU1_PLLPD_CON, WITH_16BITS_WMSK(pmu1_pll_con));
+
+ /* global */
+ mmio_write_32(PMU_BASE + PMU1_INT_MASK_CON, BITS_WITH_WMASK(1, 0x1, 0));
+ mmio_write_32(PMU_BASE + PMU1_WAKEUP_INT_CON, pmu1_wkup_int_con);
+ mmio_write_32(PMU_BASE + PMU1_PWR_CON, WITH_16BITS_WMSK(pmu1_pwr_con));
+ mmio_write_32(PMU_BASE + PMU0_PWR_CON, WITH_16BITS_WMSK(pmu0_pwr_con));
+}
+
+static void pmu_sleep_restore(void)
+{
+ /* bus / pd */
+ mmio_write_32(PMU_BASE + PMU2_BUS_IDLE_CON, 0xffff0000);
+ mmio_write_32(PMU_BASE + PMU2_PWR_GATE_CON, 0xffff0000);
+
+ /* clust idle */
+ mmio_write_32(PMU_BASE + PMU2_CLUSTER_IDLE_CON, 0xffff0000);
+ mmio_write_32(PMU_BASE + PMU2_SCU_PWR_CON, 0xffff0000);
+ mmio_write_32(PMU_BASE + PMU2_SCU_PWR_SFTCON, 0xffff0000);
+ mmio_write_32(PMU_BASE + PMU2_CPU_AUTO_PWR_CON(0), 0xffff0000);
+
+ /* ddr pwr con0 */
+ mmio_write_32(PMU_BASE + PMU1_DDR_CH0PWR_CON, 0xffff0000);
+ mmio_write_32(PMU_BASE + PMU1_DDR_AXIPWR_CON, 0xffff0000);
+
+ /* cru pwr con */
+ mmio_write_32(PMU_BASE + PMU1_CRU_PWR_CON(0), 0xffff0000);
+ mmio_write_32(PMU_BASE + PMU1_CRU_PWR_CON(1), 0xffff0000);
+
+ /* pll con */
+ mmio_write_32(PMU_BASE + PMU1_PLLPD_CON, 0xffff0000);
+
+ mmio_write_32(PMU_BASE + PMU1_INT_MASK_CON, 0xffff0000);
+ mmio_write_32(PMU_BASE + PMU1_WAKEUP_INT_CON, 0);
+ mmio_write_32(PMU_BASE + PMU1_PWR_CON, 0xffff0000);
+ mmio_write_32(PMU_BASE + PMU0_PWR_CON, 0xffff0000);
+}
+
+static void secure_watchdog_disable(void)
+{
+ ddr_data.sys_sgrf_con =
+ mmio_read_32(SYSSGRF_BASE + SYSSGRF_CON);
+
+ /* pause wdt_s */
+ mmio_write_32(SYSSGRF_BASE + SYSSGRF_CON,
+ BITS_WITH_WMASK(1, 0x1, 0));
+}
+
+static void secure_watchdog_restore(void)
+{
+ mmio_write_32(SYSSGRF_BASE + SYSSGRF_CON,
+ ddr_data.sys_sgrf_con | BITS_WMSK(0x1, 0));
+
+ if (mmio_read_32(WDT_S_BASE + WDT_CR) & WDT_EN)
+ mmio_write_32(WDT_S_BASE + WDT_CRR, 0x76);
+}
+
+static void soc_sleep_config(void)
+{
+ ddr_data.pmugrf_soc_con0 = mmio_read_32(PMUGRF_BASE + PMUGRF_SOC_CON(0));
+ ddr_data.pmugrf_soc_con1 = mmio_read_32(PMUGRF_BASE + PMUGRF_SOC_CON(1));
+ ddr_data.pmugrf_soc_con4 = mmio_read_32(PMUGRF_BASE + PMUGRF_SOC_CON(4));
+ ddr_data.pmugrf_soc_con5 = mmio_read_32(PMUGRF_BASE + PMUGRF_SOC_CON(5));
+ ddr_data.pmugrf_soc_con6 = mmio_read_32(PMUGRF_BASE + PMUGRF_SOC_CON(6));
+ ddr_data.pmugrf_soc_con7 = mmio_read_32(PMUGRF_BASE + PMUGRF_SOC_CON(7));
+
+ pmu_sleep_config();
+ ddr_sleep_config();
+ secure_watchdog_disable();
+}
+
+static void soc_sleep_restore(void)
+{
+ secure_watchdog_restore();
+ ddr_sleep_config_restore();
+ pmu_sleep_restore();
+
+ mmio_write_32(PMUGRF_BASE + PMUGRF_SOC_CON(0), WITH_16BITS_WMSK(ddr_data.pmugrf_soc_con0));
+ mmio_write_32(PMUGRF_BASE + PMUGRF_SOC_CON(1), WITH_16BITS_WMSK(ddr_data.pmugrf_soc_con1));
+ mmio_write_32(PMUGRF_BASE + PMUGRF_SOC_CON(4), WITH_16BITS_WMSK(ddr_data.pmugrf_soc_con4));
+ mmio_write_32(PMUGRF_BASE + PMUGRF_SOC_CON(5), WITH_16BITS_WMSK(ddr_data.pmugrf_soc_con5));
+ mmio_write_32(PMUGRF_BASE + PMUGRF_SOC_CON(6), WITH_16BITS_WMSK(ddr_data.pmugrf_soc_con6));
+ mmio_write_32(PMUGRF_BASE + PMUGRF_SOC_CON(7), WITH_16BITS_WMSK(ddr_data.pmugrf_soc_con7));
+}
+
+static void pm_pll_suspend(void)
+{
+ ddr_data.cru_mode_con = mmio_read_32(TOPCRU_BASE + 0x280);
+
+ /* pll switch to slow mode */
+ mmio_write_32(TOPCRU_BASE + 0x280, 0x003f0000);
+}
+
+static void pm_pll_restore(void)
+{
+ mmio_write_32(TOPCRU_BASE + 0x280, WITH_16BITS_WMSK(ddr_data.cru_mode_con));
+}
+
+int rockchip_soc_sys_pwr_dm_suspend(void)
+{
+ psram_sleep_cfg->pm_flag &= ~PM_WARM_BOOT_BIT;
+
+ clk_gate_con_save();
+ clk_gate_con_disable();
+ pmu_power_domains_suspend();
+ soc_sleep_config();
+ pm_pll_suspend();
+ vd_core_save();
+
+ return 0;
+}
+
+int rockchip_soc_sys_pwr_dm_resume(void)
+{
+ vd_core_restore();
+ pm_pll_restore();
+ soc_sleep_restore();
+ pmu_power_domains_resume();
+ plat_rockchip_gic_cpuif_enable();
+ clk_gate_con_restore();
+
+ psram_sleep_cfg->pm_flag |= PM_WARM_BOOT_BIT;
+
+ return 0;
+}
+
+static __pmusramfunc void pmusram_wfi(void)
+{
+ pmusram_data.idle_msk[0] =
+ BIT(pmu_bus_id_peri) |
+ BIT(pmu_bus_id_vi) |
+ BIT(pmu_bus_id_vepu) |
+ 0;
+
+ pmusram_data.idle_msk[1] =
+ BIT(pmu_bus_id_ddr) |
+ BIT(pmu_bus_id_subddr) |
+ BIT(pmu_bus_id_cfgddr) |
+ 0;
+
+ pmusram_pmu_bus_idle_req_msk(pmusram_data.idle_msk[0], pmu_bus_idle);
+
+ /* ddr enter self refresh */
+ dmc_enter_lp();
+
+ pmusram_pmu_bus_idle_req_msk(pmusram_data.idle_msk[1], pmu_bus_idle);
+
+ /*
+ * The HW enters to sleep mode trigger by wfi.
+ */
+ while (1) {
+ wfi();
+ }
+}
+
+void rockchip_soc_sys_pd_pwr_dn_wfi(void)
+{
+ disable_mmu_icache_el3();
+ dsb();
+ isb();
+
+ rockchip_set_sp(PSRAM_SP_TOP);
+ pmusram_wfi();
+}
+
+void __dead2 rockchip_soc_soft_reset(void)
+{
+ /* pll slow mode */
+ mmio_write_32(TOPCRU_BASE + CRU_MODE_CON, 0x003f0000);
+
+ dsb();
+ isb();
+
+ INFO("system reset......\n");
+ mmio_write_32(TOPCRU_BASE + CRU_GLB_SRST_FST, GLB_SRST_FST_CFG_VAL);
+
+ /*
+ * Maybe the HW needs some times to reset the system,
+ * so we do not hope the core to execute valid codes.
+ */
+ while (1) {
+ wfi();
+ }
+}
+
+void __dead2 rockchip_soc_system_off(void)
+{
+ INFO("system poweroff......\n");
+ dsb();
+
+ /*
+ * Maybe the HW needs some times to power off the system,
+ * so we do not hope the core to execute valid codes.
+ */
+ while (1) {
+ wfi();
+ }
+}
+
+static void rockchip_pmu_pd_init(void)
+{
+ pmu_set_power_domain(pmu_pd_npu, pmu_pd_on);
+
+ INFO("idle_st=0x%x, pd_st=0x%x\n",
+ mmio_read_32(PMU_BASE + PMU2_BUS_IDLE_ST),
+ mmio_read_32(PMU_BASE + PMU2_PWR_GATE_ST));
+}
+
+void plat_rockchip_pmu_init(void)
+{
+ int cpu;
+
+ for (cpu = 0; cpu < PLATFORM_CORE_COUNT; cpu++)
+ cpuson_flags[cpu] = 0;
+
+ psram_sleep_cfg->sp = PSRAM_SP_TOP;
+ psram_sleep_cfg->ddr_func = (uint64_t)ddr_resume;
+ psram_sleep_cfg->ddr_data = 0;
+ psram_sleep_cfg->ddr_flag = 0;
+ psram_sleep_cfg->boot_mpidr = read_mpidr_el1() & 0xffff;
+ psram_sleep_cfg->pm_flag = PM_WARM_BOOT_BIT;
+
+ nonboot_cpus_off();
+
+ mmio_write_32(PMU_BASE + PMU2_NOC_AUTO_CON, 0xffffffff);
+
+ /* pmusram remap to 0x0 */
+ mmio_write_32(PMUSGRF_BASE + PMUSGRF_SOC_CON(1), BITS_WITH_WMASK(2, 0x3, 9));
+
+ /* PMU_WAKEUP_TIMEOUT_CNT = 0, disable TIMEOUT_WAKEUP by default */
+ mmio_write_32(PMU_BASE + PMU1_WAKEUP_TIMEOUT, 0);
+
+ rockchip_pmu_pd_init();
+
+ pm_reg_rgns_init();
+}
diff --git a/plat/rockchip/rv1126b/drivers/pmu/pmu.h b/plat/rockchip/rv1126b/drivers/pmu/pmu.h
new file mode 100644
index 000000000..c0b15a844
--- /dev/null
+++ b/plat/rockchip/rv1126b/drivers/pmu/pmu.h
@@ -0,0 +1,512 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Copyright (c) 2026, Rockchip Electronics Co., Ltd.
+ */
+
+#ifndef __PMU_H__
+#define __PMU_H__
+
+#include <assert.h>
+
+#include <lib/mmio.h>
+#include <platform_def.h>
+
+/* pmu */
+#define PMU1_OFFSET 0x4000
+#define PMU2_OFFSET 0x8000
+
+#define PMU0_PWR_CON 0x0000
+#define PMU0_PMIC_STABLE_CNT 0x0010
+#define PMU0_INFO_TX_CON 0x0030
+#define PMU0_INFO_SFT_CON 0x0034
+#define PMU0_PWR_ACK_SEL_CON 0x0040
+#define PMU0_BUS_IDLE_ACK 0x0044
+#define PMU0_BUS_IDLE_ST 0x0048
+
+#define PMU1_VERSION_ID (PMU1_OFFSET + 0x000)
+#define PMU1_PWR_CON (PMU1_OFFSET + 0x004)
+#define PMU1_PWR_FSM (PMU1_OFFSET + 0x008)
+#define PMU1_INT_MASK_CON (PMU1_OFFSET + 0x00c)
+#define PMU1_WAKEUP_INT_CON (PMU1_OFFSET + 0x010)
+#define PMU1_WAKEUP_INT_ST (PMU1_OFFSET + 0x014)
+#define PMU1_WAKEUP_EDGE_CON (PMU1_OFFSET + 0x018)
+#define PMU1_WAKEUP_EDGE_ST (PMU1_OFFSET + 0x01c)
+#define PMU1_WAKEUP_TIMEOUT_CNT_ST (PMU1_OFFSET + 0x020)
+#define PMU1_DDR_CH0PWR_CON (PMU1_OFFSET + 0x100)
+#define PMU1_DDR_CH0PWR_SFTCON (PMU1_OFFSET + 0x110)
+#define PMU1_DDR_AXIPWR_CON (PMU1_OFFSET + 0x120)
+#define PMU1_DDR_AXIPWR_SFTCON(i) (PMU1_OFFSET + 0x130 + (i) * 4)
+#define PMU1_DDR_PWR_FSM (PMU1_OFFSET + 0x140)
+#define PMU1_DDR_ST (PMU1_OFFSET + 0x144)
+#define PMU1_DDR_AXI_ST (PMU1_OFFSET + 0x148)
+#define PMU1_CRU_PWR_CON(i) (PMU1_OFFSET + 0x200 + (i) * 4)
+#define PMU1_CRU_PWR_SFTCON(i) (PMU1_OFFSET + 0x208 + (i) * 4)
+#define PMU1_CRU_PWR_FSM (PMU1_OFFSET + 0x210)
+#define PMU1_PLLPD_CON (PMU1_OFFSET + 0x220)
+#define PMU1_PLLPD_SFTCON (PMU1_OFFSET + 0x228)
+#define PMU1_PMIC_STABLE_CNT (PMU1_OFFSET + 0x300)
+#define PMU1_OSC_STABLE_CNT (PMU1_OFFSET + 0x304)
+#define PMU1_WAKEUP_RST_CLR_CNT (PMU1_OFFSET + 0x308)
+#define PMU1_PLL_LOCK_CNT (PMU1_OFFSET + 0x30c)
+#define PMU1_WAKEUP_TIMEOUT (PMU1_OFFSET + 0x310)
+#define PMU1_PWM_SWITCH_CNT (PMU1_OFFSET + 0x314)
+#define PMU1_SLEEP_CNT (PMU1_OFFSET + 0x318)
+
+#define PMU2_SCU_PWR_CON (PMU2_OFFSET + 0x000)
+#define PMU2_SCU_PWR_SFTCON (PMU2_OFFSET + 0x004)
+#define PMU2_SCU_AUTO_PWR_CON (PMU2_OFFSET + 0x008)
+#define PMU2_SCU_PWR_FSM_STATUS (PMU2_OFFSET + 0x00c)
+#define PMU2_DBG_PWR_CON (PMU2_OFFSET + 0x018)
+#define PMU2_CLUSTER_PWR_ST (PMU2_OFFSET + 0x01c)
+#define PMU2_CLUSTER_IDLE_CON (PMU2_OFFSET + 0x020)
+#define PMU2_CLUSTER_IDLE_SFTCON (PMU2_OFFSET + 0x024)
+#define PMU2_SCU_PWRUP_CNT (PMU2_OFFSET + 0x040)
+#define PMU2_SCU_PWRDN_CNT (PMU2_OFFSET + 0x044)
+#define PMU2_SCU_STABLE_CNT (PMU2_OFFSET + 0x048)
+#define PMU2_CPU_AUTO_PWR_CON(i) (PMU2_OFFSET + 0x080 + (i) * 4)
+#define PMU2_CPU_PWR_SFTCON(i) (PMU2_OFFSET + 0x0a0 + (i) * 4)
+#define PMU2_BUS_IDLE_CON (PMU2_OFFSET + 0x100)
+#define PMU2_BUS_IDLE_SFTCON (PMU2_OFFSET + 0x110)
+#define PMU2_BUS_IDLE_ACK (PMU2_OFFSET + 0x120)
+#define PMU2_BUS_IDLE_ST (PMU2_OFFSET + 0x128)
+#define PMU2_NOC_AUTO_CON (PMU2_OFFSET + 0x130)
+#define PMU2_NOC_AUTO_SFTCON (PMU2_OFFSET + 0x140)
+#define PMU2_PWR_GATE_CON (PMU2_OFFSET + 0x200)
+#define PMU2_PWR_GATE_SFTCON (PMU2_OFFSET + 0x210)
+#define PMU2_VOL_GATE_CON (PMU2_OFFSET + 0x220)
+#define PMU2_PWR_GATE_ST (PMU2_OFFSET + 0x230)
+#define PMU2_PWR_GATE_FSM (PMU2_OFFSET + 0x238)
+#define PMU2_PWRDN_ACK_ST (PMU2_OFFSET + 0x240)
+#define PMU2_PWR_C0_ACK_SEL_CON (PMU2_OFFSET + 0x280)
+
+/* PMU0CRU */
+#define PMU0CRU_CLKSEL_CON(i) (0x300 + (i) * 0x4)
+#define PMU0CRU_CLKSEL_CON_CNT 9
+#define PMU0CRU_CLKGATE_CON(i) (0x800 + (i) * 0x4)
+#define PMU0CRU_CLKGATE_CON_CNT 4
+#define PMU0CRU_SOFTRST_CON(i) (0xa00 + (i) * 0x4)
+#define PMU0CRU_SOFTRST_CON_CNT 4
+#define PMU0CRU_AUTOCS_BUSCLK_MUX_CON(i) (0xd00 + (i) * 0x4)
+
+/* PMU1CRU */
+#define PMU1CRU_CLKSEL_CON(i) (0x300 + (i) * 0x4)
+#define PMU1CRU_CLKSEL_CON_CNT 2
+#define PMU1CRU_CLKGATE_CON(i) (0x800 + (i) * 0x4)
+#define PMU1CRU_CLKGATE_CON_CNT 2
+#define PMU1CRU_SOFTRST_CON(i) (0xa00 + (i) * 0x4)
+#define PMU1CRU_SOFTRST_CON_CNT 2
+
+/* PMUSCRU */
+#define PMUSCRU_CLKGATE_CON0 0x800
+#define PMUSCRU_CLKGATE_CON_CNT 1
+#define PMUSCRU_SOFTRST_CON0 0xa00
+
+/* PMUGRF */
+#define PMUGRF_SOC_CON(i) ((i) * 4)
+#define PMUGRF_AAD_CON0 0x80
+#define PMUGRF_MEM_CON(i) (0x140 + (i) * 4)
+#define PMUGRF_SOC_STATUS(i) (0x170 + (i) * 4)
+#define PMUGRF_OS_REG(i) (0x200 + (i) * 4)
+
+#define PMU_MCU_RST BIT(8)
+#define PMU_MCU_HALT BIT(9)
+
+#define PMU_MCU_STOP_MSK \
+ (PMU_MCU_HALT | PMU_MCU_RST)
+
+#define CORES_PM_DISABLE 0x0
+
+/* pmuioc */
+#define PMUIO0_IOC_GPIO0A_IOMUX_SEL_L 0x000
+#define PMUIO0_IOC_GPIO0A_IOMUX_SEL_H 0x004
+#define PMUIO0_IOC_GPIO0B_IOMUX_SEL_L 0x008
+#define PMUIO0_IOC_GPIO0B_IOMUX_SEL_H 0x00c
+
+#define PMUIO1_IOC_GPIO0C_IOMUX_SEL_L 0x010
+#define PMUIO1_IOC_GPIO0C_IOMUX_SEL_H 0x014
+#define PMUIO1_IOC_GPIO0D_IOMUX_SEL_L 0x018
+
+/* PMU_PWR_CON */
+enum pmu0_pwr_con {
+ pmu_powermode0_en = 0,
+ pmu_pmu1_pd_byp = 1,
+ pmu_pmu1_bus_byp = 2,
+ pmu_pmu0_pmic_stable_byp = 4,
+ pmu_pmu1_pwrgt = 8,
+ pmu_pmu1_pwrgt_sft = 9,
+ pmu_pmu1_mempwr_sft_gt = 10,
+ pmu_pmu1_idle_en = 11,
+ pmu_pmu1_idle_sft_en = 12,
+ pmu_pmu1_noc_auto_en = 13
+};
+
+enum pmu1_pwr_con {
+ pmu_powermode_en = 0,
+ pmu_scu0_byp = 1,
+ pmu_scu1_byp = 2,
+ pmu_bus_byp = 4,
+ pmu_ddr_byp = 5,
+ pmu_pwrgt_byp = 6,
+ pmu_cru_byp = 7,
+ pmu_pdpmu1_byp = 9,
+ pmu_wfi_byp = 12,
+ pmu_slp_cnt_en = 13,
+ pmu_wkup_pmu_sft_en = 14,
+};
+
+enum pmu_wakeup_int {
+ pmu_wkup_cpu0_int = 0,
+ pmu_wkup_cpu1_int = 1,
+ pmu_wkup_cpu2_int = 2,
+ pmu_wkup_cpu3_int = 3,
+ pmu_wkup_gpio0_int = 4,
+ pmu_wkup_sdmmc0_int = 5,
+ pmu_wkup_sdmmc1_int = 6,
+ pmu_wkup_sdio_int = 7,
+ pmu_wkup_usbdev_int = 8,
+ pmu_wkup_uart0_int = 9,
+ pmu_wkup_i2c2_int = 10,
+ pmu_wkup_pwm1_int = 11,
+ pmu_wkup_timer_int = 12,
+ pmu_wkup_hptimer_int = 13,
+ pmu_wkup_sys_int = 14,
+ pmu_wkup_aov_int = 15,
+ pmu_wkup_aad_int = 16,
+ pmu_wkup_timeout = 17,
+};
+
+/* PMU_DDR_PWR_CON */
+enum pmu_ddr_ch_pwr_con {
+ pmu_ddr_sref_c_en = 0,
+ pmu_ddr_ioret_en = 1,
+ pmu_ddr_ioret_exit_en = 2,
+ pmu_ddr_rstiov_en = 3,
+ pmu_ddr_rstiov_exit_en = 4,
+ pmu_ddrctl_c_auto_gating_en = 5,
+ pmu_ddrphy_auto_gating_en = 6,
+};
+
+enum pmu_ddr_axi_pwr_con {
+ pmu_ddr_sref_a_ch0_en = 0,
+ pmu_ddr_sref_a_ch1_en = 1,
+ pmu_ddr_sref_a_ch2_en = 2,
+ pmu_ddr_sref_a_ch3_en = 3,
+};
+
+/* PMU_CRU_PWR_CON0 */
+enum pmu_cru_pwr_con0 {
+ pmu_alive_32k_en = 0,
+ pmu_osc_dis_en = 1,
+ pmu_wakeup_rst_en = 2,
+ pmu_input_clamp_en = 3,
+ pmu_alive_osc_mode_en = 4,
+ pmu_power_off_en = 5,
+ pmu_pwm_switch_en = 6,
+ pmu_pwm_gpio_ioe_en = 7,
+ pmu_pwm_switch_io = 8,
+ pmu_pwm_clkgt_en = 9,
+};
+
+/* PMU_CRU_PWR_CON1 */
+enum pmu_cru_pwr_con1 {
+ pmu_peri_clksrc_gt_en = 0,
+ pmu_vepu_clksrc_gt_en = 1,
+ pmu_vcp_clksrc_gt_en = 2,
+ pmu_vi_clksrc_gt_en = 3,
+ pmu_npu_clksrc_gt_en = 4,
+ pmu_vdo_clksrc_gt_en = 5,
+ pmu_aisp_clksrc_gt_en = 6,
+ pmu_core_clksrc_gt_en = 7,
+ pmu_ddr_clksrc_gt_en = 8,
+ pmu_bus_clksrc_gt_en = 9,
+};
+
+/* PMU_SCU_PWR_CON */
+enum pmu_scu_pwr_con {
+ pmu_l2_flush_en = 0,
+ pmu_l2_ilde_en = 1,
+ pmu_scu_pd_en = 2,
+ pmu_scu_pwroff_en = 3,
+ pmu_clst_cpu_pd_en = 5,
+ pmu_clst_clksrc_gt_en = 6,
+ pmu_std_wfi_bypass = 8,
+ pmu_std_wfil2_bypass = 9,
+};
+
+enum pmu_scu_pwr_sftcon {
+ pmu_l2_flush_req_clst_cfg = 0,
+ pmu_acinactm_clst_cfg = 1,
+ pmu_scu_pd_sft_en = 2,
+ pmu_scu_pwroff_sft_en = 3,
+ pmu_scu_vol_gate = 5,
+ pmu_scu_dwn_ack_sel = 6,
+};
+
+/* PMU_PLLPD_CON */
+enum pmu_pllpd_con {
+ pmu_gpll_pd_en = 0,
+ pmu_dpll_pd_en = 1,
+ pmu_cpll_pd_en = 2,
+ pmu_ppll_pd_en = 3,
+};
+
+/* PMU_CLST_PWR_ST */
+enum pmu_clst_pwr_st {
+ pmu_cpu0_wfi = 0,
+ pmu_cpu1_wfi = 1,
+ pmu_cpu2_wfi = 2,
+ pmu_cpu3_wfi = 3,
+ pmu_standbywfil2 = 5,
+ pmu_l2flushdone = 6,
+ pmu_cpu0_pd_st = 8,
+ pmu_cpu1_pd_st = 9,
+ pmu_cpu2_pd_st = 10,
+ pmu_cpu3_pd_st = 11,
+ pmu_scu_pd_st = 12,
+};
+
+/* PMU_CLST_IDLE_CON */
+enum pmu_clst_idle_con {
+ pmu_idle_req_cpu = 2,
+ pmu_core_clk_gt_msk = 3,
+};
+
+enum cores_pm_ctr_mode {
+ core_pwr_pd = 0,
+ core_pwr_wfi = 1,
+ core_pwr_wfi_int = 2,
+ core_pwr_wfi_reset = 3,
+};
+
+/* PMU_CPUX_AUTO_PWR_CON */
+enum pmu_cpu_auto_pwr_con {
+ pmu_cpu_pm_en = 0,
+ pmu_cpu_pm_int_wakeup_en = 1,
+ pmu_cpu_pm_dis_int = 2,
+ pmu_cpu_pm_sft_wakeup_en = 3,
+ pmu_cpu_auto_pwrdn_mode = 4,
+ pmu_cpu_cluster_wakeup_en = 5,
+};
+
+enum qos_id {
+ qos_cpu = 0,
+ qos_npu = 1,
+ qos_aiisp = 2,
+ qos_dma2ddr = 3,
+ qos_emmc = 4,
+ qos_fspi = 5,
+ qos_u2host = 6,
+ qos_u3otg = 7,
+ qos_rkvenc = 8,
+ qos_saradc0 = 9,
+ qos_sdmmc1 = 10,
+ qos_lpmcu = 11,
+ qos_dcf = 12,
+ qos_mcu = 13,
+ qos_rga = 14,
+ qos_rkce = 15,
+ qos_rkdma = 16,
+ qos_decom = 17,
+ qos_ooc = 18,
+ qos_rkjpeg = 19,
+ qos_rkvdec = 20,
+ qos_vop = 21,
+ qos_avsp_ro = 22,
+ qos_avsp_wo = 23,
+ qos_fec_ro = 24,
+ qos_fec_wo = 25,
+ qos_aad = 26,
+ qos_afe = 27,
+ qos_atdd = 28,
+ qos_fspi1 = 29,
+ qos_lpdma = 30,
+ qos_spi2apb = 31,
+ qos_gmac = 32,
+ qos_isp = 33,
+ qos_rkcan0 = 34,
+ qos_rkcan1 = 35,
+ qos_sdmmc0 = 36,
+ qos_vicap = 37,
+ qos_vpsi = 38,
+ qos_vpss = 39,
+ qos_saradc1 = 40,
+ qos_saradc2 = 41,
+};
+
+enum pmu_bus_id {
+ pmu_bus_id_ddr = 0,
+ pmu_bus_id_subddr = 1,
+ pmu_bus_id_cfgddr = 2,
+ pmu_bus_id_peri = 3,
+ pmu_bus_id_vepu = 4,
+ pmu_bus_id_vcp = 5,
+ pmu_bus_id_vi = 6,
+ pmu_bus_id_cru = 7,
+ pmu_bus_id_npu = 8,
+ pmu_bus_id_vdo = 9,
+ pmu_bus_id_aisp = 10,
+ pmu_bus_id_bus = 11,
+ pmu_bus_id_max,
+};
+
+enum pmu_pd_id {
+ pmu_pd_npu = 0,
+ pmu_pd_vdo = 1,
+ pmu_pd_aiisp = 2,
+ pmu_pd_id_max,
+};
+
+enum pmu_vd_id {
+ pmu_vd_npu = 0,
+ pmu_vd_id_max,
+};
+
+enum pmu_bus_state {
+ pmu_bus_active = 0,
+ pmu_bus_idle = 1,
+};
+
+enum pmu_pd_state {
+ pmu_pd_on = 0,
+ pmu_pd_off = 1
+};
+
+#define PD_CTR_LOOP 5000
+#define WFEI_CHECK_LOOP 5000
+#define BUS_IDLE_LOOP 1000
+#define NONBOOT_CPUS_OFF_LOOP 500000
+
+#define REBOOT_FLAG 0x5242C300
+#define BOOT_BROM_DOWNLOAD 0xef08a53c
+
+#define BOOTROM_SUSPEND_MAGIC 0x02468ace
+#define BOOTROM_RESUME_MAGIC 0x13579bdf
+#define WARM_BOOT_MAGIC 0x76543210
+#define VALID_GLB_RST_MSK 0xffff
+
+#define DEFAULT_BOOT_CPU 0
+
+/*******************************************************
+ * sleep mode define
+ *******************************************************/
+#define SLP_ARMPD BIT(0)
+#define SLP_ARMOFF BIT(1)
+#define SLP_ARMOFF_DDRPD BIT(2)
+#define SLP_ARMOFF_LOGOFF BIT(3)
+#define SLP_ARMOFF_PMUOFF BIT(4)
+#define SLP_FROM_UBOOT BIT(5)
+
+/* all plls except ddr's pll*/
+#define SLP_PMU_HW_PLLS_PD BIT(8)
+#define SLP_PMU_PMUALIVE_32K BIT(9)
+#define SLP_PMU_DIS_OSC BIT(10)
+
+#define SLP_CLK_GT BIT(16)
+#define SLP_PMIC_LP BIT(17)
+
+#define SLP_32K_IO BIT(23)
+#define SLP_32K_EXT BIT(24)
+#define SLP_TIME_OUT_WKUP BIT(25)
+#define SLP_PMU_DBG BIT(26)
+#define SLP_LP_PR BIT(27)
+#define SLP_ARCH_TIMER_RESET BIT(28)
+#define SLP_LP_AOA BIT(29)
+
+#define PM_INVALID_GPIO 0xffff
+#define MAX_GPIO0_IO_CNT 26
+#define MAX_SLEEP_IO_CFG_CNT MAX_GPIO0_IO_CNT
+#define MAX_VIRTUAL_PWROFF_IRQ_CNT 20
+
+enum {
+ RK_PM_VIRT_PWROFF_EN = 0,
+ RK_PM_VIRT_PWROFF_IRQ_CFG = 1,
+ RK_PM_VIRT_PWROFF_MAX,
+};
+
+/* sleep pin */
+#define RKPM_SLEEP_PIN0_EN BIT(0) /* GPIO0_A3 */
+#define RKPM_SLEEP_PIN1_EN BIT(1) /* GPIO0_A4 */
+#define RKPM_SLEEP_PIN2_EN BIT(2) /* GPIO0_A5 */
+
+#define RKPM_SLEEP_PIN0_ACT_LOW BIT(0) /* GPIO0_A3 */
+#define RKPM_SLEEP_PIN1_ACT_LOW BIT(1) /* GPIO0_A4 */
+#define RKPM_SLEEP_PIN2_ACT_LOW BIT(2) /* GPIO0_A5 */
+
+/* io config */
+#define RKPM_IO_CFG_IOMUX_SFT 0
+#define RKPM_IO_CFG_GPIO_DIR_SFT 8
+#define RKPM_IO_CFG_GPIO_LVL_SFT 9
+#define RKPM_IO_CFG_PULL_SFT 10
+#define RKPM_IO_CFG_ID_SFT 16
+
+#define RKPM_IO_CFG_IOMUX_MSK 0x3f
+#define RKPM_IO_CFG_GPIO_DIR_MSK 0x1
+#define RKPM_IO_CFG_GPIO_LVL_MSK 0x1
+#define RKPM_IO_CFG_PULL_MSK 0x3
+#define RKPM_IO_CFG_ID_MSK 0xffff
+
+#define RKPM_IO_CFG_IOMUX_GPIO_VAL 0
+#define RKPM_IO_CFG_GPIO_DIR_INPUT_VAL 0
+#define RKPM_IO_CFG_GPIO_DIR_OUTPUT_VAL 1
+#define RKPM_IO_CFG_GPIO_LVL_LOW_VAL 0
+#define RKPM_IO_CFG_GPIO_LVL_HIGH_VAL 1
+#define RKPM_IO_CFG_PULL_NONE_VAL 0
+#define RKPM_IO_CFG_PULL_UP_VAL 1
+#define RKPM_IO_CFG_PULL_DOWN_VAL 2
+
+#define RKPM_IO_CFG_IOMUX(func) ((func) << RKPM_IO_CFG_IOMUX_SFT)
+#define RKPM_IO_CFG_GPIO_DIR_INPUT \
+ (RKPM_IO_CFG_GPIO_DIR_INPUT_VAL << RKPM_IO_CFG_GPIO_DIR_SFT)
+#define RKPM_IO_CFG_GPIO_DIR_OUTPUT \
+ (RKPM_IO_CFG_GPIO_DIR_OUTPUT_VAL << RKPM_IO_CFG_GPIO_DIR_SFT)
+#define RKPM_IO_CFG_GPIO_LVL_LOW \
+ (RKPM_IO_CFG_GPIO_LVL_LOW_VAL << RKPM_IO_CFG_GPIO_LVL_SFT)
+#define RKPM_IO_CFG_GPIO_LVL_HIGH \
+ (RKPM_IO_CFG_GPIO_LVL_HIGH_VAL << RKPM_IO_CFG_GPIO_LVL_SFT)
+#define RKPM_IO_CFG_PULL_NONE \
+ (RKPM_IO_CFG_PULL_NONE_VAL << RKPM_IO_CFG_PULL_SFT)
+#define RKPM_IO_CFG_PULL_UP \
+ (RKPM_IO_CFG_PULL_UP_VAL << RKPM_IO_CFG_PULL_SFT)
+#define RKPM_IO_CFG_PULL_DOWN \
+ (RKPM_IO_CFG_PULL_DOWN_VAL << RKPM_IO_CFG_PULL_SFT)
+#define RKPM_IO_CFG_ID(id) ((id) << RKPM_IO_CFG_ID_SFT)
+#define RKPM_IO_CFG_IOMUX_GPIO \
+ RKPM_IO_CFG_IOMUX(RKPM_IO_CFG_IOMUX_GPIO_VAL)
+
+#define RKPM_IO_CFG_GET_IOMUX(cfg) \
+ (((cfg) >> RKPM_IO_CFG_IOMUX_SFT) & RKPM_IO_CFG_IOMUX_MSK)
+#define RKPM_IO_CFG_GET_GPIO_DIR(cfg) \
+ (((cfg) >> RKPM_IO_CFG_GPIO_DIR_SFT) & RKPM_IO_CFG_GPIO_DIR_MSK)
+#define RKPM_IO_CFG_GET_GPIO_LVL(cfg) \
+ (((cfg) >> RKPM_IO_CFG_GPIO_LVL_SFT) & RKPM_IO_CFG_GPIO_LVL_MSK)
+#define RKPM_IO_CFG_GET_PULL(cfg) \
+ (((cfg) >> RKPM_IO_CFG_PULL_SFT) & RKPM_IO_CFG_PULL_MSK)
+#define RKPM_IO_CFG_GET_ID(cfg) \
+ (((cfg) >> RKPM_IO_CFG_ID_SFT) & RKPM_IO_CFG_ID_MSK)
+
+#define pmu_bus_idle_st(id) \
+ (!!(mmio_read_32(PMU_BASE + PMU2_BUS_IDLE_ST) & BIT(id)))
+
+#define pmu_bus_idle_ack(id) \
+ (!!(mmio_read_32(PMU_BASE + PMU2_BUS_IDLE_ACK) & BIT(id)))
+
+#define pmu_bus_idle_st_msk(msk) \
+ (mmio_read_32(PMU_BASE + PMU2_BUS_IDLE_ST) & (msk))
+
+#define pmu_bus_idle_ack_msk(msk) \
+ (mmio_read_32(PMU_BASE + PMU2_BUS_IDLE_ACK) & (msk))
+
+static inline uint32_t read_mem_os_reg(uint32_t id)
+{
+ assert((id) < MAX_MEM_OS_REG_NUM);
+
+ return mmio_read_32(MEM_OS_REG_BASE + 4 * (id));
+}
+
+static inline void write_mem_os_reg(uint32_t id, uint32_t val)
+{
+ assert((id) < MAX_MEM_OS_REG_NUM);
+
+ mmio_write_32(MEM_OS_REG_BASE + 4 * (id), val);
+}
+#endif /* __PMU_H__ */
diff --git a/plat/rockchip/rv1126b/drivers/secure/secure.c b/plat/rockchip/rv1126b/drivers/secure/secure.c
new file mode 100644
index 000000000..dbdb9120b
--- /dev/null
+++ b/plat/rockchip/rv1126b/drivers/secure/secure.c
@@ -0,0 +1,93 @@
+// SPDX-License-Identifier: BSD-3-Clause
+/*
+ * Copyright (c) 2026, Rockchip Electronics Co., Ltd.
+ */
+
+#include <assert.h>
+
+#include <lib/mmio.h>
+
+#include <plat_private.h>
+#include <platform_def.h>
+#include <secure.h>
+#include <soc.h>
+
+/* unit: Mb */
+static void ddr_fw_rgn_config(uint64_t base_mb, uint64_t top_mb, int rgn_id)
+{
+ mmio_write_32(FW_DDR_BASE + FIREWALL_DDR_RGN(rgn_id),
+ RG_MAP_SECURE(top_mb << MB_TO_128KB_SHFT, base_mb << MB_TO_128KB_SHFT));
+
+ /* enable region */
+ mmio_setbits_32(FW_DDR_BASE + FIREWALL_DDR_CON, BIT(rgn_id));
+}
+
+/* Unit: Kb */
+static void sram_fw_rgn_config(uint64_t base_kb, uint64_t top_kb, int rgn_id)
+{
+ uint32_t sft = rgn_id * 8;
+ uint32_t val = RG_MAP_SRAM_SECURE(top_kb, base_kb);
+
+ mmio_write_32(SYSSGRF_BASE + SYSSGRF_FIREWALL_CON(10), BITS_WITH_WMASK(val, 0xff, sft));
+
+ /* enable region */
+ mmio_write_32(SYSSGRF_BASE + SYSSGRF_FIREWALL_CON(11), BITS_WITH_WMASK(1, 0x1, rgn_id));
+}
+
+static void secure_region_init(void)
+{
+ uint32_t i;
+
+ /* disable all region first */
+ mmio_write_32(FW_DDR_BASE + FIREWALL_DDR_CON, 0x0);
+ mmio_write_32(SYSSGRF_BASE + SYSSGRF_FIREWALL_CON(11), BITS_WITH_WMASK(0, 0x3, 0));
+
+ /* all other ns-master can't access all ddr-regions */
+ for (i = 0; i < FIREWALL_DDR_MST_CNT; i++)
+ mmio_write_32(FW_DDR_BASE + FIREWALL_DDR_MST(i), 0xffffffff);
+
+ /* Use FW_DDR_RGN0_REG to config 0~1M of ddr space to secure */
+ ddr_fw_rgn_config(TZRAM_BASE >> 20, (TZRAM_BASE + TZRAM_SIZE) >> 20, 0);
+
+ /* Use FIREWALL_SYSMEM_RGN0 to config 48~64k of sram as secure */
+ sram_fw_rgn_config(44, 64, 0);
+}
+
+void secure_timer_init(void)
+{
+ /* rktimer switch to 24M */
+ mmio_write_32(TOPCRU_BASE + CRU_CLKSEL_CON(46), BITS_WITH_WMASK(1, 0x1, 11));
+
+ /* clear hptimer int_st */
+ mmio_write_32(HPTIMER_BASE + TIMER_HP_INTR_STATUS, BIT(2));
+}
+
+void fw_init(void)
+{
+ int i;
+
+ for (i = 0; i < 10; i++)
+ mmio_write_32(SYSSGRF_BASE + SYSSGRF_FIREWALL_CON(i), 0xffff0000);
+
+ /* slave as NS, except dcf, otpmask */
+ mmio_write_32(SYSSGRF_BASE + SYSSGRF_FIREWALL_CON(4), 0x24002400);
+ /* slave as NS, except umctl2, dfi */
+ mmio_write_32(SYSSGRF_BASE + SYSSGRF_FIREWALL_CON(6), 0xa000a000);
+ /* slave as NS, except pmusram */
+ mmio_write_32(SYSSGRF_BASE + SYSSGRF_FIREWALL_CON(11), BITS_WITH_WMASK(0x1, 0x7f, 4));
+
+ secure_region_init();
+
+ /* master as NS */
+ mmio_write_32(SYSSGRF_BASE + SYSSGRF_APB_SECURE_CON, 0xffff0000);
+ /* master as NS */
+ mmio_write_32(SYSSGRF_BASE + SYSSGRF_AHB_SECURE_CON, 0xffffffff);
+ /* master as NS, except dcf */
+ mmio_write_32(SYSSGRF_BASE + SYSSGRF_AXI_SECURE_CON, 0xfffffff3);
+}
+
+void secure_init(void)
+{
+ secure_timer_init();
+ fw_init();
+}
diff --git a/plat/rockchip/rv1126b/drivers/secure/secure.h b/plat/rockchip/rv1126b/drivers/secure/secure.h
new file mode 100644
index 000000000..75361269b
--- /dev/null
+++ b/plat/rockchip/rv1126b/drivers/secure/secure.h
@@ -0,0 +1,43 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Copyright (c) 2026, Rockchip Electronics Co., Ltd.
+ */
+
+#ifndef SECURE_H
+#define SECURE_H
+
+/* PMUSGRF */
+#define PMUSGRF_SOC_CON(i) ((i) * 4)
+#define PMUSGRF_PMUMCU_BOOT_ADDR 0x20
+
+/* SYSSGRF */
+#define SYSSGRF_CON 0x0
+#define SYSSGRF_HPMCU_BOOT_ADDR 0xc
+#define SYSSGRF_APB_SECURE_CON 0x10
+#define SYSSGRF_AHB_SECURE_CON 0x14
+#define SYSSGRF_AXI_SECURE_CON 0x18
+
+#define SYSSGRF_FIREWALL_CON(i) (0x20 + (i) * 4)
+#define SYSSGRF_FIREWALL_CON_CNT 12
+#define SYSSGRF_FUSE_CON 0x50
+
+/* FW_DDR */
+#define FIREWALL_DDR_RGN(i) ((i) * 0x4)
+#define FIREWALL_DDR_RGN_CNT 8
+#define FIREWALL_DDR_MST(i) (0x40 + (i) * 0x4)
+#define FIREWALL_DDR_MST_CNT 16
+#define FIREWALL_DDR_CON 0xf0
+
+#define PLAT_MAX_DDR_CAPACITY_MB 4096
+#define RG_MAP_SECURE(top, base) ((((top) - 1) << 16) | ((base) & 0xffff))
+#define MB_TO_128KB_SHFT 3
+
+#define FIREWALL_SYSMEM_RGN_CNT 2
+
+#define RG_MAP_SRAM_SECURE(top_kb, base_kb) \
+ (((((top_kb) / 4 - 1) & 0xf) << 4) | ((base_kb) / 4 & 0xf))
+
+void secure_timer_init(void);
+void secure_init(void);
+
+#endif /* SECURE_H */
diff --git a/plat/rockchip/rv1126b/drivers/soc/soc.c b/plat/rockchip/rv1126b/drivers/soc/soc.c
new file mode 100644
index 000000000..1616d1e28
--- /dev/null
+++ b/plat/rockchip/rv1126b/drivers/soc/soc.c
@@ -0,0 +1,114 @@
+// SPDX-License-Identifier: BSD-3-Clause
+/*
+ * Copyright (c) 2026, Rockchip Electronics Co., Ltd.
+ */
+
+#include <assert.h>
+#include <errno.h>
+
+#include <arch_helpers.h>
+#include <bl31/bl31.h>
+#include <common/debug.h>
+#include <drivers/console.h>
+#include <drivers/delay_timer.h>
+#include <lib/mmio.h>
+#include <lib/xlat_tables/xlat_tables_compat.h>
+#include <platform.h>
+
+#include <plat_private.h>
+#include <platform_def.h>
+#include <pmu.h>
+#include <rv1126b_clk.h>
+#include <secure.h>
+#include <soc.h>
+
+const mmap_region_t plat_rk_mmap[] = {
+ MAP_REGION_FLAT(RV1126B_DEV_RNG0_BASE, RV1126B_DEV_RNG0_SIZE,
+ MT_DEVICE | MT_RW | MT_SECURE),
+ MAP_REGION_FLAT(DDR_SHARE_MEM, DDR_SHARE_SIZE,
+ MT_DEVICE | MT_RW | MT_NS),
+ { 0 }
+};
+
+/* The RockChip power domain tree descriptor */
+const unsigned char rockchip_power_domain_tree_desc[] = {
+ /* No of root nodes */
+ PLATFORM_SYSTEM_COUNT,
+ /* No of children for the root node */
+ PLATFORM_CLUSTER_COUNT,
+ /* No of children for the first cluster node */
+ PLATFORM_CLUSTER0_CORE_COUNT,
+};
+
+static void print_glb_reset_status(void)
+{
+ uint32_t glb_rst_st = 0;
+ uint32_t warm_boot = 0;
+
+ /* clear CRU_GLB_RST_ST_NCLR if cold boot */
+ if (mmio_read_32(PMUGRF_BASE + PMUGRF_OS_REG(11)) == WARM_BOOT_MAGIC) {
+ glb_rst_st = mmio_read_32(TOPCRU_BASE + CRU_GLB_RST_ST_NCLR);
+ warm_boot = 1;
+ } else {
+ mmio_write_32(PMUGRF_BASE + PMUGRF_OS_REG(11), WARM_BOOT_MAGIC);
+ }
+
+ mmio_write_32(TOPCRU_BASE + CRU_GLB_RST_ST_NCLR, 0xffff);
+
+ /* save glb_rst_st in mem_os_reg0 */
+ write_mem_os_reg(0, glb_rst_st);
+
+ if (warm_boot != 0)
+ INFO("soc warm boot, reset status: 0x%x\n", glb_rst_st);
+ else
+ INFO("soc cold boot\n");
+}
+
+static void system_reset_init(void)
+{
+ print_glb_reset_status();
+
+ /*
+ * enable tsadc trigger global reset and select first reset.
+ * enable global reset and wdt trigger pmu reset.
+ * select first reset trigger pmu reset.
+ */
+ mmio_write_32(TOPCRU_BASE + CRU_GLB_RST_CON(0), 0x3f);
+ /* the CRU APB is 100M and clk of rst_con0~2 is 24M,
+ * so need 3 cycle of (24M + apb_cru_clk) to sync at most.
+ */
+ udelay(1);
+ mmio_write_32(TOPCRU_BASE + CRU_GLB_RST_CON(1), 0x1);
+ udelay(1);
+ mmio_write_32(TOPCRU_BASE + CRU_GLB_RST_CON(2), 0x1);
+ udelay(1);
+
+ /* enable wdt_s reset */
+ mmio_write_32(SYSSGRF_BASE + SYSSGRF_CON, BITS_WITH_WMASK(0x1, 0x1, 8));
+
+ /* enable wdt_ns reset */
+ mmio_write_32(SYSGRF_BASE + SYSGRF_BUSGRF_MISC, BITS_WITH_WMASK(0x1, 0x3, 12));
+
+ /* reset width = 0xffff */
+ mmio_write_32(PMUGRF_BASE + PMUGRF_SOC_CON(3), 0xffffffff);
+
+ /* enable first/tsadc/wdt reset output */
+ mmio_write_32(PMUSGRF_BASE + PMUSGRF_SOC_CON(0), BITS_WITH_WMASK(0x7, 0x7, 9));
+
+ /* pmugrf/pmu_ioc hold */
+ mmio_write_32(PMUGRF_BASE + PMUGRF_SOC_CON(4), 0xffff0120);
+
+ /* pmusgrf hold */
+ mmio_write_32(PMUGRF_BASE + PMUGRF_SOC_CON(5), 0xffff8000);
+
+ /* select tsadc_shut_m0 iomux */
+ mmio_write_32(PMU0IOC_BASE + 0x0, 0x00f00030);
+}
+
+void plat_rockchip_soc_init(void)
+{
+ rockchip_clock_init();
+ system_reset_init();
+ secure_init();
+ rockchip_init_scmi_server();
+}
diff --git a/plat/rockchip/rv1126b/drivers/soc/soc.h b/plat/rockchip/rv1126b/drivers/soc/soc.h
new file mode 100644
index 000000000..f0cd9c636
--- /dev/null
+++ b/plat/rockchip/rv1126b/drivers/soc/soc.h
@@ -0,0 +1,225 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Copyright (c) 2026, Rockchip Electronics Co., Ltd.
+ */
+
+#ifndef __SOC_H__
+#define __SOC_H__
+
+#define KHz 1000
+#define MHz (1000 * KHz)
+#define OSC_HZ (24 * MHz)
+
+#define MCU_VALID_START_ADDRESS 0x800000
+
+/* CRU */
+#define GLB_SRST_FST_CFG_VAL 0xfdb9
+
+#define CRU_PLLS_CON(pll_id, i) ((pll_id) * 0x20 + (i) * 0x4)
+#define CRU_PLL_CON(i) ((i) * 0x4)
+#define CRU_SSCGTBL_CON(i) (0x140 + (i) * 0x4)
+#define CRU_MODE_CON 0x280
+#define CRU_CLKSEL_CON(i) (0x300 + (i) * 0x4)
+#define CRU_CLKSEL_CON_CNT 71
+#define CRU_CLKGATE_CON(i) (0x800 + (i) * 0x4)
+#define CRU_CLKGATE_CON_CNT 16
+#define CRU_SOFTRST_CON(i) (0xa00 + (i) * 0x4)
+
+#define CRU_GLB_CNT_TH 0xc00
+#define CRU_GLB_RST_ST 0xc04
+#define CRU_GLB_SRST_FST 0xc08
+#define CRU_GLB_SRST_SND 0xc0c
+#define CRU_GLB_RST_CON(i) (0xc10 + (i) * 0x4)
+#define CRU_GLB_RST_ST_NCLR 0xc20
+
+#define CRU_PLLCON0_FBDIV_MASK 0xfff
+#define CRU_PLLCON0_FBDIV_SHIFT 0
+#define CRU_PLLCON0_POSTDIV1_MASK 0x7
+#define CRU_PLLCON0_POSTDIV1_SHIFT 12
+#define CRU_PLLCON0_BYPASS_SHIFT 15
+#define CRU_PLLCON1_REFDIV_MASK 0x3f
+#define CRU_PLLCON1_REFDIV_SHIFT 0
+#define CRU_PLLCON1_POSTDIV2_MASK 0x7
+#define CRU_PLLCON1_POSTDIV2_SHIFT 6
+#define CRU_PLLCON1_LOCK_STATUS BIT(10)
+#define CRU_PLLCON1_DSMPD_MASK 0x1
+#define CRU_PLLCON1_DSMPD_SHIFT 12
+#define CRU_PLLCON1_PWRDOWN BIT(13)
+
+/* DDRCRU */
+#define DDRCRU_CLKSEL_CON0 00x300
+#define DDRCRU_CLKGATE_CON0 0x800
+#define DDRCRU_SOFTRST_CON0 0xa00
+
+/* PERI_CRU */
+#define PERI_CRU_MODE_CON 0x280
+#define PERI_CRU_CLKSEL_CON(i) (0x300 + (i) * 0x4)
+#define PERI_CRU_CLKGATE_CON(i) (0x800 + (i) * 0x4)
+#define PERI_CRU_CLKGATE_CON_CNT 2
+#define PERI_CRU_SOFTRST_CON(i) (0xa00 + (i) * 0x4)
+
+/* BUS CRU */
+#define BUS_CRU_CLKSEL_CON(i) (0x300 + (i) * 0x4)
+#define BUS_CRU_CLKGATE_CON(i) (0x800 + (i) * 0x4)
+#define BUS_CRU_CLKGATE_CON_CNT 7
+#define BUS_CRU_SOFTRST_CON(i) (0xa00 + (i) * 0x4)
+
+/* BUS SCRU */
+#define BUS_SCRU_CLKSEL_CON(i) (0x300 + (i) * 0x4)
+#define BUS_SCRU_CLKGATE_CON(i) (0x800 + (i) * 0x4)
+#define BUS_SCRU_CLKGATE_CON_CNT 3
+#define BUS_SCRU_SOFTRST_CON(i) (0xa00 + (i) * 0x4)
+
+/* CORE CRU */
+#define CORE_CRU_CLKSEL_CON(i) (0x300 + (i) * 0x4)
+#define CORE_CRU_CLKGATE_CON(i) (0x800 + (i) * 0x4)
+#define CORE_CRU_CLKGATE_CON_CNT 2
+
+/* VI CRU */
+#define VI_CRU_CLKSEL_CON(i) (0x300 + (i) * 0x4)
+#define VI_CRU_CLKGATE_CON(i) (0x800 + (i) * 0x4)
+#define VI_CRU_CLKGATE_CON_CNT 5
+
+/* VEPU CRU */
+#define VEPU_CRU_CLKSEL_CON(i) (0x300 + (i) * 0x4)
+#define VEPU_CRU_CLKGATE_CON(i) (0x800 + (i) * 0x4)
+#define VEPU_CRU_CLKGATE_CON_CNT 2
+
+/* VCP CRU */
+#define VCP_CRU_CLKSEL_CON(i) (0x300 + (i) * 0x4)
+#define VCP_CRU_CLKGATE_CON(i) (0x800 + (i) * 0x4)
+#define VCP_CRU_CLKGATE_CON_CNT 2
+
+/* NPU CRU */
+#define NPU_CRU_CLKSEL_CON0 0x300
+#define NPU_CRU_CLKGATE_CON0 0x800
+#define NPU_CRU_CLKGATE_CON_CNT 1
+
+/* VDO CRU */
+#define VDO_CRU_CLKSEL_CON0 0x300
+#define VDO_CRU_CLKGATE_CON(i) (0x800 + (i) * 0x4)
+#define VDO_CRU_CLKGATE_CON_CNT 3
+
+/* SYSGRF */
+#define SYSGRF_BUSGRF_MISC 0xc
+#define SYSGRF_NOC_CON(i) (0x30 + (i) * 4)
+#define SYSGRF_NOC_STATUS(i) (0x100 + (i) * 4)
+#define SYSGRF_SYS_STATUS 0x118
+
+/* CPUGRF */
+#define CPUGRF_CON(i) ((i) * 4)
+#define CPUGRF_STATUS(i) (0xc + (i) * 4)
+
+/* DDRGRF */
+#define DDRGRF_CON(i) ((i) * 4)
+#define DDRGRF_STATUS(i) (0x100 + (i) * 4)
+
+/* pvtm */
+#define PVTM_CON(i) (0x4 + (i) * 4)
+#define PVTM_INTEN 0x70
+#define PVTM_INTSTS 0x74
+#define PVTM_STATUS(i) (0x80 + (i) * 4)
+#define PVTM_CALC_CNT 0x200
+
+enum pvtm_con0 {
+ pvtm_start = 0,
+ pvtm_osc_en = 1,
+ pvtm_osc_sel = 2,
+ pvtm_rnd_seed_en = 5,
+};
+
+/* WDT */
+#define WDT_CR 0x0
+#define WDT_TORR 0x4
+#define WDT_CCVR 0x8
+#define WDT_CRR 0xc
+#define WDT_STAT 0x10
+#define WDT_EOI 0x14
+
+#define WDT_EN BIT(0)
+#define WDT_RSP_MODE BIT(1)
+
+/* timer */
+#define TIMER_LOAD_COUNT0 0x00
+#define TIMER_LOAD_COUNT1 0x04
+#define TIMER_CURRENT_VALUE0 0x08
+#define TIMER_CURRENT_VALUE1 0x0c
+#define TIMER_CONTROL_REG 0x10
+#define TIMER_INTSTATUS 0x18
+
+#define TIMER_DIS 0x0
+#define TIMER_EN 0x1
+
+ /* hp timer */
+#define TIMER_HP_REVISION 0x00
+#define TIMER_HP_CTRL 0x04
+#define TIMER_HP_INTR_EN 0x08
+#define TIMER_HP_T24_GCD 0x0c
+#define TIMER_HP_T32_GCD 0x10
+#define TIMER_HP_LOAD_COUNT0 0x14
+#define TIMER_HP_LOAD_COUNT1 0x18
+#define TIMER_HP_T24_DELAT_COUNT0 0x1c
+#define TIMER_HP_T24_DELAT_COUNT1 0x20
+#define TIMER_HP_CURR_32K_VALUE0 0x24
+#define TIMER_HP_CURR_32K_VALUE1 0x28
+#define TIMER_HP_CURR_TIMER_VALUE0 0x2c
+#define TIMER_HP_CURR_TIMER_VALUE1 0x30
+#define TIMER_HP_T24_32BEGIN0 0x34
+#define TIMER_HP_T24_32BEGIN1 0x38
+#define TIMER_HP_T32_24END0 0x3c
+#define TIMER_HP_T32_24END1 0x40
+#define TIMER_HP_BEGIN_END_VALID 0x44
+#define TIMER_HP_SYNC_REQ 0x48
+#define TIMER_HP_INTR_STATUS 0x4c
+#define TIMER_HP_UPD_EN 0x50
+
+ /* GPIO */
+#define GPIO_SWPORT_DR_L 0x0000
+#define GPIO_SWPORT_DR_H 0x0004
+#define GPIO_SWPORT_DDR_L 0x0008
+#define GPIO_SWPORT_DDR_H 0x000c
+#define GPIO_INT_EN_L 0x0010
+#define GPIO_INT_EN_H 0x0014
+#define GPIO_INT_MASK_L 0x0018
+#define GPIO_INT_MASK_H 0x001c
+#define GPIO_INT_TYPE_L 0x0020
+#define GPIO_INT_TYPE_H 0x0024
+#define GPIO_INT_POLARITY_L 0x0028
+#define GPIO_INT_POLARITY_H 0x002c
+#define GPIO_INT_BOTHEDGE_L 0x0030
+#define GPIO_INT_BOTHEDGE_H 0x0034
+#define GPIO_DEBOUNCE_L 0x0038
+#define GPIO_DEBOUNCE_H 0x003c
+#define GPIO_DBCLK_DIV_EN_L 0x0040
+#define GPIO_DBCLK_DIV_EN_H 0x0044
+#define GPIO_DBCLK_DIV_CON 0x0048
+#define GPIO_INT_STATUS 0x0050
+#define GPIO_INT_RAWSTATUS 0x0058
+#define GPIO_PORT_EOI_L 0x0060
+#define GPIO_PORT_EOI_H 0x0064
+#define GPIO_EXT_PORT 0x0070
+#define GPIO_VER_ID 0x0078
+#define GPIO_STORE_ST_L 0x0080
+#define GPIO_STORE_ST_H 0x0084
+#define GPIO_REG_GROUP_L 0x0100
+#define GPIO_REG_GROUP_H 0x0104
+#define GPIO_VIRTUAL_EN 0x0108
+#define GPIO_REG_GROUP1_L 0x0110
+#define GPIO_REG_GROUP1_H 0x0114
+#define GPIO_REG_GROUP2_L 0x0118
+#define GPIO_REG_GROUP2_H 0x011c
+#define GPIO_REG_GROUP3_L 0x0120
+#define GPIO_REG_GROUP3_H 0x0124
+
+/* PWM */
+#define PMW_PWRCAPTURE_VAL 0x15c
+
+#define OTP_CHIP_ID_OFF 0
+#define OTP_FEA_ID_OFF 10
+#define OTP_CHIP_ID_RM_OFF 14
+#define OTP_FEA_ID_RM_OFF 22
+
+#define SOC_RV1126B 0x52561126
+#define SOC_UNKNOWN 0xeeee
+#define SOC_ROOT 0x0
+#endif /* __SOC_H__ */
diff --git a/plat/rockchip/rv1126b/include/plat.ld.S b/plat/rockchip/rv1126b/include/plat.ld.S
new file mode 100644
index 000000000..dc8b6a36b
--- /dev/null
+++ b/plat/rockchip/rv1126b/include/plat.ld.S
@@ -0,0 +1,40 @@
+// SPDX-License-Identifier: BSD-3-Clause
+/*
+ * Copyright (c) 2026, Rockchip Electronics Co., Ltd.
+ */
+
+#ifndef ROCKCHIP_PLAT_LD_S
+#define ROCKCHIP_PLAT_LD_S
+
+MEMORY {
+ PMUSRAM (rwx): ORIGIN = PMUSRAM_BASE, LENGTH = PMUSRAM_RSIZE
+}
+
+SECTIONS
+{
+ . = PMUSRAM_BASE;
+
+ /*
+ * pmu_cpuson_entrypoint request address
+ * align 64K when resume, so put it in the
+ * start of pmusram
+ */
+ .text_pmusram : {
+ ASSERT(. == ALIGN(4 * 1024),
+ ".pmusram.entry request 64K aligned.");
+ KEEP(*(.pmusram.entry))
+ __bl31_pmusram_text_start = .;
+ *(.pmusram.text)
+ *(.pmusram.rodata)
+ __bl31_pmusram_text_real_end = .;
+ __bl31_pmusram_text_end = .;
+ __bl31_pmusram_data_start = .;
+ *(.pmusram.data)
+ __bl31_pmusram_data_real_end = .;
+ __bl31_pmusram_data_end = .;
+
+ ASSERT(__bl31_pmusram_data_end <= PMUSRAM_BASE + PMUSRAM_RSIZE,
+ ".pmusram has exceeded its limit.");
+ } >PMUSRAM
+}
+#endif /* ROCKCHIP_PLAT_LD_S */
diff --git a/plat/rockchip/rv1126b/include/plat_sip_calls.h b/plat/rockchip/rv1126b/include/plat_sip_calls.h
new file mode 100644
index 000000000..a00b0593e
--- /dev/null
+++ b/plat/rockchip/rv1126b/include/plat_sip_calls.h
@@ -0,0 +1,11 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Copyright (c) 2026, Rockchip Electronics Co., Ltd.
+ */
+
+#ifndef __PLAT_SIP_CALLS_H__
+#define __PLAT_SIP_CALLS_H__
+
+#define RK_PLAT_SIP_NUM_CALLS 0
+
+#endif /* __PLAT_SIP_CALLS_H__ */
diff --git a/plat/rockchip/rv1126b/include/platform_def.h b/plat/rockchip/rv1126b/include/platform_def.h
new file mode 100644
index 000000000..e712a57be
--- /dev/null
+++ b/plat/rockchip/rv1126b/include/platform_def.h
@@ -0,0 +1,118 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Copyright (c) 2026, Rockchip Electronics Co., Ltd.
+ */
+
+#ifndef __PLATFORM_DEF_H__
+#define __PLATFORM_DEF_H__
+
+#include <arch.h>
+#include <common_def.h>
+
+#include <rv1126b_def.h>
+
+#define DEBUG_XLAT_TABLE 0
+
+/*******************************************************************************
+ * Platform binary types for linking
+ ******************************************************************************/
+#define PLATFORM_LINKER_FORMAT "elf64-littleaarch64"
+#define PLATFORM_LINKER_ARCH aarch64
+
+/*******************************************************************************
+ * Generic platform constants
+ ******************************************************************************/
+
+/* Size of cacheable stacks */
+#if DEBUG_XLAT_TABLE
+#define PLATFORM_STACK_SIZE 0x800
+#elif IMAGE_BL1
+#define PLATFORM_STACK_SIZE 0x440
+#elif IMAGE_BL2
+#define PLATFORM_STACK_SIZE 0x400
+#elif IMAGE_BL31
+#define PLATFORM_STACK_SIZE 0x800
+#elif IMAGE_BL32
+#define PLATFORM_STACK_SIZE 0x440
+#endif
+
+#define FIRMWARE_WELCOME_STR "Booting Trusted Firmware\n"
+
+#define PLATFORM_SYSTEM_COUNT 1
+#define PLATFORM_CLUSTER_COUNT 1
+#define PLATFORM_CLUSTER0_CORE_COUNT 4
+#define PLATFORM_CLUSTER1_CORE_COUNT 0
+
+#define PLATFORM_CORE_COUNT (PLATFORM_CLUSTER1_CORE_COUNT + \
+ PLATFORM_CLUSTER0_CORE_COUNT)
+
+#define PLATFORM_NUM_AFFS (PLATFORM_SYSTEM_COUNT + \
+ PLATFORM_CLUSTER_COUNT + \
+ PLATFORM_CORE_COUNT)
+
+#define PLAT_MAX_PWR_LVL MPIDR_AFFLVL2
+
+#define PLAT_RK_CLST_TO_CPUID_SHIFT 6
+
+/*
+ * This macro defines the deepest retention state possible. A higher state
+ * id will represent an invalid or a power down state.
+ */
+#define PLAT_MAX_RET_STATE 1
+
+/*
+ * This macro defines the deepest power down states possible. Any state ID
+ * higher than this is invalid.
+ */
+#define PLAT_MAX_OFF_STATE 2
+/*******************************************************************************
+ * Platform memory map related constants
+ ******************************************************************************/
+/* TF txet, ro, rw, Size: 512KB */
+#define TZRAM_BASE RK_DRAM_BASE
+#define TZRAM_SIZE 0x100000
+
+/*******************************************************************************
+ * BL31 specific defines.
+ ******************************************************************************/
+/*
+ * Put BL3-1 at the top of the Trusted RAM
+ */
+#define BL31_BASE (TZRAM_BASE + 0x0)
+#define BL31_LIMIT (TZRAM_BASE + TZRAM_SIZE)
+
+/*******************************************************************************
+ * Platform specific page table and MMU setup constants
+ ******************************************************************************/
+#define PLAT_PHY_ADDR_SPACE_SIZE (1ULL << 32)
+#define PLAT_VIRT_ADDR_SPACE_SIZE (1ULL << 32)
+
+#define ADDR_SPACE_SIZE (1ULL << 32)
+#define MAX_XLAT_TABLES 18
+#define MAX_MMAP_REGIONS 27
+
+/*******************************************************************************
+ * Declarations and constants to access the mailboxes safely. Each mailbox is
+ * aligned on the biggest cache line size in the platform. This is known only
+ * to the platform as it might have a combination of integrated and external
+ * caches. Such alignment ensures that two maiboxes do not sit on the same cache
+ * line at any cache level. They could belong to different cpus/clusters &
+ * get written while being protected by different locks causing corruption of
+ * a valid mailbox address.
+ ******************************************************************************/
+#define CACHE_WRITEBACK_SHIFT 6
+#define CACHE_WRITEBACK_GRANULE (1 << CACHE_WRITEBACK_SHIFT)
+
+/*
+ * Define GICD and GICC and GICR base
+ */
+#define PLAT_RK_GICD_BASE PLAT_GICD_BASE
+#define PLAT_RK_GICC_BASE PLAT_GICC_BASE
+#define PLAT_RK_GICR_BASE PLAT_GICR_BASE
+
+#define PLAT_RK_UART_BASE RK_DBG_UART_BASE
+#define PLAT_RK_UART_CLOCK RK_DBG_UART_CLOCK
+#define PLAT_RK_UART_BAUDRATE RK_DBG_UART_BAUDRATE
+
+#define PLAT_RK_PRIMARY_CPU 0x0
+#endif /* __PLATFORM_DEF_H__ */
diff --git a/plat/rockchip/rv1126b/plat_sip_calls.c b/plat/rockchip/rv1126b/plat_sip_calls.c
new file mode 100644
index 000000000..3a147b5d8
--- /dev/null
+++ b/plat/rockchip/rv1126b/plat_sip_calls.c
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: BSD-3-Clause
+/*
+ * Copyright (c) 2026, Rockchip Electronics Co., Ltd.
+ */
+
+#include <common/debug.h>
+#include <common/runtime_svc.h>
+#include <drivers/scmi-msg.h>
+
+#include <plat_sip_calls.h>
+#include <rockchip_sip_svc.h>
+
+uintptr_t rockchip_plat_sip_handler(uint32_t smc_fid,
+ u_register_t x1,
+ u_register_t x2,
+ u_register_t x3,
+ u_register_t x4,
+ void *cookie,
+ void *handle,
+ u_register_t flags)
+{
+ switch (smc_fid) {
+ case RK_SIP_SCMI_AGENT0:
+ scmi_smt_fastcall_smc_entry(0);
+ SMC_RET1(handle, 0);
+
+ default:
+ ERROR("%s: unhandled SMC (0x%x)\n", __func__, smc_fid);
+ SMC_RET1(handle, SMC_UNK);
+ }
+}
diff --git a/plat/rockchip/rv1126b/platform.mk b/plat/rockchip/rv1126b/platform.mk
new file mode 100644
index 000000000..46bb5e6b2
--- /dev/null
+++ b/plat/rockchip/rv1126b/platform.mk
@@ -0,0 +1,114 @@
+#
+# Copyright (c) 2026, Rockchip Electronics Co., Ltd. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+RK_PLAT := plat/rockchip
+RK_PLAT_SOC := ${RK_PLAT}/${PLAT}
+RK_PLAT_COMMON := ${RK_PLAT}/common
+
+DISABLE_BIN_GENERATION := 1
+
+include drivers/arm/gic/v2/gicv2.mk
+include lib/libfdt/libfdt.mk
+include lib/xlat_tables_v2/xlat_tables.mk
+
+PLAT_INCLUDES := -Idrivers/arm/gic/common/ \
+ -Idrivers/arm/gic/v2/ \
+ -Iinclude/bl31 \
+ -Iinclude/common \
+ -Iinclude/drivers \
+ -Iinclude/drivers/arm \
+ -Iinclude/drivers/auth \
+ -Iinclude/drivers/io \
+ -Iinclude/drivers/ti/uart \
+ -Iinclude/lib \
+ -Iinclude/lib/cpus/${ARCH} \
+ -Iinclude/lib/el3_runtime \
+ -Iinclude/lib/psci \
+ -Iinclude/plat/common \
+ -Iinclude/services \
+ -Iinclude/plat/common/ \
+ -Idrivers/scmi-msg/ \
+ -I${RK_PLAT_COMMON}/ \
+ -I${RK_PLAT_COMMON}/pmusram/ \
+ -I${RK_PLAT_COMMON}/include/ \
+ -I${RK_PLAT_COMMON}/drivers/pmu/ \
+ -I${RK_PLAT_COMMON}/drivers/parameter/ \
+ -I${RK_PLAT_COMMON}/scmi/ \
+ -I${RK_PLAT_SOC}/ \
+ -I${RK_PLAT_SOC}/drivers/dmc/ \
+ -I${RK_PLAT_SOC}/scmi/ \
+ -I${RK_PLAT_SOC}/drivers/pmu/ \
+ -I${RK_PLAT_SOC}/drivers/secure/ \
+ -I${RK_PLAT_SOC}/drivers/soc/ \
+ -I${RK_PLAT_SOC}/include/ \
+
+RK_GIC_SOURCES := ${GICV2_SOURCES} \
+ plat/common/plat_gicv2.c \
+ ${RK_PLAT}/common/rockchip_gicv2.c
+
+PLAT_BL_COMMON_SOURCES := ${XLAT_TABLES_LIB_SRCS} \
+ common/desc_image_load.c \
+ lib/bl_aux_params/bl_aux_params.c \
+ plat/common/aarch64/crash_console_helpers.S \
+ plat/common/plat_psci_common.c
+
+ifneq (${ENABLE_STACK_PROTECTOR},0)
+PLAT_BL_COMMON_SOURCES += ${RK_PLAT_COMMON}/rockchip_stack_protector.c
+endif
+
+BL31_SOURCES += ${RK_GIC_SOURCES} \
+ drivers/ti/uart/aarch64/16550_console.S \
+ drivers/delay_timer/delay_timer.c \
+ drivers/delay_timer/generic_delay_timer.c \
+ drivers/scmi-msg/base.c \
+ drivers/scmi-msg/clock.c \
+ drivers/scmi-msg/entry.c \
+ drivers/scmi-msg/reset_domain.c \
+ drivers/scmi-msg/smt.c \
+ lib/cpus/aarch64/cortex_a53.S \
+ $(LIBFDT_SRCS) \
+ $(ZLIB_SOURCES) \
+ ${RK_PLAT_COMMON}/aarch64/plat_helpers.S \
+ ${RK_PLAT_COMMON}/aarch64/platform_common.c \
+ ${RK_PLAT_COMMON}/bl31_plat_setup.c \
+ ${RK_PLAT_COMMON}/plat_pm.c \
+ ${RK_PLAT_COMMON}/params_setup.c \
+ ${RK_PLAT_COMMON}/plat_pm_helpers.c \
+ ${RK_PLAT_COMMON}/plat_topology.c \
+ ${RK_PLAT_COMMON}/rockchip_sip_svc.c \
+ ${RK_PLAT_COMMON}/pmusram/cpus_on_fixed_addr.S \
+ ${RK_PLAT_COMMON}/drivers/parameter/ddr_parameter.c \
+ ${RK_PLAT_COMMON}/rockchip_sip_svc.c \
+ ${RK_PLAT_COMMON}/scmi/scmi.c \
+ ${RK_PLAT_COMMON}/scmi/scmi_clock.c \
+ ${RK_PLAT_COMMON}/scmi/scmi_rstd.c \
+ ${RK_PLAT_COMMON}/scmi/rockchip_common_clock.c \
+ ${RK_PLAT_SOC}/drivers/dmc/suspend.c \
+ ${RK_PLAT_SOC}/plat_sip_calls.c \
+ ${RK_PLAT_SOC}/scmi/rv1126b_clk.c \
+ ${RK_PLAT_SOC}/drivers/pmu/pmu.c \
+ ${RK_PLAT_SOC}/drivers/pmu/pm_pd_regs.c \
+ ${RK_PLAT_SOC}/drivers/secure/secure.c \
+ ${RK_PLAT_SOC}/drivers/soc/soc.c
+
+# Enable workarounds for selected Cortex-A53 errata
+ERRATA_A53_835769 := 1
+ERRATA_A53_843419 := 1
+ERRATA_A53_855873 := 1
+ERRATA_A53_1530924 := 1
+
+ENABLE_PLAT_COMPAT := 0
+MULTI_CONSOLE_API := 1
+CTX_INCLUDE_EL2_REGS := 0
+CTX_INCLUDE_AARCH32_REGS := 0
+INIT_UNUSED_NS_EL2 := 1
+
+# Do not enable SVE
+ENABLE_SVE_FOR_NS := 0
+
+WORKAROUND_CVE_2017_5715 := 0
+
+PLAT_EXTRA_LD_SCRIPT := 1
diff --git a/plat/rockchip/rv1126b/rv1126b_def.h b/plat/rockchip/rv1126b/rv1126b_def.h
new file mode 100644
index 000000000..1b7df0ece
--- /dev/null
+++ b/plat/rockchip/rv1126b/rv1126b_def.h
@@ -0,0 +1,182 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Copyright (c) 2026, Rockchip Electronics Co., Ltd.
+ */
+
+#ifndef __PLAT_DEF_H__
+#define __PLAT_DEF_H__
+
+#define SIZE_K(n) ((n) * 1024)
+#define SIZE_M(n) ((n) * 1024 * 1024)
+
+#define WITH_16BITS_WMSK(bits) (0xffff0000 | (bits))
+#define BITS_WMSK(msk, shift) ((msk) << ((shift) + REG_MSK_SHIFT))
+
+/* Special value used to verify platform parameters from BL2 to BL3-1 */
+#define RK_BL31_PLAT_PARAM_VAL 0x0f1e2d3c4b5a6978ULL
+
+#define RK_DRAM_BASE 0x40000000
+#define RK_DRAM_RGN_BASE 0x0
+
+#define RV1126B_DEV_RNG0_BASE 0x00000000
+#define RV1126B_DEV_RNG0_SIZE 0x40000000
+
+/* All slave base address declare below */
+#define TOPCRU_BASE 0x20000000
+#define BUSCRU_BASE 0x20010000
+#define PERICRU_BASE 0x20020000
+#define CORECRU_BASE 0x20030000
+#define PMU0CRU_BASE 0x20040000
+#define PMU1CRU_BASE 0x20050000
+#define DDRCRU_BASE 0x20060000
+#define SUBDDRCRU_BASE 0x20068000
+#define VICRU_BASE 0x20070000
+#define VEPUCRU_BASE 0x20080000
+#define NPUCRU_BASE 0x20090000
+#define VDOCRU_BASE 0x200a0000
+#define VCPCRU_BASE 0x200b0000
+
+#define SYSGRF_BASE 0x20100000
+#define PERIGRF_BASE 0x20110000
+#define U3PHYGRF_BASE 0x20118000
+#define COREGRF_BASE 0x20120000
+#define PMUGRF_BASE 0x20130000
+#define DDRGRF_BASE 0x20140000
+#define VIGRF_BASE 0x20150000
+#define VEPUGRF_BASE 0x20160000
+#define NPUGRF_BASE 0x20170000
+#define VDOGRF_BASE 0x20180000
+#define VCPGRF_BASE 0x20190000
+#define PMU0IOC_BASE 0x201a0000
+#define PMU1IOC_BASE 0x201a8000
+#define IOC1_BASE 0x201b0000
+#define IOC2_BASE 0x201b8000
+#define IOC3_BASE 0x201c0000
+#define IOC4_BASE 0x201c8000
+#define IOC5_BASE 0x201d0000
+#define IOC6_BASE 0x201d8000
+#define IOC7_BASE 0x201e0000
+
+#define BUSSCRU_BASE 0x20200000
+#define PMUSCRU_BASE 0x20210000
+
+#define SYSSGRF_BASE 0x20220000
+#define PMUSGRF_BASE 0x20230000
+#define PVTPLL_CORE_BASE 0x20480000
+#define PVTPLL_VI_BASE 0x21C60000
+#define PVTPLL_VEPU_BASE 0x21F00000
+#define PVTPLL_VCP_BASE 0x21FC0000
+#define PVTPLL_NPU_BASE 0x22080000
+
+#define GPIO0_BASE 0x20600000
+#define PWM1_BASE 0x20700000
+#define I2C2_BASE 0x20810000
+#define UART0_BASE 0x20810000
+#define HPTIMER_BASE 0x20820000
+#define PMU_BASE 0x20830000
+#define PMU0_BASE 0x20830000
+#define PMU1_BASE 0x20834000
+#define PMU2_BASE 0x20838000
+#define PMU_WDT_BASE 0x20850000
+#define RC_OSC_CTRL_BASE 0x20860000
+#define STIMER_BASE 0x20a00000
+#define WDT_S_BASE 0x20b00000
+#define OTP_S_BASE 0x20b10000
+#define WDT_NS_BASE 0x20b60000
+#define DCF_BASE 0x20b70000
+#define OTP_NS_BASE 0x20b90000
+#define OTP_MASK_BASE 0x20ba0000
+#define TSADC_BASE 0x20bb0000
+#define NSTIMER_BASE 0x20c00000
+
+#define UART1_BASE 0x21160000
+#define UART2_BASE 0x21170000
+#define UART3_BASE 0x21180000
+#define UART4_BASE 0x21190000
+#define UART5_BASE 0x211a0000
+#define UART6_BASE 0x211b0000
+#define UART7_BASE 0x211c0000
+#define GIC400_BASE 0x21200000
+
+#define GPIO1_BASE 0x21300000
+#define DDRCTL_BASE 0x21600000
+#define DDRPHY_BASE 0x21650000
+#define FW_DDR_BASE 0x21660000
+#define GPIO2_BASE 0x21700000
+#define GPIO4_BASE 0x21800000
+#define GPIO5_BASE 0x21900000
+#define GPIO6_BASE 0x21a00000
+#define GPIO7_BASE 0x21b00000
+#define GPIO3_BASE 0x21e00000
+#define VOP_BASE 0x22150000
+
+#define PMUSRAM_RSIZE SIZE_K(8)
+#define PMUSRAM_BASE 0x3ff1e000
+#define AOASRAM_BASE 0x3ff20000
+#define SRAM_BASE 0x3ffb0000
+
+#define MAX_MEM_OS_REG_NUM 4
+#define MEM_OS_REG_BASE \
+ (PMUSRAM_BASE + PMUSRAM_RSIZE - MAX_MEM_OS_REG_NUM * 4)
+
+#define PSRAM_SP_TOP MEM_OS_REG_BASE
+
+#define STIMER_CHN_BASE(i) (STIMER_BASE + 0x10000 * (i))
+#define NSTIMER_CHN_BASE(i) (NSTIMER_BASE + 0x10000 * (i))
+
+/**************************************************************************
+ * share mem region allocation: 1M~2M
+ **************************************************************************/
+#define DDR_SHARE_MEM (RK_DRAM_BASE + SIZE_K(1024))
+#define DDR_SHARE_SIZE SIZE_K(64)
+
+#define SHARE_MEM_BASE DDR_SHARE_MEM
+#define SHARE_MEM_PAGE_NUM 15
+#define SHARE_MEM_SIZE SIZE_K(SHARE_MEM_PAGE_NUM * 4)
+
+#define SCMI_SHARE_MEM_BASE (SHARE_MEM_BASE + SHARE_MEM_SIZE)
+#define SCMI_SHARE_MEM_SIZE SIZE_K(4)
+
+#define SMT_BUFFER_BASE SCMI_SHARE_MEM_BASE
+#define SMT_BUFFER0_BASE SMT_BUFFER_BASE
+
+#define ROCKCHIP_PM_REG_REGION_MEM_SIZE SIZE_K(8)
+
+/**************************************************************************
+ * UART related constants
+ **************************************************************************/
+#define RK_DBG_UART_BASE UART0_BASE
+#define RK_DBG_UART_BAUDRATE 1500000
+#define RK_DBG_UART_CLOCK 24000000
+
+/******************************************************************************
+ * GIC-400 & interrupt handling related constants
+ ******************************************************************************/
+
+/* Base rk_platform compatible GIC memory map */
+#define PLAT_GICD_BASE (GIC400_BASE + 0x1000)
+#define PLAT_GICC_BASE (GIC400_BASE + 0x2000)
+#define PLAT_GICR_BASE 0
+
+/******************************************************************************
+ * sgi, ppi
+ ******************************************************************************/
+#define RK_IRQ_SEC_SGI_0 8
+#define RK_IRQ_SEC_SGI_1 9
+#define RK_IRQ_SEC_SGI_2 10
+#define RK_IRQ_SEC_SGI_3 11
+#define RK_IRQ_SEC_SGI_4 12
+#define RK_IRQ_SEC_SGI_5 13
+#define RK_IRQ_SEC_SGI_6 14
+#define RK_IRQ_SEC_SGI_7 15
+#define RK_IRQ_SEC_PHY_TIMER 29
+
+/*
+ * Define a list of Group 0 interrupts.
+ */
+#define PLAT_RK_GICV2_G0_IRQS \
+ INTR_PROP_DESC(RK_IRQ_SEC_PHY_TIMER, GIC_HIGHEST_SEC_PRIORITY, \
+ GICV2_INTR_GROUP0, GIC_INTR_CFG_LEVEL), \
+ INTR_PROP_DESC(RK_IRQ_SEC_SGI_6, GIC_HIGHEST_SEC_PRIORITY, \
+ GICV2_INTR_GROUP0, GIC_INTR_CFG_LEVEL)
+#endif /* __PLAT_DEF_H__ */
diff --git a/plat/rockchip/rv1126b/scmi/rv1126b_clk.c b/plat/rockchip/rv1126b/scmi/rv1126b_clk.c
new file mode 100644
index 000000000..bfae4f540
--- /dev/null
+++ b/plat/rockchip/rv1126b/scmi/rv1126b_clk.c
@@ -0,0 +1,186 @@
+// SPDX-License-Identifier: BSD-3-Clause
+/*
+ * Copyright (c) 2026, Rockchip Electronics Co., Ltd.
+ */
+
+#include <assert.h>
+#include <errno.h>
+
+#include <drivers/delay_timer.h>
+#include <drivers/scmi.h>
+#include <lib/mmio.h>
+#include <lib/spinlock.h>
+
+#include <plat_private.h>
+#include <platform_def.h>
+#include <rockchip_sip_svc.h>
+#include <rv1126b_clk.h>
+#include <scmi_clock.h>
+#include <soc.h>
+
+enum pll_type_sel {
+ PLL_SEL_AUTO, /* all plls (normal pll or pvtpll) */
+ PLL_SEL_PVT,
+ PLL_SEL_NOR,
+ PLL_SEL_AUTO_NOR /* all normal plls (apll/gpll/npll) */
+};
+
+#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
+
+#define GPLL_RATE 1188000000
+#define CPLL_RATE 1000000000
+#define AUPLL_RATE 786431952
+
+#define MAX_RATE_TABLE 16
+
+#define CLKDIV_6BITS_SHF(div, shift) BITS_WITH_WMASK(div, 0x3fU, shift)
+#define CLKDIV_5BITS_SHF(div, shift) BITS_WITH_WMASK(div, 0x1fU, shift)
+#define CLKDIV_4BITS_SHF(div, shift) BITS_WITH_WMASK(div, 0xfU, shift)
+#define CLKDIV_3BITS_SHF(div, shift) BITS_WITH_WMASK(div, 0x7U, shift)
+#define CLKDIV_2BITS_SHF(div, shift) BITS_WITH_WMASK(div, 0x3U, shift)
+#define CLKDIV_1BITS_SHF(div, shift) BITS_WITH_WMASK(div, 0x1U, shift)
+
+#define CPU_PLL_PATH_SLOWMODE BITS_WITH_WMASK(0U, 0x3U, 0)
+#define CPU_PLL_PATH_NORMAL BITS_WITH_WMASK(1U, 0x3U, 0)
+#define CPU_PLL_PATH_DEEP_SLOW BITS_WITH_WMASK(2U, 0x3U, 0)
+
+#define CRU_PLL_POWER_DOWN BIT_WITH_WMSK(13)
+#define CRU_PLL_POWER_UP WMSK_BIT(13)
+
+#define PRATE(x) static const unsigned long const x[]
+#define PINFO(x) static const uint32_t const x[]
+
+PRATE(p_24m) = { OSC_HZ };
+PRATE(p_100m) = { 100 * MHz};
+PRATE(p_200m) = { 198 * MHz};
+PRATE(p_300m) = { 297 * MHz};
+
+PINFO(clk_user_otpc_s_info) = { 0, 0, 0, 0x20200308, 12, 3, 0x20200800, 12 };
+PINFO(clk_sbpi_otpc_s_info) = { 0, 0, 0, 0, 0, 0, 0x20200800, 11 };
+PINFO(pclk_otpc_s_info) = { 0, 0, 0, 0, 0, 0, 0x20200800, 10 };
+PINFO(pclk_key_r_s_info) = { 0, 0, 0, 0, 0, 0, 0x20200800, 13 };
+PINFO(hclk_kl_rkce_s_info) = { 0, 0, 0, 0, 0, 0, 0x20200800, 9 };
+PINFO(hclk_rkce_s_info) = { 0, 0, 0, 0, 0, 0, 0x20200800, 8 };
+PINFO(pclk_wdt_s_info) = { 0, 0, 0, 0, 0, 0, 0x20200800, 6 };
+PINFO(tclk_wdt_s_info) = { 0, 0, 0, 0, 0, 0, 0x20200800, 7 };
+PINFO(clk_stimer0_info) = { 0, 0, 0, 0, 0, 0, 0x20200800, 4 };
+PINFO(clk_stimer1_info) = { 0, 0, 0, 0, 0, 0, 0x20200800, 5 };
+PINFO(pclk_stimer_info) = { 0, 0, 0, 0, 0, 0, 0x20200800, 3 };
+PINFO(hclk_rkrng_s_info) = { 0, 0, 0, 0, 0, 0, 0x20200808, 14 };
+PINFO(clk_pka_rkce_s_info) = { 0, 0, 0, 0, 0, 0, 0x20200808, 13 };
+PINFO(aclk_rkce_s_info) = { 0, 0, 0, 0, 0, 0, 0x20200808, 12 };
+
+#define RV1126B_SCMI_CLOCK(_id, _name, _data, _table, _cnt, _is_s) \
+rk_scmi_clock_t _name = { \
+ .id = _id, \
+ .name = #_name, \
+ .clk_ops = _data, \
+ .rate_table = _table, \
+ .rate_cnt = _cnt, \
+ .is_security = _is_s, \
+}
+
+#define RV1126B_SCMI_CLOCK_COM(_id, _name, _parent_table, _info, _data, \
+ _table, is_d, _is_s) \
+rk_scmi_clock_t _name = { \
+ .id = _id, \
+ .name = #_name, \
+ .parent_table = _parent_table, \
+ .info = _info, \
+ .clk_ops = _data, \
+ .rate_table = _table, \
+ .rate_cnt = ARRAY_SIZE(_table), \
+ .is_dynamic_prate = is_d, \
+ .is_security = _is_s, \
+}
+
+static unsigned long rv1126b_common_rates[] = {
+ 400000, 24000000, 50000000, 100000000, 198000000, 297000000, 396000000,
+};
+
+static const struct rk_clk_ops clk_scmi_ops_com = {
+ .get_rate = clk_scmi_common_get_rate,
+ .set_rate = clk_scmi_common_set_rate,
+ .set_status = clk_scmi_common_set_status,
+};
+
+static const struct rk_clk_ops clk_scmi_ops_gate = {
+ .get_rate = clk_scmi_common_get_rate,
+ .set_status = clk_scmi_common_set_status,
+};
+
+RV1126B_SCMI_CLOCK_COM(CLK_USER_OTPC_S, clk_user_otpc_s, p_24m, clk_user_otpc_s_info,
+ &clk_scmi_ops_com, rv1126b_common_rates, false, true);
+RV1126B_SCMI_CLOCK_COM(CLK_SBPI_OTPC_S, clk_sbpi_otpc_s, p_24m, clk_sbpi_otpc_s_info,
+ &clk_scmi_ops_gate, rv1126b_common_rates, false, true);
+RV1126B_SCMI_CLOCK_COM(PCLK_OTPC_S, pclk_otpc_s, p_100m, pclk_otpc_s_info,
+ &clk_scmi_ops_gate, rv1126b_common_rates, false, true);
+RV1126B_SCMI_CLOCK_COM(PCLK_KEY_READER_S, pclk_key_r_s, p_100m, pclk_key_r_s_info,
+ &clk_scmi_ops_gate, rv1126b_common_rates, false, true);
+RV1126B_SCMI_CLOCK_COM(HCLK_KL_RKCE_S, hclk_kl_rkce_s, p_200m, hclk_kl_rkce_s_info,
+ &clk_scmi_ops_gate, rv1126b_common_rates, false, true);
+RV1126B_SCMI_CLOCK_COM(HCLK_RKCE_S, hclk_rkce_s, p_200m, hclk_rkce_s_info,
+ &clk_scmi_ops_gate, rv1126b_common_rates, false, true);
+RV1126B_SCMI_CLOCK_COM(PCLK_WDT_S, pclk_wdt_s, p_100m, pclk_wdt_s_info,
+ &clk_scmi_ops_gate, rv1126b_common_rates, true, true);
+RV1126B_SCMI_CLOCK_COM(TCLK_WDT_S, tclk_wdt_s, p_24m, tclk_wdt_s_info,
+ &clk_scmi_ops_gate, rv1126b_common_rates, false, true);
+RV1126B_SCMI_CLOCK_COM(CLK_STIMER0, clk_stimer0, p_100m, clk_stimer0_info,
+ &clk_scmi_ops_gate, rv1126b_common_rates, false, true);
+RV1126B_SCMI_CLOCK_COM(CLK_STIMER1, clk_stimer1, p_100m, clk_stimer1_info,
+ &clk_scmi_ops_gate, rv1126b_common_rates, false, true);
+RV1126B_SCMI_CLOCK_COM(PLK_STIMER, pclk_stimer, p_100m, pclk_stimer_info,
+ &clk_scmi_ops_gate, rv1126b_common_rates, false, true);
+RV1126B_SCMI_CLOCK_COM(HCLK_RKRNG_S, hclk_rkrng_s, p_200m, hclk_rkrng_s_info,
+ &clk_scmi_ops_gate, rv1126b_common_rates, false, true);
+RV1126B_SCMI_CLOCK_COM(CLK_PKA_RKCE_S, clk_pka_rkce_s, p_200m, clk_pka_rkce_s_info,
+ &clk_scmi_ops_gate, rv1126b_common_rates, false, true);
+RV1126B_SCMI_CLOCK_COM(ACLK_RKCE_S, aclk_rkce_s, p_300m, aclk_rkce_s_info,
+ &clk_scmi_ops_gate, rv1126b_common_rates, false, true);
+
+static rk_scmi_clock_t *clock_table[] = {
+ [CLK_USER_OTPC_S] = &clk_user_otpc_s,
+ [CLK_SBPI_OTPC_S] = &clk_sbpi_otpc_s,
+ [PCLK_OTPC_S] = &pclk_otpc_s,
+ [PCLK_KEY_READER_S] = &pclk_key_r_s,
+ [HCLK_KL_RKCE_S] = &hclk_kl_rkce_s,
+ [HCLK_RKCE_S] = &hclk_rkce_s,
+ [PCLK_WDT_S] = &pclk_wdt_s,
+ [TCLK_WDT_S] = &tclk_wdt_s,
+ [CLK_STIMER0] = &clk_stimer0,
+ [CLK_STIMER1] = &clk_stimer1,
+ [PLK_STIMER] = &pclk_stimer,
+ [HCLK_RKRNG_S] = &hclk_rkrng_s,
+ [CLK_PKA_RKCE_S] = &clk_pka_rkce_s,
+ [ACLK_RKCE_S] = &aclk_rkce_s,
+};
+
+size_t rockchip_scmi_clock_count(unsigned int agent_id __unused)
+{
+ return CLK_NR_CLKS;
+}
+
+rk_scmi_clock_t *rockchip_scmi_get_clock(uint32_t agent_id __unused,
+ uint32_t clock_id)
+{
+ rk_scmi_clock_t *table = NULL;
+
+ if (clock_id < ARRAY_SIZE(clock_table)) {
+ table = clock_table[clock_id];
+ if (table == NULL)
+ return NULL;
+ }
+
+ if ((table != NULL) && (table->is_security == 0))
+ return table;
+ else
+ return NULL;
+
+ return NULL;
+}
+
+void rockchip_clock_init(void)
+{
+ /* disable aclk_rkce_s_en and clk_pka_rkce_s_en */
+ mmio_write_32(0x20200808, 0x30003000);
+}
diff --git a/plat/rockchip/rv1126b/scmi/rv1126b_clk.h b/plat/rockchip/rv1126b/scmi/rv1126b_clk.h
new file mode 100644
index 000000000..de99bd8eb
--- /dev/null
+++ b/plat/rockchip/rv1126b/scmi/rv1126b_clk.h
@@ -0,0 +1,794 @@
+/* SPDX-License-Identifier: BSD-3-Clause */
+/*
+ * Copyright (c) 2026, Rockchip Electronics Co., Ltd.
+ */
+
+#ifndef _CLOCK_H
+#define _CLOCK_H
+
+/* pll clocks */
+#define PLL_GPLL 1
+#define PLL_CPLL 2
+#define PLL_AUPLL 3
+#define ARMCLK 4
+#define SCLK_DDR 5
+
+/* clk (clocks) */
+#define CLK_CPLL_DIV20 8
+#define CLK_CPLL_DIV10 9
+#define CLK_CPLL_DIV8 10
+#define CLK_GPLL_DIV8 11
+#define CLK_GPLL_DIV6 12
+#define CLK_GPLL_DIV4 13
+#define CLK_CPLL_DIV3 14
+#define CLK_GPLL_DIV3 15
+#define CLK_CPLL_DIV2 16
+#define CLK_GPLL_DIV2 17
+#define CLK_CM_FRAC0 18
+#define CLK_CM_FRAC1 19
+#define CLK_CM_FRAC2 20
+#define CLK_UART_FRAC0 21
+#define CLK_UART_FRAC1 22
+#define CLK_AUDIO_FRAC0 23
+#define CLK_AUDIO_FRAC1 24
+#define CLK_AUDIO_INT0 25
+#define CLK_AUDIO_INT1 26
+#define SCLK_UART0_SRC 27
+#define SCLK_UART1 28
+#define SCLK_UART2 29
+#define SCLK_UART3 30
+#define SCLK_UART4 31
+#define SCLK_UART5 32
+#define SCLK_UART6 33
+#define SCLK_UART7 34
+#define MCLK_SAI0 35
+#define MCLK_SAI1 36
+#define MCLK_SAI2 37
+#define MCLK_PDM 38
+#define CLKOUT_PDM 39
+#define MCLK_ASRC0 40
+#define MCLK_ASRC1 41
+#define MCLK_ASRC2 42
+#define MCLK_ASRC3 43
+#define CLK_ASRC0 44
+#define CLK_ASRC1 45
+#define CLK_CORE_PLL 46
+#define CLK_NPU_PLL 47
+#define CLK_VEPU_PLL 48
+#define CLK_ISP_PLL 49
+#define CLK_AISP_PLL 50
+#define CLK_SARADC0_SRC 51
+#define CLK_SARADC1_SRC 52
+#define CLK_SARADC2_SRC 53
+#define HCLK_NPU_ROOT 54
+#define PCLK_NPU_ROOT 55
+#define ACLK_VEPU_ROOT 56
+#define HCLK_VEPU_ROOT 57
+#define PCLK_VEPU_ROOT 58
+#define CLK_CORE_RGA_SRC 59
+#define ACLK_GMAC_ROOT 60
+#define ACLK_VI_ROOT 61
+#define HCLK_VI_ROOT 62
+#define PCLK_VI_ROOT 63
+#define DCLK_VICAP_ROOT 64
+#define CLK_SYS_DSMC_ROOT 65
+#define ACLK_VDO_ROOT 66
+#define ACLK_RKVDEC_ROOT 67
+#define HCLK_VDO_ROOT 68
+#define PCLK_VDO_ROOT 69
+#define DCLK_OOC_SRC 70
+#define DCLK_VOP 71
+#define DCLK_DECOM_SRC 72
+#define PCLK_DDR_ROOT 73
+#define ACLK_SYSMEM_SRC 74
+#define ACLK_TOP_ROOT 75
+#define ACLK_BUS_ROOT 76
+#define HCLK_BUS_ROOT 77
+#define PCLK_BUS_ROOT 78
+#define CCLK_SDMMC0 79
+#define CCLK_SDMMC1 80
+#define CCLK_EMMC 81
+#define SCLK_2X_FSPI0 82
+#define CLK_GMAC_PTP_REF_SRC 83
+#define CLK_GMAC_125M 84
+#define CLK_TIMER_ROOT 85
+#define TCLK_WDT_NS_SRC 86
+#define TCLK_WDT_S_SRC 87
+#define TCLK_WDT_HPMCU 88
+#define CLK_CAN0 89
+#define CLK_CAN1 90
+#define PCLK_PERI_ROOT 91
+#define ACLK_PERI_ROOT 92
+#define CLK_I2C_BUS_SRC 93
+#define CLK_SPI0 94
+#define CLK_SPI1 95
+#define BUSCLK_PMU_SRC 96
+#define CLK_PWM0 97
+#define CLK_PWM2 98
+#define CLK_PWM3 99
+#define CLK_PKA_RKCE_SRC 100
+#define ACLK_RKCE_SRC 101
+#define ACLK_VCP_ROOT 102
+#define HCLK_VCP_ROOT 103
+#define PCLK_VCP_ROOT 104
+#define CLK_CORE_FEC_SRC 105
+#define CLK_CORE_AVSP_SRC 106
+#define CLK_50M_GMAC_IOBUF_VI 107
+#define PCLK_TOP_ROOT 108
+#define CLK_MIPI0_OUT2IO 109
+#define CLK_MIPI1_OUT2IO 110
+#define CLK_MIPI2_OUT2IO 111
+#define CLK_MIPI3_OUT2IO 112
+#define CLK_CIF_OUT2IO 113
+#define CLK_MAC_OUT2IO 114
+#define MCLK_SAI0_OUT2IO 115
+#define MCLK_SAI1_OUT2IO 116
+#define MCLK_SAI2_OUT2IO 117
+#define CLK_CM_FRAC0_SRC 118
+#define CLK_CM_FRAC1_SRC 119
+#define CLK_CM_FRAC2_SRC 120
+#define CLK_UART_FRAC0_SRC 121
+#define CLK_UART_FRAC1_SRC 122
+#define CLK_AUDIO_FRAC0_SRC 123
+#define CLK_AUDIO_FRAC1_SRC 124
+#define ACLK_NPU_ROOT 125
+#define HCLK_RKNN 126
+#define ACLK_RKNN 127
+#define PCLK_GPIO3 128
+#define DBCLK_GPIO3 129
+#define PCLK_IOC_VCCIO3 130
+#define PCLK_SARADC0 131
+#define CLK_SARADC0 132
+#define HCLK_SDMMC1 133
+#define HCLK_VEPU 134
+#define ACLK_VEPU 135
+#define CLK_CORE_VEPU 136
+#define HCLK_FEC 137
+#define ACLK_FEC 138
+#define CLK_CORE_FEC 139
+#define HCLK_AVSP 140
+#define ACLK_AVSP 141
+#define BUSCLK_PMU1_ROOT 142
+#define HCLK_AISP 143
+#define ACLK_AISP 144
+#define CLK_CORE_AISP 145
+#define CLK_CORE_ISP_ROOT 146
+#define PCLK_DSMC 147
+#define ACLK_DSMC 148
+#define HCLK_CAN0 149
+#define HCLK_CAN1 150
+#define PCLK_GPIO2 151
+#define DBCLK_GPIO2 152
+#define PCLK_GPIO4 153
+#define DBCLK_GPIO4 154
+#define PCLK_GPIO5 155
+#define DBCLK_GPIO5 156
+#define PCLK_GPIO6 157
+#define DBCLK_GPIO6 158
+#define PCLK_GPIO7 159
+#define DBCLK_GPIO7 160
+#define PCLK_IOC_VCCIO2 161
+#define PCLK_IOC_VCCIO4 162
+#define PCLK_IOC_VCCIO5 163
+#define PCLK_IOC_VCCIO6 164
+#define PCLK_IOC_VCCIO7 165
+#define HCLK_ISP 166
+#define ACLK_ISP 167
+#define CLK_CORE_ISP 168
+#define HCLK_VICAP 169
+#define ACLK_VICAP 170
+#define DCLK_VICAP 171
+#define ISP0CLK_VICAP 172
+#define HCLK_VPSS 173
+#define ACLK_VPSS 174
+#define CLK_CORE_VPSS 175
+#define PCLK_CSI2HOST0 176
+#define DCLK_CSI2HOST0 177
+#define PCLK_CSI2HOST1 178
+#define DCLK_CSI2HOST1 179
+#define PCLK_CSI2HOST2 180
+#define DCLK_CSI2HOST2 181
+#define PCLK_CSI2HOST3 182
+#define DCLK_CSI2HOST3 183
+#define HCLK_SDMMC0 184
+#define ACLK_GMAC 185
+#define PCLK_GMAC 186
+#define CLK_GMAC_PTP_REF 187
+#define PCLK_CSIPHY0 188
+#define PCLK_CSIPHY1 189
+#define PCLK_MACPHY 190
+#define PCLK_SARADC1 191
+#define CLK_SARADC1 192
+#define PCLK_SARADC2 193
+#define CLK_SARADC2 194
+#define ACLK_RKVDEC 195
+#define HCLK_RKVDEC 196
+#define CLK_HEVC_CA_RKVDEC 197
+#define ACLK_VOP 198
+#define HCLK_VOP 199
+#define HCLK_RKJPEG 200
+#define ACLK_RKJPEG 201
+#define ACLK_RKMMU_DECOM 202
+#define HCLK_RKMMU_DECOM 203
+#define DCLK_DECOM 204
+#define ACLK_DECOM 205
+#define PCLK_DECOM 206
+#define PCLK_MIPI_DSI 207
+#define PCLK_DSIPHY 208
+#define ACLK_OOC 209
+#define ACLK_SYSMEM 210
+#define PCLK_DDRC 211
+#define PCLK_DDRMON 212
+#define CLK_TIMER_DDRMON 213
+#define PCLK_DFICTRL 214
+#define PCLK_DDRPHY 215
+#define PCLK_DMA2DDR 216
+#define CLK_RCOSC_SRC 217
+#define BUSCLK_PMU_MUX 218
+#define BUSCLK_PMU_ROOT 219
+#define PCLK_PMU 220
+#define CLK_XIN_RC_DIV 221
+#define CLK_32K 222
+#define PCLK_PMU_GPIO0 223
+#define DBCLK_PMU_GPIO0 224
+#define PCLK_PMU_HP_TIMER 225
+#define CLK_PMU_HP_TIMER 226
+#define CLK_PMU_32K_HP_TIMER 227
+#define PCLK_PWM1 228
+#define CLK_PWM1 229
+#define CLK_OSC_PWM1 230
+#define CLK_RC_PWM1 231
+#define CLK_FREQ_PWM1 232
+#define CLK_COUNTER_PWM1 233
+#define PCLK_I2C2 234
+#define CLK_I2C2 235
+#define PCLK_UART0 236
+#define SCLK_UART0 237
+#define PCLK_RCOSC_CTRL 238
+#define CLK_OSC_RCOSC_CTRL 239
+#define CLK_REF_RCOSC_CTRL 240
+#define PCLK_IOC_PMUIO0 241
+#define CLK_REFOUT 242
+#define CLK_PREROLL 243
+#define CLK_PREROLL_32K 244
+#define HCLK_PMU_SRAM 245
+#define PCLK_WDT_LPMCU 246
+#define TCLK_WDT_LPMCU 247
+#define CLK_LPMCU 248
+#define CLK_LPMCU_RTC 249
+#define PCLK_LPMCU_MAILBOX 250
+#define HCLK_OOC 251
+#define PCLK_SPI2AHB 252
+#define HCLK_SPI2AHB 253
+#define HCLK_FSPI1 254
+#define HCLK_XIP_FSPI1 255
+#define SCLK_1X_FSPI1 256
+#define PCLK_IOC_PMUIO1 257
+#define PCLK_AUDIO_ADC_PMU 258
+#define MCLK_AUDIO_ADC_PMU 259
+#define MCLK_AUDIO_ADC_DIV4_PMU 260
+#define MCLK_LPSAI 261
+#define ACLK_GIC400 262
+#define PCLK_WDT_NS 263
+#define TCLK_WDT_NS 264
+#define PCLK_WDT_HPMCU 265
+#define HCLK_CACHE 266
+#define PCLK_HPMCU_MAILBOX 267
+#define PCLK_HPMCU_INTMUX 268
+#define CLK_HPMCU 269
+#define CLK_HPMCU_RTC 270
+#define PCLK_RKDMA 271
+#define ACLK_RKDMA 272
+#define PCLK_DCF 273
+#define ACLK_DCF 274
+#define HCLK_RGA 275
+#define ACLK_RGA 276
+#define CLK_CORE_RGA 277
+#define PCLK_TIMER 278
+#define CLK_TIMER0 279
+#define CLK_TIMER1 280
+#define CLK_TIMER2 281
+#define CLK_TIMER3 282
+#define CLK_TIMER4 283
+#define CLK_TIMER5 284
+#define PCLK_I2C0 285
+#define CLK_I2C0 286
+#define PCLK_I2C1 287
+#define CLK_I2C1 288
+#define PCLK_I2C3 289
+#define CLK_I2C3 290
+#define PCLK_I2C4 291
+#define CLK_I2C4 292
+#define PCLK_I2C5 293
+#define CLK_I2C5 294
+#define PCLK_SPI0 295
+#define PCLK_SPI1 296
+#define PCLK_PWM0 297
+#define CLK_OSC_PWM0 298
+#define CLK_RC_PWM0 299
+#define PCLK_PWM2 300
+#define CLK_OSC_PWM2 301
+#define CLK_RC_PWM2 302
+#define PCLK_PWM3 303
+#define CLK_OSC_PWM3 304
+#define CLK_RC_PWM3 305
+#define PCLK_UART1 306
+#define PCLK_UART2 307
+#define PCLK_UART3 308
+#define PCLK_UART4 309
+#define PCLK_UART5 310
+#define PCLK_UART6 311
+#define PCLK_UART7 312
+#define PCLK_TSADC 313
+#define CLK_TSADC 314
+#define HCLK_SAI0 315
+#define HCLK_SAI1 316
+#define HCLK_SAI2 317
+#define HCLK_RKDSM 318
+#define MCLK_RKDSM 319
+#define HCLK_PDM 320
+#define HCLK_ASRC0 321
+#define HCLK_ASRC1 322
+#define PCLK_AUDIO_ADC_BUS 323
+#define MCLK_AUDIO_ADC_BUS 324
+#define MCLK_AUDIO_ADC_DIV4_BUS 325
+#define PCLK_RKCE 326
+#define HCLK_NS_RKCE 327
+#define PCLK_OTPC_NS 328
+#define CLK_SBPI_OTPC_NS 329
+#define CLK_USER_OTPC_NS 330
+#define CLK_OTPC_ARB 331
+#define PCLK_OTP_MASK 332
+#define CLK_TSADC_PHYCTRL 333
+#define LRCK_SRC_ASRC0 334
+#define LRCK_DST_ASRC0 335
+#define LRCK_SRC_ASRC1 336
+#define LRCK_DST_ASRC1 337
+#define PCLK_KEY_READER 338
+#define ACLK_NSRKCE 339
+#define CLK_PKA_NSRKCE 340
+#define PCLK_RTC_ROOT 341
+#define PCLK_GPIO1 342
+#define DBCLK_GPIO1 343
+#define PCLK_IOC_VCCIO1 344
+#define ACLK_USB3OTG 345
+#define CLK_REF_USB3OTG 346
+#define CLK_SUSPEND_USB3OTG 347
+#define HCLK_USB2HOST 348
+#define HCLK_ARB_USB2HOST 349
+#define PCLK_RTC_TEST 350
+#define HCLK_EMMC 351
+#define HCLK_FSPI0 352
+#define HCLK_XIP_FSPI0 353
+#define PCLK_PIPEPHY 354
+#define PCLK_USB2PHY 355
+#define CLK_REF_PIPEPHY_CPLL_SRC 356
+#define CLK_REF_PIPEPHY 357
+#define HCLK_VPSL 358
+#define ACLK_VPSL 359
+#define CLK_CORE_VPSL 360
+#define CLK_MACPHY 361
+#define HCLK_RKRNG_NS 362
+#define HCLK_RKRNG_S_NS 362
+
+/* secure clks */
+#define CLK_USER_OTPC_S 400
+#define CLK_SBPI_OTPC_S 401
+#define PCLK_OTPC_S 402
+#define PCLK_KEY_READER_S 403
+#define HCLK_KL_RKCE_S 404
+#define HCLK_RKCE_S 405
+#define PCLK_WDT_S 406
+#define TCLK_WDT_S 407
+#define CLK_STIMER0 408
+#define CLK_STIMER1 409
+#define PLK_STIMER 410
+#define HCLK_RKRNG_S 411
+#define CLK_PKA_RKCE_S 412
+#define ACLK_RKCE_S 413
+
+#define CLK_NR_CLKS (ACLK_RKCE_S + 1)
+
+/* TOPCRU_SOFTRST_CON15(Offset:0xA3C) */
+#define SRST_PRESETN_CRU 0x000000F1
+#define SRST_PRESETN_CRU_BIU 0x000000F2
+
+/* BUSCRU_SOFTRST_CON00(Offset:0xA00) */
+#define SRST_ARESETN_TOP_BIU 0x00040000
+#define SRST_ARESETN_RKCE_BIU 0x00040001
+#define SRST_ARESETN_BUS_BIU 0x00040002
+#define SRST_HRESETN_BUS_BIU 0x00040003
+#define SRST_PRESETN_BUS_BIU 0x00040004
+#define SRST_PRESETN_CRU_BUS 0x00040005
+#define SRST_PRESETN_SYS_GRF 0x00040006
+#define SRST_HRESETN_BOOTROM 0x00040007
+#define SRST_ARESETN_GIC400 0x00040008
+#define SRST_ARESETN_SPINLOCK 0x00040009
+#define SRST_PRESETN_WDT_NS 0x0004000A
+#define SRST_TRESETN_WDT_NS 0x0004000B
+
+/* BUSCRU_SOFTRST_CON01(Offset:0xA04) */
+#define SRST_PRESETN_WDT_HPMCU 0x00040010
+#define SRST_TRESETN_WDT_HPMCU 0x00040011
+#define SRST_HRESETN_CACHE 0x00040012
+#define SRST_PRESETN_HPMCU_MAILBOX 0x00040013
+#define SRST_PRESETN_HPMCU_INTMUX 0x00040014
+#define SRST_RESETN_HPMCU_FULL_CLUSTER 0x00040015
+#define SRST_RESETN_HPMCU_PWUP 0x00040016
+#define SRST_RESETN_HPMCU_ONLY_CORE 0x00040017
+#define SRST_TRESETN_HPMCU_JTAG 0x00040018
+#define SRST_PRESETN_RKDMA 0x0004001B
+#define SRST_ARESETN_RKDMA 0x0004001C
+
+/* BUSCRU_SOFTRST_CON02(Offset:0xA08) */
+#define SRST_PRESETN_DCF 0x00040020
+#define SRST_ARESETN_DCF 0x00040021
+#define SRST_HRESETN_RGA 0x00040022
+#define SRST_ARESETN_RGA 0x00040023
+#define SRST_RESETN_CORE_RGA 0x00040024
+#define SRST_PRESETN_TIMER 0x00040025
+#define SRST_RESETN_TIMER0 0x00040026
+#define SRST_RESETN_TIMER1 0x00040027
+#define SRST_RESETN_TIMER2 0x00040028
+#define SRST_RESETN_TIMER3 0x00040029
+#define SRST_RESETN_TIMER4 0x0004002A
+#define SRST_RESETN_TIMER5 0x0004002B
+#define SRST_ARESETN_RKCE 0x0004002C
+#define SRST_RESETN_PKA_RKCE 0x0004002D
+#define SRST_HRESETN_RKRNG_S 0x0004002E
+#define SRST_HRESETN_RKRNG_NS 0x0004002F
+
+/* BUSCRU_SOFTRST_CON03(Offset:0xA0C) */
+#define SRST_PRESETN_I2C0 0x00040030
+#define SRST_RESETN_I2C0 0x00040031
+#define SRST_PRESETN_I2C1 0x00040032
+#define SRST_RESETN_I2C1 0x00040033
+#define SRST_PRESETN_I2C3 0x00040034
+#define SRST_RESETN_I2C3 0x00040035
+#define SRST_PRESETN_I2C4 0x00040036
+#define SRST_RESETN_I2C4 0x00040037
+#define SRST_PRESETN_I2C5 0x00040038
+#define SRST_RESETN_I2C5 0x00040039
+#define SRST_PRESETN_SPI0 0x0004003A
+#define SRST_RESETN_SPI0 0x0004003B
+#define SRST_PRESETN_SPI1 0x0004003C
+#define SRST_RESETN_SPI1 0x0004003D
+
+/* BUSCRU_SOFTRST_CON04(Offset:0xA10) */
+#define SRST_PRESETN_PWM0 0x00040040
+#define SRST_RESETN_PWM0 0x00040041
+#define SRST_PRESETN_PWM2 0x00040044
+#define SRST_RESETN_PWM2 0x00040045
+#define SRST_PRESETN_PWM3 0x00040048
+#define SRST_RESETN_PWM3 0x00040049
+
+/* BUSCRU_SOFTRST_CON05(Offset:0xA14) */
+#define SRST_PRESETN_UART1 0x00040050
+#define SRST_SRESETN_UART1 0x00040051
+#define SRST_PRESETN_UART2 0x00040052
+#define SRST_SRESETN_UART2 0x00040053
+#define SRST_PRESETN_UART3 0x00040054
+#define SRST_SRESETN_UART3 0x00040055
+#define SRST_PRESETN_UART4 0x00040056
+#define SRST_SRESETN_UART4 0x00040057
+#define SRST_PRESETN_UART5 0x00040058
+#define SRST_SRESETN_UART5 0x00040059
+#define SRST_PRESETN_UART6 0x0004005A
+#define SRST_SRESETN_UART6 0x0004005B
+#define SRST_PRESETN_UART7 0x0004005C
+#define SRST_SRESETN_UART7 0x0004005D
+
+/* BUSCRU_SOFTRST_CON06(Offset:0xA18) */
+#define SRST_PRESETN_TSADC 0x00040060
+#define SRST_RESETN_TSADC 0x00040061
+#define SRST_HRESETN_SAI0 0x00040062
+#define SRST_MRESETN_SAI0 0x00040063
+#define SRST_HRESETN_SAI1 0x00040064
+#define SRST_MRESETN_SAI1 0x00040065
+#define SRST_HRESETN_SAI2 0x00040066
+#define SRST_MRESETN_SAI2 0x00040067
+#define SRST_HRESETN_RKDSM 0x00040068
+#define SRST_MRESETN_RKDSM 0x00040069
+#define SRST_HRESETN_PDM 0x0004006A
+#define SRST_MRESETN_PDM 0x0004006B
+#define SRST_RESETN_PDM 0x0004006C
+
+/* BUSCRU_SOFTRST_CON07(Offset:0xA1C) */
+#define SRST_HRESETN_ASRC0 0x00040070
+#define SRST_RESETN_ASRC0 0x00040071
+#define SRST_HRESETN_ASRC1 0x00040072
+#define SRST_RESETN_ASRC1 0x00040073
+#define SRST_PRESETN_AUDIO_ADC_BUS 0x00040074
+#define SRST_MRESETN_AUDIO_ADC_BUS 0x00040075
+#define SRST_PRESETN_RKCE 0x00040076
+#define SRST_HRESETN_NS_RKCE 0x00040077
+#define SRST_PRESETN_OTPC_NS 0x00040078
+#define SRST_RESETN_SBPI_OTPC_NS 0x00040079
+#define SRST_RESETN_USER_OTPC_NS 0x0004007A
+#define SRST_RESETN_OTPC_ARB 0x0004007B
+#define SRST_PRESETN_OTP_MASK 0x0004007C
+#define SRST_RESETN_TSADC_PHYCTRL 0x0004007E
+
+/* PERICRU_SOFTRST_CON00(Offset:0xA00) */
+#define SRST_ARESETN_PERI_BIU 0x00080000
+#define SRST_PRESETN_PERI_BIU 0x00080001
+#define SRST_PRESETN_RTC_BIU 0x00080002
+#define SRST_PRESETN_CRU_PERI 0x00080003
+#define SRST_PRESETN_PERI_GRF 0x00080004
+#define SRST_PRESETN_GPIO1 0x00080005
+#define SRST_DBRESETN_GPIO1 0x00080006
+#define SRST_PRESETN_IOC_VCCIO1 0x00080007
+#define SRST_ARESETN_USB3OTG 0x00080008
+#define SRST_HRESETN_USB2HOST 0x0008000B
+#define SRST_HRESETN_ARB_USB2HOST 0x0008000C
+#define SRST_PRESETN_RTC_TEST 0x0008000D
+
+/* PERICRU_SOFTRST_CON01(Offset:0xA04) */
+#define SRST_HRESETN_EMMC 0x00080010
+#define SRST_HRESETN_FSPI0 0x00080011
+#define SRST_HRESETN_XIP_FSPI0 0x00080012
+#define SRST_SRESETN_2X_FSPI0 0x00080013
+#define SRST_RESETN_UTMI_USB2HOST 0x00080015
+#define SRST_RESETN_REF_PIPEPHY 0x00080017
+#define SRST_PRESETN_PIPEPHY 0x00080018
+#define SRST_PRESETN_PIPEPHY_GRF 0x00080019
+#define SRST_PRESETN_USB2PHY 0x0008001A
+#define SRST_RESETN_POR_USB2PHY 0x0008001B
+#define SRST_RESETN_OTG_USB2PHY 0x0008001C
+#define SRST_RESETN_HOST_USB2PHY 0x0008001D
+
+/* CORECRU_SOFTRST_CON00(Offset:0xA00) */
+#define SRST_RESETN_REF_PVTPLL_CORE 0x000C0000
+#define SRST_NCOREPORESET0 0x000C0001
+#define SRST_NCORESET0 0x000C0002
+#define SRST_NCOREPORESET1 0x000C0003
+#define SRST_NCORESET1 0x000C0004
+#define SRST_NCOREPORESET2 0x000c0005
+#define SRST_NCORESET2 0x000C0006
+#define SRST_NCOREPORESET3 0x000C0007
+#define SRST_NCORESET3 0x000C0008
+#define SRST_NDBGRESET 0x000C0009
+#define SRST_NL2RESET 0x000C000A
+
+/* CORECRU_SOFTRST_CON01(Offset:0xA04) */
+#define SRST_ARESETN_CORE_BIU 0x000C0010
+#define SRST_PRESETN_CORE_BIU 0x000C0011
+#define SRST_HRESETN_CORE_BIU 0x000C0012
+#define SRST_PRESETN_DBG 0x000C0013
+#define SRST_POTRESETN_DBG 0x000C0014
+#define SRST_NTRESETN_DBG 0x000C0015
+#define SRST_PRESETN_CORE_PVTPLL 0x000C0016
+#define SRST_PRESETN_CRU_CORE 0x000C0017
+#define SRST_PRESETN_CORE_GRF 0x000C0018
+#define SRST_PRESETN_DFT2APB 0x000C001A
+
+/* PMUCRU_SOFTRST_CON00(Offset:0xA00) */
+#define SRST_HRESETN_PMU_BIU 0x00100000
+#define SRST_PRESETN_PMU_GPIO0 0x00100007
+#define SRST_DBRESETN_PMU_GPIO0 0x00100008
+#define SRST_PRESETN_PMU_HP_TIMER 0x0010000A
+#define SRST_RESETN_PMU_HP_TIMER 0x0010000B
+#define SRST_RESETN_PMU_32K_HP_TIMER 0x0010000C
+
+/* PMUCRU_SOFTRST_CON01(Offset:0xA04) */
+#define SRST_PRESETN_PWM1 0x00100010
+#define SRST_RESETN_PWM1 0x00100011
+#define SRST_PRESETN_I2C2 0x00100012
+#define SRST_RESETN_I2C2 0x00100013
+#define SRST_PRESETN_UART0 0x00100014
+#define SRST_SRESETN_UART0 0x00100015
+
+/* PMUCRU_SOFTRST_CON02(Offset:0xA08) */
+#define SRST_PRESETN_RCOSC_CTRL 0x00100020
+#define SRST_RESETN_REF_RCOSC_CTRL 0x00100022
+#define SRST_PRESETN_IOC_PMUIO0 0x00100023
+#define SRST_PRESETN_CRU_PMU 0x00100024
+#define SRST_PRESETN_PMU_GRF 0x00100025
+#define SRST_RESETN_PREROLL 0x00100027
+#define SRST_RESETN_PREROLL_32K 0x00100028
+#define SRST_HRESETN_PMU_SRAM 0x00100029
+
+/* PMUCRU_SOFTRST_CON03(Offset:0xA0C) */
+#define SRST_PRESETN_WDT_LPMCU 0x00100030
+#define SRST_TRESETN_WDT_LPMCU 0x00100031
+#define SRST_RESETN_LPMCU_FULL_CLUSTER 0x00100032
+#define SRST_RESETN_LPMCU_PWUP 0x00100033
+#define SRST_RESETN_LPMCU_ONLY_CORE 0x00100034
+#define SRST_TRESETN_LPMCU_JTAG 0x00100035
+#define SRST_PRESETN_LPMCU_MAILBOX 0x00100036
+
+/* PMU1CRU_SOFTRST_CON00(Offset:0xA00) */
+#define SRST_PRESETN_SPI2AHB 0x00140000
+#define SRST_HRESETN_SPI2AHB 0x00140001
+#define SRST_HRESETN_FSPI1 0x00140002
+#define SRST_HRESETN_XIP_FSPI1 0x00140003
+#define SRST_SRESETN_1X_FSPI1 0x00140004
+#define SRST_PRESETN_IOC_PMUIO1 0x00140005
+#define SRST_PRESETN_CRU_PMU1 0x00140006
+#define SRST_PRESETN_AUDIO_ADC_PMU 0x00140007
+#define SRST_MRESETN_AUDIO_ADC_PMU 0x00140008
+#define SRST_HRESETN_PMU1_BIU 0x00140009
+
+/* PMU1CRU_SOFTRST_CON01(Offset:0xA04) */
+#define SRST_PRESETN_LPDMA 0x00140010
+#define SRST_ARESETN_LPDMA 0x00140011
+#define SRST_HRESETN_LPSAI 0x00140012
+#define SRST_MRESETN_LPSAI 0x00140013
+#define SRST_PRESETN_AOA_TDD 0x00140014
+#define SRST_PRESETN_AOA_FE 0x00140015
+#define SRST_PRESETN_AOA_AAD 0x00140016
+#define SRST_PRESETN_AOA_APB 0x00140017
+#define SRST_PRESETN_AOA_SRAM 0x00140018
+
+/* DDRCRU_SOFTRST_CON00(Offset:0xA00) */
+#define SRST_PRESETN_DDR_BIU 0x00180001
+#define SRST_PRESETN_DDRC 0x00180002
+#define SRST_PRESETN_DDRMON 0x00180003
+#define SRST_RESETN_TIMER_DDRMON 0x00180004
+#define SRST_PRESETN_DFICTRL 0x00180005
+#define SRST_PRESETN_DDR_GRF 0x00180006
+#define SRST_PRESETN_CRU_DDR 0x00180007
+#define SRST_PRESETN_DDRPHY 0x00180008
+#define SRST_PRESETN_DMA2DDR 0x00180009
+
+/* SUBDDRCRU_SOFTRST_CON00(Offset:0xA00) */
+#define SRST_ARESETN_SYSMEM_BIU 0x001A0000
+#define SRST_ARESETN_SYSMEM 0x001A0001
+#define SRST_ARESETN_DDR_BIU 0x001A0002
+#define SRST_ARESETN_DDRSCH0_CPU 0x001A0003
+#define SRST_ARESETN_DDRSCH1_NPU 0x001A0004
+#define SRST_ARESETN_DDRSCH2_POE 0x001A0005
+#define SRST_ARESETN_DDRSCH3_VI 0x001A0006
+#define SRST_RESETN_CORE_DDRC 0x001A0007
+#define SRST_RESETN_DDRMON 0x001A0008
+#define SRST_RESETN_DFICTRL 0x001A0009
+#define SRST_RESETN_RS 0x001A000B
+#define SRST_ARESETN_DMA2DDR 0x001A000C
+#define SRST_RESETN_DDRPHY 0x001A000D
+
+/* VICRU_SOFTRST_CON00(Offset:0xA00) */
+#define SRST_RESETN_REF_PVTPLL_ISP 0x001C0000
+#define SRST_ARESETN_GMAC_BIU 0x001C0001
+#define SRST_ARESETN_VI_BIU 0x001C0002
+#define SRST_HRESETN_VI_BIU 0x001C0003
+#define SRST_PRESETN_VI_BIU 0x001C0004
+#define SRST_PRESETN_CRU_VI 0x001C0005
+#define SRST_PRESETN_VI_GRF 0x001C0006
+#define SRST_PRESETN_VI_PVTPLL 0x001C0007
+#define SRST_PRESETN_DSMC 0x001C0008
+#define SRST_ARESETN_DSMC 0x001C0009
+#define SRST_HRESETN_CAN0 0x001C000A
+#define SRST_RESETN_CAN0 0x001C000B
+#define SRST_HRESETN_CAN1 0x001C000C
+#define SRST_RESETN_CAN1 0x001C000D
+
+/* VICRU_SOFTRST_CON01(Offset:0xA04) */
+#define SRST_PRESETN_GPIO2 0x001C0010
+#define SRST_DBRESETN_GPIO2 0x001C0011
+#define SRST_PRESETN_GPIO4 0x001C0012
+#define SRST_DBRESETN_GPIO4 0x001C0013
+#define SRST_PRESETN_GPIO5 0x001C0014
+#define SRST_DBRESETN_GPIO5 0x001C0015
+#define SRST_PRESETN_GPIO6 0x001C0016
+#define SRST_DBRESETN_GPIO6 0x001C0017
+#define SRST_PRESETN_GPIO7 0x001C0018
+#define SRST_DBRESETN_GPIO7 0x001C0019
+#define SRST_PRESETN_IOC_VCCIO2 0x001C001A
+#define SRST_PRESETN_IOC_VCCIO4 0x001C001B
+#define SRST_PRESETN_IOC_VCCIO5 0x001C001C
+#define SRST_PRESETN_IOC_VCCIO6 0x001C001D
+#define SRST_PRESETN_IOC_VCCIO7 0x001C001E
+
+/* VICRU_SOFTRST_CON02(Offset:0xA08) */
+#define SRST_RESETN_CORE_ISP 0x001C0020
+#define SRST_HRESETN_VICAP 0x001C0021
+#define SRST_ARESETN_VICAP 0x001C0022
+#define SRST_DRESETN_VICAP 0x001C0023
+#define SRST_ISP0RESETN_VICAP 0x001C0024
+#define SRST_RESETN_CORE_VPSS 0x001C0025
+#define SRST_RESETN_CORE_VPSL 0x001C0026
+#define SRST_PRESETN_CSI2HOST0 0x001C0027
+#define SRST_PRESETN_CSI2HOST1 0x001C0028
+#define SRST_PRESETN_CSI2HOST2 0x001C0029
+#define SRST_PRESETN_CSI2HOST3 0x001C002A
+#define SRST_HRESETN_SDMMC0 0x001C002B
+#define SRST_ARESETN_GMAC 0x001C002C
+#define SRST_PRESETN_CSIPHY0 0x001C002D
+#define SRST_PRESETN_CSIPHY1 0x001C002E
+
+/* VICRU_SOFTRST_CON03(Offset:0xA0C) */
+#define SRST_PRESETN_MACPHY 0x001C0030
+#define SRST_RESETN_MACPHY 0x001C0031
+#define SRST_PRESETN_SARADC1 0x001C0032
+#define SRST_RESETN_SARADC1 0x001C0033
+#define SRST_RESETN_SARADC1_PHY 0x001C0034
+#define SRST_PRESETN_SARADC2 0x001C0035
+#define SRST_RESETN_SARADC2 0x001C0036
+#define SRST_RESETN_SARADC2_PHY 0x001C0037
+
+/* VEPUCRU_SOFTRST_CON00(Offset:0xA00) */
+#define SRST_RESETN_REF_PVTPLL_VEPU 0x00200000
+#define SRST_ARESETN_VEPU_BIU 0x00200001
+#define SRST_HRESETN_VEPU_BIU 0x00200002
+#define SRST_PRESETN_VEPU_BIU 0x00200003
+#define SRST_PRESETN_CRU_VEPU 0x00200004
+#define SRST_PRESETN_VEPU_GRF 0x00200005
+#define SRST_PRESETN_GPIO3 0x00200007
+#define SRST_DBRESETN_GPIO3 0x00200008
+#define SRST_PRESETN_IOC_VCCIO3 0x00200009
+#define SRST_PRESETN_SARADC0 0x0020000A
+#define SRST_RESETN_SARADC0 0x0020000B
+#define SRST_RESETN_SARADC0_PHY 0x0020000C
+#define SRST_HRESETN_SDMMC1 0x0020000D
+
+/* VEPUCRU_SOFTRST_CON01(Offset:0xA04) */
+#define SRST_PRESETN_VEPU_PVTPLL 0x00200010
+#define SRST_HRESETN_VEPU 0x00200011
+#define SRST_ARESETN_VEPU 0x00200012
+#define SRST_RESETN_CORE_VEPU 0x00200013
+
+/* NPUCRU_SOFTRST_CON00(Offset:0xA00) */
+#define SRST_RESETN_REF_PVTPLL_NPU 0x00240000
+#define SRST_ARESETN_NPU_BIU 0x00240002
+#define SRST_HRESETN_NPU_BIU 0x00240003
+#define SRST_PRESETN_NPU_BIU 0x00240004
+#define SRST_PRESETN_CRU_NPU 0x00240005
+#define SRST_PRESETN_NPU_GRF 0x00240006
+#define SRST_PRESETN_NPU_PVTPLL 0x00240008
+#define SRST_HRESETN_RKNN 0x00240009
+#define SRST_ARESETN_RKNN 0x0024000A
+
+/* VDOCRU_SOFTRST_CON00(Offset:0xA00) */
+#define SRST_ARESETN_RKVDEC_BIU 0x00280000
+#define SRST_ARESETN_VDO_BIU 0x00280001
+#define SRST_HRESETN_VDO_BIU 0x00280003
+#define SRST_PRESETN_VDO_BIU 0x00280004
+#define SRST_PRESETN_CRU_VDO 0x00280005
+#define SRST_PRESETN_VDO_GRF 0x00280006
+#define SRST_ARESETN_RKVDEC 0x00280007
+#define SRST_HRESETN_RKVDEC 0x00280008
+#define SRST_RESETN_HEVC_CA_RKVDEC 0x00280009
+#define SRST_ARESETN_VOP 0x0028000A
+#define SRST_HRESETN_VOP 0x0028000B
+#define SRST_DRESETN_VOP 0x0028000C
+#define SRST_ARESETN_OOC 0x0028000D
+#define SRST_HRESETN_OOC 0x0028000E
+#define SRST_DRESETN_OOC 0x0028000F
+
+/* VDOCRU_SOFTRST_CON01(Offset:0xA04) */
+#define SRST_HRESETN_RKJPEG 0x00280013
+#define SRST_ARESETN_RKJPEG 0x00280014
+#define SRST_ARESETN_RKMMU_DECOM 0x00280015
+#define SRST_HRESETN_RKMMU_DECOM 0x00280016
+#define SRST_DRESETN_DECOM 0x00280018
+#define SRST_ARESETN_DECOM 0x00280019
+#define SRST_PRESETN_DECOM 0x0028001A
+#define SRST_PRESETN_MIPI_DSI 0x0028001C
+#define SRST_PRESETN_DSIPHY 0x0028001D
+
+/* VCPCRU_SOFTRST_CON00(Offset:0xA00) */
+#define SRST_RESETN_REF_PVTPLL_VCP 0x002C0000
+#define SRST_ARESETN_VCP_BIU 0x002C0001
+#define SRST_HRESETN_VCP_BIU 0x002C0002
+#define SRST_PRESETN_VCP_BIU 0x002C0003
+#define SRST_PRESETN_CRU_VCP 0x002C0004
+#define SRST_PRESETN_VCP_GRF 0x002C0005
+#define SRST_PRESETN_VCP_PVTPLL 0x002C0007
+#define SRST_ARESETN_AISP_BIU 0x002C0008
+#define SRST_HRESETN_AISP_BIU 0x002C0009
+#define SRST_ARESETN_AISPMEM_BIU 0x002C000A
+#define SRST_RESETN_CORE_AISP 0x002C000D
+#define SRST_ARESETN_AISPMEM 0x002C000E
+
+/* VCPCRU_SOFTRST_CON01(Offset:0xA04) */
+#define SRST_HRESETN_FEC 0x002C0010
+#define SRST_ARESETN_FEC 0x002C0011
+#define SRST_RESETN_CORE_FEC 0x002C0012
+#define SRST_HRESETN_AVSP 0x002C0013
+#define SRST_ARESETN_AVSP 0x002C0014
+
+#define CLK_NR_SRST (SRST_ARESETN_AVSP + 1)
+
+void rockchip_clock_init(void);
+
+#endif
diff --git a/plat/rpi/rpi4/platform.mk b/plat/rpi/rpi4/platform.mk
index 9519087b9..3f0775c65 100644
--- a/plat/rpi/rpi4/platform.mk
+++ b/plat/rpi/rpi4/platform.mk
@@ -102,7 +102,6 @@ $(eval $(call add_define,RPI3_PRELOADED_DTB_BASE))
endif
$(eval $(call add_define,RPI3_RUNTIME_UART))
$(eval $(call add_define,RPI3_USE_UEFI_MAP))
-$(eval $(call add_define,SMC_PCI_SUPPORT))
ifeq (${ARCH},aarch32)
$(error Error: AArch32 not supported on rpi4)
diff --git a/plat/rpi/rpi5/platform.mk b/plat/rpi/rpi5/platform.mk
index 7346c9a44..2f6d386a0 100644
--- a/plat/rpi/rpi5/platform.mk
+++ b/plat/rpi/rpi5/platform.mk
@@ -101,7 +101,6 @@ $(eval $(call add_define,RPI3_PRELOADED_DTB_BASE))
endif
$(eval $(call add_define,RPI3_RUNTIME_UART))
$(eval $(call add_define,RPI3_USE_UEFI_MAP))
-$(eval $(call add_define,SMC_PCI_SUPPORT))
ifeq (${ARCH},aarch32)
$(error Error: AArch32 not supported on rpi5)
diff --git a/plat/st/common/stm32mp_common.c b/plat/st/common/stm32mp_common.c
index 3c7129b70..b6f076cb3 100644
--- a/plat/st/common/stm32mp_common.c
+++ b/plat/st/common/stm32mp_common.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015-2025, Arm Limited and Contributors. All rights reserved.
+ * Copyright (c) 2015-2026, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -70,7 +70,14 @@ uintptr_t plat_get_ns_image_entrypoint(void)
unsigned int plat_get_syscnt_freq2(void)
{
- return read_cntfrq_el0();
+ /*
+ * The system counter clock will never be above 4GHz, it is usually set
+ * at 64MHz (HSI) at startup, and then moved to another clock with a
+ * lower frequency and more stable.
+ * It is then safe to cast the return of read_cntfrq_el0 to a 32 bit
+ * value to match the plat_get_syscnt_freq2 function prototype.
+ */
+ return (unsigned int)read_cntfrq_el0();
}
static uintptr_t boot_ctx_address;
@@ -293,7 +300,7 @@ int stm32mp_uart_console_setup(void)
reset_uart((uint32_t)dt_uart_info.reset);
- clk_rate = clk_get_rate((unsigned long)dt_uart_info.clock);
+ clk_rate = (uint32_t)clk_get_rate((unsigned long)dt_uart_info.clock);
#endif
set_console(dt_uart_info.base, clk_rate);
diff --git a/plat/st/stm32mp1/platform.mk b/plat/st/stm32mp1/platform.mk
index 566f48189..d20f71499 100644
--- a/plat/st/stm32mp1/platform.mk
+++ b/plat/st/stm32mp1/platform.mk
@@ -22,11 +22,18 @@ USE_COHERENT_MEM := 0
# Default Device tree
DTB_FILE_NAME ?= stm32mp157c-ev1.dtb
-TF_CFLAGS += -DSTM32MP1X
-
STM32MP13 ?= 0
STM32MP15 ?= 0
+STM32MP1X := 1
+
+# Disable STM32MP2 flags
+STM32MP21 := 0
+STM32MP23 := 0
+STM32MP25 := 0
+STM32MP2X := 0
+STM32MP_DDR_FIP_IO_STORAGE := 0
+
ifeq ($(STM32MP13),1)
ifeq ($(STM32MP15),1)
$(error Cannot enable both flags STM32MP13 and STM32MP15)
@@ -160,10 +167,16 @@ $(eval $(call assert_booleans,\
STM32MP_CRYPTO_ROM_LIB \
STM32MP_DDR_32BIT_INTERFACE \
STM32MP_DDR_DUAL_AXI_PORT \
+ STM32MP_DDR_FIP_IO_STORAGE \
STM32MP_STPMIC1L \
STM32MP_USE_EXTERNAL_HEAP \
STM32MP13 \
STM32MP15 \
+ STM32MP1X \
+ STM32MP21 \
+ STM32MP23 \
+ STM32MP25 \
+ STM32MP2X \
)))
$(eval $(call assert_numerics,\
@@ -191,10 +204,16 @@ $(eval $(call add_defines,\
STM32MP_CRYPTO_ROM_LIB \
STM32MP_DDR_32BIT_INTERFACE \
STM32MP_DDR_DUAL_AXI_PORT \
+ STM32MP_DDR_FIP_IO_STORAGE \
STM32MP_STPMIC1L \
STM32MP_USE_EXTERNAL_HEAP \
STM32MP13 \
STM32MP15 \
+ STM32MP1X \
+ STM32MP21 \
+ STM32MP23 \
+ STM32MP25 \
+ STM32MP2X \
)))
# Include paths and source files
diff --git a/plat/st/stm32mp2/platform.mk b/plat/st/stm32mp2/platform.mk
index adcacb765..50e425f0e 100644
--- a/plat/st/stm32mp2/platform.mk
+++ b/plat/st/stm32mp2/platform.mk
@@ -35,12 +35,18 @@ ENABLE_SVE_FOR_NS := 0
# Default Device tree
DTB_FILE_NAME ?= stm32mp257f-ev1.dtb
-TF_CFLAGS += -DSTM32MP2X
-
STM32MP21 ?= 0
STM32MP23 ?= 0
STM32MP25 ?= 0
+STM32MP2X := 1
+
+# Disable STM32MP1 flags
+STM32MP13 := 0
+STM32MP15 := 0
+STM32MP1X := 0
+STM32MP_STPMIC1L := 0
+
ifneq ($(findstring stm32mp21,$(DTB_FILE_NAME)),)
STM32MP21 := 1
endif
@@ -156,9 +162,14 @@ $(eval $(call assert_booleans,\
STM32MP_DDR3_TYPE \
STM32MP_DDR4_TYPE \
STM32MP_LPDDR4_TYPE \
+ STM32MP_STPMIC1L \
+ STM32MP13 \
+ STM32MP15 \
+ STM32MP1X \
STM32MP21 \
STM32MP23 \
STM32MP25 \
+ STM32MP2X \
STM32MP_BL33_EL1 \
)))
@@ -187,9 +198,14 @@ $(eval $(call add_defines,\
STM32MP_DDR3_TYPE \
STM32MP_DDR4_TYPE \
STM32MP_LPDDR4_TYPE \
+ STM32MP_STPMIC1L \
+ STM32MP13 \
+ STM32MP15 \
+ STM32MP1X \
STM32MP21 \
STM32MP23 \
STM32MP25 \
+ STM32MP2X \
STM32MP_BL33_EL1 \
)))
diff --git a/plat/ti/common/include/ti_platform_defs.h b/plat/ti/common/include/ti_platform_defs.h
index c61fccc30..f0626a10c 100644
--- a/plat/ti/common/include/ti_platform_defs.h
+++ b/plat/ti/common/include/ti_platform_defs.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2026, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2017-2026, Arm Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -17,7 +17,7 @@
******************************************************************************/
/* Size of cacheable stack */
-#if IMAGE_BL31 || IMAGE_BL1
+#if defined(IMAGE_BL31) || defined(IMAGE_BL1)
#define PLATFORM_STACK_SIZE 0x800
#else
#define PLATFORM_STACK_SIZE 0x1000
@@ -70,7 +70,7 @@
* used, choose the smallest value needed to map the required virtual addresses
* for each BL stage.
*/
-#if IMAGE_BL1
+#ifdef IMAGE_BL1
#define MAX_XLAT_TABLES 2
#else
#define MAX_XLAT_TABLES 4
diff --git a/plat/xilinx/zynqmp/pm_service/zynqmp_pm_api_sys.c b/plat/xilinx/zynqmp/pm_service/zynqmp_pm_api_sys.c
index 0f7d3756e..7c88eb2fc 100644
--- a/plat/xilinx/zynqmp/pm_service/zynqmp_pm_api_sys.c
+++ b/plat/xilinx/zynqmp/pm_service/zynqmp_pm_api_sys.c
@@ -1922,6 +1922,7 @@ enum pm_ret_status pm_pll_get_mode(enum pm_node_id nid, enum pm_pll_mode *mode,
uint32_t flag)
{
uint32_t payload[PAYLOAD_ARG_CNT];
+ uint32_t mode_val = 0U;
enum pm_ret_status ret = PM_RET_SUCCESS;
/* Check if given node ID is a PLL node */
@@ -1930,7 +1931,10 @@ enum pm_ret_status pm_pll_get_mode(enum pm_node_id nid, enum pm_pll_mode *mode,
} else {
/* Send request to the PMU */
PM_PACK_PAYLOAD2(payload, flag, PM_PLL_GET_MODE, nid);
- ret = pm_ipi_send_sync(primary_proc, payload, mode, 1);
+ ret = pm_ipi_send_sync(primary_proc, payload, &mode_val, 1);
+ if (ret == PM_RET_SUCCESS) {
+ *mode = (enum pm_pll_mode)mode_val;
+ }
}
return ret;
diff --git a/services/std_svc/firme/firme_base_service.c b/services/std_svc/firme/firme_base_service.c
index 27c414a00..347f8f980 100644
--- a/services/std_svc/firme/firme_base_service.c
+++ b/services/std_svc/firme/firme_base_service.c
@@ -45,6 +45,12 @@ static uint64_t firme_base_get_feat_reg_1(firme_instance_e instance)
reg |= FIRME_BASE_SERVICE_GRANULE_MGMT_BIT;
}
+ info = firme_mecid_service_get_info();
+ if ((info != NULL) &&
+ ((info->instance_support & BIT(instance)) != 0U)) {
+ reg |= FIRME_BASE_SERVICE_MECID_BIT;
+ }
+
return reg;
}
@@ -64,6 +70,9 @@ static int32_t get_firme_service_version(firme_instance_e instance,
case FIRME_GRANULE_MGMT_ID:
info = firme_granule_mgmt_service_get_info();
break;
+ case FIRME_MECID_MGMT_ID:
+ info = firme_mecid_service_get_info();
+ break;
default:
return FIRME_NOT_SUPPORTED;
}
@@ -99,6 +108,9 @@ static int32_t get_firme_feature_reg(uint64_t *reg, firme_instance_e instance,
case FIRME_GRANULE_MGMT_ID:
info = firme_granule_mgmt_service_get_info();
break;
+ case FIRME_MECID_MGMT_ID:
+ info = firme_mecid_service_get_info();
+ break;
}
if ((info != NULL) && (reg_index < info->num_feature_regs) &&
diff --git a/services/std_svc/firme/firme_main.c b/services/std_svc/firme/firme_main.c
index c2bf33d4b..96cde89fc 100644
--- a/services/std_svc/firme/firme_main.c
+++ b/services/std_svc/firme/firme_main.c
@@ -29,9 +29,9 @@ static inline bool is_granule_mgmt_service_fid(uint32_t fid)
{
switch (fid) {
case FIRME_GM_GPI_SET_FID:
- case FIRME_GM_GPI_OP_CONTINUE:
- case FIRME_GM_L1_GPT_CREATE:
- case FIRME_GM_L1_GPT_DESTROY:
+ case FIRME_GM_GPI_OP_CONTINUE_FID:
+ case FIRME_GM_L1_GPT_CREATE_FID:
+ case FIRME_GM_L1_GPT_DESTROY_FID:
return true;
default:
return false;
@@ -41,10 +41,10 @@ static inline bool is_granule_mgmt_service_fid(uint32_t fid)
static inline bool is_ide_key_mgmt_service_fid(uint32_t fid)
{
switch (fid) {
- case FIRME_IDE_KEYSET_PROG:
- case FIRME_IDE_KEYSET_GO:
- case FIRME_IDE_KEYSET_STOP:
- case FIRME_IDE_KEYSET_POLL:
+ case FIRME_IDE_KEYSET_PROG_FID:
+ case FIRME_IDE_KEYSET_GO_FID:
+ case FIRME_IDE_KEYSET_STOP_FID:
+ case FIRME_IDE_KEYSET_POLL_FID:
return true;
default:
return false;
@@ -53,7 +53,7 @@ static inline bool is_ide_key_mgmt_service_fid(uint32_t fid)
static inline bool is_mecid_service_fid(uint32_t fid)
{
- if (fid == FIRME_MEC_REFRESH) {
+ if (fid == FIRME_MEC_REFRESH_FID) {
return true;
} else {
return false;
@@ -63,12 +63,12 @@ static inline bool is_mecid_service_fid(uint32_t fid)
static inline bool is_attestation_service_fid(uint32_t fid)
{
switch (fid) {
- case FIRME_ATTEST_PAT_GET:
- case FIRME_ATTEST_RAK_GET:
- case FIRME_ATTEST_RAT_SIGN:
- case FIRME_ATTEST_PAT_EXT_CLAIMS_STAGE:
- case FIRME_ATTEST_PAT_EXT_CLAIMS_CLEAR:
- case FIRME_ATTEST_PAT_EXT_CLAIMS_FINALISE:
+ case FIRME_ATTEST_PAT_GET_FID:
+ case FIRME_ATTEST_RAK_GET_FID:
+ case FIRME_ATTEST_RAT_SIGN_FID:
+ case FIRME_ATTEST_PAT_EXT_CLAIMS_STAGE_FID:
+ case FIRME_ATTEST_PAT_EXT_CLAIMS_CLEAR_FID:
+ case FIRME_ATTEST_PAT_EXT_CLAIMS_FINALISE_FID:
return true;
default:
return false;
@@ -78,8 +78,8 @@ static inline bool is_attestation_service_fid(uint32_t fid)
static inline bool is_integrated_device_mgmt_service_fid(uint32_t fid)
{
switch (fid) {
- case FIRME_IDEV_OP_START:
- case FIRME_IDEV_OP_CONTINUE:
+ case FIRME_IDEV_OP_START_FID:
+ case FIRME_IDEV_OP_CONTINUE_FID:
return true;
default:
return false;
@@ -99,6 +99,11 @@ static inline firme_instance_e get_instance_from_flags(uint64_t flags)
panic();
}
+int32_t firme_init(void)
+{
+ return firme_mecid_service_init();
+}
+
uint64_t firme_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3,
uint64_t x4, void *cookie, void *handle, uint64_t flags)
{
@@ -120,6 +125,9 @@ uint64_t firme_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2, uint64_t x3,
}
else if (is_mecid_service_fid(smc_fid)) {
+ return firme_mecid_service_handler(instance, smc_fid, x1, x2,
+ x3, x4, cookie, handle,
+ flags);
}
else if (is_attestation_service_fid(smc_fid)) {
diff --git a/services/std_svc/firme/firme_mecid.c b/services/std_svc/firme/firme_mecid.c
new file mode 100644
index 000000000..ee26cb6cd
--- /dev/null
+++ b/services/std_svc/firme/firme_mecid.c
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2026, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#include <stdbool.h>
+#include <stdint.h>
+
+#include <arch.h>
+#include <arch_features.h>
+#include <services/firme_svc.h>
+#include <smccc_helpers.h>
+
+/* Only supported ABI is MEC_REFRESH for Realm callers. */
+static firme_service_info_t mecid_info = {
+ .version = FIRME_VERSION(FIRME_MECID_MGMT_VERSION_MAJOR,
+ FIRME_MECID_MGMT_VERSION_MINOR),
+ .instance_support = BIT(FIRME_REALM),
+ .num_feature_regs = FIRME_MECID_FEATURE_REG_COUNT,
+ .feature_reg = { FIRME_MECID_FEAT_REG0_MEC_REFRESH_BIT, 0U },
+};
+
+firme_service_info_t *firme_mecid_service_get_info(void)
+{
+ if (!is_feat_mec_supported()) {
+ return NULL;
+ }
+
+ return &mecid_info;
+}
+
+int32_t firme_mecid_service_init(void)
+{
+ uint64_t __maybe_unused mecid_width;
+
+ if (is_feat_mec_supported()) {
+ mecid_width = (uint64_t)plat_firme_get_common_mecid_width();
+ if ((mecid_width &
+ ~FIRME_MECID_FEAT_REG1_COMMON_MECID_WIDTH_BITS_MASK) != 0U) {
+ return FIRME_INVALID_PARAMETERS;
+ }
+
+ mecid_info.feature_reg[1] = EXTRACT(FIRME_MECID_FEAT_REG1_COMMON_MECID_WIDTH_BITS, mecid_width);
+ }
+
+ return 0;
+}
+
+static int firme_mec_refresh(u_register_t mec_params)
+{
+ uint64_t common_mecid_width;
+ uint16_t mecid;
+
+ /*
+ * Check whether FEAT_MEC is supported by the hardware. If not, return
+ * unknown SMC.
+ */
+ if (!is_feat_mec_supported()) {
+ return FIRME_NOT_SUPPORTED;
+ }
+
+ /*
+ * Check whether the MECID parameter fits within the common MECID width.
+ */
+ common_mecid_width = (mecid_info.feature_reg[1] &
+ FIRME_MECID_FEAT_REG1_COMMON_MECID_WIDTH_BITS_MASK) + 1U;
+ mecid = EXTRACT(MEC_PARAM_MECID, mec_params);
+
+ if (mecid > common_mecid_width) {
+ return FIRME_INVALID_PARAMETERS;
+ }
+
+ return plat_firme_mec_refresh(mecid, mec_params & BIT(0));
+}
+
+u_register_t firme_mecid_service_handler(firme_instance_e instance,
+ uint32_t smc_fid, uint64_t x1,
+ uint64_t x2, uint64_t x3,
+ uint64_t x4, void *cookie,
+ void *handle, uint64_t flags)
+{
+ (void)instance;
+ (void)x2;
+ (void)x3;
+ (void)x4;
+ (void)cookie;
+ (void)handle;
+ (void)flags;
+
+ if (smc_fid != FIRME_MEC_REFRESH_FID || instance != FIRME_REALM) {
+ SMC_RET1(handle, FIRME_NOT_SUPPORTED);
+ }
+
+ SMC_RET1(handle, firme_mec_refresh(x1));
+}
diff --git a/services/std_svc/pci_svc.c b/services/std_svc/pci_svc.c
index a02b8a745..5d7eac433 100644
--- a/services/std_svc/pci_svc.c
+++ b/services/std_svc/pci_svc.c
@@ -68,7 +68,7 @@ uint64_t pci_smc_handler(uint32_t smc_fid,
}
break;
case SMC_PCI_READ: {
- uint32_t ret;
+ uint32_t ret = 0U;
if (validate_rw_addr_sz(x1, x2, x3) != SMC_PCI_CALL_SUCCESS) {
SMC_RET2(handle, SMC_PCI_CALL_INVAL_PARAM, 0U);
diff --git a/services/std_svc/rmmd/rmmd_main.c b/services/std_svc/rmmd/rmmd_main.c
index 521bb9e16..c648a452a 100644
--- a/services/std_svc/rmmd/rmmd_main.c
+++ b/services/std_svc/rmmd/rmmd_main.c
@@ -32,6 +32,7 @@
#include <plat/common/platform.h>
#include <platform_def.h>
#include <services/rmmd_svc.h>
+#include <services/firme_svc.h>
#include <smccc_helpers.h>
#include <lib/extensions/sme.h>
#include <lib/extensions/sve.h>
@@ -455,46 +456,6 @@ static int rmm_el3_ifc_get_feat_register(uint64_t feat_reg_idx,
return E_RMM_OK;
}
-/*
- * Update encryption key associated with mecid included in x1.
- */
-static int rmmd_mecid_key_update(uint64_t x1)
-{
- uint64_t mecid_width, mecid_width_mask;
- uint16_t mecid;
- unsigned int reason;
- int ret;
-
- /*
- * Check whether FEAT_MEC is supported by the hardware. If not, return
- * unknown SMC.
- */
- if (is_feat_mec_supported() == false) {
- return E_RMM_UNK;
- }
-
- /*
- * Check whether the mecid parameter is at most MECIDR_EL2.MECIDWidthm1 + 1
- * in length.
- */
- mecid_width = ((read_mecidr_el2() >> MECIDR_EL2_MECIDWidthm1_SHIFT) &
- MECIDR_EL2_MECIDWidthm1_MASK) + 1UL;
- mecid_width_mask = ((1UL << mecid_width) - 1UL);
-
- mecid = (x1 >> MECID_SHIFT) & MECID_MASK;
- if ((mecid & ~mecid_width_mask) != 0U) {
- return E_RMM_INVAL;
- }
-
- reason = (x1 >> MEC_REFRESH_REASON_SHIFT) & MEC_REFRESH_REASON_MASK;
- ret = plat_rmmd_mecid_key_update(mecid, reason);
-
- if (ret != 0) {
- return E_RMM_UNK;
- }
- return E_RMM_OK;
-}
-
/*******************************************************************************
* This function handles RMM-EL3 interface SMCs
******************************************************************************/
@@ -585,7 +546,8 @@ uint64_t rmmd_rmm_el3_handler(uint32_t smc_fid, uint64_t x1, uint64_t x2,
rmmd_rmm_sync_exit(x1);
}
case RMM_MEC_REFRESH:
- ret = rmmd_mecid_key_update(x1);
+ ret = firme_handler(FIRME_MEC_REFRESH_FID, x1, x2, x3, x4,
+ cookie, handle, flags);
SMC_RET1(handle, ret);
default:
WARN("RMMD: Unsupported RMM-EL3 call 0x%08x\n", smc_fid);
diff --git a/services/std_svc/std_svc_setup.c b/services/std_svc/std_svc_setup.c
index c2b953fc2..fb402cc6e 100644
--- a/services/std_svc/std_svc_setup.c
+++ b/services/std_svc/std_svc_setup.c
@@ -83,6 +83,12 @@ static int32_t std_svc_setup(void)
trng_setup();
#endif /* TRNG_SUPPORT */
+#if FIRME_SUPPORT
+ if (firme_init() != 0) {
+ ret = 1;
+ }
+#endif /* FIRME_SUPPORT */
+
#if DRTM_SUPPORT
if (drtm_setup() != 0) {
ret = 1;