xref: /openbmc/hiomapd/vpnor/ffs.h (revision dec59b47c5ba50a5ece7633b89e227373a1869b8)
1*dec59b47SAndrew Jeffery /* SPDX-License-Identifier: Apache-2.0 */
2*dec59b47SAndrew Jeffery /* Copyright (C) 2018 IBM Corp. */
3*dec59b47SAndrew Jeffery #pragma once
4*dec59b47SAndrew Jeffery 
5*dec59b47SAndrew Jeffery #include <stdint.h>
6*dec59b47SAndrew Jeffery #include <sys/types.h>
7*dec59b47SAndrew Jeffery 
8*dec59b47SAndrew Jeffery /* There are two structures outlined here - one that represents the PNOR
9*dec59b47SAndrew Jeffery  * partition table (or header) - this appears first in the PNOR image.
10*dec59b47SAndrew Jeffery  * The last field of the PNOR partition table structure is an array
11*dec59b47SAndrew Jeffery  * of another structure - which represents the partition.
12*dec59b47SAndrew Jeffery  *
13*dec59b47SAndrew Jeffery  * The flash structures used here have been borrowed from
14*dec59b47SAndrew Jeffery  * https://github.com/open-power/hostboot/blob/master/src/usr/pnor/ffs.h */
15*dec59b47SAndrew Jeffery 
16*dec59b47SAndrew Jeffery 
17*dec59b47SAndrew Jeffery /* The maximum length of a partition's name */
18*dec59b47SAndrew Jeffery #define PARTITION_NAME_MAX 15
19*dec59b47SAndrew Jeffery 
20*dec59b47SAndrew Jeffery /* The version of this partition implementation. This is an
21*dec59b47SAndrew Jeffery  * incrementing value */
22*dec59b47SAndrew Jeffery #define PARTITION_VERSION_1 1
23*dec59b47SAndrew Jeffery 
24*dec59b47SAndrew Jeffery /* Magic number for the partition partition_table (ASCII 'PART') */
25*dec59b47SAndrew Jeffery #define PARTITION_HEADER_MAGIC 0x50415254
26*dec59b47SAndrew Jeffery 
27*dec59b47SAndrew Jeffery /* Default parent partition id */
28*dec59b47SAndrew Jeffery #define PARENT_PATITION_ID 0xFFFFFFFF
29*dec59b47SAndrew Jeffery 
30*dec59b47SAndrew Jeffery /* The partition structure has 16 'user data' words, which can be used to store
31*dec59b47SAndrew Jeffery  * miscellaneous information. This is typically used to store bits that state
32*dec59b47SAndrew Jeffery  * whether a partition is ECC protected, is read-only, is preserved across
33*dec59b47SAndrew Jeffery  * updates, etc.
34*dec59b47SAndrew Jeffery  *
35*dec59b47SAndrew Jeffery  * TODO: Replace with libflash (!) or at least refactor the data structures to
36*dec59b47SAndrew Jeffery  * better match hostboot's layout[1]. The latter would avoid the headache of
37*dec59b47SAndrew Jeffery  * verifying these flags match the expected functionality (taking into account
38*dec59b47SAndrew Jeffery  * changes in endianness).
39*dec59b47SAndrew Jeffery  *
40*dec59b47SAndrew Jeffery  * [1] https://github.com/open-power/hostboot/blob/9acfce99596f12dcc60952f8506a77e542609cbf/src/usr/pnor/common/ffs_hb.H#L81
41*dec59b47SAndrew Jeffery  */
42*dec59b47SAndrew Jeffery #define PARTITION_USER_WORDS 16
43*dec59b47SAndrew Jeffery #define PARTITION_ECC_PROTECTED 0x8000
44*dec59b47SAndrew Jeffery #define PARTITION_PRESERVED 0x00800000
45*dec59b47SAndrew Jeffery #define PARTITION_READONLY 0x00400000
46*dec59b47SAndrew Jeffery #define PARTITION_REPROVISION 0x00100000
47*dec59b47SAndrew Jeffery #define PARTITION_VOLATILE 0x00080000
48*dec59b47SAndrew Jeffery #define PARTITION_CLEARECC 0x00040000
49*dec59b47SAndrew Jeffery #define PARTITION_VERSION_CHECK_SHA512 0x80000000
50*dec59b47SAndrew Jeffery #define PARTITION_VERSION_CHECK_SHA512_PER_EC 0x40000000
51*dec59b47SAndrew Jeffery 
52*dec59b47SAndrew Jeffery /* Partition flags */
53*dec59b47SAndrew Jeffery enum partition_flags {
54*dec59b47SAndrew Jeffery     PARTITION_FLAGS_PROTECTED = 0x0001,
55*dec59b47SAndrew Jeffery     PARTITION_FLAGS_U_BOOT_ENV = 0x0002
56*dec59b47SAndrew Jeffery };
57*dec59b47SAndrew Jeffery 
58*dec59b47SAndrew Jeffery /* Type of image contained within partition */
59*dec59b47SAndrew Jeffery enum partition_type {
60*dec59b47SAndrew Jeffery     PARTITION_TYPE_DATA = 1,
61*dec59b47SAndrew Jeffery     PARTITION_TYPE_LOGICAL = 2,
62*dec59b47SAndrew Jeffery     PARTITION_TYPE_PARTITION = 3
63*dec59b47SAndrew Jeffery };
64*dec59b47SAndrew Jeffery 
65*dec59b47SAndrew Jeffery 
66*dec59b47SAndrew Jeffery /**
67*dec59b47SAndrew Jeffery  * struct pnor_partition
68*dec59b47SAndrew Jeffery  *
69*dec59b47SAndrew Jeffery  * @name:       Name of the partition - a null terminated string
70*dec59b47SAndrew Jeffery  * @base:       The offset in the PNOR, in block-size (1 block = 4KB),
71*dec59b47SAndrew Jeffery  *              where this partition is placed
72*dec59b47SAndrew Jeffery  * @size:       Partition size in blocks.
73*dec59b47SAndrew Jeffery  * @pid:        Parent partition id
74*dec59b47SAndrew Jeffery  * @id:         Partition ID [1..65536]
75*dec59b47SAndrew Jeffery  * @type:       Type of partition, see the 'type' enum
76*dec59b47SAndrew Jeffery  * @flags:      Partition flags (optional), see the 'flags' enum
77*dec59b47SAndrew Jeffery  * @actual:     Actual partition size (in bytes)
78*dec59b47SAndrew Jeffery  * @resvd:      Reserved words for future use
79*dec59b47SAndrew Jeffery  * @user:       User data (optional), see user data macros above
80*dec59b47SAndrew Jeffery  * @checksum:   Partition checksum (includes all words above) - the
81*dec59b47SAndrew Jeffery  *              checksum is obtained by a XOR operation on all of the
82*dec59b47SAndrew Jeffery  *              words above. This is used for detecting a corruption
83*dec59b47SAndrew Jeffery  *              in this structure
84*dec59b47SAndrew Jeffery  */
85*dec59b47SAndrew Jeffery struct pnor_partition {
86*dec59b47SAndrew Jeffery     struct {
87*dec59b47SAndrew Jeffery         char         name[PARTITION_NAME_MAX + 1];
88*dec59b47SAndrew Jeffery         uint32_t     base;
89*dec59b47SAndrew Jeffery         uint32_t     size;
90*dec59b47SAndrew Jeffery         uint32_t     pid;
91*dec59b47SAndrew Jeffery         uint32_t     id;
92*dec59b47SAndrew Jeffery         uint32_t     type;
93*dec59b47SAndrew Jeffery         uint32_t     flags;
94*dec59b47SAndrew Jeffery         uint32_t     actual;
95*dec59b47SAndrew Jeffery         uint32_t     resvd[4];
96*dec59b47SAndrew Jeffery         struct
97*dec59b47SAndrew Jeffery         {
98*dec59b47SAndrew Jeffery             uint32_t data[PARTITION_USER_WORDS];
99*dec59b47SAndrew Jeffery         } user;
100*dec59b47SAndrew Jeffery     } __attribute__ ((packed)) data;
101*dec59b47SAndrew Jeffery     uint32_t     checksum;
102*dec59b47SAndrew Jeffery } __attribute__ ((packed));
103*dec59b47SAndrew Jeffery 
104*dec59b47SAndrew Jeffery /**
105*dec59b47SAndrew Jeffery  * struct pnor_partition_table
106*dec59b47SAndrew Jeffery  *
107*dec59b47SAndrew Jeffery  * @magic:          Eye catcher/corruption detector - set to
108*dec59b47SAndrew Jeffery  *                  PARTITION_HEADER_MAGIC
109*dec59b47SAndrew Jeffery  * @version:        Version of the structure, set to
110*dec59b47SAndrew Jeffery  *                  PARTITION_VERSION_1
111*dec59b47SAndrew Jeffery  * @size:           Size of partition table (in blocks)
112*dec59b47SAndrew Jeffery  * @entry_size:     Size of struct pnor_partition element (in bytes)
113*dec59b47SAndrew Jeffery  * @entry_count:    Number of struct pnor_partition elements in partitions array
114*dec59b47SAndrew Jeffery  * @block_size:     Size of an erase-block on the PNOR (in bytes)
115*dec59b47SAndrew Jeffery  * @block_count:    Number of blocks on the PNOR
116*dec59b47SAndrew Jeffery  * @resvd:          Reserved words for future use
117*dec59b47SAndrew Jeffery  * @checksum:       Header checksum (includes all words above) - the
118*dec59b47SAndrew Jeffery  *                  checksum is obtained by a XOR operation on all of the
119*dec59b47SAndrew Jeffery  *                  words above. This is used for detecting a corruption
120*dec59b47SAndrew Jeffery  *                  in this structure
121*dec59b47SAndrew Jeffery  * @partitions:     Array of struct pnor_partition
122*dec59b47SAndrew Jeffery  */
123*dec59b47SAndrew Jeffery struct pnor_partition_table {
124*dec59b47SAndrew Jeffery     struct {
125*dec59b47SAndrew Jeffery         uint32_t         magic;
126*dec59b47SAndrew Jeffery         uint32_t         version;
127*dec59b47SAndrew Jeffery         uint32_t         size;
128*dec59b47SAndrew Jeffery         uint32_t         entry_size;
129*dec59b47SAndrew Jeffery         uint32_t         entry_count;
130*dec59b47SAndrew Jeffery         uint32_t         block_size;
131*dec59b47SAndrew Jeffery         uint32_t         block_count;
132*dec59b47SAndrew Jeffery         uint32_t         resvd[4];
133*dec59b47SAndrew Jeffery     } __attribute__ ((packed)) data;
134*dec59b47SAndrew Jeffery     uint32_t         checksum;
135*dec59b47SAndrew Jeffery     struct pnor_partition partitions[];
136*dec59b47SAndrew Jeffery } __attribute__ ((packed));
137