Provide MTD version of common functions

Provide an MTD implementation of several common functions in cgpt_common.c

BUG=chromium:221745
BRANCH=none
TEST=none

Original-Change-Id: Ib3248c283ca31e33a91b9ea0c14b2f72ea7c5850
Reviewed-on: https://gerrit.chromium.org/gerrit/47029
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Commit-Queue: Albert Chaulk <achaulk@chromium.org>
Tested-by: Albert Chaulk <achaulk@chromium.org>
(cherry picked from commit b0bd7e4cf8dd15cc3c371dac157093c7e7c7a874)

Change-Id: I243c2bf98a88d0019c332b274868459b5f1b8ea1
Reviewed-on: https://gerrit.chromium.org/gerrit/49791
Reviewed-by: Albert Chaulk <achaulk@chromium.org>
Tested-by: Albert Chaulk <achaulk@chromium.org>
Commit-Queue: Albert Chaulk <achaulk@chromium.org>
This commit is contained in:
Albert Chaulk
2013-03-28 15:25:33 -07:00
committed by ChromeBot
parent 874109ec57
commit b334e651a5
4 changed files with 124 additions and 42 deletions

View File

@@ -322,6 +322,7 @@ HOSTLIB_SRCS = \
cgpt/cgpt_prioritize.c \
cgpt/cgpt_common.c \
cgpt/flash_ts_drv.c \
firmware/lib/cgptlib/mtdlib.c \
firmware/lib/flash_ts.c \
host/arch/${ARCH}/lib/crossystem_arch.c \
host/lib/crossystem.c \
@@ -355,6 +356,7 @@ TINYHOSTLIB_SRCS = \
cgpt/cgpt_prioritize.c \
cgpt/cgpt_common.c \
cgpt/flash_ts_drv.c \
firmware/lib/cgptlib/mtdlib.c \
firmware/lib/flash_ts.c \
utility/dump_kernel_config_lib.c \
firmware/lib/cgptlib/crc32.c \

View File

@@ -143,6 +143,8 @@ void EntryDetails(GptEntry *entry, uint32_t index, int raw);
uint32_t GetNumberOfEntries(const struct drive *drive);
GptEntry *GetEntry(GptData *gpt, int secondary, uint32_t entry_index);
MtdDiskPartition *MtdGetEntry(MtdData *mtd, int secondary, uint32_t index);
void SetPriority(struct drive *drive, int secondary, uint32_t entry_index,
int priority);
int GetPriority(struct drive *drive, int secondary, uint32_t entry_index);
@@ -165,6 +167,7 @@ int IsSynonymous(const GptHeader* a, const GptHeader* b);
int IsUnused(struct drive *drive, int secondary, uint32_t index);
int IsKernel(struct drive *drive, int secondary, uint32_t index);
int LookupMtdTypeForGuid(const Guid *type);
// For usage and error messages.
extern const char* progname;

View File

@@ -697,20 +697,38 @@ const Guid guid_chromeos_reserved = GPT_ENT_TYPE_CHROMEOS_RESERVED;
const Guid guid_efi = GPT_ENT_TYPE_EFI;
const Guid guid_unused = GPT_ENT_TYPE_UNUSED;
static struct {
const static struct {
const Guid *type;
char *name;
char *description;
int mtd_type;
} supported_types[] = {
{&guid_chromeos_firmware, "firmware", "ChromeOS firmware"},
{&guid_chromeos_kernel, "kernel", "ChromeOS kernel"},
{&guid_chromeos_rootfs, "rootfs", "ChromeOS rootfs"},
{&guid_linux_data, "data", "Linux data"},
{&guid_chromeos_reserved, "reserved", "ChromeOS reserved"},
{&guid_efi, "efi", "EFI System Partition"},
{&guid_unused, "unused", "Unused (nonexistent) partition"},
{&guid_chromeos_firmware, "firmware", "ChromeOS firmware",
MTD_PARTITION_TYPE_CHROMEOS_FIRMWARE},
{&guid_chromeos_kernel, "kernel", "ChromeOS kernel",
MTD_PARTITION_TYPE_CHROMEOS_KERNEL},
{&guid_chromeos_rootfs, "rootfs", "ChromeOS rootfs",
MTD_PARTITION_TYPE_CHROMEOS_ROOTFS},
{&guid_linux_data, "data", "Linux data",
MTD_PARTITION_TYPE_LINUX_DATA},
{&guid_chromeos_reserved, "reserved", "ChromeOS reserved",
MTD_PARTITION_TYPE_CHROMEOS_RESERVED},
{&guid_efi, "efi", "EFI System Partition",
MTD_PARTITION_TYPE_EFI},
{&guid_unused, "unused", "Unused (nonexistent) partition",
MTD_PARTITION_TYPE_UNUSED},
};
int LookupMtdTypeForGuid(const Guid *type) {
int i;
for (i = 0; i < ARRAY_COUNT(supported_types); ++i) {
if (!memcmp(type, supported_types[i].type, sizeof(Guid))) {
return supported_types[i].mtd_type;
}
}
return MTD_PARTITION_TYPE_OTHER;
}
/* Resolves human-readable GPT type.
* Returns CGPT_OK if found.
* Returns CGPT_FAILED if no known type found. */
@@ -756,6 +774,9 @@ GptHeader* GetGptHeader(const GptData *gpt) {
}
uint32_t GetNumberOfEntries(const struct drive *drive) {
if (drive->is_mtd)
return MTD_MAX_PARTITIONS;
GptHeader *header = GetGptHeader(&drive->gpt);
if (!header)
return 0;
@@ -787,75 +808,130 @@ GptEntry *GetEntry(GptData *gpt, int secondary, uint32_t entry_index) {
return (GptEntry*)(&entries[stride * entry_index]);
}
MtdDiskPartition* MtdGetEntry(MtdData *mtd, int secondary, uint32_t index) {
if (index >= MTD_MAX_PARTITIONS)
return NULL;
return &mtd->primary.partitions[index];
}
void SetPriority(struct drive *drive, int secondary, uint32_t entry_index,
int priority) {
require(priority >= 0 && priority <= CGPT_ATTRIBUTE_MAX_PRIORITY);
if (drive->is_mtd) {
MtdDiskPartition *e = MtdGetEntry(&drive->mtd, secondary, entry_index);
MtdSetEntryPriority(e, priority);
} else {
GptEntry *entry;
entry = GetEntry(&drive->gpt, secondary, entry_index);
require(priority >= 0 && priority <= CGPT_ATTRIBUTE_MAX_PRIORITY);
SetEntryPriority(entry, priority);
}
}
int GetPriority(struct drive *drive, int secondary, uint32_t entry_index) {
if (drive->is_mtd) {
MtdDiskPartition *e = MtdGetEntry(&drive->mtd, secondary, entry_index);
return MtdGetEntryPriority(e);
} else {
GptEntry *entry;
entry = GetEntry(&drive->gpt, secondary, entry_index);
return GetEntryPriority(entry);
}
}
void SetTries(struct drive *drive, int secondary, uint32_t entry_index,
int tries) {
require(tries >= 0 && tries <= CGPT_ATTRIBUTE_MAX_TRIES);
if (drive->is_mtd) {
MtdDiskPartition *e = MtdGetEntry(&drive->mtd, secondary, entry_index);
MtdSetEntryTries(e, tries);
} else {
GptEntry *entry;
entry = GetEntry(&drive->gpt, secondary, entry_index);
require(tries >= 0 && tries <= CGPT_ATTRIBUTE_MAX_TRIES);
SetEntryTries(entry, tries);
}
}
int GetTries(struct drive *drive, int secondary, uint32_t entry_index) {
if (drive->is_mtd) {
MtdDiskPartition *e = MtdGetEntry(&drive->mtd, secondary, entry_index);
return MtdGetEntryTries(e);
} else {
GptEntry *entry;
entry = GetEntry(&drive->gpt, secondary, entry_index);
return GetEntryTries(entry);
}
}
void SetSuccessful(struct drive *drive, int secondary, uint32_t entry_index,
int success) {
require(success >= 0 && success <= CGPT_ATTRIBUTE_MAX_SUCCESSFUL);
if (drive->is_mtd) {
MtdDiskPartition *e = MtdGetEntry(&drive->mtd, secondary, entry_index);
MtdSetEntrySuccessful(e, success);
} else {
GptEntry *entry;
entry = GetEntry(&drive->gpt, secondary, entry_index);
require(success >= 0 && success <= CGPT_ATTRIBUTE_MAX_SUCCESSFUL);
SetEntrySuccessful(entry, success);
}
}
int GetSuccessful(struct drive *drive, int secondary, uint32_t entry_index) {
if (drive->is_mtd) {
MtdDiskPartition *e = MtdGetEntry(&drive->mtd, secondary, entry_index);
return MtdGetEntrySuccessful(e);
} else {
GptEntry *entry;
entry = GetEntry(&drive->gpt, secondary, entry_index);
return GetEntrySuccessful(entry);
}
}
void SetRaw(struct drive *drive, int secondary, uint32_t entry_index,
uint32_t raw) {
if (drive->is_mtd) {
MtdDiskPartition *e = MtdGetEntry(&drive->mtd, secondary, entry_index);
e->flags = raw;
} else {
GptEntry *entry;
entry = GetEntry(&drive->gpt, secondary, entry_index);
entry->attrs.fields.gpt_att = (uint16_t)raw;
}
}
void UpdateAllEntries(struct drive *drive) {
if (drive->is_mtd) {
drive->mtd.modified = 1;
drive->mtd.primary.crc32 = MtdHeaderCrc(&drive->mtd.primary);
} else {
RepairEntries(&drive->gpt, MASK_PRIMARY);
RepairHeader(&drive->gpt, MASK_PRIMARY);
drive->gpt.modified |= (GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES1 |
GPT_MODIFIED_HEADER2 | GPT_MODIFIED_ENTRIES2);
UpdateCrc(&drive->gpt);
}
}
int IsUnused(struct drive *drive, int secondary, uint32_t index) {
if (drive->is_mtd) {
MtdDiskPartition *e = MtdGetEntry(&drive->mtd, secondary, index);
return MtdGetEntryType(e) == MTD_PARTITION_TYPE_UNUSED;
} else {
GptEntry *entry;
entry = GetEntry(&drive->gpt, secondary, index);
return GuidIsZero(&entry->type);
}
}
int IsKernel(struct drive *drive, int secondary, uint32_t index) {
if (drive->is_mtd) {
MtdDiskPartition *e = MtdGetEntry(&drive->mtd, secondary, index);
return MtdGetEntryType(e) == MTD_PARTITION_TYPE_CHROMEOS_KERNEL;
} else {
GptEntry *entry;
entry = GetEntry(&drive->gpt, secondary, index);
return GuidEqual(&entry->type, &guid_chromeos_kernel);
}
}

View File

@@ -55,6 +55,7 @@
#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