historical/m0-applesillicon.git/xnu-qemu-arm64-5.1.0/roms/skiboot/hw/fsp/fsp-codeupdate.h
2024-01-16 11:20:27 -06:00

236 lines
5.9 KiB
C

/* Copyright 2013-2014 IBM Corp.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#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 */
uint16_t header_size;
uint16_t entry_size;
uint8_t reserved[56];
};
/* LID index entry */
struct lid_index_entry {
uint32_t id;
uint32_t size;
uint32_t offset;
uint32_t 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 {
uint32_t sp_flag;
char sp_ga_date[8]; /* YYYYMMDD */
};
/* Image magic number */
#define IMAGE_MAGIC_NUMBER 0x5549
/* Image header structure */
struct update_image_header {
uint16_t magic;
uint16_t version;
uint32_t package_size;
uint32_t crc;
uint16_t lid_index_offset;
uint16_t number_lids;
uint16_t package_flags;
uint16_t mi_keyword_size;
char mi_keyword_data[40];
uint16_t ext_fw_id_size;
/* Rest of the image data including ext fw id, sp flags */
char data[];
};
/* FipS header */
struct fips_header {
uint16_t magic;
uint16_t version;
uint32_t lid_id;
uint32_t lid_date; /* YYYYMMDD */
uint16_t lid_time; /* HHMM */
uint16_t lid_class;
uint32_t crc;
uint32_t lid_size; /* Number of bytes below header */
uint32_t 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 */
uint32_t update_date; /* YYYYMMDD */
uint16_t update_time; /* HHMM */
uint16_t 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 {
uint32_t version;
uint32_t MI_offset; /* Offset to MI section */
uint32_t iseries_offset;
};
/* MI Keyword section */
struct com_marker_mi_section {
uint32_t MI_size;
char mi_keyword[40]; /* MI Keyword */
char lst_disrupt_fix_lvl[3];
char skip[21]; /* Skip not interested fields */
uint32_t adf_offset; /* Offset to ADF section */
};
/* Additional Data Fields */
struct com_marker_adf_sec {
uint32_t adf_cnt; /* ADF count */
char adf_data[]; /* ADF data */
};
/* ADF common header */
struct com_marker_adf_header {
uint32_t size; /* Section size */
uint32_t 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;
uint32_t sp_name_offset; /* Offset from start of ADF */
uint32_t sp_name_size;
uint32_t 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;
uint32_t sp_flag_offset; /* Offset from start of ADF */
uint32_t sp_flag_size;
uint32_t sp_ga_offset; /* Offset from start of ADF*/
uint32_t sp_ga_size;
};
#endif /* __CODEUPDATE_H */