aboutsummaryrefslogtreecommitdiffstats
path: root/roms/skiboot/libflash/ffs.h
diff options
context:
space:
mode:
Diffstat (limited to 'roms/skiboot/libflash/ffs.h')
-rw-r--r--roms/skiboot/libflash/ffs.h210
1 files changed, 210 insertions, 0 deletions
diff --git a/roms/skiboot/libflash/ffs.h b/roms/skiboot/libflash/ffs.h
new file mode 100644
index 000000000..441d84646
--- /dev/null
+++ b/roms/skiboot/libflash/ffs.h
@@ -0,0 +1,210 @@
+// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
+/*
+ * FSP Flash Structure
+ *
+ * This header defines the layout for the FSP Flash Structure.
+ *
+ * Copyright 2012-2018 IBM Corp.
+ */
+
+#ifndef __FFS_H__
+#define __FFS_H__
+
+/* Pull in the correct header depending on what is being built */
+#ifndef __SKIBOOT__
+#include <linux/types.h>
+#else
+#include <stdint.h>
+#endif
+#include <ccan/short_types/short_types.h>
+#include <ccan/endian/endian.h>
+#include <ccan/list/list.h>
+
+#include "libffs.h"
+
+/* The version of this partition implementation */
+#define FFS_VERSION_1 1
+
+/* Magic number for the partition header (ASCII 'PART') */
+#define FFS_MAGIC 0x50415254
+
+/* pid of logical partitions/containers */
+#define FFS_PID_TOPLEVEL 0xFFFFFFFF
+
+/*
+ * Type of image contained w/in partition
+ */
+enum ffs_type {
+ FFS_TYPE_DATA = 1,
+ FFS_TYPE_LOGICAL = 2,
+ FFS_TYPE_PARTITION = 3,
+};
+
+/*
+ * Flag bit definitions
+ */
+#define FFS_FLAGS_PROTECTED 0x0001
+#define FFS_FLAGS_U_BOOT_ENV 0x0002
+
+/* Data integrity flags */
+#define FFS_ENRY_INTEG_ECC 0x8000
+
+/*
+ * User verCheck definitions
+ */
+#define FFS_VERCHECK_SHA512V 0x80
+#define FFS_VERCHECK_SHA512EC 0x40
+
+/*
+ * User miscFlags
+ */
+#define FFS_MISCFLAGS_PRESERVED 0x80
+#define FFS_MISCFLAGS_READONLY 0x40
+#define FFS_MISCFLAGS_BACKUP 0x20
+#define FFS_MISCFLAGS_REPROVISION 0x10
+#define FFS_MISCFLAGS_VOLATILE 0x08
+#define FFS_MISCFLAGS_CLEARECC 0x04
+#define FFS_MISCFLAGS_GOLDEN 0x01
+
+/**
+ * struct __ffs_entry_user - On flash user data entries
+ *
+ * Represents the on flash layout of FFS structures
+ *
+ * @chip: Chip Select (0,1)
+ * @compressType: Compression Indication/alg (0=not compressed)
+ * @dataInteg: Indicates Data Integrity mechanism
+ * @verCheck: Indicates Version check type
+ * @miscFlags: Misc Partition related Flags
+ * @freeMisc[2]: Unused Miscellaneious Info
+ * @freeUser[14]: Unused User Data
+ */
+struct __ffs_entry_user {
+ uint8_t chip;
+ uint8_t compresstype;
+ be16 datainteg;
+ uint8_t vercheck;
+ uint8_t miscflags;
+ uint8_t freemisc[2];
+ be32 reserved[14];
+} __attribute__ ((packed));
+
+/**
+ * struct __ffs_entry - On flash partition entry
+ *
+ * Represents the on flash layout of FFS structures
+ * Note: Unlike the in memory structures base and size of the entry are in
+ * units of block_size and the actual size is in bytes
+ *
+ * @name: Opaque null terminated string
+ * @base: Starting offset of partition in flash (in hdr.block_size)
+ * @size: Partition size (in hdr.block_size)
+ * @pid: Parent partition entry (FFS_PID_TOPLEVEL for toplevel)
+ * @id: Partition entry ID [1..65536]
+ * @type: Describe type of partition
+ * @flags: Partition attributes (optional)
+ * @actual: Actual partition size (in bytes)
+ * @resvd: Reserved words for future use
+ * @user: User data (optional)
+ * @checksum: Partition entry checksum (includes all above)
+ */
+struct __ffs_entry {
+ char name[FFS_PART_NAME_MAX + 1];
+ be32 base;
+ be32 size;
+ be32 pid;
+ be32 id;
+ be32 type;
+ be32 flags;
+ be32 actual;
+ be32 resvd[4];
+ struct __ffs_entry_user user;
+ /* The checksum is actually endian agnostic */
+ uint32_t checksum;
+} __attribute__ ((packed));
+
+/**
+ * struct ffs_entry - Partition entry
+ *
+ * Useable in memory representation of a struct __ffs_entry
+ * Note: Unlike the on flash structure, all sizes here are in bytes!
+ *
+ * @name: Opaque null terminated string
+ * @base: Starting offset of partition in flash (in bytes)
+ * @size: Partition size (in bytes)
+ * @actual: Actual partition size (in bytes)
+ * @pid: Parent partition entry (FFS_PID_TOPLEVEL for toplevel)
+ * @type: Describe type of partition
+ * @flags: Partition attributes (optional)
+ * @user: User data (optional)
+ * @ref: Refcount
+ */
+struct ffs_entry {
+ char name[FFS_PART_NAME_MAX + 1];
+ uint32_t base;
+ uint32_t size;
+ uint32_t actual;
+ uint32_t pid;
+ enum ffs_type type;
+ uint32_t flags;
+ struct ffs_entry_user user;
+ unsigned int ref;
+};
+
+
+/**
+ * struct __ffs_hdr - On flash FSP Flash Structure header
+ *
+ * Represents the on flash layout of FFS structures
+ * Note: Beware that the size of the partition table is in units of block_size
+ *
+ * @magic: Eye catcher/corruption detector
+ * @version: Version of the structure
+ * @size: Size of partition table (in block_size)
+ * @entry_size: Size of struct ffs_entry element (in bytes)
+ * @entry_count: Number of struct ffs_entry elements in @entries array
+ * @block_size: Size of block on device (in bytes)
+ * @block_count: Number of blocks on device
+ * @resvd[4]: Reserved words for future use
+ * @checksum: Header checksum
+ * @entries: Pointer to array of partition entries
+ */
+struct __ffs_hdr {
+ be32 magic;
+ be32 version;
+ be32 size;
+ be32 entry_size;
+ be32 entry_count;
+ be32 block_size;
+ be32 block_count;
+ be32 resvd[4];
+ /* The checksum is actually endian agnostic */
+ uint32_t checksum;
+ struct __ffs_entry entries[];
+} __attribute__ ((packed));
+
+/**
+ * struct ffs_hdr - FSP Flash Structure header
+ *
+ * Useable in memory representation of a struct __ffs_hdr
+ * Note: All sizes here are in bytes
+ *
+ * @version: Version of the structure
+ * @size: Size of partition table (in bytes)
+ * @block_size: Size of block on device (in bytes)
+ * @block_count: Number of blocks on device.
+ * @count: Count of the number of entires
+ * @entries: Array of partition entries.
+ */
+struct ffs_hdr {
+ uint32_t version;
+ uint32_t size;
+ uint32_t block_size;
+ uint32_t block_count;
+ uint32_t count;
+ struct ffs_entry *part;
+ struct ffs_entry **entries;
+ unsigned int entries_size;
+};
+
+#endif /* __FFS_H__ */