summaryrefslogtreecommitdiffstats
path: root/vpnor/pnor_partition_defs.h
diff options
context:
space:
mode:
Diffstat (limited to 'vpnor/pnor_partition_defs.h')
-rw-r--r--vpnor/pnor_partition_defs.h136
1 files changed, 136 insertions, 0 deletions
diff --git a/vpnor/pnor_partition_defs.h b/vpnor/pnor_partition_defs.h
new file mode 100644
index 0000000..447b11c
--- /dev/null
+++ b/vpnor/pnor_partition_defs.h
@@ -0,0 +1,136 @@
+/* SPDX-License-Identifier: Apache-2.0 */
+/* Copyright (C) 2018 IBM Corp. */
+#pragma once
+
+#include <stdint.h>
+#include <sys/types.h>
+
+/* There are two structures outlined here - one that represents the PNOR
+ * partition table (or header) - this appears first in the PNOR image.
+ * The last field of the PNOR partition table structure is an array
+ * of another structure - which represents the partition.
+ *
+ * The flash structures used here have been borrowed from
+ * https://github.com/open-power/hostboot/blob/master/src/usr/pnor/ffs.h */
+
+
+/* The maximum length of a partition's name */
+#define PARTITION_NAME_MAX 15
+
+/* The version of this partition implementation. This is an
+ * incrementing value */
+#define PARTITION_VERSION_1 1
+
+/* Magic number for the partition partition_table (ASCII 'PART') */
+#define PARTITION_HEADER_MAGIC 0x50415254
+
+/* Default parent partition id */
+#define PARENT_PATITION_ID 0xFFFFFFFF
+
+/* The partition structure has 16 'user data' words, which can be used to store
+ * miscellaneous information. This is typically used to store bits that state
+ * whether a partition is ECC protected, is read-only, is preserved across
+ * updates, etc.
+ *
+ * TODO: Replace with libflash (!) or at least refactor the data structures to
+ * better match hostboot's layout[1]. The latter would avoid the headache of
+ * verifying these flags match the expected functionality (taking into account
+ * changes in endianness).
+ *
+ * [1] https://github.com/open-power/hostboot/blob/9acfce99596f12dcc60952f8506a77e542609cbf/src/usr/pnor/common/ffs_hb.H#L81
+ */
+#define PARTITION_USER_WORDS 16
+#define PARTITION_ECC_PROTECTED 0x8000
+#define PARTITION_PRESERVED 0x00800000
+#define PARTITION_READONLY 0x00400000
+#define PARTITION_REPROVISION 0x00100000
+#define PARTITION_VOLATILE 0x00080000
+#define PARTITION_CLEARECC 0x00040000
+#define PARTITION_VERSION_CHECK_SHA512 0x80000000
+#define PARTITION_VERSION_CHECK_SHA512_PER_EC 0x40000000
+
+/* Partition flags */
+enum partition_flags {
+ PARTITION_FLAGS_PROTECTED = 0x0001,
+ PARTITION_FLAGS_U_BOOT_ENV = 0x0002
+};
+
+/* Type of image contained within partition */
+enum partition_type {
+ PARTITION_TYPE_DATA = 1,
+ PARTITION_TYPE_LOGICAL = 2,
+ PARTITION_TYPE_PARTITION = 3
+};
+
+
+/**
+ * struct pnor_partition
+ *
+ * @name: Name of the partition - a null terminated string
+ * @base: The offset in the PNOR, in block-size (1 block = 4KB),
+ * where this partition is placed
+ * @size: Partition size in blocks.
+ * @pid: Parent partition id
+ * @id: Partition ID [1..65536]
+ * @type: Type of partition, see the 'type' enum
+ * @flags: Partition flags (optional), see the 'flags' enum
+ * @actual: Actual partition size (in bytes)
+ * @resvd: Reserved words for future use
+ * @user: User data (optional), see user data macros above
+ * @checksum: Partition checksum (includes all words above) - the
+ * checksum is obtained by a XOR operation on all of the
+ * words above. This is used for detecting a corruption
+ * in this structure
+ */
+struct pnor_partition {
+ struct {
+ char name[PARTITION_NAME_MAX + 1];
+ uint32_t base;
+ uint32_t size;
+ uint32_t pid;
+ uint32_t id;
+ uint32_t type;
+ uint32_t flags;
+ uint32_t actual;
+ uint32_t resvd[4];
+ struct
+ {
+ uint32_t data[PARTITION_USER_WORDS];
+ } user;
+ } __attribute__ ((packed)) data;
+ uint32_t checksum;
+} __attribute__ ((packed));
+
+/**
+ * struct pnor_partition_table
+ *
+ * @magic: Eye catcher/corruption detector - set to
+ * PARTITION_HEADER_MAGIC
+ * @version: Version of the structure, set to
+ * PARTITION_VERSION_1
+ * @size: Size of partition table (in blocks)
+ * @entry_size: Size of struct pnor_partition element (in bytes)
+ * @entry_count: Number of struct pnor_partition elements in partitions array
+ * @block_size: Size of an erase-block on the PNOR (in bytes)
+ * @block_count: Number of blocks on the PNOR
+ * @resvd: Reserved words for future use
+ * @checksum: Header checksum (includes all words above) - the
+ * checksum is obtained by a XOR operation on all of the
+ * words above. This is used for detecting a corruption
+ * in this structure
+ * @partitions: Array of struct pnor_partition
+ */
+struct pnor_partition_table {
+ struct {
+ uint32_t magic;
+ uint32_t version;
+ uint32_t size;
+ uint32_t entry_size;
+ uint32_t entry_count;
+ uint32_t block_size;
+ uint32_t block_count;
+ uint32_t resvd[4];
+ } __attribute__ ((packed)) data;
+ uint32_t checksum;
+ struct pnor_partition partitions[];
+} __attribute__ ((packed));
OpenPOWER on IntegriCloud