xref: /rk3399_ARM-atf/tools/sptool/sp_mk_generator.py (revision 1e7528ec378eb633125e67ddf1b1089eba149945)
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
1407c44475SManish PandeyFDT_SOURCES, FIP_ARGS, CRT_ARGS and SPTOOL_ARGS which are used in later build
1507c44475SManish 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
22*1e7528ecSRuari Phippsparam4: CoT parameter
23ce2b1ec6SManish Pandey
24ce2b1ec6SManish PandeyGenerated "sp_gen.mk" file contains triplet of following information for each
25ce2b1ec6SManish PandeySecure Partition entry
26ce2b1ec6SManish Pandey    FDT_SOURCES +=  sp1.dts
27ce2b1ec6SManish Pandey    SPTOOL_ARGS += -i sp1.bin:sp1.dtb -o sp1.pkg
28ce2b1ec6SManish Pandey    FIP_ARGS += --blob uuid=XXXXX-XXX...,file=sp1.pkg
2907c44475SManish Pandey    CRT_ARGS += --sp-pkg1 sp1.pkg
30ce2b1ec6SManish Pandey
31ce2b1ec6SManish PandeyA typical SP_LAYOUT_FILE file will look like
32ce2b1ec6SManish Pandey{
33ce2b1ec6SManish Pandey        "SP1" : {
34ce2b1ec6SManish Pandey                "image": "sp1.bin",
35ce2b1ec6SManish Pandey                "pm": "test/sp1.dts"
36ce2b1ec6SManish Pandey        },
37ce2b1ec6SManish Pandey
38ce2b1ec6SManish Pandey        "SP2" : {
39ce2b1ec6SManish Pandey                "image": "sp2.bin",
40ce2b1ec6SManish Pandey                "pm": "test/sp2.dts"
41ce2b1ec6SManish Pandey        }
42ce2b1ec6SManish Pandey
43ce2b1ec6SManish Pandey        ...
44ce2b1ec6SManish Pandey}
45ce2b1ec6SManish Pandey
46ce2b1ec6SManish Pandey"""
47ce2b1ec6SManish Pandey
48ce2b1ec6SManish Pandeyimport getopt
49ce2b1ec6SManish Pandeyimport json
50ce2b1ec6SManish Pandeyimport os
51ce2b1ec6SManish Pandeyimport re
52ce2b1ec6SManish Pandeyimport sys
53ce2b1ec6SManish Pandeyimport uuid
54ce2b1ec6SManish Pandey
55ce2b1ec6SManish Pandeywith open(sys.argv[2],'r') as in_file:
56ce2b1ec6SManish Pandey    data = json.load(in_file)
57ce2b1ec6SManish Pandeyjson_file = os.path.abspath(sys.argv[2])
58ce2b1ec6SManish Pandeyjson_dir = os.path.dirname(json_file)
5929214e95SGrant Likelygen_file = os.path.abspath(sys.argv[1])
6029214e95SGrant Likelyout_dir = os.path.abspath(sys.argv[3])
61ce2b1ec6SManish Pandeydtb_dir = out_dir + "/fdts/"
62*1e7528ecSRuari PhippsMAX_SP = 8
63*1e7528ecSRuari Phippsdualroot = sys.argv[4].lower() == "dualroot"
64*1e7528ecSRuari Phippssplit = int(MAX_SP / 2)
65ce2b1ec6SManish Pandeyprint(dtb_dir)
66*1e7528ecSRuari Phippsplatform_count = 1
67*1e7528ecSRuari Phippssip_count = 1
68ce2b1ec6SManish Pandey
69ce2b1ec6SManish Pandeywith open(gen_file, 'w') as out_file:
7007c44475SManish Pandey    for idx, key in enumerate(data.keys()):
71ce2b1ec6SManish Pandey
72*1e7528ecSRuari Phipps        pkg_num = idx + 1
73*1e7528ecSRuari Phipps
74*1e7528ecSRuari Phipps        if (pkg_num > MAX_SP):
75*1e7528ecSRuari Phipps            print("WARNING: Too many secure partitions\n")
76*1e7528ecSRuari Phipps            exit(-1)
77*1e7528ecSRuari Phipps
78*1e7528ecSRuari Phipps        if dualroot:
79*1e7528ecSRuari Phipps            owner = data[key].get('owner')
80*1e7528ecSRuari Phipps            if owner == "Plat":
81*1e7528ecSRuari Phipps                if (platform_count > split):
82*1e7528ecSRuari Phipps                    print("WARNING: Maximum Secure partitions by Plat " +
83*1e7528ecSRuari Phipps                    "have been exceeded (" + str(split) + ")\n")
84*1e7528ecSRuari Phipps                    exit(-1)
85*1e7528ecSRuari Phipps                pkg_num = split + platform_count
86*1e7528ecSRuari Phipps                platform_count += 1
87*1e7528ecSRuari Phipps            elif (sip_count > split):
88*1e7528ecSRuari Phipps                print("WARNING: Maximum Secure partitions by SiP " +
89*1e7528ecSRuari Phipps                "have been exceeded (" + str(split) + ")\n")
90*1e7528ecSRuari Phipps                exit(-1)
91*1e7528ecSRuari Phipps            else:
92*1e7528ecSRuari Phipps                pkg_num = sip_count
93*1e7528ecSRuari Phipps                sip_count += 1
94*1e7528ecSRuari Phipps
95ce2b1ec6SManish Pandey        """
96ce2b1ec6SManish Pandey        Append FDT_SOURCES
97ce2b1ec6SManish Pandey        """
98ce2b1ec6SManish Pandey        dts = os.path.join(json_dir, data[key]['pm'])
99ce2b1ec6SManish Pandey        dtb = dtb_dir + os.path.basename(data[key]['pm'][:-1] + "b")
100ce2b1ec6SManish Pandey        out_file.write("FDT_SOURCES += " + dts + "\n")
101ce2b1ec6SManish Pandey
102ce2b1ec6SManish Pandey        """
103ce2b1ec6SManish Pandey        Update SPTOOL_ARGS
104ce2b1ec6SManish Pandey        """
105ce2b1ec6SManish Pandey        dst = out_dir + "/" + key + ".pkg"
106ce2b1ec6SManish Pandey        src = [ json_dir + "/" + data[key]['image'] , dtb  ]
107ce2b1ec6SManish Pandey        out_file.write("SPTOOL_ARGS += -i " + ":".join(src) + " -o " + dst + "\n")
108ce2b1ec6SManish Pandey
109ce2b1ec6SManish Pandey        """
110ce2b1ec6SManish Pandey        Extract uuid from partition manifest
111ce2b1ec6SManish Pandey        """
112ce2b1ec6SManish Pandey        pm_file = open(dts)
113*1e7528ecSRuari Phipps        uuid_key = "uuid"
114ce2b1ec6SManish Pandey
115ce2b1ec6SManish Pandey        for line in pm_file:
116*1e7528ecSRuari Phipps            if uuid_key in line:
117ce2b1ec6SManish Pandey                uuid_hex = re.findall(r'\<(.+?)\>', line)[0];
118ce2b1ec6SManish Pandey
119ce2b1ec6SManish Pandey        # PM has uuid in format 0xABC... 0x... 0x... 0x...
120ce2b1ec6SManish Pandey        # Get rid of '0x' and spaces and convert to string of hex digits
121ce2b1ec6SManish Pandey        uuid_hex = uuid_hex.replace('0x','').replace(' ','')
122ce2b1ec6SManish Pandey        # make UUID from a string of hex digits
123ce2b1ec6SManish Pandey        uuid_std = uuid.UUID(uuid_hex)
124ce2b1ec6SManish Pandey        # convert UUID to a string of hex digits in standard form
125ce2b1ec6SManish Pandey        uuid_std = str(uuid_std)
126ce2b1ec6SManish Pandey
127ce2b1ec6SManish Pandey        """
128ce2b1ec6SManish Pandey        Append FIP_ARGS
129ce2b1ec6SManish Pandey        """
130ce2b1ec6SManish Pandey        out_file.write("FIP_ARGS += --blob uuid=" + uuid_std + ",file=" + dst + "\n")
13107c44475SManish Pandey
13207c44475SManish Pandey        """
13307c44475SManish Pandey        Append CRT_ARGS
13407c44475SManish Pandey        """
135*1e7528ecSRuari Phipps
136*1e7528ecSRuari Phipps        out_file.write("CRT_ARGS += --sp-pkg" + str(pkg_num) + " " + dst + "\n")
137ce2b1ec6SManish Pandey        out_file.write("\n")
138