xref: /rk3399_ARM-atf/tools/sptool/sp_mk_generator.py (revision b06344a3f2c5a0fede3646627f37d1fce3d3d585)
1ce2b1ec6SManish Pandey#!/usr/bin/python3
2*b06344a3SAnders Dellien# Copyright (c) 2020-2022, 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
221e7528ecSRuari 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/"
621e7528ecSRuari PhippsMAX_SP = 8
631e7528ecSRuari Phippsdualroot = sys.argv[4].lower() == "dualroot"
641e7528ecSRuari Phippssplit = int(MAX_SP / 2)
65ce2b1ec6SManish Pandeyprint(dtb_dir)
661e7528ecSRuari Phippsplatform_count = 1
671e7528ecSRuari 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
721e7528ecSRuari Phipps        pkg_num = idx + 1
731e7528ecSRuari Phipps
741e7528ecSRuari Phipps        if (pkg_num > MAX_SP):
751e7528ecSRuari Phipps            print("WARNING: Too many secure partitions\n")
761e7528ecSRuari Phipps            exit(-1)
771e7528ecSRuari Phipps
781e7528ecSRuari Phipps        if dualroot:
791e7528ecSRuari Phipps            owner = data[key].get('owner')
801e7528ecSRuari Phipps            if owner == "Plat":
811e7528ecSRuari Phipps                if (platform_count > split):
821e7528ecSRuari Phipps                    print("WARNING: Maximum Secure partitions by Plat " +
831e7528ecSRuari Phipps                    "have been exceeded (" + str(split) + ")\n")
841e7528ecSRuari Phipps                    exit(-1)
851e7528ecSRuari Phipps                pkg_num = split + platform_count
861e7528ecSRuari Phipps                platform_count += 1
871e7528ecSRuari Phipps            elif (sip_count > split):
881e7528ecSRuari Phipps                print("WARNING: Maximum Secure partitions by SiP " +
891e7528ecSRuari Phipps                "have been exceeded (" + str(split) + ")\n")
901e7528ecSRuari Phipps                exit(-1)
911e7528ecSRuari Phipps            else:
921e7528ecSRuari Phipps                pkg_num = sip_count
931e7528ecSRuari Phipps                sip_count += 1
941e7528ecSRuari 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)
113ce2b1ec6SManish Pandey        for line in pm_file:
114dcdbcddeSOlivier Deprez            if "uuid" in line:
115dcdbcddeSOlivier Deprez                # re.findall returns a list of string tuples.
116dcdbcddeSOlivier Deprez                # uuid_hex is the first item in this list representing the four
117dcdbcddeSOlivier Deprez                # uuid hex integers from the manifest uuid field. The heading
118dcdbcddeSOlivier Deprez                # '0x' of the hexadecimal representation is stripped out.
119dcdbcddeSOlivier Deprez                # e.g. uuid = <0x1e67b5b4 0xe14f904a 0x13fb1fb8 0xcbdae1da>;
120dcdbcddeSOlivier Deprez                # uuid_hex = ('1e67b5b4', 'e14f904a', '13fb1fb8', 'cbdae1da')
121dcdbcddeSOlivier Deprez                uuid_hex = re.findall(r'0x([0-9a-f]+) 0x([0-9a-f]+) 0x([0-9a-f]+) 0x([0-9a-f]+)', line)[0];
122ce2b1ec6SManish Pandey
123dcdbcddeSOlivier Deprez        # uuid_hex is a list of four hex string values
124dcdbcddeSOlivier Deprez        if len(uuid_hex) != 4:
125dcdbcddeSOlivier Deprez            print("ERROR: malformed UUID")
126dcdbcddeSOlivier Deprez            exit(-1)
127dcdbcddeSOlivier Deprez
128dcdbcddeSOlivier Deprez        # The uuid field in SP manifest is the little endian representation
129dcdbcddeSOlivier Deprez        # mapped to arguments as described in SMCCC section 5.3.
130dcdbcddeSOlivier Deprez        # Convert each unsigned integer value to a big endian representation
131dcdbcddeSOlivier Deprez        # required by fiptool.
132dcdbcddeSOlivier Deprez        y=list(map(bytearray.fromhex, uuid_hex))
133dcdbcddeSOlivier Deprez        z=(int.from_bytes(y[0], byteorder='little', signed=False),
134dcdbcddeSOlivier Deprez        int.from_bytes(y[1], byteorder='little', signed=False),
135dcdbcddeSOlivier Deprez        int.from_bytes(y[2], byteorder='little', signed=False),
136dcdbcddeSOlivier Deprez        int.from_bytes(y[3], byteorder='little', signed=False))
137*b06344a3SAnders Dellien        uuid_std = uuid.UUID(f'{z[0]:08x}{z[1]:08x}{z[2]:08x}{z[3]:08x}')
138ce2b1ec6SManish Pandey
139ce2b1ec6SManish Pandey        """
140ce2b1ec6SManish Pandey        Append FIP_ARGS
141ce2b1ec6SManish Pandey        """
142dcdbcddeSOlivier Deprez        out_file.write("FIP_ARGS += --blob uuid=" + str(uuid_std) + ",file=" + dst + "\n")
14307c44475SManish Pandey
14407c44475SManish Pandey        """
14507c44475SManish Pandey        Append CRT_ARGS
14607c44475SManish Pandey        """
1471e7528ecSRuari Phipps
1481e7528ecSRuari Phipps        out_file.write("CRT_ARGS += --sp-pkg" + str(pkg_num) + " " + dst + "\n")
149ce2b1ec6SManish Pandey        out_file.write("\n")
150