On Fri 2021-09-17 @ 06:01:21 PM, Trevor Woerner via lists.yoctoproject.org wrote:
Recent upstream kernel changes have made the mmc probing order unpredictable. Therefore, boards with both an emmc and sdmmc interface aren't guaranteed to boot with a hard-coded root device selected.
For example, on the rock64, with linux-yocto 5.10.y, using the uSD card (i.e. the sdmmc interface) about 50% of the time the boot would succeed, and roughly 50% of the time it wouldn't:
... [ 0.612233] Waiting for root device /dev/mmcblk1p7... [ 0.634551] mmc_host mmc1: Bus speed (slot 0) = 300000Hz (slot req 300000Hz, actual 300000HZ div = 0) [ 0.639064] mmc_host mmc0: Bus speed (slot 0) = 50000000Hz (slot req 50000000Hz, actual 50000000HZ di) [ 0.640007] mmc0: new high speed SDXC card at address 5048 [ 0.641176] mmcblk0: mmc0:5048 SD64G 58.0 GiB [ 0.647610] random: fast init done [ 0.648279] GPT:Primary header thinks Alt. header is not at the end of the disk. [ 0.648941] GPT:376479 != 121634815 [ 0.649252] GPT:Alternate GPT header not at the end of the disk. [ 0.649796] GPT:376479 != 121634815 [ 0.650106] GPT: Use GNU Parted to correct GPT errors. [ 0.650598] mmcblk0: p1 p2 p3 p4 p5 p6 p7
NOTE the discrepancy between the kernel waiting for device /dev/mmcblk1p7, which comes from the hard-coded kernel cmdline, and the kernel probing putting the sdmmc on mmcblk0.
With linux-yocto 5.13.y on the rock64 using the uSD card the board would never boot, the sdmmc always appears on mmcblk0.
Instead of simply changing the hard-coded root device (i.e. from mmcblk0 to mmcblk1) switch to using partition UUIDs instead. Hard-coding the boot device would work with 5.13.y but would fail 50% of the time with 5.10.y; who knows what other kernels will do?
In any case, switching to UUIDs works regardless of board, kernel, or available mmc interfaces.