summaryrefslogtreecommitdiff
path: root/firmware/lib/cgptlib/include/mtdlib.h
blob: 135a530b9c57482b0c140240f432a7a1ffba3ea0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
/* 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

/* 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