summaryrefslogtreecommitdiffstats
path: root/meta-xilinx-core/classes
diff options
context:
space:
mode:
authorSandeep Gundlupet Raju <sandeep.gundlupet-raju@amd.com>2023-07-06 00:31:09 -0600
committerMark Hatle <mark.hatle@amd.com>2023-07-07 09:41:02 -0500
commitba455084dadb5d681b5b4fff67195645b061fc20 (patch)
treea33ace175657a3b60549b2c7a56638ce2cf84979 /meta-xilinx-core/classes
parent6fa2417366707790e81f61470c52d0482b446351 (diff)
downloadmeta-xilinx-ba455084dadb5d681b5b4fff67195645b061fc20.tar.gz
fpgamanager_custom: Add deprecation warnings
fpgamanager_custom bbclass will be deprecated in upcoming release. Users should start using dfx_user_dts bbclass for below firmware app. 1. Zynq-7000 iand ZynqMP full bitstream firmware app. 2. ZynqMP or Versal DFx Static firmware app. 3. ZynqMP or Versal DFx Partial firmware app. 4. Versal CSoC DFx Partial firmware app. Signed-off-by: Sandeep Gundlupet Raju <sandeep.gundlupet-raju@amd.com> Signed-off-by: Mark Hatle <mark.hatle@amd.com>
Diffstat (limited to 'meta-xilinx-core/classes')
-rw-r--r--meta-xilinx-core/classes/fpgamanager_custom.bbclass197
1 files changed, 22 insertions, 175 deletions
diff --git a/meta-xilinx-core/classes/fpgamanager_custom.bbclass b/meta-xilinx-core/classes/fpgamanager_custom.bbclass
index e5255783..8c8997a1 100644
--- a/meta-xilinx-core/classes/fpgamanager_custom.bbclass
+++ b/meta-xilinx-core/classes/fpgamanager_custom.bbclass
@@ -1,177 +1,24 @@
1# This bbclass is inherited by flat, DFx Static and DFx RP firmware recipes. 1# This class inherits dfx_user_dts.bbclass for below use cases.
2# fpgamanager_custom.bbclass expects user to generate pl dtsi for flat, DFx Static 2# Zynq-7000 and ZynqMP: Full bitstream loading.
3# and DFx RP xsa outside of yocto. 3# ZynqMP: DFx Static and Partial bitstream loading.
4 4# Versal: DFx Static and Parial pdi loading.
5inherit devicetree 5# Versal: Full PDI loading.
6 6
7DEPENDS = "dtc-native bootgen-native" 7inherit dfx_user_dts
8 8
9# recipes that inherit from this class need to use an appropriate machine 9python fpgamanager_warn_msg () {
10# override for COMPATIBLE_MACHINE to build successfully; don't allow building 10 if not d.getVar("FPGAMANAGER_NO_WARN"):
11# for microblaze MACHINE 11 arch = d.getVar('SOC_FAMILY')
12COMPATIBLE_MACHINE ?= "^$" 12 pn = d.getVar('PN')
13COMPATIBLE_MACHINE:microblaze = "^$" 13 warn_msg = 'Users should start using dfx_user_dts bbclass for '
14 14 if arch == 'zynq':
15PACKAGE_ARCH = "${MACHINE_ARCH}" 15 warn_msg += 'Zynq-7000 Full bitstream loading use case.'
16 16 elif arch == 'zynqmp':
17PROVIDES = "" 17 warn_msg += 'ZynqMP Full or DFx Static or DFx Partial bitstream loading use case.'
18 18 elif arch == 'versal':
19do_fetch[cleandirs] = "${B}" 19 warn_msg += 'Versal DFx Static or DFx Partial or Full PDI loading use case.'
20 20
21DT_PADDING_SIZE = "0x1000" 21 bb.warn("Recipe %s has inherited fpgamanager_custom bbclass which will be deprecated in 2024.1 release. \n%s" % (pn, warn_msg))
22BOOTGEN_FLAGS ?= " -arch ${SOC_FAMILY} -w ${@bb.utils.contains('SOC_FAMILY','zynqmp','','-process_bitstream bin',d)}"
23
24S ?= "${WORKDIR}"
25FW_DIR ?= ""
26DTSI_PATH ?= ""
27DTBO_PATH ?= ""
28DT_FILES_PATH = "${S}/${DTSI_PATH}"
29
30python() {
31 soc_family = d.getVar("SOC_FAMILY")
32 if "git://" in d.getVar("SRC_URI") or "https://" in d.getVar("SRC_URI"):
33 d.setVar("S",'${WORKDIR}/git/'+d.getVar("FW_DIR"))
34 else:
35 dtsi_found = False
36 dtbo_found = False
37 bit_found = False
38 pdi_found = False
39
40 # Required Inputs
41 if '.dtsi' in d.getVar("SRC_URI"):
42 dtsi_found = True
43 d.setVar("DTSI_PATH",os.path.dirname([a for a in d.getVar('SRC_URI').split() if '.dtsi' in a][0].lstrip('file://')))
44
45 if '.dtbo' in d.getVar("SRC_URI"):
46 dtbo_found = True
47 d.setVar("DTBO_PATH",os.path.dirname([a for a in d.getVar('SRC_URI').split() if '.dtbo' in a][0].lstrip('file://')))
48
49 if '.bit' in d.getVar("SRC_URI") and soc_family != "versal":
50 bit_found = True
51 d.setVar("BIT_PATH",os.path.dirname([a for a in d.getVar('SRC_URI').split() if '.bit' in a][0].lstrip('file://')))
52
53 if '.pdi' in d.getVar("SRC_URI") and soc_family == "versal":
54 pdi_found = True
55 d.setVar("PDI_PATH",os.path.dirname([a for a in d.getVar('SRC_URI').split() if '.pdi' in a][0].lstrip('file://')))
56
57 # Check for valid combination of input files in SRC_URI
58 if dtsi_found or dtbo_found:
59 bb.debug(2, "dtsi or dtbo found in SRC_URI")
60 if bit_found or pdi_found:
61 bb.debug(2, "bitstream or pdi found in SRC_URI")
62 else:
63 raise bb.parse.SkipRecipe("Need one '.bit' or one '.pdi' file added to SRC_URI ")
64 else:
65 raise bb.parse.SkipRecipe("Need one '.dtsi' or one '.dtbo' file added to SRC_URI ")
66
67 # Optional input
68 if '.json' in d.getVar("SRC_URI"):
69 d.setVar("JSON_PATH",os.path.dirname([a for a in d.getVar('SRC_URI').split() if '.json' in a][0].lstrip('file://')))
70
71 if '.xclbin' in d.getVar("SRC_URI"):
72 d.setVar("XCL_PATH",os.path.dirname([a for a in d.getVar('SRC_URI').split() if '.xclbin' in a][0].lstrip('file://')))
73} 22}
74python do_configure() {
75 import glob, re, shutil
76 soc_family = d.getVar("SOC_FAMILY")
77
78 if bb.utils.contains('MACHINE_FEATURES', 'fpga-overlay', False, True, d):
79 bb.warn("Using fpga-manager.bbclass requires fpga-overlay MACHINE_FEATURE to be enabled")
80
81 # Renaming firmware-name using $PN as bitstream/PDI will be renamed using
82 # $PN when generating the bin/pdi file.
83 if '.dtsi' in d.getVar("SRC_URI"):
84 orig_dtsi = glob.glob(d.getVar('S')+ (d.getVar('DTSI_PATH') or '') + '/*.dtsi')[0]
85 new_dtsi = d.getVar('S') + '/pl.dtsi_firmwarename'
86 with open(new_dtsi, 'w') as newdtsi:
87 with open(orig_dtsi) as olddtsi:
88 for line in olddtsi:
89 if soc_family == 'versal':
90 newdtsi.write(re.sub('firmware-name.*\".*\"','firmware-name = \"'+d.getVar('PN')+'.pdi\"',line))
91 else:
92 newdtsi.write(re.sub('firmware-name.*\".*\"','firmware-name = \"'+d.getVar('PN')+'.bit.bin\"',line))
93 shutil.move(new_dtsi,orig_dtsi)
94}
95
96python devicetree_do_compile:append() {
97 import glob, subprocess, shutil
98 soc_family = d.getVar("SOC_FAMILY")
99
100 # Convert .bit to bit.bin format only if dtsi is input.
101 # In case of dtbo as input, bbclass doesn't know if firmware-name is .bit or
102 # .bit.bin format and corresponding file name. Hence we are not doing
103 # bit.bin conversion.
104 if soc_family != 'versal' and glob.glob(d.getVar('S') + '/*.dtsi'):
105 pn = d.getVar('PN')
106 biffile = pn + '.bif'
107
108 with open(biffile, 'w') as f:
109 f.write('all:\n{\n\t' + glob.glob(d.getVar('S')+(d.getVar('BIT_PATH') or '') + '/*.bit')[0] + '\n}')
110
111 bootgenargs = ["bootgen"] + (d.getVar("BOOTGEN_FLAGS") or "").split()
112 bootgenargs += ["-image", biffile, "-o", pn + ".bit.bin"]
113 subprocess.run(bootgenargs, check = True)
114
115 # In Zynq7k using both "-process_bitstream bin" and "-o" in bootgen flag,
116 # to convert bit file to bin format, "-o" option will not be effective
117 # and generated output file name is ${S}+${BIT_PATH}/<bit_file_name>.bit.bin
118 # file, Hence we need to rename this file from <bit_file_name>.bit.bin to
119 # ${PN}.bit.bin which matches the firmware name in dtbo and move
120 # ${PN}.bit.bin to ${B} directory.
121 if soc_family == 'zynq':
122 src_bitbin_file = glob.glob(d.getVar('S') + (d.getVar('BIT_PATH') or '') + '/*.bit.bin')[0]
123 dst_bitbin_file = d.getVar('B') + '/' + pn + '.bit.bin'
124 shutil.move(src_bitbin_file, dst_bitbin_file)
125
126 if not os.path.isfile(pn + ".bit.bin"):
127 bb.fatal("Couldn't find %s file, Enable '-log trace' in BOOTGEN_FLAGS" \
128 "and check bootgen_log.txt" % (d.getVar('B') + '/' + pn + '.bit.bin'))
129}
130
131do_install() {
132 install -d ${D}/${nonarch_base_libdir}/firmware/xilinx/${PN}/
133
134 # In case of dtbo as input, dtbo will be copied from directly from ${S}
135 # In case of dtsi as input, dtbo will be copied from directly from ${B}
136 if [ -f ${S}/*.dtbo ]; then
137 install -Dm 0644 ${S}/*.dtbo ${D}/${nonarch_base_libdir}/firmware/xilinx/${PN}/
138 elif [ -f ${B}/*.dtbo ]; then
139 install -Dm 0644 ${B}/*.dtbo ${D}/${nonarch_base_libdir}/firmware/xilinx/${PN}/${PN}.dtbo
140 else
141 bbfatal "A dtbo ending '.dtbo' expected but not found"
142 fi
143
144 if [ "${SOC_FAMILY}" == "versal" ]; then
145 # In case of dtbo as input, pdi will be copied from directly from ${S}
146 # without renaming the pdi name to ${PN}.pdi
147 if [ -f ${S}/*.pdi ] && [ -f ${S}/*.dtbo ]; then
148 install -Dm 0644 ${S}/*.pdi ${D}/${nonarch_base_libdir}/firmware/xilinx/${PN}/
149 elif [ -f ${S}/*.pdi ] && [ -f ${B}/*.dtbo ]; then
150 install -Dm 0644 ${S}/*.pdi ${D}/${nonarch_base_libdir}/firmware/xilinx/${PN}/${PN}.pdi
151 else
152 bbfatal "A PDI file with '.pdi' expected but not found"
153 fi
154 else
155 # In case of dtbo as input, .bit or .bit.in will be copied from directly
156 # from ${S} without renaming the .bit name to ${PN}.bit.bin
157 if [ -f ${S}/*.bit* ] && [ -f ${S}/*.dtbo ]; then
158 install -Dm 0644 ${S}/*.bit* ${D}/${nonarch_base_libdir}/firmware/xilinx/${PN}/
159 elif [ -f ${B}/${PN}.bit.bin ] && [ -f ${B}/*.dtbo ]; then
160 install -Dm 0644 ${B}/${PN}.bit.bin ${D}/${nonarch_base_libdir}/firmware/xilinx/${PN}/${PN}.bit.bin
161 else
162 bbfatal "A bitstream file with '.bit' or '.bit.bin' expected but not found"
163 fi
164 fi
165
166 if ls ${S}/${XCL_PATH}/*.xclbin >/dev/null 2>&1; then
167 install -Dm 0644 ${S}/${XCL_PATH}/*.xclbin ${D}/${nonarch_base_libdir}/firmware/xilinx/${PN}/${PN}.xclbin
168 fi
169
170 if [ -f ${S}/${JSON_PATH}/shell.json ] || [ -f ${S}/${JSON_PATH}/accel.json ]; then
171 install -Dm 0644 ${S}/${JSON_PATH}/*.json ${D}/${nonarch_base_libdir}/firmware/xilinx/${PN}/
172 fi
173}
174
175do_deploy[noexec] = "1"
176 23
177FILES:${PN} += "${nonarch_base_libdir}/firmware/xilinx/${PN}" 24do_install[postfuncs] += "fpgamanager_warn_msg" \ No newline at end of file