222 lines
5.3 KiB
C
222 lines
5.3 KiB
C
// SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
|
|
/* Copyright 2013-2015 IBM Corp. */
|
|
|
|
#ifndef __CODEUPDATE_H
|
|
#define __CODEUPDATE_H
|
|
|
|
/* Flash SG list version */
|
|
#define SG_LIST_VERSION (1UL)
|
|
|
|
/* LID size <= 16M */
|
|
#define LID_MAX_SIZE 0x1000000
|
|
|
|
/* Delete all LIDs in */
|
|
#define DEL_UPD_SIDE_LIDS 0xFFFFFFFF
|
|
|
|
/* System parameter values used in code update validation */
|
|
#define INBAND_UPDATE_ALLOWED 0x01
|
|
#define PLATFORM_HMC_MANAGED 0x01
|
|
#define FW_LICENSE_ACCEPT 0x01
|
|
|
|
/* Running image side */
|
|
#define FW_IPL_SIDE_TEMP 0x01
|
|
#define FW_IPL_SIDE_PERM 0x00
|
|
|
|
/* Manage operations */
|
|
#define OPAL_REJECT_TMP_SIDE 0
|
|
#define OPAL_COMMIT_TMP_SIDE 1
|
|
|
|
/* Validate image size */
|
|
#define VALIDATE_BUF_SIZE 4096
|
|
|
|
/* Code update operation status */
|
|
#define OPAL_INVALID_IMAGE -1003 /* Unacceptable image */
|
|
#define OPAL_ACTIVE_SIDE_ERR -9001
|
|
#define OPAL_FLASH_NO_AUTH -9002
|
|
|
|
/* Validate image update result tokens */
|
|
#define VALIDATE_TMP_UPDATE 0 /* T side will be updated */
|
|
#define VALIDATE_FLASH_AUTH 1 /* Partition does not have authority */
|
|
#define VALIDATE_INVALID_IMG 2 /* Candidate image is not valid */
|
|
#define VALIDATE_CUR_UNKNOWN 3 /* Current fixpack level is unknown */
|
|
/*
|
|
* Current T side will be committed to P side before being replace with new
|
|
* image, and the new image is downlevel from current image
|
|
*/
|
|
#define VALIDATE_TMP_COMMIT_DL 4
|
|
/*
|
|
* Current T side will be committed to P side before being replaced with new
|
|
* image
|
|
*/
|
|
#define VALIDATE_TMP_COMMIT 5
|
|
/*
|
|
* T side will be updated with a downlevel image
|
|
*/
|
|
#define VALIDATE_TMP_UPDATE_DL 6
|
|
/*
|
|
* The candidate image's release date is later than the system's firmware
|
|
* service entitlement date - service warranty period has expired
|
|
*/
|
|
#define VALIDATE_OUT_OF_WRNTY 7
|
|
|
|
/* default version */
|
|
#define FW_VERSION_UNKNOWN "UNKNOWN"
|
|
|
|
/* Actual size of MI & ML keyword including NULL */
|
|
#define MI_KEYWORD_SIZE 10
|
|
#define ML_KEYWORD_SIZE 9
|
|
|
|
/* Firmware image VPD data */
|
|
struct fw_image_vpd {
|
|
char mi_keyword[MI_KEYWORD_SIZE]; /* NNSSS_FFF */
|
|
char ext_fw_id[ML_KEYWORD_SIZE]; /* FWxxx.yy */
|
|
};
|
|
|
|
/* Master LID header */
|
|
struct master_lid_header {
|
|
char key[3]; /* "MLH" */
|
|
uint8_t version; /* 0x02 */
|
|
__be16 header_size;
|
|
__be16 entry_size;
|
|
uint8_t reserved[56];
|
|
};
|
|
|
|
/* LID index entry */
|
|
struct lid_index_entry {
|
|
__be32 id;
|
|
__be32 size;
|
|
__be32 offset;
|
|
__be32 crc;
|
|
};
|
|
|
|
/* SP flags */
|
|
#define FW_ONE_OFF_SP 0x80000000
|
|
#define FW_EMERGENCY_SP 0x40000000
|
|
|
|
/*
|
|
* SP GA date
|
|
*
|
|
* sp_flag addr = header->data + header->ext_fw_id_size
|
|
*/
|
|
struct update_image_ga_date {
|
|
__be32 sp_flag;
|
|
char sp_ga_date[8]; /* YYYYMMDD */
|
|
};
|
|
|
|
/* Image magic number */
|
|
#define IMAGE_MAGIC_NUMBER 0x5549
|
|
|
|
/* Image header structure */
|
|
struct update_image_header {
|
|
__be16 magic;
|
|
__be16 version;
|
|
__be32 package_size;
|
|
__be32 crc;
|
|
__be16 lid_index_offset;
|
|
__be16 number_lids;
|
|
__be16 package_flags;
|
|
__be16 mi_keyword_size;
|
|
char mi_keyword_data[40];
|
|
__be16 ext_fw_id_size;
|
|
/* Rest of the image data including ext fw id, sp flags */
|
|
char data[];
|
|
};
|
|
|
|
/* FipS header */
|
|
struct fips_header {
|
|
__be16 magic;
|
|
__be16 version;
|
|
__be32 lid_id;
|
|
__be32 lid_date; /* YYYYMMDD */
|
|
__be16 lid_time; /* HHMM */
|
|
__be16 lid_class;
|
|
__be32 crc;
|
|
__be32 lid_size; /* Number of bytes below header */
|
|
__be32 header_size;
|
|
uint8_t mtd_number;
|
|
uint8_t valid; /* 1 = valid, 0 = invalid */
|
|
uint8_t reserved;
|
|
uint8_t lid_info_size;
|
|
char lid_info[64]; /* code level */
|
|
__be32 update_date; /* YYYYMMDD */
|
|
__be16 update_time; /* HHMM */
|
|
__be16 phylum_len;
|
|
uint8_t lid_phylum[];
|
|
};
|
|
|
|
/* Approximate LID size */
|
|
#define MASTER_LID_SIZE 0x5000
|
|
/*
|
|
* Note:
|
|
* Doc indicates non-SP LIDs size is 0-8MB. However
|
|
* in reality marker LID size less than 4k. Allocating
|
|
* 8k to give some breathing space.
|
|
*/
|
|
#define MARKER_LID_SIZE 0x00002000
|
|
|
|
/* Common marker LID no */
|
|
#define P_COM_MARKER_LID_ID 0x80A00001
|
|
#define T_COM_MARKER_LID_ID (P_COM_MARKER_LID_ID | ADJUST_T_SIDE_LID_NO)
|
|
|
|
/*
|
|
* Common marker LID structure
|
|
*
|
|
* Note that we are populating only required sections,
|
|
* not all ADF sections in common marker LID.
|
|
*/
|
|
struct com_marker_header {
|
|
__be32 version;
|
|
__be32 MI_offset; /* Offset to MI section */
|
|
__be32 iseries_offset;
|
|
};
|
|
|
|
/* MI Keyword section */
|
|
struct com_marker_mi_section {
|
|
__be32 MI_size;
|
|
char mi_keyword[40]; /* MI Keyword */
|
|
char lst_disrupt_fix_lvl[3];
|
|
char skip[21]; /* Skip not interested fields */
|
|
__be32 adf_offset; /* Offset to ADF section */
|
|
};
|
|
|
|
/* Additional Data Fields */
|
|
struct com_marker_adf_sec {
|
|
__be32 adf_cnt; /* ADF count */
|
|
char adf_data[]; /* ADF data */
|
|
};
|
|
|
|
/* ADF common header */
|
|
struct com_marker_adf_header {
|
|
__be32 size; /* Section size */
|
|
__be32 name; /* Section name */
|
|
};
|
|
|
|
/*
|
|
* Service Pack Nomenclature ADF
|
|
*
|
|
* Service pack release name.
|
|
*/
|
|
#define ADF_NAME_SP 0x53504E4D /* SPNM */
|
|
struct com_marker_adf_sp
|
|
{
|
|
struct com_marker_adf_header header;
|
|
__be32 sp_name_offset; /* Offset from start of ADF */
|
|
__be32 sp_name_size;
|
|
__be32 skip[4]; /* Skip rest of fields */
|
|
};
|
|
|
|
/*
|
|
* Firmware IP Protection ADF
|
|
*
|
|
* Service Pack flags and GA date.
|
|
*/
|
|
#define ADF_NAME_FW_IP 0x46495050 /* FIPP */
|
|
struct com_marker_fw_ip {
|
|
struct com_marker_adf_header header;
|
|
__be32 sp_flag_offset; /* Offset from start of ADF */
|
|
__be32 sp_flag_size;
|
|
__be32 sp_ga_offset; /* Offset from start of ADF*/
|
|
__be32 sp_ga_size;
|
|
};
|
|
|
|
#endif /* __CODEUPDATE_H */
|