1*ce2b1ec6SManish Pandey#!/usr/bin/python3 2*ce2b1ec6SManish Pandey# Copyright (c) 2020, Arm Limited. All rights reserved. 3*ce2b1ec6SManish Pandey# 4*ce2b1ec6SManish Pandey# SPDX-License-Identifier: BSD-3-Clause 5*ce2b1ec6SManish Pandey 6*ce2b1ec6SManish Pandey""" 7*ce2b1ec6SManish PandeyThis script is invoked by Make system and generates secure partition makefile. 8*ce2b1ec6SManish PandeyIt expects platform provided secure partition layout file which contains list 9*ce2b1ec6SManish Pandeyof Secure Partition Images and Partition manifests(PM). 10*ce2b1ec6SManish PandeyLayout file can exist outside of TF-A tree and the paths of Image and PM files 11*ce2b1ec6SManish Pandeymust be relative to it. 12*ce2b1ec6SManish Pandey 13*ce2b1ec6SManish PandeyThis script parses the layout file and generates a make file which updates 14*ce2b1ec6SManish PandeyFDT_SOURCES, FIP_ARGS and SPTOOL_ARGS which are used in later build steps. 15*ce2b1ec6SManish PandeyThis script also gets SP "uuid" from parsing its PM and converting it to a 16*ce2b1ec6SManish Pandeystandard format. 17*ce2b1ec6SManish Pandey 18*ce2b1ec6SManish Pandeyparam1: Generated mk file "sp_gen.mk" 19*ce2b1ec6SManish Pandeyparam2: "SP_LAYOUT_FILE", json file containing platform provided information 20*ce2b1ec6SManish Pandeyparam3: plat out directory 21*ce2b1ec6SManish Pandey 22*ce2b1ec6SManish PandeyGenerated "sp_gen.mk" file contains triplet of following information for each 23*ce2b1ec6SManish PandeySecure Partition entry 24*ce2b1ec6SManish Pandey FDT_SOURCES += sp1.dts 25*ce2b1ec6SManish Pandey SPTOOL_ARGS += -i sp1.bin:sp1.dtb -o sp1.pkg 26*ce2b1ec6SManish Pandey FIP_ARGS += --blob uuid=XXXXX-XXX...,file=sp1.pkg 27*ce2b1ec6SManish Pandey 28*ce2b1ec6SManish PandeyA typical SP_LAYOUT_FILE file will look like 29*ce2b1ec6SManish Pandey{ 30*ce2b1ec6SManish Pandey "SP1" : { 31*ce2b1ec6SManish Pandey "image": "sp1.bin", 32*ce2b1ec6SManish Pandey "pm": "test/sp1.dts" 33*ce2b1ec6SManish Pandey }, 34*ce2b1ec6SManish Pandey 35*ce2b1ec6SManish Pandey "SP2" : { 36*ce2b1ec6SManish Pandey "image": "sp2.bin", 37*ce2b1ec6SManish Pandey "pm": "test/sp2.dts" 38*ce2b1ec6SManish Pandey } 39*ce2b1ec6SManish Pandey 40*ce2b1ec6SManish Pandey ... 41*ce2b1ec6SManish Pandey} 42*ce2b1ec6SManish Pandey 43*ce2b1ec6SManish Pandey""" 44*ce2b1ec6SManish Pandey 45*ce2b1ec6SManish Pandeyimport getopt 46*ce2b1ec6SManish Pandeyimport json 47*ce2b1ec6SManish Pandeyimport os 48*ce2b1ec6SManish Pandeyimport re 49*ce2b1ec6SManish Pandeyimport sys 50*ce2b1ec6SManish Pandeyimport uuid 51*ce2b1ec6SManish Pandey 52*ce2b1ec6SManish Pandeywith open(sys.argv[2],'r') as in_file: 53*ce2b1ec6SManish Pandey data = json.load(in_file) 54*ce2b1ec6SManish Pandeyjson_file = os.path.abspath(sys.argv[2]) 55*ce2b1ec6SManish Pandeyjson_dir = os.path.dirname(json_file) 56*ce2b1ec6SManish Pandeygen_file = sys.argv[1] 57*ce2b1ec6SManish Pandeyout_dir = sys.argv[3][2:] 58*ce2b1ec6SManish Pandeydtb_dir = out_dir + "/fdts/" 59*ce2b1ec6SManish Pandeyprint(dtb_dir) 60*ce2b1ec6SManish Pandey 61*ce2b1ec6SManish Pandeywith open(gen_file, 'w') as out_file: 62*ce2b1ec6SManish Pandey for key in data.keys(): 63*ce2b1ec6SManish Pandey 64*ce2b1ec6SManish Pandey """ 65*ce2b1ec6SManish Pandey Append FDT_SOURCES 66*ce2b1ec6SManish Pandey """ 67*ce2b1ec6SManish Pandey dts = os.path.join(json_dir, data[key]['pm']) 68*ce2b1ec6SManish Pandey dtb = dtb_dir + os.path.basename(data[key]['pm'][:-1] + "b") 69*ce2b1ec6SManish Pandey out_file.write("FDT_SOURCES += " + dts + "\n") 70*ce2b1ec6SManish Pandey 71*ce2b1ec6SManish Pandey """ 72*ce2b1ec6SManish Pandey Update SPTOOL_ARGS 73*ce2b1ec6SManish Pandey """ 74*ce2b1ec6SManish Pandey dst = out_dir + "/" + key + ".pkg" 75*ce2b1ec6SManish Pandey src = [ json_dir + "/" + data[key]['image'] , dtb ] 76*ce2b1ec6SManish Pandey out_file.write("SPTOOL_ARGS += -i " + ":".join(src) + " -o " + dst + "\n") 77*ce2b1ec6SManish Pandey 78*ce2b1ec6SManish Pandey """ 79*ce2b1ec6SManish Pandey Extract uuid from partition manifest 80*ce2b1ec6SManish Pandey """ 81*ce2b1ec6SManish Pandey pm_file = open(dts) 82*ce2b1ec6SManish Pandey key = "uuid" 83*ce2b1ec6SManish Pandey 84*ce2b1ec6SManish Pandey for line in pm_file: 85*ce2b1ec6SManish Pandey if key in line: 86*ce2b1ec6SManish Pandey uuid_hex = re.findall(r'\<(.+?)\>', line)[0]; 87*ce2b1ec6SManish Pandey 88*ce2b1ec6SManish Pandey # PM has uuid in format 0xABC... 0x... 0x... 0x... 89*ce2b1ec6SManish Pandey # Get rid of '0x' and spaces and convert to string of hex digits 90*ce2b1ec6SManish Pandey uuid_hex = uuid_hex.replace('0x','').replace(' ','') 91*ce2b1ec6SManish Pandey # make UUID from a string of hex digits 92*ce2b1ec6SManish Pandey uuid_std = uuid.UUID(uuid_hex) 93*ce2b1ec6SManish Pandey # convert UUID to a string of hex digits in standard form 94*ce2b1ec6SManish Pandey uuid_std = str(uuid_std) 95*ce2b1ec6SManish Pandey 96*ce2b1ec6SManish Pandey """ 97*ce2b1ec6SManish Pandey Append FIP_ARGS 98*ce2b1ec6SManish Pandey """ 99*ce2b1ec6SManish Pandey out_file.write("FIP_ARGS += --blob uuid=" + uuid_std + ",file=" + dst + "\n") 100*ce2b1ec6SManish Pandey out_file.write("\n") 101