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