]>
git.ipfire.org Git - thirdparty/u-boot.git/blob - arch/arm/mach-rockchip/make_fit_atf.py
3 # SPDX-License-Identifier: GPL-2.0+
5 # A script to generate FIT image source for rockchip boards
6 # with ARM Trusted Firmware
7 # and multiple device trees (given on the command line)
9 # usage: $0 <dt_name> [<dt_name> [<dt_name] ...]
16 # pip install pyelftools
17 from elftools
.elf
.elffile
import ELFFile
19 ELF_SEG_P_TYPE
= 'p_type'
20 ELF_SEG_P_PADDR
= 'p_paddr'
21 ELF_SEG_P_VADDR
= 'p_vaddr'
22 ELF_SEG_P_OFFSET
= 'p_offset'
23 ELF_SEG_P_FILESZ
= 'p_filesz'
24 ELF_SEG_P_MEMSZ
= 'p_memsz'
28 * This is a generated file.
33 description = "FIT image for U-Boot with bl31 (TF-A)";
41 description = "U-Boot (64-bit)";
42 data = /incbin/("u-boot-nodtb.bin");
52 DT_IMAGES_NODE_END
= """ };
58 def append_bl31_node(file, atf_index
, phy_addr
, elf_entry
):
59 # Append BL31 DT node to input FIT dts file.
60 data
= 'bl31_0x%08x.bin' % phy_addr
61 file.write('\t\tatf_%d {\n' % atf_index
)
62 file.write('\t\t\tdescription = \"ARM Trusted Firmware\";\n')
63 file.write('\t\t\tdata = /incbin/("%s");\n' % data
)
64 file.write('\t\t\ttype = "firmware";\n')
65 file.write('\t\t\tarch = "arm64";\n')
66 file.write('\t\t\tos = "arm-trusted-firmware";\n')
67 file.write('\t\t\tcompression = "none";\n')
68 file.write('\t\t\tload = <0x%08x>;\n' % phy_addr
)
70 file.write('\t\t\tentry = <0x%08x>;\n' % elf_entry
)
71 file.write('\t\t};\n')
74 def append_fdt_node(file, dtbs
):
78 dtname
= os
.path
.basename(dtb
)
79 file.write('\t\tfdt_%d {\n' % cnt
)
80 file.write('\t\t\tdescription = "%s";\n' % dtname
)
81 file.write('\t\t\tdata = /incbin/("%s");\n' % dtb
)
82 file.write('\t\t\ttype = "flat_dt";\n')
83 file.write('\t\t\tcompression = "none";\n')
84 file.write('\t\t};\n')
88 def append_conf_section(file, cnt
, dtname
, segments
):
89 file.write('\t\tconfig_%d {\n' % cnt
)
90 file.write('\t\t\tdescription = "%s";\n' % dtname
)
91 file.write('\t\t\tfirmware = "atf_1";\n')
92 file.write('\t\t\tloadables = "uboot",')
93 for i
in range(1, segments
):
94 file.write('"atf_%d"' % (i
))
95 if i
!= (segments
- 1):
99 file.write('\t\t\tfdt = "fdt_1";\n')
100 file.write('\t\t};\n')
103 def append_conf_node(file, dtbs
, segments
):
104 # Append configeration nodes.
106 file.write('\tconfigurations {\n')
107 file.write('\t\tdefault = "config_1";\n')
109 dtname
= os
.path
.basename(dtb
)
110 append_conf_section(file, cnt
, dtname
, segments
)
115 def generate_atf_fit_dts_uboot(fit_file
, uboot_file_name
):
118 with
open(uboot_file_name
, 'rb') as uboot_file
:
119 uboot
= ELFFile(uboot_file
)
120 for i
in range(uboot
.num_segments()):
121 seg
= uboot
.get_segment(i
)
122 if seg
.__getitem
__(ELF_SEG_P_TYPE
) == 'PT_LOAD':
123 p_paddr
= seg
.__getitem
__(ELF_SEG_P_PADDR
)
124 num_load_seg
= num_load_seg
+ 1
126 assert (p_paddr
!= 0xFFFFFFFF and num_load_seg
== 1)
128 fit_file
.write(DT_UBOOT
% p_paddr
)
130 def generate_atf_fit_dts_bl31(fit_file
, bl31_file_name
, dtbs_file_name
):
131 with
open(bl31_file_name
, 'rb') as bl31_file
:
132 bl31
= ELFFile(bl31_file
)
133 elf_entry
= bl31
.header
['e_entry']
134 segments
= bl31
.num_segments()
135 for i
in range(segments
):
136 seg
= bl31
.get_segment(i
)
137 if seg
.__getitem
__(ELF_SEG_P_TYPE
) == 'PT_LOAD':
138 paddr
= seg
.__getitem
__(ELF_SEG_P_PADDR
)
139 append_bl31_node(fit_file
, i
+ 1, paddr
, elf_entry
)
140 append_fdt_node(fit_file
, dtbs_file_name
)
141 fit_file
.write(DT_IMAGES_NODE_END
)
142 append_conf_node(fit_file
, dtbs_file_name
, segments
)
144 def generate_atf_fit_dts(fit_file_name
, bl31_file_name
, uboot_file_name
, dtbs_file_name
):
145 # Generate FIT script for ATF image.
146 if fit_file_name
!= sys
.stdout
:
147 fit_file
= open(fit_file_name
, "wb")
149 fit_file
= sys
.stdout
151 fit_file
.write(DT_HEADER
)
152 generate_atf_fit_dts_uboot(fit_file
, uboot_file_name
)
153 generate_atf_fit_dts_bl31(fit_file
, bl31_file_name
, dtbs_file_name
)
154 fit_file
.write(DT_END
)
156 if fit_file_name
!= sys
.stdout
:
159 def generate_atf_binary(bl31_file_name
):
160 with
open(bl31_file_name
, 'rb') as bl31_file
:
161 bl31
= ELFFile(bl31_file
)
163 num
= bl31
.num_segments()
165 seg
= bl31
.get_segment(i
)
166 if seg
.__getitem
__(ELF_SEG_P_TYPE
) == 'PT_LOAD':
167 paddr
= seg
.__getitem
__(ELF_SEG_P_PADDR
)
168 file_name
= 'bl31_0x%08x.bin' % paddr
169 with
open(file_name
, "wb") as atf
:
170 atf
.write(seg
.data())
173 uboot_elf
= "./u-boot"
174 bl31_elf
= "./bl31.elf"
177 opts
, args
= getopt
.getopt(sys
.argv
[1:], "o:u:b:h")
178 for opt
, val
in opts
:
191 generate_atf_fit_dts(fit_its
, bl31_elf
, uboot_elf
, dtbs
)
192 generate_atf_binary(bl31_elf
)
194 if __name__
== "__main__":