summaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-imx/tzasc.c
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2024-03-15 13:15:19 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2024-03-15 13:15:19 +0100
commit46149a0260cbe7ec86e7fabd83c6e68f1b900e54 (patch)
treea317ddfe8fe2d21bd5562d32622dc578508d617c /arch/arm/mach-imx/tzasc.c
parente4a37472999e8b8305cdcc77998514fae7c785d1 (diff)
parent4ff51eb1816dc3c79527c0dbc40f5c843ea74523 (diff)
downloadbarebox-46149a0260cbe7ec86e7fabd83c6e68f1b900e54.tar.gz
barebox-46149a0260cbe7ec86e7fabd83c6e68f1b900e54.tar.xz
Merge branch 'for-next/imx'
Diffstat (limited to 'arch/arm/mach-imx/tzasc.c')
-rw-r--r--arch/arm/mach-imx/tzasc.c47
1 files changed, 27 insertions, 20 deletions
diff --git a/arch/arm/mach-imx/tzasc.c b/arch/arm/mach-imx/tzasc.c
index 9c71108c99..4cb4d7c5cf 100644
--- a/arch/arm/mach-imx/tzasc.c
+++ b/arch/arm/mach-imx/tzasc.c
@@ -1,44 +1,51 @@
// SPDX-License-Identifier: GPL-2.0-only
+#include <mach/imx/generic.h>
#include <mach/imx/tzasc.h>
#include <linux/bitops.h>
#include <mach/imx/imx8m-regs.h>
#include <io.h>
-#define GPR_TZASC_EN BIT(0)
-#define GPR_TZASC_SWAP_ID BIT(1)
-#define GPR_TZASC_EN_LOCK BIT(16)
+#define GPR_TZASC_EN BIT(0)
+#define GPR_TZASC_ID_SWAP_BYPASS BIT(1)
+#define GPR_TZASC_EN_LOCK BIT(16)
+#define GPR_TZASC_ID_SWAP_BYPASS_LOCK BIT(17)
-static void enable_tzc380(bool bypass_id_swap)
+#define MX8M_TZASC_REGION_ATTRIBUTES_0 (MX8M_TZASC_BASE_ADDR + 0x108)
+#define MX8M_TZASC_REGION_ATTRIBUTES_0_SP GENMASK(31, 28)
+
+void imx8m_tzc380_init(void)
{
u32 __iomem *gpr = IOMEM(MX8M_IOMUXC_GPR_BASE_ADDR);
/* Enable TZASC and lock setting */
setbits_le32(&gpr[10], GPR_TZASC_EN);
setbits_le32(&gpr[10], GPR_TZASC_EN_LOCK);
- if (bypass_id_swap)
- setbits_le32(&gpr[10], BIT(1));
+
+ /*
+ * According to TRM, TZASC_ID_SWAP_BYPASS should be set in
+ * order to avoid AXI Bus errors when GPU is in use
+ */
+ if (cpu_is_mx8mm() || cpu_is_mx8mn() || cpu_is_mx8mp())
+ setbits_le32(&gpr[10], GPR_TZASC_ID_SWAP_BYPASS);
+
+ /*
+ * imx8mn and imx8mp implements the lock bit for
+ * TZASC_ID_SWAP_BYPASS, enable it to lock settings
+ */
+ if (cpu_is_mx8mn() || cpu_is_mx8mp())
+ setbits_le32(&gpr[10], GPR_TZASC_ID_SWAP_BYPASS_LOCK);
+
/*
* set Region 0 attribute to allow secure and non-secure
* read/write permission. Found some masters like usb dwc3
* controllers can't work with secure memory.
*/
- writel(0xf0000000, MX8M_TZASC_BASE_ADDR + 0x108);
-}
-
-void imx8mq_tzc380_init(void)
-{
- enable_tzc380(false);
-}
-
-void imx8mn_tzc380_init(void) __alias(imx8mm_tzc380_init);
-void imx8mp_tzc380_init(void) __alias(imx8mm_tzc380_init);
-void imx8mm_tzc380_init(void)
-{
- enable_tzc380(true);
+ writel(MX8M_TZASC_REGION_ATTRIBUTES_0_SP,
+ MX8M_TZASC_REGION_ATTRIBUTES_0);
}
-bool tzc380_is_enabled(void)
+bool imx8m_tzc380_is_enabled(void)
{
u32 __iomem *gpr = IOMEM(MX8M_IOMUXC_GPR_BASE_ADDR);