summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYe Li <ye.li@nxp.com>2017-05-17 02:19:25 -0500
committerMarcel Ziswiler <marcel.ziswiler@toradex.com>2019-07-09 15:54:42 +0200
commite8e40cc30e9a6f0decf36cf3419969f66de57c3d (patch)
tree997a5c71c497c2a40739e081896aa6009ec9ff8f
parenta9c68c6f6e5e89bdaaf9292706a5b04960bceed0 (diff)
MLK-14938-8 imx8: Add SMMU setup to Soc codes
We setup SMMU in arch_preboot_os to avoid breaking u-boot driver. Add a kconfig entry CONFIG_IMX_SMMU to enable it. So far, the USDHC0-USDHC1 and FEC0-FEC1 are added into sid. Signed-off-by: Peng Fan <peng.fan@nxp.com> Signed-off-by: Ye Li <ye.li@nxp.com> (cherry picked from downstream commit 7da6345919ee59a26cf65b4bc29072eea2fc0909) (cherry picked from downstream commit 45308e7da90f342c2de7fbec1f8c5b8bd3f1b8e5)
-rw-r--r--arch/arm/include/asm/arch-imx8/sid.h14
-rw-r--r--arch/arm/mach-imx/imx8/Kconfig5
-rw-r--r--arch/arm/mach-imx/imx8/cpu.c41
3 files changed, 60 insertions, 0 deletions
diff --git a/arch/arm/include/asm/arch-imx8/sid.h b/arch/arm/include/asm/arch-imx8/sid.h
new file mode 100644
index 0000000000..2250efa06b
--- /dev/null
+++ b/arch/arm/include/asm/arch-imx8/sid.h
@@ -0,0 +1,14 @@
+/*
+ * Copyright 2017 NXP
+ *
+ * SPDX-License-Identifier: GPL-2.0+
+ */
+#include <asm/arch/sci/sci.h>
+
+struct smmu_sid {
+ sc_rsrc_t rsrc;
+ sc_rm_sid_t sid;
+ char dev_name[32];
+};
+
+sc_err_t imx8_config_smmu_sid(struct smmu_sid *dev_sids, int size);
diff --git a/arch/arm/mach-imx/imx8/Kconfig b/arch/arm/mach-imx/imx8/Kconfig
index bbe323d5ca..d577b0f077 100644
--- a/arch/arm/mach-imx/imx8/Kconfig
+++ b/arch/arm/mach-imx/imx8/Kconfig
@@ -1,5 +1,10 @@
if ARCH_IMX8
+config IMX_SMMU
+ bool "Enable SMMU on i.MX8"
+ help
+ Enable the SMMU for peripherals on i.MX8
+
config IMX8
bool
diff --git a/arch/arm/mach-imx/imx8/cpu.c b/arch/arm/mach-imx/imx8/cpu.c
index f2fa262ac8..72404d9eb6 100644
--- a/arch/arm/mach-imx/imx8/cpu.c
+++ b/arch/arm/mach-imx/imx8/cpu.c
@@ -13,6 +13,7 @@
#include <errno.h>
#include <thermal.h>
#include <asm/arch/sci/sci.h>
+#include <asm/arch/sid.h>
#include <asm/arch/sys_proto.h>
#include <asm/arch-imx/cpu.h>
#include <asm/armv8/cpu.h>
@@ -513,6 +514,46 @@ err:
printf("%s: fuse %d, err: %d\n", __func__, word[i], ret);
}
+#ifdef CONFIG_IMX_SMMU
+struct smmu_sid dev_sids[] = {
+ { SC_R_SDHC_0, 0x11, "SDHC0" },
+ { SC_R_SDHC_1, 0x11, "SDHC1" },
+ { SC_R_SDHC_2, 0x11, "SDHC2" },
+ { SC_R_ENET_0, 0x12, "FEC0" },
+ { SC_R_ENET_1, 0x12, "FEC1" },
+};
+
+sc_err_t imx8_config_smmu_sid(struct smmu_sid *dev_sids, int size)
+{
+ int i;
+ sc_err_t sciErr = SC_ERR_NONE;
+
+ if ((dev_sids == NULL) || (size <= 0))
+ return SC_ERR_NONE;
+
+ for (i = 0; i < size; i++) {
+ sciErr = sc_rm_set_master_sid(-1,
+ dev_sids[i].rsrc,
+ dev_sids[i].sid);
+ if (sciErr != SC_ERR_NONE) {
+ printf("set master sid error\n");
+ return sciErr;
+ }
+ }
+
+ return SC_ERR_NONE;
+}
+#endif
+
+void arch_preboot_os(void)
+{
+#ifdef CONFIG_IMX_SMMU
+ sc_pm_set_resource_power_mode(-1, SC_R_SMMU, SC_PM_PW_MODE_ON);
+
+ imx8_config_smmu_sid(dev_sids, ARRAY_SIZE(dev_sids));
+#endif
+}
+
u32 get_cpu_rev(void)
{
u32 id = 0, rev = 0;