Bugfixes & MTD create command

Fix some bugs in the cgpt implementation of the flash I/O functions & load
logic, it was validating too much at load time.

Implement the create command for MTD

BUG=chromium:221745
TEST=MTD version of run_cgpt_tests.sh passes
BRANCH=none

Original-Change-Id: I2f52637d82962f4d805aa827c5c37685f10e76ea
Reviewed-on: https://gerrit.chromium.org/gerrit/47172
Tested-by: Albert Chaulk <achaulk@chromium.org>
Reviewed-by: Bill Richardson <wfrichar@chromium.org>
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Commit-Queue: Albert Chaulk <achaulk@chromium.org>
(cherry picked from commit 931544744ba410dad267064b87d504b0b4c24772)

Change-Id: If9364155fb2c030645adc6ee6f3fbe5373bcc153
Reviewed-on: https://gerrit.chromium.org/gerrit/49793
Commit-Queue: Albert Chaulk <achaulk@chromium.org>
Reviewed-by: Albert Chaulk <achaulk@chromium.org>
Tested-by: Albert Chaulk <achaulk@chromium.org>
diff --git a/cgpt/cgpt_create.c b/cgpt/cgpt_create.c
index b0256c5..0b116b2 100644
--- a/cgpt/cgpt_create.c
+++ b/cgpt/cgpt_create.c
@@ -9,6 +9,65 @@
 #include "cgptlib_internal.h"
 #include "vboot_host.h"
 
+int GptCreate(struct drive *drive, CgptCreateParams *params) {
+  // Erase the data
+  memset(drive->gpt.primary_header, 0,
+         drive->gpt.sector_bytes * GPT_HEADER_SECTOR);
+  memset(drive->gpt.secondary_header, 0,
+         drive->gpt.sector_bytes * GPT_HEADER_SECTOR);
+  memset(drive->gpt.primary_entries, 0,
+         drive->gpt.sector_bytes * GPT_ENTRIES_SECTORS);
+  memset(drive->gpt.secondary_entries, 0,
+         drive->gpt.sector_bytes * GPT_ENTRIES_SECTORS);
+
+  drive->gpt.modified |= (GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES1 |
+                         GPT_MODIFIED_HEADER2 | GPT_MODIFIED_ENTRIES2);
+
+  // Initialize a blank set
+  if (!params->zap) {
+    GptHeader *h = (GptHeader *)drive->gpt.primary_header;
+    memcpy(h->signature, GPT_HEADER_SIGNATURE, GPT_HEADER_SIGNATURE_SIZE);
+    h->revision = GPT_HEADER_REVISION;
+    h->size = sizeof(GptHeader);
+    h->my_lba = 1;
+    h->alternate_lba = drive->gpt.drive_sectors - 1;
+    h->first_usable_lba = 1 + 1 + GPT_ENTRIES_SECTORS;
+    h->last_usable_lba = drive->gpt.drive_sectors - 1 - GPT_ENTRIES_SECTORS - 1;
+    if (!uuid_generator) {
+      Error("Unable to generate new GUID. uuid_generator not set.\n");
+      return -1;
+    }
+    (*uuid_generator)((uint8_t *)&h->disk_uuid);
+    h->entries_lba = 2;
+    h->number_of_entries = 128;
+    h->size_of_entry = sizeof(GptEntry);
+
+    // Copy to secondary
+    RepairHeader(&drive->gpt, MASK_PRIMARY);
+
+    UpdateCrc(&drive->gpt);
+  }
+
+  return 0;
+}
+
+int MtdCreate(struct drive *drive, CgptCreateParams *params) {
+  MtdDiskLayout *h = &drive->mtd.primary;
+  memset(h, 0, sizeof(*h));
+  drive->mtd.modified = 1;
+
+  if (!params->zap) {
+    // Prep basic parameters
+    memcpy(h->signature, MTD_DRIVE_SIGNATURE, sizeof(h->signature));
+    h->size = sizeof(*h);
+    h->first_lba = 0;
+    h->last_lba = drive->mtd.drive_sectors - 1;
+    h->crc32 = MtdHeaderCrc(h);
+  }
+
+  return 0;
+}
+
 int CgptCreate(CgptCreateParams *params) {
   struct drive drive;
 
@@ -18,43 +77,12 @@
   if (CGPT_OK != DriveOpen(params->drive_name, &drive, O_RDWR))
     return CGPT_FAILED;
 
-  // Erase the data
-  memset(drive.gpt.primary_header, 0,
-         drive.gpt.sector_bytes * GPT_HEADER_SECTOR);
-  memset(drive.gpt.secondary_header, 0,
-         drive.gpt.sector_bytes * GPT_HEADER_SECTOR);
-  memset(drive.gpt.primary_entries, 0,
-         drive.gpt.sector_bytes * GPT_ENTRIES_SECTORS);
-  memset(drive.gpt.secondary_entries, 0,
-         drive.gpt.sector_bytes * GPT_ENTRIES_SECTORS);
-
-  drive.gpt.modified |= (GPT_MODIFIED_HEADER1 | GPT_MODIFIED_ENTRIES1 |
-                         GPT_MODIFIED_HEADER2 | GPT_MODIFIED_ENTRIES2);
-
-  // Initialize a blank set
-  if (!params->zap)
-  {
-    GptHeader *h = (GptHeader *)drive.gpt.primary_header;
-    memcpy(h->signature, GPT_HEADER_SIGNATURE, GPT_HEADER_SIGNATURE_SIZE);
-    h->revision = GPT_HEADER_REVISION;
-    h->size = sizeof(GptHeader);
-    h->my_lba = 1;
-    h->alternate_lba = drive.gpt.drive_sectors - 1;
-    h->first_usable_lba = 1 + 1 + GPT_ENTRIES_SECTORS;
-    h->last_usable_lba = drive.gpt.drive_sectors - 1 - GPT_ENTRIES_SECTORS - 1;
-    if (!uuid_generator) {
-      Error("Unable to generate new GUID. uuid_generator not set.\n");
+  if (drive.is_mtd) {
+    if (MtdCreate(&drive, params))
       goto bad;
-    }
-    (*uuid_generator)((uint8_t *)&h->disk_uuid);
-    h->entries_lba = 2;
-    h->number_of_entries = 128;
-    h->size_of_entry = sizeof(GptEntry);
-
-    // Copy to secondary
-    RepairHeader(&drive.gpt, MASK_PRIMARY);
-
-    UpdateCrc(&drive.gpt);
+  } else {
+    if (GptCreate(&drive, params))
+      goto bad;
   }
 
   // Write it all out