| /* Copyright (c) 2013 The Chromium OS Authors. All rights reserved. |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef VBOOT_REFERENCE_MTDLIB_H_ |
| #define VBOOT_REFERENCE_MTDLIB_H_ |
| |
| #include "cgptlib.h" |
| #include "sysincludes.h" |
| |
| |
| #define MTD_DRIVE_SIGNATURE "CrOSPart" /* This must be exactly 8 chars */ |
| |
| /* |
| * Bit definitions and masks for MTD attributes. |
| * |
| * 13-16 -- partition number |
| * 9-12 -- partition type |
| * 8 -- success |
| * 7-4 -- tries |
| * 3-0 -- priority |
| */ |
| #define MTD_ATTRIBUTE_PRIORITY_OFFSET (0) |
| #define MTD_ATTRIBUTE_MAX_PRIORITY (15UL) |
| #define MTD_ATTRIBUTE_PRIORITY_MASK (MTD_ATTRIBUTE_MAX_PRIORITY << \ |
| MTD_ATTRIBUTE_PRIORITY_OFFSET) |
| |
| #define MTD_ATTRIBUTE_TRIES_OFFSET (4) |
| #define MTD_ATTRIBUTE_MAX_TRIES (15UL) |
| #define MTD_ATTRIBUTE_TRIES_MASK (MTD_ATTRIBUTE_MAX_TRIES << \ |
| MTD_ATTRIBUTE_TRIES_OFFSET) |
| |
| #define MTD_ATTRIBUTE_SUCCESSFUL_OFFSET (8) |
| #define MTD_ATTRIBUTE_MAX_SUCCESSFUL (1UL) |
| #define MTD_ATTRIBUTE_SUCCESSFUL_MASK (MTD_ATTRIBUTE_MAX_SUCCESSFUL << \ |
| MTD_ATTRIBUTE_SUCCESSFUL_OFFSET) |
| |
| #define MTD_ATTRIBUTE_TYPE_OFFSET (9) |
| #define MTD_ATTRIBUTE_MAX_TYPE (15UL) |
| #define MTD_ATTRIBUTE_TYPE_MASK (MTD_ATTRIBUTE_MAX_TYPE << \ |
| MTD_ATTRIBUTE_TYPE_OFFSET) |
| |
| #define MTD_ATTRIBUTE_NUMBER_OFFSET (13) |
| #define MTD_ATTRIBUTE_MAX_NUMBER (15UL) |
| #define MTD_ATTRIBUTE_NUMBER_MASK (MTD_ATTRIBUTE_MAX_NUMBER << \ |
| MTD_ATTRIBUTE_NUMBER_OFFSET) |
| |
| |
| #define MTD_PARTITION_TYPE_UNUSED 0 |
| #define MTD_PARTITION_TYPE_CHROMEOS_KERNEL 1 |
| #define MTD_PARTITION_TYPE_CHROMEOS_FIRMWARE 2 |
| #define MTD_PARTITION_TYPE_CHROMEOS_ROOTFS 3 |
| #define MTD_PARTITION_TYPE_CHROMEOS_RESERVED 4 |
| #define MTD_PARTITION_TYPE_CHROMEOS_FLAGSTORE 5 |
| #define MTD_PARTITION_TYPE_LINUX_DATA 6 |
| #define MTD_PARTITION_TYPE_EFI 7 |
| #define MTD_PARTITION_TYPE_OTHER 8 |
| |
| /* This is mostly arbitrary at the moment, but gives a little room to expand. */ |
| #define MTD_MAX_PARTITIONS 16 |
| |
| |
| |
| typedef struct { |
| uint32_t starting_lba; |
| uint32_t ending_lba; |
| uint32_t flags; |
| uint32_t reserved; |
| } __attribute__((packed)) MtdDiskPartition; |
| |
| typedef struct { |
| unsigned char signature[8]; |
| /* For compatibility, this is only ever the CRC of the first |
| * MTD_DRIVE_V1_SIZE bytes. Further extensions must include their own CRCs, |
| * so older FW can boot newer layouts if we expand in the future. |
| */ |
| uint32_t crc32; |
| uint32_t size; |
| uint32_t first_lba; |
| uint32_t last_lba; |
| MtdDiskPartition partitions[MTD_MAX_PARTITIONS]; |
| } __attribute__((packed)) MtdDiskLayout; |
| |
| #define MTD_DRIVE_V1_SIZE (24 + 16*16) |
| |
| #define MTDENTRY_EXPECTED_SIZE (16) |
| #define MTDLAYOUT_EXPECTED_SIZE (24 + 16 * MTDENTRY_EXPECTED_SIZE) |
| |
| |
| typedef struct { |
| /* Specifies the flash geometry, in erase blocks & write pages */ |
| uint32_t flash_block_bytes; |
| uint32_t flash_page_bytes; |
| |
| /* Location, in blocks, of FTS partition */ |
| uint32_t fts_block_offset; |
| /* Size, in blocks, of FTS partition */ |
| uint32_t fts_block_size; |
| |
| /* Size of a LBA sector, in bytes */ |
| uint32_t sector_bytes; |
| /* Size of drive in LBA sectors, in sectors */ |
| uint64_t drive_sectors; |
| |
| /* |
| * The current chromeos kernel index in partition table. -1 means not |
| * found on drive. |
| */ |
| int current_kernel; |
| int current_priority; |
| |
| /* If set, the flags partition has been modified and needs to be flushed */ |
| int modified; |
| |
| /* Internal variables */ |
| MtdDiskLayout primary; |
| } MtdData; |
| |
| |
| /* APIs are documented in cgptlib.h & cgptlib_internal.h */ |
| int MtdInit(MtdData *mtd); |
| int MtdCheckParameters(MtdData *mtd); |
| |
| int MtdNextKernelEntry(MtdData *gpt, uint64_t *start_sector, uint64_t *size); |
| int MtdUpdateKernelEntry(MtdData *gpt, uint32_t update_type); |
| |
| int MtdGetEntryPriority(const MtdDiskPartition *e); |
| int MtdGetEntryTries(const MtdDiskPartition *e); |
| int MtdGetEntrySuccessful(const MtdDiskPartition *e); |
| int MtdGetEntryType(const MtdDiskPartition *e); |
| int MtdIsKernelEntry(const MtdDiskPartition *e); |
| void MtdSetEntrySuccessful(MtdDiskPartition *e, int successful) ; |
| void MtdSetEntryPriority(MtdDiskPartition *e, int priority); |
| void MtdSetEntryTries(MtdDiskPartition *e, int tries); |
| void MtdSetEntryType(MtdDiskPartition *e, int type); |
| |
| void MtdModified(MtdData *mtd); |
| int MtdGptInit(MtdData *mtd); |
| int MtdIsPartitionValid(const MtdDiskPartition *part); |
| int MtdCheckEntries(MtdDiskPartition *entries, MtdDiskLayout *h); |
| int MtdSanityCheck(MtdData *disk); |
| void MtdRepair(MtdData *gpt); |
| void MtdGetCurrentKernelUniqueGuid(MtdData *gpt, void *dest); |
| uint32_t MtdHeaderCrc(MtdDiskLayout *h); |
| |
| |
| #endif |
| |