Files
meta-tegra/recipes-core/initrdscripts/tegra-flash-init/program-boot-device.sh
Pavel Löbl 105532880b tegra-flash-init: derive mtd name from OTABOOTDEV variable
On custom board the QSPI flash can be under different name
(like mtd1). Instead hardcoding mtd0 we derive the mtd device
name from OTABOOTDEV variable already specified in machine
files.

Signed-off-by: Pavel Löbl <pavel@loebl.cz>
2024-06-11 14:21:28 -07:00

161 lines
4.6 KiB
Bash

#!/bin/sh
BOOTPART_SIZE=
BOOTDEV_TYPE=unset
program_spi_partition() {
local partname="$1"
local part_offset="$2"
local part_size="$3"
local part_file="$4"
local file_size=0
if [ -n "$part_file" ]; then
file_size=$(stat -c "%s" "$part_file")
if [ -z "$file_size" ]; then
echo "ERR: could not retrieve file size of $part_file" >&2
return 1
fi
fi
if [ $file_size -ne 0 ]; then
echo "Writing $part_file (size=$file_size) to $partname (offset=$part_offset)"
if ! mtd_debug write @MTD_DEV@ $part_offset $file_size "$part_file"; then
return 1
fi
fi
# Multiple copies of the BCT get installed at erase-block boundaries
# within the defined BCT partition
if [ "$partname" = "BCT" ]; then
local slotsize=16384
local rounded_slot_size=$(expr \( \( $slotsize \+ 511 \) / 512 \) \* 512)
local curr_offset=$(expr $part_offset \+ $rounded_slot_size)
local copycount=$(expr $part_size / $rounded_slot_size)
local i=1
while [ $i -lt $copycount ]; do
echo "Writing $part_file to BCT+$i (offset=$curr_offset)"
if ! mtd_debug write @MTD_DEV@ $curr_offset $file_size "$part_file"; then
return 1
fi
i=$(expr $i \+ 1)
curr_offset=$(expr $curr_offset \+ $rounded_slot_size)
done
fi
return 0
}
program_mmcboot_partition() {
local partname="$1"
local part_offset="$2"
local part_size="$3"
local part_file="$4"
local file_size=0
local bootpart="/dev/mmcblk0boot0"
if [ -z "$BOOTPART_SIZE" ]; then
echo "ERR: boot partition size not set" >&2
return 1
fi
if [ $part_offset -ge $BOOTPART_SIZE ]; then
part_offset=$(expr $part_offset - $BOOTPART_SIZE)
bootpart="/dev/mmcblk0boot1"
fi
if [ -n "$part_file" ]; then
file_size=$(stat -c "%s" "$part_file")
if [ -z "$file_size" ]; then
echo "ERR: could not retrieve file size of $part_file" >&2
return 1
fi
fi
if [ $file_size -ne 0 ]; then
echo "Writing $part_file (size=$file_size) to $partname on $bootpart (offset=$part_offset)"
if ! dd if="$part_file" of="$bootpart" bs=1 seek=$part_offset count=$file_size > /dev/null; then
return 1
fi
# Multiple copies of the BCT get installed at 16KiB boundaries
# within the defined BCT partition
if [ "$partname" = "BCT" ]; then
local slotsize=16384
local curr_offset=$(expr $part_offset \+ $slotsize)
local copycount=$(expr $part_size / $slotsize)
local i=1
while [ $i -lt $copycount ]; do
echo "Writing $part_file (size=$file_size) to BCT+$i (offset=$curr_offset)"
if ! dd if="$part_file" of="$bootpart" bs=1 seek=$curr_offset count=$file_size > /dev/null; then
return 1
fi
i=$(expr $i \+ 1)
curr_offset=$(expr $curr_offset \+ $slotsize)
done
fi
fi
return 0
}
program_boot_partitions() {
local blpkgdir="$1"
local partname part_offset part_size part_file
local rc=0
if [ -z "$blpkgdir" -o ! -d "$blpkgdir" ]; then
echo "ERR: missing or non-directory: $blpkgdir" >&2
return 1
fi
if [ -f "$blpkgdir/boot_device_type" ]; then
BOOTDEV_TYPE=$(cat "$blpkgdir/boot_device_type")
else
echo "ERR: missing boot_device_type file in $blpkgdir" >&2
return 1
fi
if [ ! -f "$blpkgdir/partitions.conf" ]; then
echo "ERR: partition config missing in $blpkgdir" >&2
return 1
fi
if [ "$BOOTDEV_TYPE" = "mmcboot" ]; then
if [ ! -b /dev/mmcblk0boot0 -o ! -b /dev/mmcblk0boot1 ]; then
echo "ERR: eMMC boot device, but mmcblk0bootX devices do not exist" >&2
return 1
fi
BOOTPART_SIZE=$(expr $(cat /sys/block/mmcblk0boot0/size) \* 512)
echo "0" > /sys/block/mmcblk0boot0/force_ro
echo "0" > /sys/block/mmcblk0boot1/force_ro
blkdiscard -f /dev/mmcblk0boot0
blkdiscard -f /dev/mmcblk0boot1
elif [ "$BOOTDEV_TYPE" = "spi" ]; then
if [ ! -e @MTD_DEV@ ]; then
echo "ERR: SPI boot device, but @MTD_DEV@ device does not exist" >&2
return 1
fi
echo "Erasing @MTD_DEV@"
flash_erase @MTD_DEV@ 0 0
else
echo "ERR: unknown boot device type: $BOOTDEV_TYPE" >&2
return 1
fi
oldwd="$PWD"
cd "$blpkgdir"
while IFS=":" read partname part_offset part_size part_file; do
if [ "$BOOTDEV_TYPE" = "spi" ]; then
if ! program_spi_partition "$partname" "$part_offset" "$part_size" "$part_file"; then
rc=1
break
fi
elif [ "$BOOTDEV_TYPE" = "mmcboot" ]; then
if ! program_mmcboot_partition "$partname" "$part_offset" "$part_size" "$part_file"; then
rc=1
break
fi
fi
done < partitions.conf
if [ "$BOOTDEV_TYPE" = "mmcboot" ]; then
echo "1" > /sys/block/mmcblk0boot0/force_ro
echo "1" > /sys/block/mmcblk0boot1/force_ro
fi
cd "$oldwd"
return $rc
}
program_boot_partitions "$@"