xref: /rk3399_ARM-atf/tools/sptool/sp_mk_generator.py (revision 51dbe464ec5b176eed0b4ffc664df6277344931e)
1ce2b1ec6SManish Pandey#!/usr/bin/python3
2*5f7116a8SBence Balogh# Copyright (c) 2020-2025, 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.
165ac60ea1SImre KisIf the SP entry in the layout file has a "uuid" field the scripts gets the UUID
175ac60ea1SImre Kisfrom there, otherwise it parses the associated partition manifest and extracts
185ac60ea1SImre Kisthe UUID from there.
19ce2b1ec6SManish Pandey
20ce2b1ec6SManish Pandeyparam1: Generated mk file "sp_gen.mk"
21ce2b1ec6SManish Pandeyparam2: "SP_LAYOUT_FILE", json file containing platform provided information
22ce2b1ec6SManish Pandeyparam3: plat out directory
231e7528ecSRuari Phippsparam4: CoT parameter
2420629b31SKarl Meakinparam5: Generated dts file "sp_list_fragment.dts"
25ce2b1ec6SManish Pandey
26ce2b1ec6SManish PandeyGenerated "sp_gen.mk" file contains triplet of following information for each
27ce2b1ec6SManish PandeySecure Partition entry
28ce2b1ec6SManish Pandey    FDT_SOURCES +=  sp1.dts
29ce2b1ec6SManish Pandey    SPTOOL_ARGS += -i sp1.bin:sp1.dtb -o sp1.pkg
30ce2b1ec6SManish Pandey    FIP_ARGS += --blob uuid=XXXXX-XXX...,file=sp1.pkg
3107c44475SManish Pandey    CRT_ARGS += --sp-pkg1 sp1.pkg
32ce2b1ec6SManish Pandey
3393273613SBen HorganIt populates the number of SP in the defined macro 'NUM_SP'
3493273613SBen Horgan    $(eval $(call add_define_val,NUM_SP,{len(sp_layout.keys())}))
3593273613SBen Horgan
36ce2b1ec6SManish PandeyA typical SP_LAYOUT_FILE file will look like
37ce2b1ec6SManish Pandey{
38ce2b1ec6SManish Pandey        "SP1" : {
39ce2b1ec6SManish Pandey                "image": "sp1.bin",
40ce2b1ec6SManish Pandey                "pm": "test/sp1.dts"
41ce2b1ec6SManish Pandey        },
42ce2b1ec6SManish Pandey
43ce2b1ec6SManish Pandey        "SP2" : {
44ce2b1ec6SManish Pandey                "image": "sp2.bin",
455ac60ea1SImre Kis                "pm": "test/sp2.dts",
465ac60ea1SImre Kis                "uuid": "1b1820fe-48f7-4175-8999-d51da00b7c9f"
47ce2b1ec6SManish Pandey        }
48ce2b1ec6SManish Pandey
49ce2b1ec6SManish Pandey        ...
50ce2b1ec6SManish Pandey}
51ce2b1ec6SManish Pandey
52ce2b1ec6SManish Pandey"""
53ce2b1ec6SManish Pandeyimport json
54ce2b1ec6SManish Pandeyimport os
55ce2b1ec6SManish Pandeyimport re
56ce2b1ec6SManish Pandeyimport sys
57ce2b1ec6SManish Pandeyimport uuid
582d317e80SJ-Alvesimport fdt
59a96a07bfSJ-Alvesfrom spactions import SpSetupActions
602d317e80SJ-Alvesimport hob
612d317e80SJ-Alvesimport struct
622d317e80SJ-Alvesfrom hob import HobList
63ce2b1ec6SManish Pandey
641e7528ecSRuari PhippsMAX_SP = 8
65a96a07bfSJ-AlvesUUID_LEN = 4
662d317e80SJ-AlvesHOB_OFFSET_DEFAULT=0x2000
67ce2b1ec6SManish Pandey
68a96a07bfSJ-Alves# Some helper functions to access args propagated to the action functions in
69a96a07bfSJ-Alves# SpSetupActions framework.
70a96a07bfSJ-Alvesdef check_sp_mk_gen(args :dict):
71a96a07bfSJ-Alves    if "sp_gen_mk" not in args.keys():
72a96a07bfSJ-Alves        raise Exception(f"Path to file sp_gen.mk needs to be in 'args'.")
731e7528ecSRuari Phipps
74a96a07bfSJ-Alvesdef check_out_dir(args :dict):
75a96a07bfSJ-Alves    if "out_dir" not in args.keys() or not os.path.isdir(args["out_dir"]):
76a96a07bfSJ-Alves        raise Exception("Define output folder with \'out_dir\' key.")
771e7528ecSRuari Phipps
78a96a07bfSJ-Alvesdef check_sp_layout_dir(args :dict):
79a96a07bfSJ-Alves    if "sp_layout_dir" not in args.keys() or not os.path.isdir(args["sp_layout_dir"]):
80a96a07bfSJ-Alves        raise Exception("Define output folder with \'sp_layout_dir\' key.")
81a96a07bfSJ-Alves
82a96a07bfSJ-Alvesdef write_to_sp_mk_gen(content, args :dict):
83a96a07bfSJ-Alves    check_sp_mk_gen(args)
84a96a07bfSJ-Alves    with open(args["sp_gen_mk"], "a") as f:
85a96a07bfSJ-Alves        f.write(f"{content}\n")
86a96a07bfSJ-Alves
87a96a07bfSJ-Alvesdef get_sp_manifest_full_path(sp_node, args :dict):
88a96a07bfSJ-Alves    check_sp_layout_dir(args)
89a96a07bfSJ-Alves    return os.path.join(args["sp_layout_dir"], get_file_from_layout(sp_node["pm"]))
90a96a07bfSJ-Alves
91a96a07bfSJ-Alvesdef get_sp_img_full_path(sp_node, args :dict):
92a96a07bfSJ-Alves    check_sp_layout_dir(args)
93a96a07bfSJ-Alves    return os.path.join(args["sp_layout_dir"], get_file_from_layout(sp_node["image"]))
94a96a07bfSJ-Alves
950fe374efSJ-Alvesdef get_size(sp_node):
960fe374efSJ-Alves    if not "size" in sp_node:
970fe374efSJ-Alves        print("WARNING: default image size 0x100000")
980fe374efSJ-Alves        return 0x100000
990fe374efSJ-Alves
1000fe374efSJ-Alves    # Try if it was a decimal value.
1010fe374efSJ-Alves    try:
1020fe374efSJ-Alves        return int(sp_node["size"])
1030fe374efSJ-Alves    except ValueError:
1040fe374efSJ-Alves        print("WARNING: trying to parse base 16 size")
1050fe374efSJ-Alves        # Try if it is of base 16
1060fe374efSJ-Alves        return int(sp_node["size"], 16)
1070fe374efSJ-Alves
108a96a07bfSJ-Alvesdef get_sp_pkg(sp, args :dict):
109a96a07bfSJ-Alves    check_out_dir(args)
110a96a07bfSJ-Alves    return os.path.join(args["out_dir"], f"{sp}.pkg")
111a96a07bfSJ-Alves
112a96a07bfSJ-Alvesdef is_line_in_sp_gen(line, args :dict):
113a96a07bfSJ-Alves    with open(args["sp_gen_mk"], "r") as f:
114a96a07bfSJ-Alves        sppkg_rule = [l for l in f if line in l]
1151a28f290SJ-Alves    return len(sppkg_rule) != 0
116a96a07bfSJ-Alves
117a96a07bfSJ-Alvesdef get_file_from_layout(node):
118a96a07bfSJ-Alves    ''' Helper to fetch a file path from sp_layout.json. '''
119a96a07bfSJ-Alves    if type(node) is dict and "file" in node.keys():
120a96a07bfSJ-Alves        return node["file"]
121a96a07bfSJ-Alves    return node
122a96a07bfSJ-Alves
123a96a07bfSJ-Alvesdef get_offset_from_layout(node):
124a96a07bfSJ-Alves    ''' Helper to fetch an offset from sp_layout.json. '''
125a96a07bfSJ-Alves    if type(node) is dict and "offset" in node.keys():
126a96a07bfSJ-Alves        return int(node["offset"], 0)
127a96a07bfSJ-Alves    return None
128a96a07bfSJ-Alves
129a96a07bfSJ-Alvesdef get_image_offset(node):
130a96a07bfSJ-Alves    ''' Helper to fetch image offset from sp_layout.json '''
131a96a07bfSJ-Alves    return get_offset_from_layout(node["image"])
132a96a07bfSJ-Alves
133a96a07bfSJ-Alvesdef get_pm_offset(node):
134a96a07bfSJ-Alves    ''' Helper to fetch pm offset from sp_layout.json '''
135a96a07bfSJ-Alves    return get_offset_from_layout(node["pm"])
136a96a07bfSJ-Alves
13720629b31SKarl Meakindef get_uuid(sp_layout, sp, args :dict):
13820629b31SKarl Meakin    ''' Helper to fetch uuid from pm file listed in sp_layout.json'''
13920629b31SKarl Meakin    if "uuid" in sp_layout[sp]:
14020629b31SKarl Meakin        # Extract the UUID from the JSON file if the SP entry has a 'uuid' field
14120629b31SKarl Meakin        uuid_std = uuid.UUID(sp_layout[sp]['uuid'])
14220629b31SKarl Meakin    else:
14320629b31SKarl Meakin        with open(get_sp_manifest_full_path(sp_layout[sp], args), "r") as pm_f:
14420629b31SKarl Meakin            uuid_lines = [l for l in pm_f if 'uuid' in l]
14520629b31SKarl Meakin        assert(len(uuid_lines) == 1)
14620629b31SKarl Meakin        # The uuid field in SP manifest is the little endian representation
14720629b31SKarl Meakin        # mapped to arguments as described in SMCCC section 5.3.
14820629b31SKarl Meakin        # Convert each unsigned integer value to a big endian representation
14920629b31SKarl Meakin        # required by fiptool.
15020629b31SKarl Meakin        uuid_parsed = re.findall("0x([0-9a-f]+)", uuid_lines[0])
15120629b31SKarl Meakin        y = list(map(bytearray.fromhex, uuid_parsed))
15220629b31SKarl Meakin        z = [int.from_bytes(i, byteorder='little', signed=False) for i in y]
15320629b31SKarl Meakin        uuid_std = uuid.UUID(f'{z[0]:08x}{z[1]:08x}{z[2]:08x}{z[3]:08x}')
15420629b31SKarl Meakin    return uuid_std
15520629b31SKarl Meakin
15620629b31SKarl Meakindef get_load_address(sp_layout, sp, args :dict):
15720629b31SKarl Meakin    ''' Helper to fetch load-address from pm file listed in sp_layout.json'''
15820629b31SKarl Meakin    with open(get_sp_manifest_full_path(sp_layout[sp], args), "r") as pm_f:
159*5f7116a8SBence Balogh        load_address_lines = [l for l in pm_f if re.search(r'load-address[^-]', l)]
16004e7f808SJ-Alves
1616a3225e2SJ-Alves    if len(load_address_lines) != 1:
16204e7f808SJ-Alves        return None
16304e7f808SJ-Alves
16420629b31SKarl Meakin    load_address_parsed = re.search("(0x[0-9a-f]+)", load_address_lines[0])
16520629b31SKarl Meakin    return load_address_parsed.group(0)
16620629b31SKarl Meakin
167a96a07bfSJ-Alves@SpSetupActions.sp_action(global_action=True)
168a96a07bfSJ-Alvesdef check_max_sps(sp_layout, _, args :dict):
169a96a07bfSJ-Alves    ''' Check validate the maximum number of SPs is respected. '''
170a96a07bfSJ-Alves    if len(sp_layout.keys()) > MAX_SP:
171a96a07bfSJ-Alves        raise Exception(f"Too many SPs in SP layout file. Max: {MAX_SP}")
172a96a07bfSJ-Alves    return args
173a96a07bfSJ-Alves
17493273613SBen Horgan@SpSetupActions.sp_action(global_action=True)
17593273613SBen Horgandef count_sps(sp_layout, _, args :dict):
17693273613SBen Horgan    ''' Count number of SP and put in NUM_SP '''
17793273613SBen Horgan    write_to_sp_mk_gen(f"$(eval $(call add_define_val,NUM_SP,{len(sp_layout.keys())}))", args)
17893273613SBen Horgan    return args
17993273613SBen Horgan
180a96a07bfSJ-Alves@SpSetupActions.sp_action
181a96a07bfSJ-Alvesdef gen_fdt_sources(sp_layout, sp, args :dict):
182a96a07bfSJ-Alves    ''' Generate FDT_SOURCES values for a given SP. '''
183a96a07bfSJ-Alves    manifest_path = get_sp_manifest_full_path(sp_layout[sp], args)
184a96a07bfSJ-Alves    write_to_sp_mk_gen(f"FDT_SOURCES += {manifest_path}", args)
185a96a07bfSJ-Alves    return args
186a96a07bfSJ-Alves
1872d317e80SJ-Alves@SpSetupActions.sp_action(exec_order=1)
1882d317e80SJ-Alvesdef generate_hob_list(sp_layout, sp, args: dict):
1892d317e80SJ-Alves    '''
1902d317e80SJ-Alves        Generates a HOB file for the partition, if it requested it in its FF-A
1912d317e80SJ-Alves        manifest.
1922d317e80SJ-Alves    '''
1932d317e80SJ-Alves    with open(get_sp_manifest_full_path(sp_layout[sp], args), "r") as f:
1942d317e80SJ-Alves        sp_fdt = fdt.parse_dts(f.read())
1952d317e80SJ-Alves
1962d317e80SJ-Alves    if sp_fdt.exist_property('hob_list', '/boot-info'):
1972d317e80SJ-Alves        sp_hob_name = os.path.basename(sp + ".hob.bin")
1982d317e80SJ-Alves        sp_hob_name = os.path.join(args["out_dir"], f"{sp_hob_name}")
1992d317e80SJ-Alves
2002d317e80SJ-Alves        # Add to the args so it can be consumed by the TL pkg function.
2012d317e80SJ-Alves        sp_layout[sp]["hob_path"] = sp_hob_name
2022d317e80SJ-Alves        hob_list = hob.generate_hob_from_fdt_node(sp_fdt, HOB_OFFSET_DEFAULT)
2032d317e80SJ-Alves        with open(sp_hob_name, "wb") as h:
2042d317e80SJ-Alves            for block in hob_list.get_list():
2052d317e80SJ-Alves                h.write(block.pack())
2062d317e80SJ-Alves
2072d317e80SJ-Alves    return args
2082d317e80SJ-Alves
2090fe374efSJ-Alvesdef generate_sp_pkg(sp_node, pkg, sp_img, sp_dtb):
2100fe374efSJ-Alves    ''' Generates the rule in case SP is to be generated in an SP Pkg. '''
2110fe374efSJ-Alves    pm_offset = get_pm_offset(sp_node)
2120fe374efSJ-Alves    sptool_args = f" --pm-offset {pm_offset}" if pm_offset is not None else ""
2130fe374efSJ-Alves    image_offset = get_image_offset(sp_node)
2140fe374efSJ-Alves    sptool_args += f" --img-offset {image_offset}" if image_offset is not None else ""
2150fe374efSJ-Alves    sptool_args += f" -o {pkg}"
2160fe374efSJ-Alves    return f'''
2170fe374efSJ-Alves{pkg}: {sp_dtb} {sp_img}
2180fe374efSJ-Alves\t$(Q)echo Generating {pkg}
2190fe374efSJ-Alves\t$(Q)$(PYTHON) $(SPTOOL)  -i {sp_img}:{sp_dtb} {sptool_args}
2200fe374efSJ-Alves'''
2210fe374efSJ-Alves
2220fe374efSJ-Alvesdef generate_tl_pkg(sp_node, pkg, sp_img, sp_dtb, hob_path = None):
2230fe374efSJ-Alves    ''' Generate make rules for a Transfer List type package. '''
2240fe374efSJ-Alves    # TE Type for the FF-A manifest.
2250fe374efSJ-Alves    TE_FFA_MANIFEST = 0x106
2260fe374efSJ-Alves    # TE Type for the SP binary.
2270fe374efSJ-Alves    TE_SP_BINARY = 0x103
2280fe374efSJ-Alves    # TE Type for the HOB List.
2290fe374efSJ-Alves    TE_HOB_LIST = 0x3
23032ecc0efSJ-Alves    tlc_add_hob = f"\t$(Q)$(TLCTOOL) add --entry {TE_HOB_LIST} {hob_path} {pkg}" if hob_path is not None else ""
2310fe374efSJ-Alves    return f'''
2320fe374efSJ-Alves{pkg}: {sp_dtb} {sp_img}
2330fe374efSJ-Alves\t$(Q)echo Generating {pkg}
2340fe374efSJ-Alves\t$(Q)$(TLCTOOL) create --size {get_size(sp_node)} --entry {TE_FFA_MANIFEST} {sp_dtb} {pkg} --align 12
23532ecc0efSJ-Alves{tlc_add_hob}
2360fe374efSJ-Alves\t$(Q)$(TLCTOOL) add --entry {TE_SP_BINARY} {sp_img} {pkg}
2370fe374efSJ-Alves'''
2380fe374efSJ-Alves
239a96a07bfSJ-Alves@SpSetupActions.sp_action
2400fe374efSJ-Alvesdef gen_partition_pkg(sp_layout, sp, args :dict):
241822c7279SJ-Alves    ''' Generate Sp Pkgs rules. '''
2420fe374efSJ-Alves    pkg = get_sp_pkg(sp, args)
2430fe374efSJ-Alves
244822c7279SJ-Alves    sp_dtb_name = os.path.basename(get_file_from_layout(sp_layout[sp]["pm"]))[:-1] + "b"
245a96a07bfSJ-Alves    sp_dtb = os.path.join(args["out_dir"], f"fdts/{sp_dtb_name}")
2464daeaf34SJens Wiklander    sp_img = get_sp_img_full_path(sp_layout[sp], args)
247822c7279SJ-Alves
248822c7279SJ-Alves    # Do not generate rule if already there.
2490fe374efSJ-Alves    if is_line_in_sp_gen(f'{pkg}:', args):
250822c7279SJ-Alves        return args
251822c7279SJ-Alves
2520fe374efSJ-Alves    # This should include all packages of all kinds.
2530fe374efSJ-Alves    write_to_sp_mk_gen(f"SP_PKGS += {pkg}\n", args)
2540fe374efSJ-Alves    package_type = sp_layout[sp]["package"] if "package" in sp_layout[sp] else "sp_pkg"
2550fe374efSJ-Alves
2560fe374efSJ-Alves    if package_type == "sp_pkg":
2570fe374efSJ-Alves        partition_pkg_rule = generate_sp_pkg(sp_layout[sp], pkg, sp_img, sp_dtb)
2580fe374efSJ-Alves    elif package_type == "tl_pkg":
25932ecc0efSJ-Alves        # Conditionally provide the Hob.
26032ecc0efSJ-Alves        hob_path = sp_layout[sp]["hob_path"] if "hob_path" in sp_layout[sp] else None
26132ecc0efSJ-Alves        partition_pkg_rule = generate_tl_pkg(
26232ecc0efSJ-Alves                sp_layout[sp], pkg, sp_img, sp_dtb, hob_path)
2630fe374efSJ-Alves    else:
2640fe374efSJ-Alves        raise ValueError(f"Specified invalid pkg type {package_type}")
2650fe374efSJ-Alves
2660fe374efSJ-Alves    write_to_sp_mk_gen(partition_pkg_rule, args)
267a96a07bfSJ-Alves    return args
268a96a07bfSJ-Alves
269a96a07bfSJ-Alves@SpSetupActions.sp_action(global_action=True, exec_order=1)
270a96a07bfSJ-Alvesdef check_dualroot(sp_layout, _, args :dict):
271a96a07bfSJ-Alves    ''' Validate the amount of SPs from SiP and Platform owners. '''
272a96a07bfSJ-Alves    if not args.get("dualroot"):
273a96a07bfSJ-Alves        return args
274a96a07bfSJ-Alves    args["split"] =  int(MAX_SP / 2)
275a96a07bfSJ-Alves    owners = [sp_layout[sp].get("owner") for sp in sp_layout]
276a96a07bfSJ-Alves    args["plat_max_count"] = owners.count("Plat")
2770fe374efSJ-Alves
278a96a07bfSJ-Alves    # If it is owned by the platform owner, it is assigned to the SiP.
279a96a07bfSJ-Alves    args["sip_max_count"] = len(sp_layout.keys()) - args["plat_max_count"]
280a96a07bfSJ-Alves    if  args["sip_max_count"] > args["split"] or args["sip_max_count"] > args["split"]:
281a96a07bfSJ-Alves        print(f"WARN: SiP Secure Partitions should not be more than {args['split']}")
282a96a07bfSJ-Alves    # Counters for gen_crt_args.
283a96a07bfSJ-Alves    args["sip_count"] = 1
284a96a07bfSJ-Alves    args["plat_count"] = 1
285a96a07bfSJ-Alves    return args
286a96a07bfSJ-Alves
287a96a07bfSJ-Alves@SpSetupActions.sp_action
288a96a07bfSJ-Alvesdef gen_crt_args(sp_layout, sp, args :dict):
289a96a07bfSJ-Alves    ''' Append CRT_ARGS. '''
290a96a07bfSJ-Alves    # If "dualroot" is configured, 'sp_pkg_idx' depends on whether the SP is owned
291a96a07bfSJ-Alves    # by the "SiP" or the "Plat".
292a96a07bfSJ-Alves    if args.get("dualroot"):
293a96a07bfSJ-Alves        # If the owner is not specified as "Plat", default to "SiP".
294a96a07bfSJ-Alves        if sp_layout[sp].get("owner") == "Plat":
295a96a07bfSJ-Alves            if args["plat_count"] > args["plat_max_count"]:
296a96a07bfSJ-Alves                raise ValueError("plat_count can't surpass plat_max_count in args.")
297a96a07bfSJ-Alves            sp_pkg_idx = args["plat_count"] + args["split"]
298a96a07bfSJ-Alves            args["plat_count"] += 1
2991e7528ecSRuari Phipps        else:
300a96a07bfSJ-Alves            if args["sip_count"] > args["sip_max_count"]:
301a96a07bfSJ-Alves                raise ValueError("sip_count can't surpass sip_max_count in args.")
302a96a07bfSJ-Alves            sp_pkg_idx = args["sip_count"]
303a96a07bfSJ-Alves            args["sip_count"] += 1
304a96a07bfSJ-Alves    else:
305a96a07bfSJ-Alves        sp_pkg_idx = [k for k in sp_layout.keys()].index(sp) + 1
306a96a07bfSJ-Alves    write_to_sp_mk_gen(f"CRT_ARGS += --sp-pkg{sp_pkg_idx} {get_sp_pkg(sp, args)}\n", args)
307a96a07bfSJ-Alves    return args
3081e7528ecSRuari Phipps
309a96a07bfSJ-Alves@SpSetupActions.sp_action
310a96a07bfSJ-Alvesdef gen_fiptool_args(sp_layout, sp, args :dict):
311a96a07bfSJ-Alves    ''' Generate arguments for the FIP Tool. '''
31220629b31SKarl Meakin    uuid_std = get_uuid(sp_layout, sp, args)
313a96a07bfSJ-Alves    write_to_sp_mk_gen(f"FIP_ARGS += --blob uuid={str(uuid_std)},file={get_sp_pkg(sp, args)}\n", args)
314a96a07bfSJ-Alves    return args
315ce2b1ec6SManish Pandey
31620629b31SKarl Meakin@SpSetupActions.sp_action
31720629b31SKarl Meakindef gen_fconf_fragment(sp_layout, sp, args: dict):
31820629b31SKarl Meakin    ''' Generate the fconf fragment file'''
31920629b31SKarl Meakin    with open(args["fconf_fragment"], "a") as f:
32020629b31SKarl Meakin        uuid = get_uuid(sp_layout, sp, args)
32120629b31SKarl Meakin        owner = "Plat" if sp_layout[sp].get("owner") == "Plat" else "SiP"
32220629b31SKarl Meakin
32320629b31SKarl Meakin        if "physical-load-address" in sp_layout[sp].keys():
32420629b31SKarl Meakin            load_address = sp_layout[sp]["physical-load-address"]
32520629b31SKarl Meakin        else:
32620629b31SKarl Meakin            load_address = get_load_address(sp_layout, sp, args)
32720629b31SKarl Meakin
32804e7f808SJ-Alves        if load_address is not None:
32920629b31SKarl Meakin            f.write(
33020629b31SKarl Meakinf'''\
33120629b31SKarl Meakin{sp} {{
33220629b31SKarl Meakin    uuid = "{uuid}";
33320629b31SKarl Meakin    load-address = <{load_address}>;
33420629b31SKarl Meakin    owner = "{owner}";
33520629b31SKarl Meakin}};
33620629b31SKarl Meakin
33720629b31SKarl Meakin''')
33804e7f808SJ-Alves        else:
33904e7f808SJ-Alves            print("Warning: No load-address was found in the SP manifest.")
34004e7f808SJ-Alves
34120629b31SKarl Meakin    return args
34220629b31SKarl Meakin
343a96a07bfSJ-Alvesdef init_sp_actions(sys):
344a96a07bfSJ-Alves    # Initialize arguments for the SP actions framework
345a96a07bfSJ-Alves    args = {}
346a96a07bfSJ-Alves    args["sp_gen_mk"] = os.path.abspath(sys.argv[1])
34720629b31SKarl Meakin    sp_layout_file = os.path.abspath(sys.argv[2])
348a96a07bfSJ-Alves    args["sp_layout_dir"] = os.path.dirname(sp_layout_file)
349a96a07bfSJ-Alves    args["out_dir"] = os.path.abspath(sys.argv[3])
350a96a07bfSJ-Alves    args["dualroot"] = sys.argv[4] == "dualroot"
35120629b31SKarl Meakin    args["fconf_fragment"] = os.path.abspath(sys.argv[5])
35220629b31SKarl Meakin
35320629b31SKarl Meakin
35420629b31SKarl Meakin    with open(sp_layout_file) as json_file:
35520629b31SKarl Meakin        sp_layout = json.load(json_file)
356a96a07bfSJ-Alves    #Clear content of file "sp_gen.mk".
357a96a07bfSJ-Alves    with open(args["sp_gen_mk"], "w"):
358a96a07bfSJ-Alves        None
35920629b31SKarl Meakin    #Clear content of file "fconf_fragment".
36020629b31SKarl Meakin    with open(args["fconf_fragment"], "w"):
36120629b31SKarl Meakin        None
36220629b31SKarl Meakin
363a96a07bfSJ-Alves    return args, sp_layout
36407c44475SManish Pandey
365a96a07bfSJ-Alvesif __name__ == "__main__":
366a96a07bfSJ-Alves    args, sp_layout = init_sp_actions(sys)
367a96a07bfSJ-Alves    SpSetupActions.run_actions(sp_layout, args)
368