sonic-buildimage/files/dsc/install_debian.j2
Ashwin Hiranniah ada7c6a72e
Add pensando platform (#15978)
This commit adds support for pensando asic called ELBA. ELBA is used in pci based cards and in smartswitches.

#### Why I did it
This commit introduces pensando platform which is based on ELBA ASIC.
##### Work item tracking
- Microsoft ADO **(number only)**:

#### How I did it
Created platform/pensando folder and created makefiles specific to pensando.
This mainly creates pensando docker (which OEM's need to download before building an image) which has all the userspace to initialize and use the DPU (ELBA ASIC).
Output of the build process creates two images which can be used from ONIE and goldfw.
Recommendation is use to use ONIE.
#### How to verify it
Load the SONiC image via ONIE or goldfw and make sure the interfaces are UP.

##### Description for the changelog
Add pensando platform support.
2023-12-04 14:41:52 -08:00

332 lines
8.4 KiB
Django/Jinja
Executable File

#!/bin/sh
R=""
export LD_LIBRARY_PATH=/platform/lib:/nic/lib:$LD_LIBRARY_PATH
export PATH=/platform/bin:$PATH
if [ $(arch) != aarch64 ]; then
export PATH=$(pwd)/bin:$PATH
R=$(pwd)/data
fi
root_mnt=$R/mnt
image_version={{ SONIC_IMAGE_VERSION }}
image_dir=image-$image_version
INSTALLER_PAYLOAD=fs.zip
DOCKERFS_DIR=docker
FILESYSTEM_DOCKERFS=dockerfs.tar.gz
BL_CONF=boot.conf
DATA_PARTUUID=6ED62003-DD8D-44B8-9538-0A2B7C7E628F
ROOT_PARTUUID=C7F48DD2-C265-404B-959D-C64D21D49168
ROOT_PARTSIZE=24G
exec 0< /dev/tty 1> /dev/tty 2> /dev/tty
PKG=""
ACTION=""
root_pn=0
data_pn=0
REPART_NEEDED=0
set -e
fatal()
{
echo "FATAL: $1" >&2
exit 1
}
hash()
{
sha512sum $1 | awk '{ print $1 }'
}
check_running_goldfw()
{
local fw=$(expr "$(cat $R/proc/cmdline)" : '.*FW_NAME=\([a-z]\+\)')
if [ "$fw" != "goldfw" ]; then
fatal "Installer can only be run from goldfw"
fi
}
check_package()
{
local f want_hash got_hash
echo "==> Checking package"
for f in $(jq -r ".shas | keys | join(\" \") | tostring" MANIFEST); do
echo -n "${f}..."
want_hash=$(jq -r .shas.\"$f\" MANIFEST)
got_hash=$(tar xfO $PKG $f | hash /dev/stdin)
if [ "$got_hash" != "$want_hash" ]; then
echo " BAD"
echo "WANT: $want_hash"
echo "GOT: $got_hash"
fatal "Package file error"
else
echo " OK"
fi
done
}
get_install_mode()
{
local r
while [ -z "$install_mode" ]; do
echo "### Select install mode:"
echo "### 1. Whole disk (wipe all Pensando filesystems)"
echo "### 2. Half of /data (lose /data contents)"
echo "### 3. Half of /data (save/restore /data contents)"
read -p '### Selection: ' r
case "X-$r" in
X-1) install_mode=FULL_DISK; ;;
X-2) install_mode=DATA_LOSE; ;;
X-3) install_mode=DATA_KEEP; ;;
*) fatal "ABORTED"; ;;
esac
done
}
check_existing_parts()
{
local nparts i partuuid boot_partsize boot_lastsec data_firstsec
nparts=$(sgdisk -p /dev/mmcblk0 | grep '^[ ]*[1-9]' | wc -l)
for i in $(seq $nparts); do
partuuid=$(sgdisk -i $i /dev/mmcblk0 | awk '/Partition unique GUID/ { print $NF }')
case "$partuuid" in
$DATA_PARTUUID) data_pn=$i; ;;
$ROOT_PARTUUID) root_pn=$i; ;;
esac
done
if [ $install_mode != FULL_DISK ]; then
if [ $root_pn -ne 0 ]; then
boot_partsize=$(sgdisk -i $root_pn /dev/mmcblk0 | awk -F '[( ]' '/Partition size/ {print int($6)}')
boot_lastsec=$(sgdisk -i $root_pn /dev/mmcblk0 | awk '/Last sector/ {print $3}')
if [ ${boot_partsize}G = $ROOT_PARTSIZE ]; then
echo "SONiC root partitions already present with requested size. No repartition, only formatting"
else
echo "SONiC root partitions already present with mismatch size ${partsize}G. Repartition needed"
REPART_NEEDED=1
fi
fi
if [ $data_pn -eq 0 ]; then
echo "Data partition not found; Repartition needed"
REPART_NEEDED=1
elif [ $data_pn -ne $nparts ]; then
fatal "Data partition is not the last partition; exiting." >&2
else
data_firstsec=$(sgdisk -i $data_pn /dev/mmcblk0 | awk '/First sector/ {print $3}')
if [ $data_firstsec -ne $((boot_lastsec+1)) ]; then
echo "Data partition not contigent with boot partition. Repartition needed"
REPART_NEEDED=1
fi
fi
fi
}
save_data()
{
echo "==> Saving /data"
mount /dev/mmcblk0p$data_pn $R/mnt
tar cvf $R/root/data.tar -C $R/mnt .
umount $R/mnt
}
setup_partitions_full()
{
local i
echo "==> Setting up partitions..."
root_pn=1
set +e
sgdisk -Z /dev/mmcblk0 >/dev/null 2>&1
partprobe >/dev/null 2>&1
sgdisk \
-n $root_pn:+0:+$ROOT_PARTSIZE -t $root_pn:8300 \
-u $root_pn:$ROOT_PARTUUID -c $root_pn:"SONiC Root Filesystem" \
/dev/mmcblk0 >/dev/null
while true; do
partprobe
if [ ! -e $R/dev/mmcblk0p3 ]; then
break
fi
sleep 1
done
echo "==> Creating filesystems"
for i in $root_pn; do
mkfs.ext4 -F -q /dev/mmcblk0p$i >/dev/null
done
set -e
}
setup_partitions_multi()
{
echo "==> Setting up partitions..."
set +e
if [ $REPART_NEEDED -eq 0 ]; then
mkfs.ext4 -F -q /dev/mmcblk0p$root_pn >/dev/null
else
if [ $root_pn -ne 0 ]; then
sgdisk -d $root_pn /dev/mmcblk0 >/dev/null
fi
[ $data_pn -ne 0 ] && sgdisk -d $data_pn /dev/mmcblk0 >/dev/null
if [ $root_pn -eq 0 ]; then
root_pn=10
data_pn=$(($root_pn + 1))
fi
if [ $data_pn -eq 0 ]; then
data_pn=$(($root_pn + 1))
fi
sgdisk \
-n $root_pn:+0:+$ROOT_PARTSIZE -t $root_pn:8300 \
-u $root_pn:$ROOT_PARTUUID -c $root_pn:"SONiC Root Filesystem" \
-n $data_pn:+0:0 -t $data_pn:8300 -u $data_pn:$DATA_PARTUUID \
-c $data_pn:"Data Filesystem" \
/dev/mmcblk0 >/dev/null
sgdisk -U R /dev/mmcblk0 >/dev/null
while true; do
partprobe
if [ -e $R/dev/mmcblk0p$data_pn ]; then
break
fi
sleep 1
done
echo "==> Creating filesystems"
for i in $root_pn $data_pn; do
mkfs.ext4 -F -q /dev/mmcblk0p$i >/dev/null
done
fi
set -e
}
setup_partitions()
{
if [ $install_mode = INSTALL_FULL ]; then
setup_partitions_full
else
setup_partitions_multi
fi
}
restore_data()
{
echo "==> Restoring /data"
if [ -f $R/root/data.tar ]; then
mount /dev/mmcblk0p$data_pn $R/mnt
tar xpvf $R/root/data.tar -C $R/mnt
umount $R/mnt
fi
}
create_bootloader_conf()
{
echo "==> Create bootloader config"
cat <<EOF >> $root_mnt/$BL_CONF
default main
label main
kernel /$image_dir/boot/vmlinuz-6.1.0-11-2-arm64
initrd /$image_dir/boot/initrd.img-6.1.0-11-2-arm64
devicetree /$image_dir/boot/elba-asic-psci.dtb
append softdog.soft_panic=1 FW_NAME=mainfwa root=/dev/mmcblk0p10 rw rootwait rootfstype=ext4 loopfstype=squashfs loop=/$image_dir/fs.squashfs
}
EOF
}
install_root_filesystem()
{
echo "==> Installing root filesystem"
mount /dev/mmcblk0p$root_pn $root_mnt
mkdir -p $root_mnt/$image_dir
# Decompress the file for the file system directly to the partition
if [ x"$docker_inram" = x"on" ]; then
# when disk is small, keep dockerfs.tar.gz in disk, expand it into ramfs during initrd
tar xfO $PKG $INSTALLER_PAYLOAD | unzip -o - -x "platform.tar.gz" -d $root_mnt/$image_dir
else
tar xfO $PKG $INSTALLER_PAYLOAD | unzip -o - -x "$FILESYSTEM_DOCKERFS" "platform.tar.gz" -d $root_mnt/$image_dir
TAR_EXTRA_OPTION="--numeric-owner"
mkdir -p $root_mnt/$image_dir/$DOCKERFS_DIR
tar xfO $PKG $INSTALLER_PAYLOAD | unzip -op - "$FILESYSTEM_DOCKERFS" | tar xz $TAR_EXTRA_OPTION -f - -C $root_mnt/$image_dir/$DOCKERFS_DIR
fi
create_bootloader_conf
umount $root_mnt
}
set_boot_command()
{
local pn
#set to mainfwa where sonic is installed
mtd=/dev/$(grep fwsel /proc/mtd | sed -e 's/:.*//')
flash_erase -q $mtd 0 1
echo -n mainfwa | dd of=$mtd status=none
echo "==> Setting u-boot environment for Debian Boot"
pn=$(printf "%x" $root_pn)
fwenv -E \
-s kernel_comp_addr_r 88000000 \
-s kernel_comp_size 8000000 \
-s kernel_addr_r a0000000 \
-s fdt_addr_r bb100000 \
-s ramdisk_addr_r a4000000 \
-s bootcmd "sysboot mmc 0:$pn any bf000000 /$BL_CONF"
}
main()
{
while getopts ":p:i:" opt; do
case "$opt" in
p) PKG=$OPTARG; ;;
i) ACTION=INSTALL; ;;
*) true; ;;
esac
done
if [ "$PKG" = "" -o "$ACTION" != "INSTALL" ]; then
fatal "Needs -p filename -i all"
fi
tar xf $PKG MANIFEST
check_running_goldfw
check_package
# get_install_mode
install_mode=DATA_KEEP
check_existing_parts
if [ $install_mode = DATA_KEEP -a $REPART_NEEDED -eq 1 -a $data_pn -ne 0 ]; then
save_data
fi
setup_partitions
if [ $install_mode = DATA_KEEP -a $REPART_NEEDED -eq 1 ]; then
restore_data
fi
install_root_filesystem
set_boot_command
echo "==> Installation complete"
}
main "$@"