diff options
Diffstat (limited to 'package/boot/arm-trusted-firmware-mvebu/patches-mox-boot-builder/102-avs-Validate-VDD-value-from-OTP.patch')
-rw-r--r-- | package/boot/arm-trusted-firmware-mvebu/patches-mox-boot-builder/102-avs-Validate-VDD-value-from-OTP.patch | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/package/boot/arm-trusted-firmware-mvebu/patches-mox-boot-builder/102-avs-Validate-VDD-value-from-OTP.patch b/package/boot/arm-trusted-firmware-mvebu/patches-mox-boot-builder/102-avs-Validate-VDD-value-from-OTP.patch new file mode 100644 index 0000000000..d44eb21181 --- /dev/null +++ b/package/boot/arm-trusted-firmware-mvebu/patches-mox-boot-builder/102-avs-Validate-VDD-value-from-OTP.patch @@ -0,0 +1,52 @@ +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 + |