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