blob: ac4f255ce3b5f4d74826a50587127b7d8c9a198b [file] [log] [blame]
Yann Gautierf33b2432019-05-20 19:17:08 +02001/*
Nicolas Le Bayonde02e9b2019-11-18 17:18:06 +01002 * Copyright (c) 2019-2022, STMicroelectronics - All Rights Reserved
Yann Gautierf33b2432019-05-20 19:17:08 +02003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
Yann Gautierf33b2432019-05-20 19:17:08 +02007#include <common/debug.h>
Etienne Carrierec7a66e72020-02-07 13:38:30 +01008#include <drivers/clk.h>
Nicolas Le Bayonde02e9b2019-11-18 17:18:06 +01009#include <drivers/delay_timer.h>
Yann Gautierf33b2432019-05-20 19:17:08 +020010#include <drivers/st/bsec.h>
11#include <drivers/st/stpmic1.h>
12#include <lib/mmio.h>
13
Nicolas Le Bayonde02e9b2019-11-18 17:18:06 +010014#include <platform_def.h>
Yann Gautierf33b2432019-05-20 19:17:08 +020015#include <stm32mp_dt.h>
16#include <stm32mp1_private.h>
17
18/*
19 * SYSCFG REGISTER OFFSET (base relative)
20 */
21#define SYSCFG_BOOTR 0x00U
22#define SYSCFG_IOCTRLSETR 0x18U
23#define SYSCFG_ICNR 0x1CU
24#define SYSCFG_CMPCR 0x20U
25#define SYSCFG_CMPENSETR 0x24U
Yann Gautierc2d18ca2020-10-26 15:21:25 +010026#define SYSCFG_CMPENCLRR 0x28U
Yann Gautierf33b2432019-05-20 19:17:08 +020027
28/*
29 * SYSCFG_BOOTR Register
30 */
31#define SYSCFG_BOOTR_BOOT_MASK GENMASK(2, 0)
32#define SYSCFG_BOOTR_BOOTPD_MASK GENMASK(6, 4)
33#define SYSCFG_BOOTR_BOOTPD_SHIFT 4
34/*
35 * SYSCFG_IOCTRLSETR Register
36 */
37#define SYSCFG_IOCTRLSETR_HSLVEN_TRACE BIT(0)
38#define SYSCFG_IOCTRLSETR_HSLVEN_QUADSPI BIT(1)
39#define SYSCFG_IOCTRLSETR_HSLVEN_ETH BIT(2)
40#define SYSCFG_IOCTRLSETR_HSLVEN_SDMMC BIT(3)
41#define SYSCFG_IOCTRLSETR_HSLVEN_SPI BIT(4)
42
43/*
44 * SYSCFG_ICNR Register
45 */
46#define SYSCFG_ICNR_AXI_M9 BIT(9)
47
48/*
49 * SYSCFG_CMPCR Register
50 */
51#define SYSCFG_CMPCR_SW_CTRL BIT(1)
52#define SYSCFG_CMPCR_READY BIT(8)
53#define SYSCFG_CMPCR_RANSRC GENMASK(19, 16)
54#define SYSCFG_CMPCR_RANSRC_SHIFT 16
55#define SYSCFG_CMPCR_RAPSRC GENMASK(23, 20)
56#define SYSCFG_CMPCR_ANSRC_SHIFT 24
57
Nicolas Le Bayonde02e9b2019-11-18 17:18:06 +010058#define SYSCFG_CMPCR_READY_TIMEOUT_US 10000U
59
Yann Gautierf33b2432019-05-20 19:17:08 +020060/*
61 * SYSCFG_CMPENSETR Register
62 */
63#define SYSCFG_CMPENSETR_MPU_EN BIT(0)
64
65void stm32mp1_syscfg_init(void)
66{
67 uint32_t bootr;
68 uint32_t otp = 0;
69 uint32_t vdd_voltage;
Yann Gautierf33b2432019-05-20 19:17:08 +020070
71 /*
72 * Interconnect update : select master using the port 1.
73 * LTDC = AXI_M9.
74 */
Yann Gautierade9ce02020-05-05 17:58:40 +020075 mmio_write_32(SYSCFG_BASE + SYSCFG_ICNR, SYSCFG_ICNR_AXI_M9);
Yann Gautierf33b2432019-05-20 19:17:08 +020076
77 /* Disable Pull-Down for boot pin connected to VDD */
Yann Gautierade9ce02020-05-05 17:58:40 +020078 bootr = mmio_read_32(SYSCFG_BASE + SYSCFG_BOOTR) &
Yann Gautierf33b2432019-05-20 19:17:08 +020079 SYSCFG_BOOTR_BOOT_MASK;
Yann Gautierade9ce02020-05-05 17:58:40 +020080 mmio_clrsetbits_32(SYSCFG_BASE + SYSCFG_BOOTR, SYSCFG_BOOTR_BOOTPD_MASK,
Yann Gautierf33b2432019-05-20 19:17:08 +020081 bootr << SYSCFG_BOOTR_BOOTPD_SHIFT);
82
83 /*
84 * High Speed Low Voltage Pad mode Enable for SPI, SDMMC, ETH, QSPI
85 * and TRACE. Needed above ~50MHz and conditioned by AFMUX selection.
86 * It could be disabled for low frequencies or if AFMUX is selected
87 * but the function is not used, typically for TRACE.
88 * If high speed low voltage pad mode is node enable, platform will
89 * over consume.
90 *
91 * WARNING:
92 * Enabling High Speed mode while VDD > 2.7V
93 * with the OTP product_below_2v5 (OTP 18, BIT 13)
94 * erroneously set to 1 can damage the SoC!
95 * => TF-A enables the low power mode only if VDD < 2.7V (in DT)
96 * but this value needs to be consistent with board design.
97 */
98 if (bsec_read_otp(&otp, HW2_OTP) != BSEC_OK) {
99 panic();
100 }
101
102 otp = otp & HW2_OTP_PRODUCT_BELOW_2V5;
103
104 /* Get VDD supply */
105 vdd_voltage = dt_get_pwr_vdd_voltage();
106
107 /* Check if VDD is Low Voltage */
108 if (vdd_voltage == 0U) {
109 WARN("VDD unknown");
110 } else if (vdd_voltage < 2700000U) {
Yann Gautierade9ce02020-05-05 17:58:40 +0200111 mmio_write_32(SYSCFG_BASE + SYSCFG_IOCTRLSETR,
Yann Gautierf33b2432019-05-20 19:17:08 +0200112 SYSCFG_IOCTRLSETR_HSLVEN_TRACE |
113 SYSCFG_IOCTRLSETR_HSLVEN_QUADSPI |
114 SYSCFG_IOCTRLSETR_HSLVEN_ETH |
115 SYSCFG_IOCTRLSETR_HSLVEN_SDMMC |
116 SYSCFG_IOCTRLSETR_HSLVEN_SPI);
117
118 if (otp == 0U) {
119 INFO("Product_below_2v5=0: HSLVEN protected by HW\n");
120 }
121 } else {
122 if (otp != 0U) {
123 ERROR("Product_below_2v5=1:\n");
124 ERROR("\tHSLVEN update is destructive,\n");
125 ERROR("\tno update as VDD > 2.7V\n");
126 panic();
127 }
128 }
129
130 stm32mp1_syscfg_enable_io_compensation();
131}
132
133void stm32mp1_syscfg_enable_io_compensation(void)
134{
Nicolas Le Bayonde02e9b2019-11-18 17:18:06 +0100135 uint64_t start;
136
Yann Gautierf33b2432019-05-20 19:17:08 +0200137 /*
138 * Activate automatic I/O compensation.
139 * Warning: need to ensure CSI enabled and ready in clock driver.
140 * Enable non-secure clock, we assume non-secure is suspended.
141 */
Etienne Carrierec7a66e72020-02-07 13:38:30 +0100142 clk_enable(SYSCFG);
Yann Gautierf33b2432019-05-20 19:17:08 +0200143
Yann Gautierade9ce02020-05-05 17:58:40 +0200144 mmio_setbits_32(SYSCFG_BASE + SYSCFG_CMPENSETR,
Yann Gautierf33b2432019-05-20 19:17:08 +0200145 SYSCFG_CMPENSETR_MPU_EN);
146
Nicolas Le Bayonde02e9b2019-11-18 17:18:06 +0100147 start = timeout_init_us(SYSCFG_CMPCR_READY_TIMEOUT_US);
148
Yann Gautierade9ce02020-05-05 17:58:40 +0200149 while ((mmio_read_32(SYSCFG_BASE + SYSCFG_CMPCR) &
Yann Gautierf33b2432019-05-20 19:17:08 +0200150 SYSCFG_CMPCR_READY) == 0U) {
Nicolas Le Bayonde02e9b2019-11-18 17:18:06 +0100151 if (timeout_elapsed(start)) {
152 /*
153 * Failure on IO compensation enable is not a issue:
154 * warn only.
155 */
156 WARN("IO compensation cell not ready\n");
157 break;
158 }
Yann Gautierf33b2432019-05-20 19:17:08 +0200159 }
160
Yann Gautierade9ce02020-05-05 17:58:40 +0200161 mmio_clrbits_32(SYSCFG_BASE + SYSCFG_CMPCR, SYSCFG_CMPCR_SW_CTRL);
Yann Gautierf33b2432019-05-20 19:17:08 +0200162}
163
164void stm32mp1_syscfg_disable_io_compensation(void)
165{
Yann Gautierf33b2432019-05-20 19:17:08 +0200166 uint32_t value;
167
168 /*
169 * Deactivate automatic I/O compensation.
170 * Warning: CSI is disabled automatically in STOP if not
171 * requested for other usages and always OFF in STANDBY.
172 * Disable non-secure SYSCFG clock, we assume non-secure is suspended.
173 */
Yann Gautierade9ce02020-05-05 17:58:40 +0200174 value = mmio_read_32(SYSCFG_BASE + SYSCFG_CMPCR) >>
Yann Gautierf33b2432019-05-20 19:17:08 +0200175 SYSCFG_CMPCR_ANSRC_SHIFT;
176
Yann Gautierade9ce02020-05-05 17:58:40 +0200177 mmio_clrbits_32(SYSCFG_BASE + SYSCFG_CMPCR,
Yann Gautierf33b2432019-05-20 19:17:08 +0200178 SYSCFG_CMPCR_RANSRC | SYSCFG_CMPCR_RAPSRC);
179
Yann Gautierade9ce02020-05-05 17:58:40 +0200180 value = mmio_read_32(SYSCFG_BASE + SYSCFG_CMPCR) |
Yann Gautierf33b2432019-05-20 19:17:08 +0200181 (value << SYSCFG_CMPCR_RANSRC_SHIFT);
182
Yann Gautierade9ce02020-05-05 17:58:40 +0200183 mmio_write_32(SYSCFG_BASE + SYSCFG_CMPCR, value | SYSCFG_CMPCR_SW_CTRL);
Yann Gautierf33b2432019-05-20 19:17:08 +0200184
Yann Gautierc2d18ca2020-10-26 15:21:25 +0100185 mmio_setbits_32(SYSCFG_BASE + SYSCFG_CMPENCLRR, SYSCFG_CMPENSETR_MPU_EN);
Yann Gautierf33b2432019-05-20 19:17:08 +0200186
Etienne Carrierec7a66e72020-02-07 13:38:30 +0100187 clk_disable(SYSCFG);
Yann Gautierf33b2432019-05-20 19:17:08 +0200188}