blob: 5a2f164ed4c3ed9ea55990565a02312a37fa79c9 [file] [log] [blame]
/*
* Copyright (c) 2019 The Fuchsia Authors
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include <common.h>
#include <emmc_partitions.h>
#include <mmc.h>
#include <zircon_uboot/partition_internal.h>
/*
* ABR and AVB's metadatas used to be located on the 'sysconfig' partition,
* but were split out into their own GPT partitions at the same locations.
* Once the GPT entry is added, these offsets will no longer be used.
*
* This is maintained on Newman to support the bootstrapping via zedboot workflow.
*
* 00000 - CEFFF (828K) sysconfig data
* CF000 - CFFFF (4K) A/B/R metadata
* D0000 - DFFFF (64K) AVB -a metadata
* E0000 - EFFFF (64K) AVB -b metadata
* F0000 - FFFFF (64K) AVB -r metadata
*/
#define ABR_OFFSET 0xCF000
#define AVB_A_OFFSET 0xD0000
#define AVB_B_OFFSET 0xE0000
#define AVB_R_OFFSET 0xF0000
#define ABR_SIZE (4 * 1024)
#define AVB_SIZE (64 * 1024)
#define ZIRCON_PART_SIZE (32 * 1024 * 1024)
// Does not include 1 LBA for protective MBR for primary GPT copy.
#define GPT_SIZE_LBA 33
const char *zircon_abr_partition_name = "durable_boot";
const subpart_t bootloader_composite_sub_partitions[] = {
{
.name = "bootloader_0",
},
{
.name = "bootloader_1",
},
};
const zircon_partition_data_t zircon_partition_map[] = {
{
.name = "bootloader",
.type = ZIRCON_PART_TYPE_COMPOSITE,
.prioritize_over_gpt = true,
.fastboot_locked_access = ZIRCON_PARTITION_ACCESS_FLAG_WRITE,
.sub_parts = bootloader_composite_sub_partitions,
.sub_parts_count =
ARRAY_SIZE(bootloader_composite_sub_partitions),
},
{
.name = "bootloader_0",
.type = ZIRCON_PART_TYPE_RAW_EMMC,
.prioritize_over_gpt = true,
.hw_part = MMC_PART_BOOT0,
.lba_offset = 1, // skip boot_info
},
{
.name = "bootloader_1",
.type = ZIRCON_PART_TYPE_RAW_EMMC,
.prioritize_over_gpt = true,
.hw_part = MMC_PART_BOOT1,
.lba_offset = 1, // skip boot_info
},
{
.name = "boot_info_0",
.type = ZIRCON_PART_TYPE_RAW_EMMC,
.prioritize_over_gpt = true,
.hw_part = MMC_PART_BOOT0,
.lba_offset = 0,
.lba_size = 1,
},
{
.name = "boot_info_1",
.type = ZIRCON_PART_TYPE_RAW_EMMC,
.prioritize_over_gpt = true,
.hw_part = MMC_PART_BOOT1,
.lba_offset = 0,
.lba_size = 1,
},
{
.name = "boot0",
.type = ZIRCON_PART_TYPE_RAW_EMMC,
.prioritize_over_gpt = true,
.hw_part = MMC_PART_BOOT0,
},
{
.name = "boot1",
.type = ZIRCON_PART_TYPE_RAW_EMMC,
.prioritize_over_gpt = true,
.hw_part = MMC_PART_BOOT1,
},
{
.name = "gpt",
.type = ZIRCON_PART_TYPE_GPT,
.prioritize_over_gpt = true,
// Only for reading / erasing
.hw_part = MMC_PART_USER,
.lba_offset = 0,
.lba_size = GPT_SIZE_LBA + 1, // includes protective MBR
},
{
.name = "mbr",
.type = ZIRCON_PART_TYPE_RAW_EMMC,
.prioritize_over_gpt = true,
.hw_part = MMC_PART_USER,
.lba_offset = 0,
.lba_size = 1,
},
{
.name = "gpt_primary",
.type = ZIRCON_PART_TYPE_RAW_EMMC,
.prioritize_over_gpt = true,
.hw_part = MMC_PART_USER,
.lba_offset = 1,
.lba_size = GPT_SIZE_LBA,
},
{
.name = "gpt_backup",
.type = ZIRCON_PART_TYPE_RAW_EMMC,
.prioritize_over_gpt = true,
.hw_part = MMC_PART_USER,
.lba_offset = -GPT_SIZE_LBA,
.lba_size = GPT_SIZE_LBA,
},
{
.name = ZIRCON_PARTITION_PREFIX "_a",
.fastboot_locked_access = ZIRCON_PARTITION_ACCESS_FLAG_WRITE,
.gpt_name = "boot",
},
{
.name = ZIRCON_PARTITION_PREFIX "_b",
.fastboot_locked_access = ZIRCON_PARTITION_ACCESS_FLAG_WRITE,
.gpt_name = "system",
// Only the first 32MiB of system is zircon_b
// The rest is part of fvm.
.size = ZIRCON_PART_SIZE,
},
{
.name = ZIRCON_PARTITION_PREFIX "_r",
.fastboot_locked_access = ZIRCON_PARTITION_ACCESS_FLAG_WRITE,
.gpt_name = "recovery",
},
{
.name = "durable_boot",
// Only erase for misc/durable_boot to reset A/B/R metadata. Changing state
// otherwise should use calls like `set_active` instead of direct writes.
.fastboot_locked_access = ZIRCON_PARTITION_ACCESS_FLAG_ERASE,
// maintains support for zedboot-partitioned devices with 'misc' partition
.gpt_name = "misc",
},
{
// maintains support for `fastboot erase misc` on all devices
.name = "misc",
.fastboot_locked_access = ZIRCON_PARTITION_ACCESS_FLAG_ERASE,
.gpt_name = "durable_boot",
},
{
.name = "vbmeta_a",
.fastboot_locked_access = ZIRCON_PARTITION_ACCESS_FLAG_WRITE,
.gpt_name = "sysconfig",
.gpt_offset = AVB_A_OFFSET,
.size = AVB_SIZE,
},
{
.name = "vbmeta_b",
.fastboot_locked_access = ZIRCON_PARTITION_ACCESS_FLAG_WRITE,
.gpt_name = "sysconfig",
.gpt_offset = AVB_B_OFFSET,
.size = AVB_SIZE,
},
{
.name = "vbmeta_r",
.fastboot_locked_access = ZIRCON_PARTITION_ACCESS_FLAG_WRITE,
.gpt_name = "sysconfig",
.gpt_offset = AVB_R_OFFSET,
.size = AVB_SIZE,
},
{
.name = "fuchsia-fvm",
.fastboot_locked_access = ZIRCON_PARTITION_ACCESS_FLAG_WRITE,
},
{
// Expose "fvm" as an alias for "fuchsia-fvm" for consistency with
// other devices.
.name = "fvm",
.fastboot_locked_access = ZIRCON_PARTITION_ACCESS_FLAG_WRITE,
.gpt_name = "fuchsia-fvm",
},
{
.name = MMC_SECURE_STORAGE_NAME,
.fastboot_locked_access = ZIRCON_PARTITION_ACCESS_DEV_ONLY,
.gpt_name = "reserved",
.gpt_offset = MMC_SECURE_STORAGE_OFFSET,
.size = MMC_SECURE_STORAGE_SIZE,
},
};
const size_t zircon_partition_map_count = ARRAY_SIZE(zircon_partition_map);