/* * Copyright (c) 2019-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #ifndef DSU_MACROS_S #define DSU_MACROS_S #include #include #include .macro check_errata_dsu_798953_impl mov x2, #ERRATA_APPLIES mov x3, #ERRATA_NOT_APPLIES /* Check if DSU is equal to r0p0 */ mrs x1, CLUSTERIDR_EL1 /* DSU variant and revision bitfields in CLUSTERIDR are adjacent */ ubfx x0, x1, #CLUSTERIDR_REV_SHIFT,\ #(CLUSTERIDR_REV_BITS + CLUSTERIDR_VAR_BITS) mov x1, #(0x0 << CLUSTERIDR_REV_SHIFT) cmp x0, x1 csel x0, x2, x3, EQ .endm .macro errata_dsu_798953_wa_impl /* If erratum applies, disable high-level clock gating */ mrs x0, CLUSTERACTLR_EL1 orr x0, x0, #CLUSTERACTLR_EL1_DISABLE_CLOCK_GATING msr CLUSTERACTLR_EL1, x0 .endm .macro branch_if_scu_not_present _target:req /* Check if the SCU L3 Unit is present on the DSU */ mrs x0, CPUCFR_EL1 ubfx x0, x0, #SCU_SHIFT, #1 eor x0, x0, #1 /* If SCU is not present, return without applying patch */ cmp x0, xzr mov x0, #ERRATA_NOT_APPLIES b.eq \_target .endm .macro check_errata_dsu_936184_impl mov x0, #ERRATA_NOT_APPLIES /* Erratum applies only if DSU has the ACP interface */ mrs x1, CLUSTERCFR_EL1 ubfx x1, x1, #CLUSTERCFR_ACP_SHIFT, #1 cbz x1, 1f /* If ACP is present, check if DSU is older than r2p0 */ mrs x1, CLUSTERIDR_EL1 /* DSU variant and revision bitfields in CLUSTERIDR are adjacent */ ubfx x2, x1, #CLUSTERIDR_REV_SHIFT,\ #(CLUSTERIDR_REV_BITS + CLUSTERIDR_VAR_BITS) cmp x2, #(0x2 << CLUSTERIDR_VAR_SHIFT) b.hs 1f mov x0, #ERRATA_APPLIES 1: .endm .macro errata_dsu_936184_wa_impl /* If erratum applies, we set a mask to a DSU control register */ mrs x0, CLUSTERACTLR_EL1 ldr x1, =DSU_ERRATA_936184_MASK orr x0, x0, x1 msr CLUSTERACTLR_EL1, x0 .endm .macro check_errata_dsu_2313941_impl mov x2, #ERRATA_APPLIES mov x3, #ERRATA_NOT_APPLIES /* Check if DSU version is less than or equal to r3p1 */ mrs x1, CLUSTERIDR_EL1 mov x0, #ERRATA_NOT_APPLIES /* DSU variant and revision bitfields in CLUSTERIDR are adjacent */ ubfx x0, x1, #CLUSTERIDR_REV_SHIFT,\ #(CLUSTERIDR_REV_BITS + CLUSTERIDR_VAR_BITS) mov x1, #(0x31 << CLUSTERIDR_REV_SHIFT) cmp x0, x1 csel x0, x2, x3, LS 1: .endm .macro errata_dsu_2313941_wa_impl /* If erratum applies, disable high-level clock gating */ mrs x0, CLUSTERACTLR_EL1 orr x0, x0, #CLUSTERACTLR_EL1_DISABLE_SCLK_GATING msr CLUSTERACTLR_EL1, x0 .endm #endif /* DSU_MACROS_S */