Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
EFI booting is used on newer machines compatible with the Arm SystemReady specifications. This commit restructures armvirt into a more 'generic' target similar to x86. See #4956 for a history of this port. Signed-off-by: Mathew McBride <matt@traverse.com.au>
- Loading branch information
1 parent
16a2051
commit e0f06dd
Showing
11 changed files
with
393 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
#!/bin/sh | ||
# SPDX-License-Identifier: GPL-2.0-or-later | ||
|
||
. /lib/functions/uci-defaults.sh | ||
|
||
board_config_update | ||
|
||
board=$(board_name) | ||
|
||
case "$board" in | ||
traverse,ten64) | ||
ucidef_set_led_netdev "sfp1" "SFP 1" "ten64:green:sfp1:down" "eth8" "link tx rx" | ||
ucidef_set_led_netdev "sfp2" "SFP 2" "ten64:green:sfp2:up" "eth9" "link tx rx" | ||
;; | ||
esac | ||
|
||
board_config_flush | ||
|
||
exit 0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
#!/bin/sh | ||
# SPDX-License-Identifier: GPL-2.0-or-later | ||
|
||
. /lib/functions/system.sh | ||
. /lib/functions/uci-defaults.sh | ||
|
||
board_config_update | ||
|
||
case "$(board_name)" in | ||
traverse,ten64) | ||
ucidef_set_interface_lan "eth0 eth1 eth2 eth3" | ||
ucidef_set_interface_wan "eth6" | ||
;; | ||
esac | ||
|
||
board_config_flush | ||
|
||
exit 0 |
23 changes: 23 additions & 0 deletions
23
target/linux/armvirt/base-files/etc/board.d/03_gpio_switches
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
#!/bin/sh | ||
# SPDX-License-Identifier: GPL-2.0-or-later | ||
|
||
. /lib/functions/uci-defaults.sh | ||
|
||
board_config_update | ||
|
||
board=$(board_name) | ||
|
||
case "$board" in | ||
traverse,ten64) | ||
ucidef_add_gpio_switch "lte_reset" "Cell Modem Reset" "376" | ||
ucidef_add_gpio_switch "lte_power" "Cell Modem Power" "377" | ||
ucidef_add_gpio_switch "lte_disable" "Cell Modem Airplane mode" "378" | ||
ucidef_add_gpio_switch "gnss_disable" "Cell Modem Disable GNSS receiver" "379" | ||
ucidef_add_gpio_switch "lower_sfp_txidsable" "Lower SFP+ TX Disable" "369" | ||
ucidef_add_gpio_switch "upper_sfp_txdisable" "Upper SFP+ TX Disable" "373" | ||
;; | ||
esac | ||
|
||
board_config_flush | ||
|
||
exit 0 |
52 changes: 52 additions & 0 deletions
52
target/linux/armvirt/base-files/lib/preinit/01_sysinfo_acpi
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
# SPDX-License-Identifier: GPL-2.0-or-later | ||
|
||
sanitize_name_arm64() { | ||
sed -e ' | ||
y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/; | ||
s/[^a-z0-9_-]\+/-/g; | ||
s/^-//; | ||
s/-$//; | ||
' "$@" | ||
} | ||
|
||
do_sysinfo_arm64() { | ||
local vendor product file | ||
|
||
for file in sys_vendor board_vendor; do | ||
vendor="$(cat /sys/devices/virtual/dmi/id/$file 2>/dev/null)" | ||
case "$vendor" in | ||
empty | \ | ||
System\ manufacturer | \ | ||
To\ [bB]e\ [fF]illed\ [bB]y\ O\.E\.M\.) | ||
continue | ||
;; | ||
esac | ||
[ -n "$vendor" ] && break | ||
done | ||
|
||
for file in product_name board_name; do | ||
product="$(cat /sys/devices/virtual/dmi/id/$file 2>/dev/null)" | ||
case "$vendor:$product" in | ||
?*:empty | \ | ||
?*:System\ Product\ Name | \ | ||
?*:To\ [bB]e\ [fF]illed\ [bB]y\ O\.E\.M\.) | ||
continue | ||
;; | ||
?*:?*) | ||
break | ||
;; | ||
esac | ||
done | ||
|
||
[ -d "/sys/firmware/devicetree/base" ] && return | ||
|
||
[ -n "$vendor" -a -n "$product" ] || return | ||
|
||
mkdir -p /tmp/sysinfo | ||
|
||
echo "$vendor $product" > /tmp/sysinfo/model | ||
|
||
sanitize_name_arm64 /tmp/sysinfo/model > /tmp/sysinfo/board_name | ||
} | ||
|
||
boot_hook_add preinit_main do_sysinfo_arm64 |
164 changes: 164 additions & 0 deletions
164
target/linux/armvirt/base-files/lib/upgrade/platform.sh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,164 @@ | ||
# SPDX-License-Identifier: GPL-2.0-or-later | ||
|
||
RAMFS_COPY_BIN="/usr/sbin/blkid" | ||
|
||
platform_check_image() { | ||
local board=$(board_name) | ||
local diskdev partdev diff | ||
[ "$#" -gt 1 ] && return 1 | ||
|
||
v "Board is ${board}" | ||
|
||
export_bootdevice && export_partdevice diskdev 0 || { | ||
v "platform_check_image: Unable to determine upgrade device" | ||
return 1 | ||
} | ||
|
||
get_partitions "/dev/$diskdev" bootdisk | ||
|
||
v "Extract boot sector from the image" | ||
get_image_dd "$1" of=/tmp/image.bs count=63 bs=512b | ||
|
||
get_partitions /tmp/image.bs image | ||
|
||
#compare tables | ||
diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)" | ||
|
||
rm -f /tmp/image.bs /tmp/partmap.bootdisk /tmp/partmap.image | ||
|
||
if [ -n "$diff" ]; then | ||
v "Partition layout has changed. Full image will be written." | ||
ask_bool 0 "Abort" && exit 1 | ||
return 0 | ||
fi | ||
} | ||
|
||
platform_copy_config() { | ||
local partdev parttype=ext4 | ||
|
||
if export_partdevice partdev 2; then | ||
mount -t $parttype -o rw,noatime "/dev/$partdev" /mnt | ||
cp -af "$UPGRADE_BACKUP" "/mnt/$BACKUP_FILE" | ||
umount /mnt | ||
else | ||
v "ERROR: Unable to find partition to copy config data to" | ||
fi | ||
|
||
sleep 5 | ||
} | ||
|
||
# To avoid writing over any firmware | ||
# files (e.g ubootefi.var or firmware/X/ aka EBBR) | ||
# Copy efi/openwrt and efi/boot from the new image | ||
# to the existing ESP | ||
platform_do_upgrade_efi_system_partition() { | ||
local image_file=$1 | ||
local target_partdev=$2 | ||
local image_efisp_start=$3 | ||
local image_efisp_size=$4 | ||
|
||
v "Updating ESP on ${target_partdev}" | ||
NEW_ESP_DIR="/mnt/new_esp_loop" | ||
CUR_ESP_DIR="/mnt/cur_esp" | ||
mkdir "${NEW_ESP_DIR}" | ||
mkdir "${CUR_ESP_DIR}" | ||
|
||
get_image_dd "$image_file" of="/tmp/new_efi_sys_part.img" \ | ||
skip="$image_efisp_start" count="$image_efisp_size" | ||
|
||
mount -t vfat -o loop -o ro /tmp/new_efi_sys_part.img "${NEW_ESP_DIR}" | ||
if [ ! -d "${NEW_ESP_DIR}/efi/boot" ]; then | ||
v "ERROR: Image does not contain EFI boot files (/efi/boot)" | ||
return 1 | ||
fi | ||
|
||
mount -t vfat "/dev/$partdev" "${CUR_ESP_DIR}" | ||
|
||
for d in $(find "${NEW_ESP_DIR}/efi/" -mindepth 1 -maxdepth 1 -type d); do | ||
v "Copying ${d}" | ||
newdir_bname=$(basename "${d}") | ||
rm -rf "${CUR_ESP_DIR}/efi/${newdir_bname}" | ||
cp -r "${d}" "${CUR_ESP_DIR}/efi" | ||
done | ||
|
||
umount "${NEW_ESP_DIR}" | ||
umount "${CUR_ESP_DIR}" | ||
} | ||
|
||
platform_do_upgrade() { | ||
local board=$(board_name) | ||
local diskdev partdev diff | ||
|
||
export_bootdevice && export_partdevice diskdev 0 || { | ||
v "platform_do_upgrade: Unable to determine upgrade device" | ||
return 1 | ||
} | ||
|
||
sync | ||
|
||
if [ "$UPGRADE_OPT_SAVE_PARTITIONS" = "1" ]; then | ||
get_partitions "/dev/$diskdev" bootdisk | ||
|
||
v "Extract boot sector from the image" | ||
get_image_dd "$1" of=/tmp/image.bs count=63 bs=512b | ||
|
||
get_partitions /tmp/image.bs image | ||
|
||
#compare tables | ||
diff="$(grep -F -x -v -f /tmp/partmap.bootdisk /tmp/partmap.image)" | ||
else | ||
diff=1 | ||
fi | ||
|
||
# Only change the partition table if sysupgrade -p is set, | ||
# otherwise doing so could interfere with embedded "single storage" | ||
# (e.g SoC boot from SD card) setups, as well as other user | ||
# created storage (like uvol) | ||
if [ -n "$diff" ] && [ "${UPGRADE_OPT_SAVE_PARTITIONS}" = "0" ]; then | ||
# Need to remove partitions before dd, otherwise the partitions | ||
# that are added after will have minor numbers offset | ||
partx -d - "/dev/$diskdev" | ||
|
||
get_image_dd "$1" of="/dev/$diskdev" bs=4096 conv=fsync | ||
|
||
# Separate removal and addtion is necessary; otherwise, partition 1 | ||
# will be missing if it overlaps with the old partition 2 | ||
partx -a - "/dev/$diskdev" | ||
|
||
return 0 | ||
fi | ||
|
||
#iterate over each partition from the image and write it to the boot disk | ||
while read part start size; do | ||
if export_partdevice partdev $part; then | ||
v "Writing image to /dev/$partdev..." | ||
if [ "$part" = "1" ]; then | ||
platform_do_upgrade_efi_system_partition \ | ||
$1 $partdev $start $size || return 1 | ||
else | ||
v "Normal partition, doing DD" | ||
get_image_dd "$1" of="/dev/$partdev" ibs=512 obs=1M skip="$start" \ | ||
count="$size" conv=fsync | ||
fi | ||
else | ||
v "Unable to find partition $part device, skipped." | ||
fi | ||
done < /tmp/partmap.image | ||
|
||
local parttype=ext4 | ||
|
||
if (blkid > /dev/null) && export_partdevice partdev 1; then | ||
part_magic_fat "/dev/$partdev" && parttype=vfat | ||
mount -t $parttype -o rw,noatime "/dev/$partdev" /mnt | ||
if export_partdevice partdev 2; then | ||
THIS_PART_BLKID=$(blkid -o value -s PARTUUID "/dev/${partdev}") | ||
v "Setting rootfs PARTUUID=${THIS_PART_BLKID}" | ||
sed -i "s/\(PARTUUID=\)[a-f0-9-]\+/\1${THIS_PART_BLKID}/ig" \ | ||
/mnt/efi/openwrt/grub.cfg | ||
fi | ||
umount /mnt | ||
fi | ||
# Provide time for the storage medium to flush before system reset | ||
# (despite the sync/umount it appears NVMe etc. do it in the background) | ||
sleep 5 | ||
} |
Oops, something went wrong.