diff options
Diffstat (limited to 'roms/skiboot/libflash/ffs.h')
-rw-r--r-- | roms/skiboot/libflash/ffs.h | 210 |
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__ */ |