feat(rd1ae): Add runtime script for rd1ae platform

This patch adds a runtime script configuration and build
generation scripts, along with the necessary expect logs
and port configuration.

Change-Id: I7a5b2d30c8a17332d347eef781e41dad6d6167ec
Signed-off-by: Divin Raj <divin.raj@arm.com>
diff --git a/arm_auto_solutions_utils.sh b/arm_auto_solutions_utils.sh
new file mode 100644
index 0000000..eee7607
--- /dev/null
+++ b/arm_auto_solutions_utils.sh
@@ -0,0 +1,14 @@
+#!/usr/bin/env bash
+#
+# Copyright (c) 2024, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+source "$ci_root/fvp_utils.sh"
+
+arm_automotive_solutions="${rd1ae_prebuilts:-$tfa_downloads/arm_automotive_solutions}"
+
+# RD-1 AE AP bl2 0x00 is mapped to 0x70083C00 in RSE memory map
+rd1ae_ap_bl2_flash_load_addr=0x70083C00
+rd1ae_ap_bl2_flash_size=0x80000
diff --git a/expect-lava/rd1ae-tf.exp b/expect-lava/rd1ae-tf.exp
new file mode 100644
index 0000000..0fe8790
--- /dev/null
+++ b/expect-lava/rd1ae-tf.exp
@@ -0,0 +1,11 @@
+#
+# Copyright (c) 2024 Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+# Expect script for booting TF-A on RD-1 AE
+#
+
+# RD1AE BL2
+expect_string+=('i;BL2: Built :')
+expect_string+=('i;BL2: Booting BL31')
diff --git a/expect-lava/rd1ae-yocto.exp b/expect-lava/rd1ae-yocto.exp
new file mode 100644
index 0000000..6f18c0f
--- /dev/null
+++ b/expect-lava/rd1ae-yocto.exp
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2024 Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+# Expect script for booting Yocto linux on RD-1 AE
+#
+
+# Uboot
+expect_string+=('i;U-Boot')
+
+# Linux kernel boot section
+source $ci_root/expect-lava/linux.inc
+
+# Yocto
+expect_string+=('i;fvp-rd-kronos login:')
diff --git a/expect/rd1ae-tf.exp b/expect/rd1ae-tf.exp
new file mode 100644
index 0000000..64ac3f6
--- /dev/null
+++ b/expect/rd1ae-tf.exp
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2024 Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+# Expect script for booting Yocto linux on RD-1 AE
+#
+
+source [file join [file dirname [info script]] utils.inc]
+source [file join [file dirname [info script]] handle-arguments.inc]
+
+# RD-1-AE BL2
+expect {
+	"BL2: Built :" {
+		message "Booting BL2"
+	}
+}
+
+expect {
+	"BL2: Booting BL31" {
+		message "Booting BL31"
+	}
+}
diff --git a/expect/rd1ae-yocto.exp b/expect/rd1ae-yocto.exp
new file mode 100644
index 0000000..9f5f084
--- /dev/null
+++ b/expect/rd1ae-yocto.exp
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2024 Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+# Expect script for booting Yocto linux on RD-1 AE
+#
+
+source [file join [file dirname [info script]] utils.inc]
+source [file join [file dirname [info script]] handle-arguments.inc]
+
+# Uboot
+expect {
+	"U-Boot" {
+		message "Entered Uboot"
+	}
+}
+
+# Linux kernel boot section
+source [file join [file dirname [info script]] linux.inc]
+
+# Yocto
+expect {
+	"fvp-rd-kronos login:" {
+		message "Kronos Login Prompt Received"
+	}
+}
diff --git a/fvp_utils.sh b/fvp_utils.sh
index f013fe0..1bd713d 100644
--- a/fvp_utils.sh
+++ b/fvp_utils.sh
@@ -50,6 +50,7 @@
 fvp_arm_std_library="fvp:fvp_arm_std_library_${model_version}_${model_build};/opt/model/FVP_ARM_Std_Library/FVP_Base"
 fvp_base_revc_2xaemva="fvp:fvp_base_revc-2xaemva_${model_version}_${model_build};/opt/model/Base_RevC_AEMvA_pkg/models/${model_flavour}"
 fvp_base_aemv8r="fvp:fvp_base_aemv8r_${model_version}_${model_build};/opt/model/AEMv8R_base_pkg/models/${model_flavour}"
+fvp_rd_1_ae="fvp:fvp_rd_1_ae_11.27_20;/opt/model/FVP_RD_1_AE/models/${model_flavour}"
 
 # CSS model list
 fvp_morello="fvp:fvp_morello_0.11_33;/opt/model/FVP_Morello/models/Linux64_GCC-6.4"
@@ -100,6 +101,7 @@
 [tc2]="${fvp_tc2};FVP_TC2"
 [tc3]="${fvp_tc3};FVP_TC3"
 [baser-aemv8r]="${fvp_base_aemv8r};FVP_BaseR_AEMv8R"
+[rd1ae]="${fvp_rd_1_ae};FVP_RD_1_AE"
 )
 
 
@@ -317,6 +319,7 @@
         [romlib]="romlib.bin"
         [rootfs]="rootfs.bin"
         [host_flash_fip]="host_flash_fip.bin"
+        [rse_flash]="rse_flash.bin"
         [rse_rom]="rse_rom.bin"
         [rse_encrypted_cm_provisioning_bundle_0]="rse_encrypted_cm_provisioning_bundle_0.bin"
         [rse_encrypted_dm_provisioning_bundle]="rse_encrypted_dm_provisioning_bundle.bin"
@@ -368,6 +371,7 @@
         [romlib]="$(gen_bin_url romlib.bin)"
         [rootfs]="$(gen_bin_url rootfs.bin.gz)"
         [host_flash_fip]="$(gen_bin_url host_flash_fip.bin)"
+        [rse_flash]="$(gen_bin_url rse_flash.bin)"
         [rse_rom]="$(gen_bin_url rse_rom.bin)"
         [rse_encrypted_cm_provisioning_bundle_0]="$(gen_bin_url rse_encrypted_cm_provisioning_bundle_0.bin)"
         [rse_encrypted_dm_provisioning_bundle]="$(gen_bin_url rse_encrypted_dm_provisioning_bundle.bin)"
@@ -424,6 +428,7 @@
         ["[= ]romlib.bin"]="={ROMLIB}"
         ["[= ]rootfs.bin"]="={ROOTFS}"
         ["[= ]host_flash_fip.bin"]="={HOST_FLASH_FIP}"
+        ["[= ]rse_flash.bin"]="={RSE_FLASH}"
         ["[= ]rse_rom.bin"]="={RSE_ROM}"
         ["[= ]rse_encrypted_cm_provisioning_bundle_0.bin"]="={RSE_ENCRYPTED_CM_PROVISIONING_BUNDLE_0}"
         ["[= ]rse_encrypted_dm_provisioning_bundle.bin"]="={RSE_ENCRYPTED_DM_PROVISIONING_BUNDLE}"
diff --git a/group/tf-l2-boot-tests-arm-plats/rd1ae-default:fvp-linux.rd1ae b/group/tf-l2-boot-tests-arm-plats/rd1ae-default:fvp-linux.rd1ae
new file mode 100644
index 0000000..b5a3cc6
--- /dev/null
+++ b/group/tf-l2-boot-tests-arm-plats/rd1ae-default:fvp-linux.rd1ae
@@ -0,0 +1,6 @@
+#
+# Copyright (c) 2024 Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
diff --git a/model/rd1ae-ports.awk b/model/rd1ae-ports.awk
new file mode 100644
index 0000000..f2be0b6
--- /dev/null
+++ b/model/rd1ae-ports.awk
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2024, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+/terminal_sec_uart:/ { ports[0] = $NF }
+/terminal_ns_uart0:/ { ports[1] = $NF }
+/terminal_uart_scp:/ { ports[2] = $NF }
+END {
+    for (i = 0; i < num_uarts; i++) {
+        if (ports[i] != "")
+            print "ports[" i "]=" ports[i]
+    }
+}
diff --git a/model/rd1ae.sh b/model/rd1ae.sh
new file mode 100644
index 0000000..e86ffa1
--- /dev/null
+++ b/model/rd1ae.sh
@@ -0,0 +1,59 @@
+#!/usr/bin/env bash
+#
+# Copyright (c) 2024, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+if  is_arm_jenkins_env || upon "$local_ci"; then
+	# Internal ARM Jenkins environment path
+	set_model_path "$warehouse/SysGen/Models/$model_version/$model_build/external/models/$model_flavour/FVP_RD_1_AE"
+else
+	source "$ci_root/fvp_utils.sh"
+	# fvp_models variable contains the information for FVP paths, where 2nd field
+	# points to the /opt/model/*/models/${model_flavour}
+	models_dir="$(echo ${fvp_models[$model]} | awk -F ';' '{print $2}')"
+	set_model_path "$models_dir"
+fi
+
+# Write model command line options
+cat <<EOF >"$model_param_file"
+-C css.sysctrl.scp.terminal_uart_scp.start_port=5007
+-C css.ap_periph.terminal_ns_uart0.start_port=5008
+-C css.ap_periph.terminal_sec_uart.start_port=5009
+-C ros.disable_visualisation=1
+-C css.sysctrl.si.disable_visualisation=1
+-C css.sysctrl.rse.rom.raw_image=$rse_rom_bin
+-C css.sysctrl.rse_flashloader.fname=$rse_flash_bin
+-C ros.board.flashloader0.fname=$fip_gpt_bin
+-C ros.board.virtioblockdevice.image_path=$rootfs_bin
+-C ros.board.virtio_net.enabled=1
+-C ros.board.virtio_net.hostbridge.userNetworking=1
+-C ros.board.virtio_net.hostbridge.userNetPorts=2222=22
+-C ros.board.virtio_net.transport=legacy
+-C ros.board.virtio_rng.enabled=1
+-C ros.dram_size=0x100000000
+-C css.sysctrl.rse.DISABLE_GATING=1
+-C css.sysctrl.rse.CMU4_NUM_DB_CH=6
+-C css.sysctrl.si.system_ctrl_regs.cl1_c1_cfgrvbaraddr=0x140000000
+-C css.sysctrl.si.system_ctrl_regs.cl2_c1_cfgrvbaraddr=0x160000000
+-C css.sysctrl.si.system_ctrl_regs.cl2_c2_cfgrvbaraddr=0x160000000
+-C css.sysctrl.si.system_ctrl_regs.cl2_c3_cfgrvbaraddr=0x160000000
+-C 'pcie_group_0.pcie4.hierarchy_file_name=<default>'
+-C pcie_group_0.pcie4.pcie_rc.ahci0.endpoint.ats_supported=true
+-C pcie_group_0.pcie4.pcie_rc.ahci0.ahci.image_path=
+-C pcie_group_0.pcie4.pci_smmuv3.mmu.SMMU_ROOT_IDR0=0
+-C css.sysctrl.rse_flashloader.fnameWrite=$rse_flash_bin
+-C ros.board.flashloader0.fnameWrite=$fip_gpt_bin
+-C css.sysctrl.rse_flashloader.write_flash_after_reset=true
+-C ros.board.flashloader0.write_flash_after_reset=true
+-C css.sysctrl.rse.lcm_nvm.otp_enabled=1
+-C css.sysctrl.rse.lcm_nvm.read_from_file=1
+-C css.sysctrl.rse.lcm_nvm.update_raw_image=1
+-C css.sysctrl.rse.lcm_nvm.use_image_file=1
+-C css.sysctrl.rse.clk_mul.mul=5
+-C css.sysctrl.rse.intchecker.ICBC_RESET_VALUE=0x0000011B
+--data css.sysctrl.rse.cpu=$rse_encrypted_cm_provisioning_bundle_0_bin@0x31000400
+--data css.sysctrl.rse.cpu=$rse_encrypted_dm_provisioning_bundle_bin@0x31080000
+
+EOF
diff --git a/run_config/fvp-linux.rd1ae b/run_config/fvp-linux.rd1ae
new file mode 100644
index 0000000..c0665a0
--- /dev/null
+++ b/run_config/fvp-linux.rd1ae
@@ -0,0 +1,56 @@
+#!/usr/bin/env bash
+#
+# Copyright (c) 2024, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+source "$ci_root/run_config/rd1ae_rse_utils.sh"
+source "$ci_root/arm_auto_solutions_utils.sh"
+
+post_tf_build() {
+	# Download and archive rd1ae u-boot.bin files
+	url="$arm_automotive_solutions/rd1ae/u-boot.bin" saveas="uboot.bin" fetch_file
+	archive_file "uboot.bin"
+
+	build_fip BL33="$archive/uboot.bin"
+}
+
+fetch_tf_resource() {
+	# Sign ap_bl2 image with RSE public key
+	sign_host_ap_bl2_image bl2.bin $rd1ae_ap_bl2_flash_load_addr $rd1ae_ap_bl2_flash_size
+
+	# Update fip image with signed ap_bl2
+	bin_name="tb-fw" src="$archive/$signed_bin" fip_update
+
+	# Download all required images to boot rd1ae
+	downlaod_rd1ae_prebuilt
+
+	# Update ap-flash-image with newly created fip image
+	update_ap_flash_image
+}
+
+generate_lava_job_template() {
+	payload_type="linux" gen_yaml_template
+}
+
+generate_lava_job() {
+	local model="rd1ae"
+	uart="1" set_expect_variable "num_cpus" "8"
+
+	# Hold scp terminal_uart_scp
+	uart="2" port="5007" file="hold_uart.exp" track_expect
+	uart="0" port="5009" file="rd1ae-tf.exp" track_expect
+	uart="1" port="5008" file="rd1ae-yocto.exp" set_primary="1" timeout="1200" track_expect
+
+	set_run_env "ports_script" "$ci_root/model/rd1ae-ports.awk"
+	set_run_env "num_uarts" "3"
+
+	model="$model" \
+			model_build="20" \
+			model_flavour="Linux64_GCC-9.3" \
+			model_version="11.27" \
+			gen_model_params
+
+	model="$model" gen_fvp_yaml
+}
+
diff --git a/run_config/rd1ae_rse_utils.sh b/run_config/rd1ae_rse_utils.sh
new file mode 100644
index 0000000..3aa62a7
--- /dev/null
+++ b/run_config/rd1ae_rse_utils.sh
@@ -0,0 +1,107 @@
+#!/usr/bin/env bash
+#
+# Copyright (c) 2024, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+sign_host_ap_bl2_image() {
+	# $1 ... host binary name to sign
+	# $2 ... image load address
+	# $3 ... signed bin size
+
+	local tmpdir="$(mktemp -d)"
+	host_bin="`basename ${1}`"
+	signed_bin="signed_`basename ${1}`"
+	host_binary_layout="`basename -s .bin ${1}`_ns"
+
+	# Download the RSE public key
+	url="$arm_automotive_solutions/rd1ae/root-EC-P256.pem" saveas="root-EC-P256.pem" fetch_file
+	archive_file "root-EC-P256.pem"
+
+	RSE_SIGN_PRIVATE_KEY=$archive/root-EC-P256.pem
+	RSE_LAYOUT_WRAPPER_VERSION="0.0.7"
+
+	cat << EOF > $tmpdir/$host_binary_layout
+enum image_attributes {
+	RE_IMAGE_LOAD_ADDRESS = $2,
+	RE_SIGN_BIN_SIZE = $3,
+};
+EOF
+
+	if [ ! -f $archive/$host_bin ]; then
+		echo "$archive/$host_bin does not exist. Aborting...!"
+		exit 1
+	fi
+
+	echo "Signing `basename ${1}`"
+	# Get mcuboot
+	git clone --branch v2.1.0 "https://github.com/mcu-tools/mcuboot.git" $tmpdir/mcuboot
+
+	# Fetch wrapper script
+	saveas="$tmpdir" url="$arm_automotive_solutions/rd1ae/wrapper_scripts" fetch_directory
+
+	pushd $tmpdir/mcuboot/scripts
+	python3 $tmpdir/wrapper_scripts/wrapper/wrapper.py \
+		-v $RSE_LAYOUT_WRAPPER_VERSION \
+		--layout $tmpdir/$host_binary_layout \
+		-k $RSE_SIGN_PRIVATE_KEY \
+		--public-key-format full \
+		--align 1 \
+		--pad \
+		--pad-header \
+		--measured-boot-record \
+		-H 0x400 \
+		-s auto \
+		$archive/$host_bin  \
+		$tmpdir/$signed_bin
+
+	echo "Generated signed_`basename ${1}`"
+
+	url="$tmpdir/$signed_bin" saveas="$signed_bin" fetch_file
+	archive_file "$signed_bin"
+	popd
+}
+
+downlaod_rd1ae_prebuilt() {
+	url="$arm_automotive_solutions/rd1ae/core-image-minimal-fvp-rd-kronos.wic" saveas="rootfs.bin" fetch_file
+	archive_file "rootfs.bin"
+
+	# Get pre-built rse encrypted_cm_provisioning_bundle_0 bin
+	url="$arm_automotive_solutions/rd1ae/encrypted_cm_provisioning_bundle_0.bin" \
+		saveas=rse_encrypted_cm_provisioning_bundle_0.bin fetch_file
+	archive_file "rse_encrypted_cm_provisioning_bundle_0.bin"
+
+	# Get pre-built rse encrypted_dm_provisioning_bundle bin
+	url="$arm_automotive_solutions/rd1ae/encrypted_dm_provisioning_bundle_0.bin" \
+		saveas=rse_encrypted_dm_provisioning_bundle.bin fetch_file
+	archive_file "rse_encrypted_dm_provisioning_bundle.bin"
+
+	# Get pre-built rse-rom-image.img
+	url="$arm_automotive_solutions/rd1ae/rse-rom-image.img" saveas=rse_rom.bin fetch_file
+	archive_file "rse_rom.bin"
+
+	# Get pre-built rse-flash-image.img
+	url="$arm_automotive_solutions/rd1ae/rse-flash-image.img" saveas=rse_flash.bin fetch_file
+	archive_file "rse_flash.bin"
+
+	# Get pre-built rse-nvm-image.img
+	url="$arm_automotive_solutions/rd1ae/rse-nvm-image.img" fetch_file
+	archive_file "rse-nvm-image.img"
+}
+
+update_ap_flash_image() {
+	# Downlaod prebuilt ap-flash-image.img
+	url="$arm_automotive_solutions/rd1ae/ap-flash-image.img" saveas=fip_gpt.bin fetch_file
+	archive_file "fip_gpt.bin"
+
+	if [ ! -f "$archive/fip.bin" ]; then
+		echo "$archive/fip.bin does not exist. Aborting...!"
+		exit 1
+	fi
+
+	echo "Updating ap-flash-image..."
+	dd if=$archive/fip.bin of=$archive/fip_gpt.bin bs=1 seek=0 conv=notrunc
+	dd if=$archive/fip.bin of=$archive/fip_gpt.bin bs=1 seek=$((0x200000)) conv=notrunc
+	echo "Succesfully updated."
+}