15357f83dSManish V Badarkhe /* 25357f83dSManish V Badarkhe * Copyright (c) 2021, Arm Limited. All rights reserved. 35357f83dSManish V Badarkhe * 45357f83dSManish V Badarkhe * SPDX-License-Identifier: BSD-3-Clause 55357f83dSManish V Badarkhe * 65357f83dSManish V Badarkhe * FWU metadata information as per the specification section 4.1: 7e106a78eSSughosh Ganu * https://developer.arm.com/documentation/den0118/latest/ 85357f83dSManish V Badarkhe * 95357f83dSManish V Badarkhe */ 105357f83dSManish V Badarkhe 115357f83dSManish V Badarkhe #ifndef FWU_METADATA_H 125357f83dSManish V Badarkhe #define FWU_METADATA_H 135357f83dSManish V Badarkhe 145357f83dSManish V Badarkhe #include <stdint.h> 155357f83dSManish V Badarkhe #include <tools_share/uuid.h> 165357f83dSManish V Badarkhe 17a89d58bbSSughosh Ganu #define NR_OF_MAX_FW_BANKS 4 18a89d58bbSSughosh Ganu 195357f83dSManish V Badarkhe /* Properties of image in a bank */ 20*8d08a1dfSSughosh Ganu struct fwu_image_bank_info { 215357f83dSManish V Badarkhe 22*8d08a1dfSSughosh Ganu /* GUID of the image in this bank */ 23*8d08a1dfSSughosh Ganu struct efi_guid img_guid; 245357f83dSManish V Badarkhe 255357f83dSManish V Badarkhe /* [0]: bit describing the image acceptance status – 265357f83dSManish V Badarkhe * 1 means the image is accepted 275357f83dSManish V Badarkhe * [31:1]: MBZ 285357f83dSManish V Badarkhe */ 295357f83dSManish V Badarkhe uint32_t accepted; 305357f83dSManish V Badarkhe 315357f83dSManish V Badarkhe /* reserved (MBZ) */ 325357f83dSManish V Badarkhe uint32_t reserved; 335357f83dSManish V Badarkhe 345357f83dSManish V Badarkhe } __packed; 355357f83dSManish V Badarkhe 365357f83dSManish V Badarkhe /* Image entry information */ 375357f83dSManish V Badarkhe struct fwu_image_entry { 385357f83dSManish V Badarkhe 39*8d08a1dfSSughosh Ganu /* GUID identifying the image type */ 40*8d08a1dfSSughosh Ganu struct efi_guid img_type_guid; 415357f83dSManish V Badarkhe 42*8d08a1dfSSughosh Ganu /* GUID of the storage volume where the image is located */ 43*8d08a1dfSSughosh Ganu struct efi_guid location_guid; 445357f83dSManish V Badarkhe 45*8d08a1dfSSughosh Ganu /* Properties of images with img_type_guid in the different FW banks */ 46*8d08a1dfSSughosh Ganu struct fwu_image_bank_info img_bank_info[NR_OF_FW_BANKS]; 475357f83dSManish V Badarkhe 485357f83dSManish V Badarkhe } __packed; 495357f83dSManish V Badarkhe 50a89d58bbSSughosh Ganu /* Firmware Image descriptor */ 51a89d58bbSSughosh Ganu struct fwu_fw_store_descriptor { 52a89d58bbSSughosh Ganu 53a89d58bbSSughosh Ganu /* Number of Banks */ 54a89d58bbSSughosh Ganu uint8_t num_banks; 55a89d58bbSSughosh Ganu 56a89d58bbSSughosh Ganu /* Reserved */ 57a89d58bbSSughosh Ganu uint8_t reserved; 58a89d58bbSSughosh Ganu 59a89d58bbSSughosh Ganu /* Number of images per bank */ 60a89d58bbSSughosh Ganu uint16_t num_images; 61a89d58bbSSughosh Ganu 62a89d58bbSSughosh Ganu /* Size of image_entry(all banks) in bytes */ 63a89d58bbSSughosh Ganu uint16_t img_entry_size; 64a89d58bbSSughosh Ganu 65a89d58bbSSughosh Ganu /* Size of image bank info structure in bytes */ 66a89d58bbSSughosh Ganu uint16_t bank_info_entry_size; 67a89d58bbSSughosh Ganu 68a89d58bbSSughosh Ganu /* Array of fwu_image_entry structs */ 69a89d58bbSSughosh Ganu struct fwu_image_entry img_entry[NR_OF_IMAGES_IN_FW_BANK]; 70a89d58bbSSughosh Ganu 71a89d58bbSSughosh Ganu } __packed; 72a89d58bbSSughosh Ganu 735357f83dSManish V Badarkhe /* 745357f83dSManish V Badarkhe * FWU metadata filled by the updater and consumed by TF-A for 755357f83dSManish V Badarkhe * various purposes as below: 765357f83dSManish V Badarkhe * 1. Get active FW bank. 775357f83dSManish V Badarkhe * 2. Rollback to previous working FW bank. 785357f83dSManish V Badarkhe * 3. Get properties of all images present in all banks. 795357f83dSManish V Badarkhe */ 805357f83dSManish V Badarkhe struct fwu_metadata { 815357f83dSManish V Badarkhe 825357f83dSManish V Badarkhe /* Metadata CRC value */ 835357f83dSManish V Badarkhe uint32_t crc_32; 845357f83dSManish V Badarkhe 855357f83dSManish V Badarkhe /* Metadata version */ 865357f83dSManish V Badarkhe uint32_t version; 875357f83dSManish V Badarkhe 885357f83dSManish V Badarkhe /* Bank index with which device boots */ 895357f83dSManish V Badarkhe uint32_t active_index; 905357f83dSManish V Badarkhe 915357f83dSManish V Badarkhe /* Previous bank index with which device booted successfully */ 925357f83dSManish V Badarkhe uint32_t previous_active_index; 935357f83dSManish V Badarkhe 94a89d58bbSSughosh Ganu /* Size of the entire metadata in bytes */ 95a89d58bbSSughosh Ganu uint32_t metadata_size; 96a89d58bbSSughosh Ganu 97a89d58bbSSughosh Ganu /* Offset of the image descriptor structure */ 98a89d58bbSSughosh Ganu uint16_t desc_offset; 99a89d58bbSSughosh Ganu 100a89d58bbSSughosh Ganu /* Reserved */ 101a89d58bbSSughosh Ganu uint16_t reserved1; 102a89d58bbSSughosh Ganu 103a89d58bbSSughosh Ganu /* Bank state */ 104a89d58bbSSughosh Ganu uint8_t bank_state[NR_OF_MAX_FW_BANKS]; 105a89d58bbSSughosh Ganu 106a89d58bbSSughosh Ganu /* Reserved */ 107a89d58bbSSughosh Ganu uint32_t reserved2; 108a89d58bbSSughosh Ganu 109a89d58bbSSughosh Ganu #if PSA_FWU_METADATA_FW_STORE_DESC 1105357f83dSManish V Badarkhe /* Image entry information */ 111a89d58bbSSughosh Ganu struct fwu_fw_store_descriptor fw_desc; 112a89d58bbSSughosh Ganu #endif 1135357f83dSManish V Badarkhe 1145357f83dSManish V Badarkhe } __packed; 1155357f83dSManish V Badarkhe 1165357f83dSManish V Badarkhe #endif /* FWU_METADATA_H */ 117