ada7c6a72e
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.
284 lines
7.8 KiB
Plaintext
284 lines
7.8 KiB
Plaintext
####### Pensando ########
|
|
|
|
#!/bin/sh
|
|
|
|
R=""
|
|
export LD_LIBRARY_PATH=/platform/lib:/nic/lib:$LD_LIBRARY_PATH
|
|
export PATH=/platform/bin:$PATH
|
|
|
|
root_mnt=$R/mnt
|
|
bl_conf_path=$root_mnt
|
|
HOST=/host
|
|
|
|
image_dir=image-$image_version
|
|
|
|
INSTALLER_PAYLOAD=fs.zip
|
|
DOCKERFS_DIR=docker
|
|
FILESYSTEM_DOCKERFS=dockerfs.tar.gz
|
|
BL_CONF=boot-$image_dir.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
|
|
}
|
|
|
|
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 [ $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
|
|
}
|
|
|
|
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()
|
|
{
|
|
setup_partitions_multi
|
|
}
|
|
|
|
cleanup()
|
|
{
|
|
echo "==> Cleaning up residual files"
|
|
running_sonic_revision=`cat /etc/sonic/sonic_version.yml | grep build_version | awk -F \' '{print $2}'`
|
|
config_files=$(find /host -type f -name "boot*.conf" | grep -iv "$running_sonic_revision\|$image_dir" )
|
|
if [ -z $config_files ]; then
|
|
echo "No config files to remove"
|
|
else
|
|
echo "config files to remove are: $config_files"
|
|
fi
|
|
|
|
for file in $config_files; do
|
|
if [ -f "$file" ]; then
|
|
echo "Removing file: $file"
|
|
rm "$file"
|
|
fi
|
|
done
|
|
|
|
faulty_image_dir=$(find /host -type d -name "image-*" | grep -iv "$running_sonic_revision\|$image_dir")
|
|
if [ -z $faulty_image_dir ]; then
|
|
echo "No faulty image directories to remove"
|
|
else
|
|
echo "Faulty image directories to remove are: $faulty_image_dir"
|
|
fi
|
|
|
|
for d in $faulty_image_dir; do
|
|
if [ -d "$d" ]; then
|
|
echo "Removing directory: $d"
|
|
rm -rfd "$d"
|
|
fi
|
|
done
|
|
|
|
}
|
|
|
|
create_bootloader_conf()
|
|
{
|
|
echo "==> Create bootloader config"
|
|
|
|
cat <<EOF >> $bl_conf_path/$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
|
|
}
|
|
|
|
set_boot_command()
|
|
{
|
|
local pn
|
|
|
|
echo "==> Setting u-boot environment for Debian Boot"
|
|
pn=$(printf "%x" $root_pn)
|
|
|
|
fw_setenv -f baudrate 115200
|
|
fw_setenv -f bootcmd 'test -n "$boot_once" && setenv do_boot_once "$boot_once" && setenv boot_once && saveenv && run do_boot_once; run boot_next'
|
|
fw_setenv -f bootdelay 0
|
|
fw_setenv -f fdt_addr_r bb100000
|
|
fw_setenv -f kernel_addr_r a0000000
|
|
fw_setenv -f kernel_comp_addr_r 88000000
|
|
fw_setenv -f kernel_comp_size 8000000
|
|
fw_setenv -f ramdisk_addr_r a4000000
|
|
}
|
|
|
|
set_sonic_env() {
|
|
echo "current env is $env"
|
|
BL_CONF_OLD=NONE
|
|
pn=$(printf "%x" $root_pn)
|
|
if [ "$install_env" = "onie" ]; then
|
|
echo "set sonic env onie"
|
|
fw_setenv -f linuxargs "${extra_cmdline_linux}"
|
|
fw_setenv -f sonic_image_1 "sysboot mmc 0:$pn any bf000000 /$BL_CONF"
|
|
fw_setenv -f sonic_image_2 "NONE"
|
|
fw_setenv -f sonic_dir_1 $image_dir
|
|
fw_setenv -f sonic_dir_2 "NONE"
|
|
fw_setenv -f sonic_version_1 `echo $image_dir | sed "s/^image-/SONiC-OS-/g"`
|
|
fw_setenv -f sonic_version_2 "NONE"
|
|
|
|
fw_setenv -f boot_next "run sonic_image_1"
|
|
else
|
|
check_existing_parts
|
|
pn=$(printf "%x" $root_pn)
|
|
running_sonic_revision=`cat /etc/sonic/sonic_version.yml | grep build_version | awk -F \' '{print $2}'`
|
|
SONIC_IMAGE_MAX=2
|
|
idx=0
|
|
for i in $(seq 1 $SONIC_IMAGE_MAX); do
|
|
if [ "`fw_printenv sonic_version_$i 2>/dev/null | awk -F = '{print $2}'`" != "SONiC-OS-$running_sonic_revision" ]; then
|
|
idx=$i
|
|
break
|
|
fi
|
|
done
|
|
|
|
fw_setenv linuxargs "${extra_cmdline_linux}"
|
|
fw_setenv sonic_image_$idx "sysboot mmc 0:$pn any bf000000 /$BL_CONF"
|
|
fw_setenv sonic_dir_$idx $image_dir
|
|
fw_setenv sonic_version_$idx `echo $image_dir | sed "s/^image-/SONiC-OS-/g"`
|
|
|
|
fw_setenv boot_next "run sonic_image_$idx"
|
|
|
|
cleanup
|
|
fi
|
|
}
|
|
|
|
|
|
|
|
########################################################################################################################
|
|
|
|
prepare_boot_menu() {
|
|
echo "Sync up cache ..."
|
|
sync
|
|
echo "Setting up U-Boot environment..."
|
|
if [ "$install_env" = "onie" ]; then
|
|
bl_conf_path=$root_mnt
|
|
else
|
|
bl_conf_path=$HOST
|
|
fi
|
|
file=$bl_conf_path/$BL_CONF
|
|
if [ -f "$file" ]; then
|
|
rm "$file"
|
|
fi
|
|
create_bootloader_conf
|
|
MTD_UBOOTENV=$(cat /proc/mtd | grep -e 'ubootenv' | awk '{print $1}' | tr -dc '0-9')
|
|
FW_ENV_DEFAULT="/dev/mtd$MTD_UBOOTENV 0x0 0x1000 0x10000"
|
|
echo $FW_ENV_DEFAULT > /etc/fw_env.config
|
|
set_boot_command
|
|
set_sonic_env
|
|
}
|
|
|
|
create_partition() {
|
|
check_existing_parts
|
|
setup_partitions
|
|
}
|
|
|
|
mount_partition() {
|
|
demo_mnt=$root_mnt
|
|
mounted=$(mount | grep "/dev/mmcblk0p$root_pn on $demo_mnt type ext4" | wc -l)
|
|
if [ $mounted -eq 0 ]; then
|
|
mount /dev/mmcblk0p$root_pn $demo_mnt
|
|
fi
|
|
}
|
|
|
|
bootloader_menu_config() {
|
|
# Update uboot Environment
|
|
prepare_boot_menu
|
|
if [ "$install_env" = "onie" ]; then
|
|
chmod -x /bin/onie-nos-mode
|
|
fi
|
|
}
|