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