toolchain.mk: Add support for Rust toolchain for aarch{32/64}

Rather than invoking custom setup.sh script provided by OP-TEE Rust SDK,
add Rust toolchain installation support as part of toolchain Makefile.
This allows to separate OP-TEE specific Rust toolchain installation
from default Rust toolchain installation. Now all OP-TEE specific Rust
toolchains will be installed under: $(ROOT)/toolchains/rust/.

Acked-by: Jerome Forissier <jerome.forissier@linaro.org>
Acked-by: Etienne Carriere <etienne.carriere@foss.st.com>
Acked-by: Jens Wiklander <jens.wiklander@linaro.org>
Acked-by: Yuan Zhuang <yuanz@apache.org>
Signed-off-by: Sumit Garg <sumit.garg@linaro.org>
diff --git a/toolchain.mk b/toolchain.mk
index d8be58f..8cfc982 100644
--- a/toolchain.mk
+++ b/toolchain.mk
@@ -56,8 +56,10 @@
 AARCH64_GCC_VERSION 		?= arm-gnu-toolchain-11.3.rel1-x86_64-aarch64-none-linux-gnu
 SRC_AARCH64_GCC 		?= https://developer.arm.com/-/media/Files/downloads/gnu/11.3.rel1/binrel/$(AARCH64_GCC_VERSION).tar.xz
 
+RUST_TOOLCHAIN_PATH 		?= $(TOOLCHAIN_ROOT)/rust
+
 .PHONY: toolchains
-toolchains: aarch32-toolchain aarch64-toolchain
+toolchains: aarch32-toolchain aarch64-toolchain rust-toolchain
 
 .PHONY: aarch32-toolchain
 aarch32-toolchain:
@@ -67,6 +69,24 @@
 aarch64-toolchain:
 	$(call dltc,$(AARCH64_PATH),$(SRC_AARCH64_GCC),$(AARCH64_GCC_VERSION))
 
+# Download the Rust toolchain
+define dl-rust-toolchain
+	@if [ ! -d "$(1)" ]; then \
+		mkdir -p $(1) && \
+		export RUSTUP_HOME=$(1)/.rustup && \
+		export CARGO_HOME=$(1)/.cargo && \
+		curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --no-modify-path && \
+		source "$(1)/.cargo/env" && \
+		rustup target install aarch64-unknown-linux-gnu && \
+		rustup target install arm-unknown-linux-gnueabihf && \
+		rustup default nightly-2023-12-18; \
+	fi
+endef
+
+.PHONY: rust-toolchain
+rust-toolchain:
+	$(call dl-rust-toolchain,$(RUST_TOOLCHAIN_PATH))
+
 CLANG_VER			?= 12.0.0
 CLANG_PATH			?= $(ROOT)/clang-$(CLANG_VER)