xref: /rk3399_ARM-atf/tools/sptool/sp_mk_generator.py (revision ce2b1ec6f0da35e20424c0a886d3d24dfded7189)
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