u-boot: boot.ini usa LABEL= em vez de /dev/mmcblkN paths

Issue archr-linux/Arch-R#34: ao inserir um segundo cartão SD em TF2,
o boot falha com "cannot find mmcblk1p1" + countdown para poweroff.

Causa:
  - Linux enumera os controladores MMC do RK3326 por ordem do DT:
      ff380000.mmc -> mmc0 -> /dev/mmcblk0 (TF2, slot secundário)
      ff370000.mmc -> mmc1 -> /dev/mmcblk1 (TF1, slot com o OS)
  - U-Boot enumera por ordem de probe dos slots; com TF2 populado o
    devnum repassado para a sysboot pode acabar diferente do que o
    kernel apresenta como /dev/mmcblk1.
  - clone_boot.ini e original_boot.ini montavam o kernel cmdline como
    `boot=/dev/mmcblk${devnum}p1 root=...p2 disk=...p3`, então a
    troca de devnum quebrava o /init busybox.

Fix:
  Substituir o path hardcoded por LABEL=@DISTRO_BOOTLABEL@ (sed do
  package.mk já existia mas não tinha onde substituir; agora cobre
  ARCHR / ARCHR_ROOT / STORAGE). O /init busybox já trata LABEL= via
  findfs + fallback de blkid scan em mmcblk0/mmcblk1, então a partição
  certa é encontrada independente da ordem de enumeração — sobrevive
  a 2-SD, troca de slot, ou qualquer reorder que U-Boot decida fazer.

Kernel cmdline antes:
  boot=/dev/mmcblk1p1 root=/dev/mmcblk1p2 disk=/dev/mmcblk1p3
Depois:
  boot=LABEL=ARCHR    root=LABEL=ARCHR_ROOT disk=LABEL=STORAGE

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Douglas Teles
2026-06-24 12:02:09 -03:00
parent e48e9675a9
commit 0689a89c47
2 changed files with 24 additions and 11 deletions
@@ -10,11 +10,18 @@ fi
setenv thispart "${devtype} ${devnum}:${distro_bootpart}"
setenv storagepart "${devtype} ${devnum}:${distro_storagepart}"
# Clone hardware: SD card is mmcblk0 (U-Boot devnum=1 doesn't match kernel)
setenv mmcdev ${devnum}
setenv partition_boot "/dev/mmcblk${mmcdev}p${distro_bootpart}"
setenv partition_root "/dev/mmcblk${mmcdev}p2"
setenv partition_storage "/dev/mmcblk${mmcdev}p3"
# Usar LABEL= em vez de /dev/mmcblk${devnum}p... porque a numeração do
# U-Boot (devnum=0/1/2 conforme o slot probado primeiro) não bate com
# a enumeração estável do kernel (mmc0=ff380000 TF2, mmc1=ff370000
# TF1). Quando o usuário insere um SD em TF2, U-Boot pode escolher um
# devnum diferente do que o Linux apresenta como /dev/mmcblk1, e o
# /init falhava em montar `boot=/dev/mmcblk1p1` ("cannot find
# mmcblk1p1" + countdown to poweroff — issue #34). LABEL= é resolvido
# pelo /init busybox via findfs/blkid em qualquer mmcblk que tenha a
# partição com a label correta — sobrevive a reordenamento de slots.
setenv partition_boot "LABEL=@DISTRO_BOOTLABEL@"
setenv partition_root "LABEL=@DISTRO_ROOTLABEL@"
setenv partition_storage "LABEL=@DISTRO_DISKLABEL@"
# Just in case this script is executed by (patched?) hardkernel u-boot, recover adc value from hwrev
if test -n "${hwid_adc}"; then setenv adc ${hwid_adc}; echo "ADC ${hwid_adc}" # mainline u-boot, just use real value
@@ -16,12 +16,18 @@ fi
setenv thispart "${devtype} ${devnum}:${distro_bootpart}"
setenv storagepart "${devtype} ${devnum}:${distro_storagepart}"
# Use device paths based on U-Boot mmc device number
# mmc 1 in U-Boot = /dev/mmcblk1 in Linux (SD card on RK3326)
setenv mmcdev ${devnum}
setenv partition_boot "/dev/mmcblk${mmcdev}p${distro_bootpart}"
setenv partition_root "/dev/mmcblk${mmcdev}p2"
setenv partition_storage "/dev/mmcblk${mmcdev}p3"
# Usar LABEL= em vez de /dev/mmcblk${devnum}p... porque a numeração do
# U-Boot (devnum=0/1/2 conforme o slot probado primeiro) não bate com
# a enumeração estável do kernel (mmc0=ff380000 TF2, mmc1=ff370000
# TF1). Quando o usuário insere um SD em TF2, U-Boot pode escolher um
# devnum diferente do que o Linux apresenta como /dev/mmcblk1, e o
# /init falhava em montar `boot=/dev/mmcblk1p1` ("cannot find
# mmcblk1p1" + countdown to poweroff — issue #34). LABEL= é resolvido
# pelo /init busybox via findfs/blkid em qualquer mmcblk que tenha a
# partição com a label correta — sobrevive a reordenamento de slots.
setenv partition_boot "LABEL=@DISTRO_BOOTLABEL@"
setenv partition_root "LABEL=@DISTRO_ROOTLABEL@"
setenv partition_storage "LABEL=@DISTRO_DISKLABEL@"
# Just in case this script is executed by (patched?) hardkernel u-boot, recover adc value from hwrev
if test -n "${hwid_adc}"; then setenv adc ${hwid_adc}; echo "ADC ${hwid_adc}" # mainline u-boot, just use real value