unifreq / linux-6.1.y

clone from https://github.com/chewitt/linux branch amlogic-6.1.y, And will add some patches that I have collected, which can be used for the aarch64 openwrt firmware, or for general occasions such as armbian.
Other
39 stars 58 forks source link

Experimental native support for Amlogic's proprietary eMMC partition table #11

Closed 7Ji closed 1 year ago

7Ji commented 1 year ago

This adds experimental support for Amlogic's proprietary eMMC partition table to the kernel, based on my reverse engineering results previously only available in ampart

The support is added in the kernel's block subsystem, not in the MMC driver, so it can now identify such partition layout on any block device, e.g.:

It will also send udev events with correct block names so the following udev rule could be used to create symlinks under /dev/block with correponding name for easy access:

SUBSYSTEM=="block", KERNEL=="mmcblk2p*", ENV{DEVTYPE}=="partition", SYMLINK+="block/$env{PARTNAME}"

Symlinks under /dev/block with the above udev rules:

# ls -al /dev/block/
total 0
drwxr-xr-x  2 root root  740 Feb 18 08:41 .
drwxr-xr-x 16 root root 3500 Feb 23 23:35 ..
lrwxrwxrwx  1 root root   10 Feb 18 08:41 179:0 -> ../mmcblk1
lrwxrwxrwx  1 root root   12 Feb 18 08:41 179:1 -> ../mmcblk1p1
lrwxrwxrwx  1 root root   12 Feb 18 08:41 179:2 -> ../mmcblk1p2
lrwxrwxrwx  1 root root   12 Feb 18 08:41 179:3 -> ../mmcblk1p3
lrwxrwxrwx  1 root root   10 Feb 18 08:41 179:32 -> ../mmcblk2
lrwxrwxrwx  1 root root   12 Feb 18 08:41 179:33 -> ../mmcblk2p1
lrwxrwxrwx  1 root root   12 Feb 18 08:41 179:34 -> ../mmcblk2p2
lrwxrwxrwx  1 root root   12 Feb 18 08:41 179:35 -> ../mmcblk2p3
lrwxrwxrwx  1 root root   12 Feb 18 08:41 179:36 -> ../mmcblk2p4
lrwxrwxrwx  1 root root   12 Feb 18 08:41 179:37 -> ../mmcblk2p5
lrwxrwxrwx  1 root root   12 Feb 18 08:41 179:38 -> ../mmcblk2p6
lrwxrwxrwx  1 root root   12 Feb 18 08:41 179:39 -> ../mmcblk2p7
lrwxrwxrwx  1 root root   12 Feb 18 08:41 179:40 -> ../mmcblk2p8
lrwxrwxrwx  1 root root   12 Feb 18 08:41 179:41 -> ../mmcblk2p9
lrwxrwxrwx  1 root root   13 Feb 18 08:41 179:42 -> ../mmcblk2p10
lrwxrwxrwx  1 root root   13 Feb 18 08:41 179:43 -> ../mmcblk2p11
lrwxrwxrwx  1 root root   13 Feb 18 08:41 179:44 -> ../mmcblk2p12
lrwxrwxrwx  1 root root   13 Feb 18 08:41 179:45 -> ../mmcblk2p13
lrwxrwxrwx  1 root root   13 Feb 18 08:41 179:46 -> ../mmcblk2p14
lrwxrwxrwx  1 root root   15 Feb 18 08:41 179:64 -> ../mmcblk2boot0
lrwxrwxrwx  1 root root   15 Feb 18 08:41 179:96 -> ../mmcblk2boot1
lrwxrwxrwx  1 root root   13 Feb 18 08:41 boot -> ../mmcblk2p11
lrwxrwxrwx  1 root root   12 Feb 18 08:41 cache -> ../mmcblk2p2
lrwxrwxrwx  1 root root   12 Feb 18 08:41 crypt -> ../mmcblk2p8
lrwxrwxrwx  1 root root   13 Feb 18 08:41 data -> ../mmcblk2p14
lrwxrwxrwx  1 root root   12 Feb 18 08:41 env -> ../mmcblk2p3
lrwxrwxrwx  1 root root   13 Feb 18 08:41 instaboot -> ../mmcblk2p10
lrwxrwxrwx  1 root root   12 Feb 18 08:41 logo -> ../mmcblk2p4
lrwxrwxrwx  1 root root   12 Feb 18 08:41 misc -> ../mmcblk2p9
lrwxrwxrwx  1 root root   13 Feb 18 08:41 params -> ../mmcblk2p13
lrwxrwxrwx  1 root root   12 Feb 18 08:41 recovery -> ../mmcblk2p5
lrwxrwxrwx  1 root root   12 Feb 18 08:41 reserved -> ../mmcblk2p1
lrwxrwxrwx  1 root root   12 Feb 18 08:41 rsv -> ../mmcblk2p6
lrwxrwxrwx  1 root root   13 Feb 18 08:41 system -> ../mmcblk2p12
lrwxrwxrwx  1 root root   12 Feb 18 08:41 tee -> ../mmcblk2p7

Priority

Such partitions will be parsed after all other existing partition types including MBR and GPT. So it will only be recognized if there is no MBR or GPT. This is also the way Amlogic handles it.

Userspace

My project ampart provides a tool that can modify such partition table in userspace

Build

The support could be built with the following config:

CONFIG_AMLOGIC_PARTITION=y

Configuration

The following kernel options are available to set its behaviour:

7Ji commented 1 year ago

刚发现子设备数起始搞错成0了,bootloader分区在p0不会加载出来,需要修一下

7Ji commented 1 year ago

现在OK了 lsblk:

NAME         MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0          7:0    0   128G  0 loop 
├─loop0p1    259:20   0     4M  0 part 
├─loop0p2    259:21   0    64M  0 part 
├─loop0p3    259:22   0   1.1G  0 part 
├─loop0p4    259:23   0     8M  0 part 
├─loop0p5    259:24   0     8M  0 part 
├─loop0p6    259:25   0    24M  0 part 
├─loop0p7    259:26   0     8M  0 part 
├─loop0p8    259:27   0     8M  0 part 
├─loop0p9    259:28   0     8M  0 part 
├─loop0p10   259:29   0    16M  0 part 
├─loop0p11   259:30   0    16M  0 part 
├─loop0p12   259:31   0    16M  0 part 
├─loop0p13   259:32   0    16M  0 part 
├─loop0p14   259:33   0     2M  0 part 
├─loop0p15   259:34   0    32M  0 part 
├─loop0p16   259:35   0   320M  0 part 
├─loop0p17   259:36   0   128M  0 part 
├─loop0p18   259:37   0   1.8G  0 part 
├─loop0p19   259:38   0   128M  0 part 
└─loop0p20   259:39   0 112.6G  0 part

ampart:

# ampart /dev/loop0p2 --mode esnapshot 2> /dev/null | tail -n 1
bootloader:0B:4M:0 reserved:36M:64M:0 cache:108M:1120M:2 env:1236M:8M:0 logo:1252M:8M:1 recovery:1268M:24M:1 misc:1300M:8M:1 dtbo:1316M:8M:1 cri_data:1332M:8M:2 param:1348M:16M:2 boot:1372M:16M:1 rsv:1396M:16M:1 metadata:1420M:16M:1 vbmeta:1444M:2M:1 tee:1454M:32M:1 vendor:1494M:320M:1 odm:1822M:128M:1 system:1958M:1856M:1 product:3822M:128M:1 data:3958M:115318M:4

dmesg:

[   66.012887] loop0: detected capacity change from 0 to 268435456
[   66.017127] apt_blkdevs is not set, all blocks should be parsed
[   66.022780]  loop0: p1(bootloader) p2(reserved) p3(cache) p4(env) p5(logo) p6(recovery) p7(misc) p8(dtbo) p9(cri_data) p10(param) p11(boot) p12(rsv) p13(metadata) p14(vbmeta) p15(tee) p16(vendor) p17(odm) p18(system) p19(product) p20(data)