summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYe Li <ye.li@nxp.com>2017-08-21 21:03:35 -0500
committerYe Li <ye.li@nxp.com>2017-08-22 05:03:46 -0500
commit3150830e67eec1848654f5d76a89e7b33661ecf5 (patch)
tree0a8b2734a509c9c9d2e74065ca8624cc8e71507d
parent5d944b0f18d81e37b7be9d0eb3d9815dc886e30e (diff)
MLK-16238-3 imx8m_evk: Update codes to enable TMU
Update SoC codes, DTSi and defconfig to enable TMU for i.MX8M EVK board. Also implement functions to get speed grade and market segment info from fuse. Signed-off-by: Ye Li <ye.li@nxp.com> Acked-by: Peng Fan <peng.fan@nxp.com>
-rw-r--r--arch/arm/cpu/armv8/imx8m/clock.c2
-rw-r--r--arch/arm/cpu/armv8/imx8m/soc.c78
-rw-r--r--arch/arm/dts/fsl-imx8mq.dtsi1
-rw-r--r--arch/arm/include/asm/arch-imx8m/imx-regs.h11
-rw-r--r--configs/imx8mq_evk_defconfig3
5 files changed, 95 insertions, 0 deletions
diff --git a/arch/arm/cpu/armv8/imx8m/clock.c b/arch/arm/cpu/armv8/imx8m/clock.c
index 8a742b3fb9..7e1ad66860 100644
--- a/arch/arm/cpu/armv8/imx8m/clock.c
+++ b/arch/arm/cpu/armv8/imx8m/clock.c
@@ -590,6 +590,8 @@ int clock_init()
clock_enable(CCGR_WDOG2, 1);
clock_enable(CCGR_WDOG3, 1);
+ clock_enable(CCGR_TSENSOR, 1);
+
return 0;
};
diff --git a/arch/arm/cpu/armv8/imx8m/soc.c b/arch/arm/cpu/armv8/imx8m/soc.c
index d0be22c9c7..65c5f9ff65 100644
--- a/arch/arm/cpu/armv8/imx8m/soc.c
+++ b/arch/arm/cpu/armv8/imx8m/soc.c
@@ -15,6 +15,84 @@
DECLARE_GLOBAL_DATA_PTR;
+/*
+ * OCOTP_TESTER3[9:8] (see Fusemap Description Table offset 0x440)
+ * defines a 2-bit SPEED_GRADING
+ */
+#define OCOTP_TESTER3_SPEED_SHIFT 8
+#define OCOTP_TESTER3_SPEED_800MHZ 0
+#define OCOTP_TESTER3_SPEED_1GHZ 1
+#define OCOTP_TESTER3_SPEED_1300HZ 2
+#define OCOTP_TESTER3_SPEED_1500HZ 3
+
+u32 get_cpu_speed_grade_hz(void)
+{
+ struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
+ struct fuse_bank *bank = &ocotp->bank[1];
+ struct fuse_bank1_regs *fuse =
+ (struct fuse_bank1_regs *)bank->fuse_regs;
+ uint32_t val;
+
+ val = readl(&fuse->tester3);
+ val >>= OCOTP_TESTER3_SPEED_SHIFT;
+ val &= 0x3;
+
+ switch(val) {
+ case OCOTP_TESTER3_SPEED_800MHZ:
+ return 792000000;
+ case OCOTP_TESTER3_SPEED_1GHZ:
+ return 996000000;
+ case OCOTP_TESTER3_SPEED_1300HZ:
+ return 1300000000;
+ case OCOTP_TESTER3_SPEED_1500HZ:
+ return 1500000000;
+ }
+ return 0;
+}
+
+/*
+ * OCOTP_TESTER3[7:6] (see Fusemap Description Table offset 0x440)
+ * defines a 2-bit SPEED_GRADING
+ */
+#define OCOTP_TESTER3_TEMP_SHIFT 6
+
+/* CPU Temperature Grades */
+#define TEMP_COMMERCIAL 0
+#define TEMP_EXTCOMMERCIAL 1
+#define TEMP_INDUSTRIAL 2
+#define TEMP_AUTOMOTIVE 3
+
+
+u32 get_cpu_temp_grade(int *minc, int *maxc)
+{
+ struct ocotp_regs *ocotp = (struct ocotp_regs *)OCOTP_BASE_ADDR;
+ struct fuse_bank *bank = &ocotp->bank[1];
+ struct fuse_bank1_regs *fuse =
+ (struct fuse_bank1_regs *)bank->fuse_regs;
+ uint32_t val;
+
+ val = readl(&fuse->tester3);
+ val >>= OCOTP_TESTER3_TEMP_SHIFT;
+ val &= 0x3;
+
+ if (minc && maxc) {
+ if (val == TEMP_AUTOMOTIVE) {
+ *minc = -40;
+ *maxc = 125;
+ } else if (val == TEMP_INDUSTRIAL) {
+ *minc = -40;
+ *maxc = 105;
+ } else if (val == TEMP_EXTCOMMERCIAL) {
+ *minc = -20;
+ *maxc = 105;
+ } else {
+ *minc = 0;
+ *maxc = 95;
+ }
+ }
+ return val;
+}
+
int timer_init(void)
{
#ifdef CONFIG_SPL_BUILD
diff --git a/arch/arm/dts/fsl-imx8mq.dtsi b/arch/arm/dts/fsl-imx8mq.dtsi
index e44dfc9fc3..e3056af14c 100644
--- a/arch/arm/dts/fsl-imx8mq.dtsi
+++ b/arch/arm/dts/fsl-imx8mq.dtsi
@@ -224,6 +224,7 @@
reg = <0x0 0x30260000 0x0 0x10000>;
interrupt = <GIC_SPI 49 IRQ_TYPE_LEVEL_HIGH>;
little-endian;
+ u-boot,dm-pre-reloc;
fsl,tmu-range = <0xa0000 0x90026 0x8004a 0x1006a>;
fsl,tmu-calibration = <0x00000000 0x00000020
0x00000001 0x00000028
diff --git a/arch/arm/include/asm/arch-imx8m/imx-regs.h b/arch/arm/include/asm/arch-imx8m/imx-regs.h
index 453b43269d..6de9941f96 100644
--- a/arch/arm/include/asm/arch-imx8m/imx-regs.h
+++ b/arch/arm/include/asm/arch-imx8m/imx-regs.h
@@ -192,6 +192,17 @@ struct ocotp_regs {
} bank[0];
};
+struct fuse_bank1_regs {
+ u32 tester3;
+ u32 rsvd0[3];
+ u32 tester4;
+ u32 rsvd1[3];
+ u32 tester5;
+ u32 rsvd2[3];
+ u32 cfg0;
+ u32 rsvd3[3];
+};
+
struct fuse_bank9_regs {
u32 mac_addr0;
u32 rsvd0[3];
diff --git a/configs/imx8mq_evk_defconfig b/configs/imx8mq_evk_defconfig
index e70cab77e8..cdb266698a 100644
--- a/configs/imx8mq_evk_defconfig
+++ b/configs/imx8mq_evk_defconfig
@@ -28,3 +28,6 @@ CONFIG_DM_REGULATOR_FIXED=y
CONFIG_DM_REGULATOR_GPIO=y
CONFIG_DM_ETH=y
CONFIG_CMD_PMIC=y
+
+CONFIG_NXP_TMU=y
+CONFIG_DM_THERMAL=y