util/qualcomm: Add MBN v7 format support
The QCOM X1P42100 SoC requires images loaded by PBL in MBN v7 format. This script is updated to support MBN v7 format which will be used to generate the Bootblock binary. Starting with the Qualcomm x1p42100 SoC, the bootblock ELF header expects MBN version 7 instead of version 6 with the SC7280 SoC. This patch adds the necessary adjustment to ensure compatibility with older SoC platforms and also adds incremental support for newer SoC generations. If Qualcomm SoCs in the future demands a more advanced version of MBN (version > 7), additional logic will be added to the newly added section as `self.flash_parti_ver == 8`. BUG=b:420542130, b:404985109 TEST=Create image.serial.bin with bootblock in MBN v7 format and ensure it boots on X1P42100. Please refer to the steps mentioned below to create final AP FW image for QC SoC X1P42100. Step 1: Create Bootblock MBN image using createxbl.py script where the newly added MBN v7 support will be used. Step 2: Call create_multielf.py to create the concatenated multi ELF ( TME SEQ + TME FW + QC_SEC + BOOTBLOCK from step 1) Step 3: Call nqgpt.py to create final GPT image. Change-Id: I484df537ac7d1e51ec86dcae74a74dc211710616 Signed-off-by: Sasirekaa Madhesu <smadhesu@qualcomm.corp-partner.google.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/88240 Reviewed-by: Pranava Y N <pranavayn@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Subrata Banik <subratabanik@google.com> Reviewed-by: Kapil Porwal <kapilporwal@google.com>
This commit is contained in:
parent
626c5364b8
commit
ae5810e358
2 changed files with 150 additions and 38 deletions
|
|
@ -98,7 +98,7 @@ def main():
|
|||
|
||||
parser.add_option("--mbn_version",
|
||||
action="store", type="int", dest="mbn_version",
|
||||
help="Add mbn header in elf image. '3', '5' or '6'")
|
||||
help="Add mbn header in elf image. '3', '5', '6' or '7'")
|
||||
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
|
|
|||
|
|
@ -528,50 +528,154 @@ class Boot_Hdr:
|
|||
self.reserved_1 = init_val
|
||||
self.reserved_2 = init_val
|
||||
self.reserved_3 = init_val
|
||||
self.reserved = 0
|
||||
self.common_metadata_size = init_val
|
||||
|
||||
# Common Metadata members. These are needed for an MBNv7.
|
||||
# Common Metadata is placed just after the header, hence, clubbed with
|
||||
# this header.
|
||||
self.common_metadata_major_version = 0
|
||||
self.common_metadata_minor_version = 0
|
||||
self.software_id = init_val
|
||||
self.secondary_software_id = 0
|
||||
self.hash_table_algorithm = 3
|
||||
self.measurement_register_target = 0
|
||||
|
||||
# OEM Metadata 2.0 Members added for MBNv7.
|
||||
self.major_version = 2
|
||||
self.minor_version = 0
|
||||
self.anti_rollback_version = 0
|
||||
self.mrc_index = 0
|
||||
self.soc_hw_ver_0 = 0
|
||||
self.soc_hw_ver_1 = 0
|
||||
self.soc_hw_ver_2 = 0
|
||||
self.soc_hw_ver_3 = 0
|
||||
self.soc_hw_ver_4 = 0
|
||||
self.soc_hw_ver_5 = 0
|
||||
self.soc_hw_ver_6 = 0
|
||||
self.soc_hw_ver_7 = 0
|
||||
self.soc_hw_ver_8 = 0
|
||||
self.soc_hw_ver_9 = 0
|
||||
self.soc_hw_ver_10 = 0
|
||||
self.soc_hw_ver_11 = 0
|
||||
self.soc_feature_id = 0
|
||||
self.jtag_id = 0
|
||||
self.serial_number_0 = 0
|
||||
self.serial_number_1 = 0
|
||||
self.serial_number_2 = 0
|
||||
self.serial_number_3 = 0
|
||||
self.serial_number_4 = 0
|
||||
self.serial_number_5 = 0
|
||||
self.serial_number_6 = 0
|
||||
self.serial_number_7 = 0
|
||||
self.oem_id = 0
|
||||
self.oem_product_id = 0
|
||||
self.soc_lifecycle_state = 0
|
||||
self.oem_lifecycle_state = 0
|
||||
self.oem_root_certificate_hash_algorithm = 0
|
||||
self.oem_root_certificate_hash = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
|
||||
self.flags = 1398101
|
||||
|
||||
def getLength(self):
|
||||
return BOOT_HEADER_LENGTH
|
||||
|
||||
def writePackedData(self, target, write_full_hdr):
|
||||
values = [self.image_id,
|
||||
self.flash_parti_ver,
|
||||
self.image_src,
|
||||
self.image_dest_ptr,
|
||||
self.image_size,
|
||||
self.code_size ,
|
||||
self.sig_ptr,
|
||||
self.sig_size,
|
||||
self.cert_chain_ptr,
|
||||
self.cert_chain_size,
|
||||
self.magic_number1,
|
||||
self.version,
|
||||
self.OS_type,
|
||||
self.boot_apps_parti_entry,
|
||||
self.boot_apps_size_entry,
|
||||
self.boot_apps_ram_loc,
|
||||
self.reserved_ptr,
|
||||
self.reserved_1,
|
||||
self.reserved_2,
|
||||
self.reserved_3 ]
|
||||
if self.flash_parti_ver == 7:
|
||||
values = [self.reserved,
|
||||
self.flash_parti_ver,
|
||||
self.common_metadata_size,
|
||||
self.metadata_size_qti,
|
||||
self.metadata_size,
|
||||
self.code_size,
|
||||
self.image_src, # QTI signature size per MBNv6/v5/v3 structure below.
|
||||
self.image_dest_ptr, # QTI certificate chain size per MBNv6/v5/v3 structure below.
|
||||
self.sig_size,
|
||||
self.cert_chain_size,
|
||||
# Common Metadata members.
|
||||
self.common_metadata_major_version,
|
||||
self.common_metadata_minor_version,
|
||||
self.software_id,
|
||||
self.secondary_software_id,
|
||||
self.hash_table_algorithm,
|
||||
self.measurement_register_target,
|
||||
# OEM Metadata 2.0 members.
|
||||
self.major_version,
|
||||
self.minor_version,
|
||||
self.anti_rollback_version,
|
||||
self.mrc_index,
|
||||
self.soc_hw_ver_0,
|
||||
self.soc_hw_ver_1,
|
||||
self.soc_hw_ver_2,
|
||||
self.soc_hw_ver_3,
|
||||
self.soc_hw_ver_4,
|
||||
self.soc_hw_ver_5,
|
||||
self.soc_hw_ver_6,
|
||||
self.soc_hw_ver_7,
|
||||
self.soc_hw_ver_8,
|
||||
self.soc_hw_ver_9,
|
||||
self.soc_hw_ver_10,
|
||||
self.soc_hw_ver_11,
|
||||
self.soc_feature_id,
|
||||
self.jtag_id,
|
||||
self.serial_number_0,
|
||||
self.serial_number_1,
|
||||
self.serial_number_2,
|
||||
self.serial_number_3,
|
||||
self.serial_number_4,
|
||||
self.serial_number_5,
|
||||
self.serial_number_6,
|
||||
self.serial_number_7,
|
||||
self.oem_id,
|
||||
self.oem_product_id,
|
||||
self.soc_lifecycle_state,
|
||||
self.oem_lifecycle_state,
|
||||
self.oem_root_certificate_hash_algorithm,
|
||||
self.oem_root_certificate_hash,
|
||||
self.flags]
|
||||
else:
|
||||
values = [self.image_id,
|
||||
self.flash_parti_ver,
|
||||
self.image_src,
|
||||
self.image_dest_ptr,
|
||||
self.image_size,
|
||||
self.code_size ,
|
||||
self.sig_ptr,
|
||||
self.sig_size,
|
||||
self.cert_chain_ptr,
|
||||
self.cert_chain_size,
|
||||
self.magic_number1,
|
||||
self.version,
|
||||
self.OS_type,
|
||||
self.boot_apps_parti_entry,
|
||||
self.boot_apps_size_entry,
|
||||
self.boot_apps_ram_loc,
|
||||
self.reserved_ptr,
|
||||
self.reserved_1,
|
||||
self.reserved_2,
|
||||
self.reserved_3 ]
|
||||
|
||||
if self.flash_parti_ver >= 6:
|
||||
values.insert(10, self.metadata_size_qti)
|
||||
values.insert(11, self.metadata_size)
|
||||
if self.flash_parti_ver == 6:
|
||||
values.insert(10, self.metadata_size_qti)
|
||||
values.insert(11, self.metadata_size)
|
||||
|
||||
if self.image_dest_ptr >= 0x100000000:
|
||||
values[3] = 0xFFFFFFFF
|
||||
if self.image_dest_ptr >= 0x100000000:
|
||||
values[3] = 0xFFFFFFFF
|
||||
|
||||
if self.cert_chain_ptr >= 0x100000000:
|
||||
values[6] = 0xFFFFFFFF
|
||||
if self.cert_chain_ptr >= 0x100000000:
|
||||
values[6] = 0xFFFFFFFF
|
||||
|
||||
if self.sig_ptr >= 0x100000000:
|
||||
values[8] = 0xFFFFFFFF
|
||||
if self.sig_ptr >= 0x100000000:
|
||||
values[8] = 0xFFFFFFFF
|
||||
|
||||
# Write 10 entries(40B) or 20 entries(80B) of boot header
|
||||
if write_full_hdr is False:
|
||||
if self.flash_parti_ver >= 6:
|
||||
if self.flash_parti_ver == 6:
|
||||
s = struct.Struct('I'* 12)
|
||||
values = values[:12]
|
||||
elif self.flash_parti_ver == 7:
|
||||
# MBNv7 Header is 40 bytes. Common Metadata is 24 bytes,
|
||||
# OEM Metadata is 224 bytes and of the format: "I*18 + Q*8 + I*5+ 64s + I".
|
||||
s = struct.Struct('I'*34 + 'Q'*8 + 'I'*5 + '64sI')
|
||||
else:
|
||||
s = struct.Struct('I'* 10)
|
||||
values = values[:10]
|
||||
|
|
@ -935,7 +1039,7 @@ def image_header(env, gen_dict,
|
|||
image_size = code_size
|
||||
|
||||
if header_version:
|
||||
assert header_version in [3, 5, 6], 'Not a valid MBN header version'
|
||||
assert header_version in [3, 5, 6, 7], 'Not a valid MBN header version'
|
||||
|
||||
# For ELF or hashed images, image destination will be determined from an ELF input file
|
||||
if gen_dict['IMAGE_KEY_MBN_TYPE'] == 'elf':
|
||||
|
|
@ -993,6 +1097,12 @@ def image_header(env, gen_dict,
|
|||
boot_header.metadata_size_qti = 0 # qti_metadata size
|
||||
boot_header.metadata_size = 0 # oem_metadata size
|
||||
|
||||
if header_version == 7:
|
||||
boot_header.software_id = 0x7B # Hardcoded to BOOTBLOCK SW ID
|
||||
boot_header.common_metadata_size = 24
|
||||
boot_header.metadata_size = 224
|
||||
|
||||
|
||||
# If preamble is required, output the preamble file and update the boot_header
|
||||
if requires_preamble is True:
|
||||
boot_header = image_preamble(gen_dict, preamble_file_name, boot_header, num_of_pages)
|
||||
|
|
@ -2113,11 +2223,13 @@ def file_copy_offset(in_fp, in_off, out_fp, out_off, num_bytes):
|
|||
return num_bytes
|
||||
|
||||
#----------------------------------------------------------------------------
|
||||
# sha1/sha256 hash routine wrapper
|
||||
# Return header_size based on version
|
||||
#----------------------------------------------------------------------------
|
||||
def header_size(header_version):
|
||||
if header_version >= 6:
|
||||
if header_version == 6:
|
||||
return 48
|
||||
elif header_version == 7:
|
||||
return 288
|
||||
else:
|
||||
return 40
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue