Introduction

Rockchip use GPT as its main partition table in open source support. We store GPT at LBA0 ~ LBA63.

GPT partition table in U-boot

U-boot supports standard GPT partition table format.

Default partition map

Partition Start Sector Number of Sectors Partition Size Mount Point Requirements
MBR 0 00000000 1 00000001 512 0.5KB
Primary GPT 1 00000001 63 0000003F 32256 31.5KB
loader1 64 00000040 8000 00001F40 4096000 3.91MB miniloader or uboot
reserved1 8064 00001F80 128 00000080 65536 64KB
reserved2 8192 00002000 8192 00002000 4194304 4MB parameter or vendor data
loader2 16384 00004000 8192 00002000 4194304 4MB uboot when using miniloader
atf 24576 00006000 8192 00002000 4194304 4MB arm trusted firmware, trusted-os
boot(bootable must be set) 32768 00008000 229376 00038000 117440512 112MB kernela, kernelb, dts, extlinux.conf, ramdisk
rootfs 262144 00040000 - - - -MB Linux system
Secondary GPT 16777183 00FFFFDF 33 00000021 16896 16.5KB

How to modify GPT partition table through U-boot

In u-boot console, the "gpt" command can be used to write the gpt partition table:

gpt - GUID Partition Table

Usage:
gpt <command> <interface> <dev> <partitions_list>
 - GUID partition table restoration and validity check
 Restore or verify GPT information on a device connected
 to interface
 Example usage:
 gpt write mmc 0 $partitions
 gpt verify mmc 0 $partitions

for exsample:

=> env set partitions name=rootfs,size=-,type=system
=> gpt write mmc 0 $partitions
Writing GPT: success!

NOTE: the partitions env can be set in the u-boot console(using "env set" command), or in u-boot's source code,
for exsample:
include/configs/kylin_rk3036.h
#define PARTS_DEFAULT \
        "uuid_disk=${uuid_gpt_disk};" \
...

#undef CONFIG_EXTRA_ENV_SETTINGS
#define CONFIG_EXTRA_ENV_SETTINGS \
        "partitions=" PARTS_DEFAULT \

How to modify GPT partition table through U-boot's fastboot

The current upstream u-boot contains fastboot protocol support. And this version of fastboot supports 2 ways to modify gpt partition table:

1/ fastboot oem format:
It's the same as "gpt write mmc 0 $partitions" in u-boot console:

#ifdef CONFIG_FASTBOOT_FLASH_MMC_DEV
        if (strncmp("format", cmd + 4, 6) == 0) {
                char cmdbuf[32];
                sprintf(cmdbuf, "gpt write mmc %x $partitions",
                        CONFIG_FASTBOOT_FLASH_MMC_DEV);
                if (run_command(cmdbuf, 0))
                        fastboot_tx_write_str("FAIL");
                else
                        fastboot_tx_write_str("OKAY");
        } else
#endif

PC command:

$ fastboot oem format -i 0x2207
...
OKAY [  0.015s]
finished. total time: 0.015s

2/ fastboot flash gpt <gpt partition image>

        if (strcmp(cmd, CONFIG_FASTBOOT_GPT_NAME) == 0) {
                printf("%s: updating MBR, Primary and Backup GPT(s)\n",
                       __func__);
                if (is_valid_gpt_buf(dev_desc, download_buffer)) {
                        printf("%s: invalid GPT - refusing to write to flash\n",
                               __func__);
                        fastboot_fail(response_str, "invalid GPT partition");
                        return;
                }
                if (write_mbr_and_gpt_partitions(dev_desc, download_buffer)) {
                        printf("%s: writing GPT partitions failed\n", __func__);
                        fastboot_fail(response_str,
                                      "writing GPT partitions failed");
                        return;
                }
                printf("........ success\n");
                fastboot_okay(response_str, "");
                return;

The gpt partition image can be generated by PC's gdisk tool,
for exsample:

$ dd if=/dev/zero of=disk.img bs=1M count=256
256+0 records in
256+0 records out
268435456 bytes (268 MB) copied, 0.151867 s, 1.8 GB/s

$ gdisk disk.img
GPT fdisk (gdisk) version 0.8.1

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries.

Command (? for help): n
Partition number (1-128, default 1):
First sector (34-524254, default = 34) or {+-}size{KMGTP}:
Information: Moved requested sector from 34 to 2048 in
order to align on 2048-sector boundaries.
Use 'l' on the experts' menu to adjust alignment
Last sector (2048-524254, default = 524254) or {+-}size{KMGTP}:
Current type is 'Linux filesystem'
Hex code or GUID (L to show codes, Enter = 8300):
Changed type of partition to 'Linux filesystem'

Command (? for help): w

Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!

Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT).
Warning: The kernel is still using the old partition table.
The new table will be used at the next reboot.
The operation has completed successfully.

$ dd if=disk.img of=gpt.img count=64
64+0 records in
64+0 records out
32768 bytes (33 kB) copied, 0.00075438 s, 43.4 MB/s

PC command:

$ fastboot flash gpt gpt.img
target reported max download size of 117440512 bytes
sending 'gpt' (32 KB)...
OKAY [  0.006s]
writing 'gpt'...
OKAY [  0.025s]
finished. total time: 0.030s