Skip to content
Snippets Groups Projects
Commit f51d6ff2 authored by Mikhail Kshevetskiy's avatar Mikhail Kshevetskiy
Browse files

airoha: write gpt partitions during first upgrade from pre-GPT_on_eMMC era

parent cf81164b
Branches
Tags
1 merge request!1364airoha: GPT support
#!/bin/sh #!/bin/sh
source /lib/functions.sh
source /lib/functions/iopsys-system-layout.sh
source /lib/upgrade/platform.sh
invocation=$1 invocation=$1
image=$2 image=$2
log_tag="$0 $1" log_tag="$0 $1"
gpt_era_bootloader_version=8000
old_bootloader_marker="/tmp/_pre_GPT_on_eMMC_bootloader_detected"
log() { log() {
logger -s -p daemon.info -t "$log_tag" -- "$@" logger -s -p daemon.info -t "$log_tag" -- "$@"
} }
do_pre_upgrade() { do_pre_upgrade() {
local image=$1 local image=$1
local bootloader_dev
local bootloader_version
log "- pre_upgrade -" log "- pre_upgrade -"
if [ ! -d /sys/bus/platform/drivers/en75xx-spi ]; then if [ ! -d /sys/bus/platform/drivers/en75xx-spi ]; then
log "ERROR: en7xx-spi bus driver is not detected. For upgrade from IOWRT 6.5, please upgrade to IOWRT 7.3.x (or 7.2.x or 7.1.x) first." log "ERROR: en7xx-spi bus driver is not detected. For upgrade from IOWRT 6.5, please upgrade to IOWRT 7.3.x (or 7.2.x or 7.1.x) first."
...@@ -19,15 +29,88 @@ do_pre_upgrade() { ...@@ -19,15 +29,88 @@ do_pre_upgrade() {
log "ERROR: spi-nand flash driver is not detected. For upgrade from IOWRT 6.5, please upgrade to IOWRT 7.3.x (or 7.2.x or 7.1.x) first." log "ERROR: spi-nand flash driver is not detected. For upgrade from IOWRT 6.5, please upgrade to IOWRT 7.3.x (or 7.2.x or 7.1.x) first."
exit 1 exit 1
fi fi
if [ "$(get_root_device_type)" = emmc ]; then
# booted from eMMC
bootloader_dev=$(get_bootloader_dev)
if [ -e "${bootloader_dev}" ]; then
bootloader_version=$(get_bootloader_version $bootloader_dev)
if [ ${bootloader_version} -lt ${gpt_era_bootloader_version} ]; then
# old bootloader detected, create a mark for post_upgrade
touch ${old_bootloader_marker}
else
# no additional steps required, remove mark (if someone create it)
rm -f ${old_bootloader_marker}
fi
fi
fi
return 0 return 0
} }
do_post_upgrade() { do_post_upgrade() {
local image=$1 local image=$1
local bootloader_dev
local bootloader_version
log "- post_upgrade -" log "- post_upgrade -"
if [ "$(get_root_device_type)" = emmc ]; then
# booted from eMMC
bootloader_dev=$(get_bootloader_dev)
if [ -e "${bootloader_dev}" ]; then
bootloader_version=$(get_bootloader_version $bootloader_dev)
if [ ${bootloader_version} -ge ${gpt_era_bootloader_version} ] && [ -e ${old_bootloader_marker} ]; then
# bootloader was just upgraded from pre-GPT_on_eMMC era.
# GPT partitions on eMMC needs to be created
do_gpt_partitions_create $image
fi
fi
fi
return 0 return 0
} }
get_bootloader_dev () {
local dev
dev=$(system_layout_device_spec_to_device block:bootloader 2>/dev/null)
[ ! -e "$dev" ] && dev=$(__get_bootloader_device 2>/dev/null)
[ ! -e "$dev" ] && dev=""
echo "$dev"
}
get_bootloader_version() {
local iopsys_bootloader_version="0"
local loader_device="$1"
json_init
json_load "$(strings "$loader_device" | awk '/938f0820-2ffb-11e7-bbc9-2f21351ee6fb:/ {$1=""; print $0}' 2> /dev/null | head -n1 | awk '{$1=$1; print}')"
json_get_vars iopsys_bootloader_version
iopsys_bootloader_version=$((iopsys_bootloader_version))
echo "${iopsys_bootloader_version}"
}
do_gpt_partitions_create() {
local image="$1"
local board_name=$(board_name)
local block_dev=$(get_real_root_device | sed 's/p[0-9]*$//')
local gpt_primary_header gpt_primary_entry gpt_alternate
local gpt_primary_entry_offset gpt_alternate_offset
gpt_primary_header=$(fdtget -t s "$image" "/configurations/${board_name}" gpt-primary-header 2>/dev/null)
gpt_primary_entry=$(fdtget -t s "$image" "/configurations/${board_name}" gpt-primary-entry 2>/dev/null)
gpt_primary_entry_offset=$(fdtget -t u "$image" "/configurations/${board_name}" gpt-primary-entry-offset 2>/dev/null)
gpt_alternate=$(fdtget -t s "$image" "/configurations/${board_name}" gpt-alternate 2>/dev/null)
gpt_alternate_offset=$(fdtget -t u "$image" "/configurations/${board_name}" gpt-alternate-offset 2>/dev/null)
if [ 0 -lt ${gpt_primary_entry_offset} ] && [ 0 -lt ${gpt_alternate_offset} ]; then
log "Writing GPT partition table to ${block_dev} device..."
[ $? -eq 0 ] && fdtextract -e ${gpt_primary_header} ${image} | dd of=${block_dev} bs=512 count=2
[ $? -eq 0 ] && fdtextract -e ${gpt_primary_entry} ${image} | dd of=${block_dev} bs=512 count=32 seek=${gpt_primary_entry_offset}
[ $? -eq 0 ] && fdtextract -e ${gpt_alternate} ${image} | dd of=${block_dev} bs=512 count=33 seek=${gpt_alternate_offset}
[ $? -eq 0 ] && sync "${block_dev}"
fi
return $?;
}
case $invocation in case $invocation in
pre_upgrade) pre_upgrade)
do_pre_upgrade $image do_pre_upgrade $image
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment