/* * Copyright (c) International Business Machines Corp., 2014 * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ /* * Copyright (c) International Business Machines Corp., 2012 * * FSP Flash Structure * * This header defines the layout for the FSP Flash Structure. */ #ifndef __FFS_H__ #define __FFS_H__ /* Pull in the correct header depending on what is being built */ #if defined(__KERNEL__) #include #else #include #endif /* The version of this partition implementation */ #define FFS_VERSION_1 1 /* Magic number for the partition header (ASCII 'PART') */ #define FFS_MAGIC 0x50415254 /* The maximum length of the partition name */ #define PART_NAME_MAX 15 /* * Sizes of the data structures */ #define FFS_HDR_SIZE sizeof(struct ffs_hdr) #define FFS_ENTRY_SIZE sizeof(struct ffs_entry) /* * Sizes of the data structures w/o checksum */ #define FFS_HDR_SIZE_CSUM (FFS_HDR_SIZE - sizeof(uint32_t)) #define FFS_ENTRY_SIZE_CSUM (FFS_ENTRY_SIZE - sizeof(uint32_t)) /* pid of logical partitions/containers */ #define FFS_PID_TOPLEVEL 0xFFFFFFFF /* * Type of image contained w/in partition */ enum 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 /* * Number of user data words */ #define FFS_USER_WORDS 16 /* * Define layout of user.data in struct ffs_entry */ enum user_data { USER_DATA_VOL = 0, USER_DATA_SIZE = 1, USER_DATA_CRC = 2, }; /** * struct ffs_entry - Partition entry * * @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[PART_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[FFS_USER_WORDS]; } user; uint32_t checksum; } __attribute__ ((packed)); /** * struct ffs_hdr - FSP Flash Structure header * * @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: Reserved words for future use * @checksum: Header checksum * @entries: Pointer to array of partition entries */ struct ffs_hdr { 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]; uint32_t checksum; struct ffs_entry entries[]; } __attribute__ ((packed)); #endif /* __FFS_H__ */