896d49d10a
CZ.NIC as part of Turris project released free and open source WTMI
application firmware wtmi_app.bin for all Armada 3720 devices.
This firmware includes additional features like access to Hardware
Random Number Generator of Armada 3720 SoC which original Marvell's
fuse.bin image does not have.
Add a patch which allows to pass the commit id, so the firmware is able
to identify itself, see a04bffeb
.
Add a patch to disable linking with gold, since the ARM toolchain
doesn't ship gold.
Cherry-pick the 3 post-release fixes.
Signed-off-by: Andre Heider <a.heider@gmail.com>
53 lines
1.8 KiB
Diff
53 lines
1.8 KiB
Diff
From 15ff10623c83ee2e626d93d16e022b115dcb608f Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Pali=20Roh=C3=A1r?= <pali@kernel.org>
|
|
Date: Sat, 10 Apr 2021 16:56:12 +0200
|
|
Subject: [PATCH] avs: Validate VDD value from OTP
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
CPU VDD voltage value for 1.2 GHz frequency on some Espressobin boards is
|
|
not set and raw value 0x00 is returned. In this case init_avs() function
|
|
calculated CPU VDD voltage value to 0x00 + AVS_VDD_BASE = 0.898 V, which is
|
|
too low for any operation and Espressobin board immediately crashed
|
|
init_avs() function set this low value.
|
|
|
|
This patch fixes above issue by validating returned VDD value from OTP and
|
|
using default VDD value when invalid value is in OTP. With this patch
|
|
init_avs() function does cause CPU crash anymore.
|
|
|
|
Signed-off-by: Pali Rohár <pali@kernel.org>
|
|
Signed-off-by: Marek Behún <marek.behun@nic.cz>
|
|
---
|
|
wtmi/avs.c | 14 ++++++++++----
|
|
1 file changed, 10 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/wtmi/avs.c b/wtmi/avs.c
|
|
index 36ca9fa..4624359 100644
|
|
--- a/wtmi/avs.c
|
|
+++ b/wtmi/avs.c
|
|
@@ -140,10 +140,16 @@ int init_avs(u32 speed)
|
|
}
|
|
|
|
if (svc_rev >= SVC_REVISION_2) {
|
|
- vdd_otp = ((otp_data[OTP_DATA_SVC_SPEED_ID] >> shift) +
|
|
- AVS_VDD_BASE) & AVS_VDD_MASK;
|
|
- regval |= (vdd_otp << HIGH_VDD_LIMIT_OFF);
|
|
- regval |= (vdd_otp << LOW_VDD_LIMIT_OFF);
|
|
+ vdd_otp = (otp_data[OTP_DATA_SVC_SPEED_ID] >> shift) &
|
|
+ AVS_VDD_MASK;
|
|
+ if (!vdd_otp || vdd_otp + AVS_VDD_BASE > AVS_VDD_MASK) {
|
|
+ regval |= (vdd_default << HIGH_VDD_LIMIT_OFF);
|
|
+ regval |= (vdd_default << LOW_VDD_LIMIT_OFF);
|
|
+ } else {
|
|
+ vdd_otp += AVS_VDD_BASE;
|
|
+ regval |= (vdd_otp << HIGH_VDD_LIMIT_OFF);
|
|
+ regval |= (vdd_otp << LOW_VDD_LIMIT_OFF);
|
|
+ }
|
|
} else {
|
|
regval |= (vdd_default << HIGH_VDD_LIMIT_OFF);
|
|
regval |= (vdd_default << LOW_VDD_LIMIT_OFF);
|
|
--
|
|
2.30.2
|
|
|