mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-11-24 02:05:01 +00:00
As per the discussion on issue 221745 we will be using 64-bit byte offsets for the MTD partition table and converting to/from sectors internally in cgpt. Existing interfaces do not change, eg sizes are still reported in sectors, only the on-disk representation is affected. BRANCH=none BUG=chromium:221745 TEST=unit tests pass Change-Id: Id312d42783acfdabe6eb8aea11dcbd298e00a100 Reviewed-on: https://gerrit.chromium.org/gerrit/60919 Commit-Queue: Albert Chaulk <achaulk@chromium.org> Reviewed-by: Albert Chaulk <achaulk@chromium.org> Tested-by: Albert Chaulk <achaulk@chromium.org>
155 lines
4.9 KiB
C
155 lines
4.9 KiB
C
/* 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 {
|
|
uint64_t starting_offset;
|
|
uint64_t ending_offset;
|
|
uint32_t flags;
|
|
} __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;
|
|
uint64_t first_offset;
|
|
uint64_t last_offset;
|
|
MtdDiskPartition partitions[MTD_MAX_PARTITIONS];
|
|
} __attribute__((packed)) MtdDiskLayout;
|
|
|
|
#define MTD_DRIVE_V1_SIZE (32 + 16*20)
|
|
|
|
#define MTDENTRY_EXPECTED_SIZE (20)
|
|
#define MTDLAYOUT_EXPECTED_SIZE (32 + 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 MtdGetPartitionSize(const MtdDiskPartition *e,
|
|
uint64_t *start, uint64_t *end, uint64_t *size);
|
|
|
|
void MtdGetPartitionSizeInSectors(const MtdDiskPartition *e, uint64_t *start,
|
|
uint64_t *end, uint64_t *size);
|
|
|
|
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
|
|
|