summaryrefslogtreecommitdiff
path: root/recipes-bsp/u-boot-mainline/files/0006-MLK-14938-8-imx8-Add-SMMU-setup-to-Soc-codes.patch
blob: d365185ac8d3c78a37c61e3b0b912b89d010eae5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
From 70ff91215f9969dfa9f8640b36ef4695d5b2d3f9 Mon Sep 17 00:00:00 2001
From: Ye Li <ye.li@nxp.com>
Date: Wed, 17 May 2017 02:19:25 -0500
Subject: [PATCH 06/15] 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)
---
 arch/arm/include/asm/arch-imx8/sid.h | 14 ++++++++++++
 arch/arm/mach-imx/imx8/Kconfig       |  5 +++++
 arch/arm/mach-imx/imx8/cpu.c         | 41 ++++++++++++++++++++++++++++++++++++
 3 files changed, 60 insertions(+)
 create mode 100644 arch/arm/include/asm/arch-imx8/sid.h

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;
-- 
2.13.6