blob: 565e43c73603524819a934fa3481b9e5361c844f [file] [log] [blame]
Brad Bishop97cce002017-07-22 14:49:25 -04001# Base image class extension, inlined into every image.
2
3def build_uboot(d):
4 fstypes = d.getVar('IMAGE_FSTYPES', True).split()
5 if any([x.endswith('u-boot') for x in fstypes]):
6 return 'image_types_uboot'
7 return ''
8
9
10# Inherit u-boot classes if legacy uboot images are in use.
11IMAGE_TYPE_uboot = '${@build_uboot(d)}'
12inherit ${IMAGE_TYPE_uboot}
13
Brad Bishop19fc4f82017-08-04 23:38:54 -040014# Phosphor image types
15#
Brad Bishop3aa1ef62017-08-04 23:48:12 -040016# Phosphor OpenBMC supports a fixed partition mtd layout,
17# A dynamic mtd with ubi layout, and a tar file for use with
18# The reference BMC software update implementation.
Brad Bishop19fc4f82017-08-04 23:38:54 -040019
20# Image composition
21FLASH_KERNEL_IMAGE ?= "fitImage-${INITRAMFS_IMAGE}-${MACHINE}.bin"
22IMAGE_BASETYPE ?= "squashfs-xz"
23OVERLAY_BASETYPE ?= "jffs2"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040024FLASH_UBI_BASETYPE ?= "${IMAGE_BASETYPE}"
25FLASH_UBI_OVERLAY_BASETYPE ?= "ubifs"
Brad Bishop19fc4f82017-08-04 23:38:54 -040026
Brad Bishop3aa1ef62017-08-04 23:48:12 -040027IMAGE_TYPES += "overlay mtd-static mtd-static-alltar mtd-static-tar mtd-ubi mtd-ubi-tar"
Brad Bishop19fc4f82017-08-04 23:38:54 -040028
Brad Bishop3aa1ef62017-08-04 23:48:12 -040029IMAGE_TYPEDEP_overlay = "${IMAGE_BASETYPE}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040030IMAGE_TYPEDEP_mtd-static = "${IMAGE_BASETYPE}"
31IMAGE_TYPEDEP_mtd-static-tar = "${IMAGE_BASETYPE}"
32IMAGE_TYPEDEP_mtd-static-alltar = "mtd-static"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040033IMAGE_TYPEDEP_mtd-ubi = "${FLASH_UBI_BASETYPE}"
34IMAGE_TYPEDEP_mtd-ubi-tar = "${FLASH_UBI_BASETYPE}"
35IMAGE_TYPES_MASKED += "overlay mtd-static mtd-static-alltar mtd-static-tar mtd-ubi mtd-ubi-tar"
Brad Bishop19fc4f82017-08-04 23:38:54 -040036
Brad Bishop3aa1ef62017-08-04 23:48:12 -040037# Flash characteristics in KB unless otherwise noted
Brad Bishop19fc4f82017-08-04 23:38:54 -040038FLASH_SIZE ?= "32768"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040039FLASH_PEB_SIZE ?= "64"
40# Flash page and overhead sizes in bytes
41FLASH_PAGE_SIZE ?= "1"
42FLASH_NOR_UBI_OVERHEAD ?= "64"
Brad Bishop19fc4f82017-08-04 23:38:54 -040043
44# Fixed partition offsets
45FLASH_UBOOT_OFFSET ?= "0"
46FLASH_KERNEL_OFFSET ?= "512"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040047FLASH_UBI_OFFSET ?= "${FLASH_KERNEL_OFFSET}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040048FLASH_ROFS_OFFSET ?= "4864"
49FLASH_RWFS_OFFSET ?= "28672"
50
Brad Bishop3aa1ef62017-08-04 23:48:12 -040051# UBI volume sizes in KB unless otherwise noted.
52FLASH_UBI_RWFS_SIZE ?= "4096"
53FLASH_UBI_RWFS_TXT_SIZE ?= "4MiB"
54
55python() {
56 # Compute rwfs LEB count and LEB size.
57 page_size = d.getVar('FLASH_PAGE_SIZE', True)
58 nor_overhead_size = d.getVar('FLASH_NOR_UBI_OVERHEAD', True)
59 overhead_size = max(int(page_size), int(nor_overhead_size))
60 peb_size = d.getVar('FLASH_PEB_SIZE', True)
61 leb_size = (int(peb_size) * 1024) - (2 * overhead_size)
62 d.setVar('FLASH_LEB_SIZE', str(leb_size)) # In bytes
63
64 rwfs_size = d.getVar('FLASH_UBI_RWFS_SIZE', True)
65 rwfs_size = int(rwfs_size) * 1024
66 lebs = int((rwfs_size + leb_size - 1) / leb_size) # Rounding up
67 d.setVar('FLASH_UBI_RWFS_LEBS', str(lebs))
68}
69
Brad Bishop19fc4f82017-08-04 23:38:54 -040070# Allow rwfs mkfs configuration through OVERLAY_MKFS_OPTS and OVERRIDES. However,
71# avoid setting 'ext4' or 'jffs2' in OVERRIDES as such raw filesystem types are
72# reserved for the primary image (and setting them currently breaks the build).
73# Instead, prefix the overlay override value with 'rwfs-' to avoid collisions.
74DISTROOVERRIDES .= ":static-rwfs-${OVERLAY_BASETYPE}"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040075DISTROOVERRIDES .= ":ubi-rwfs-${FLASH_UBI_OVERLAY_BASETYPE}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040076
77JFFS2_RWFS_CMD = "mkfs.jffs2 --root=jffs2 --faketime --output=rwfs.jffs2"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040078UBIFS_RWFS_CMD = "mkfs.ubifs -r ubifs -c ${FLASH_UBI_RWFS_LEBS} -m ${FLASH_PAGE_SIZE} -e ${FLASH_LEB_SIZE} rwfs.ubifs"
Brad Bishop19fc4f82017-08-04 23:38:54 -040079
80FLASH_STATIC_RWFS_CMD_static-rwfs-jffs2 = "${JFFS2_RWFS_CMD}"
Brad Bishop3aa1ef62017-08-04 23:48:12 -040081FLASH_UBI_RWFS_CMD_ubi-rwfs-jffs2 = "${JFFS2_RWFS_CMD}"
82FLASH_UBI_RWFS_CMD_ubi-rwfs-ubifs = "${UBIFS_RWFS_CMD}"
Brad Bishop19fc4f82017-08-04 23:38:54 -040083
84mk_nor_image() {
85 image_dst="$1"
86 image_size_kb=$2
87 dd if=/dev/zero bs=1k count=$image_size_kb \
88 | tr '\000' '\377' > $image_dst
89}
90
91make_rwfs() {
92 type=$1
93 cmd=$2
94 shift
95 shift
96 opts="$@"
97
98 rm -f rwfs.$type
99 rm -rf $type
100 mkdir $type
101
102 $cmd $opts
103}
104
105do_generate_rwfs_static() {
106 make_rwfs ${OVERLAY_BASETYPE} "${FLASH_STATIC_RWFS_CMD}" ${OVERLAY_MKFS_OPTS}
107}
108do_generate_rwfs_static[dirs] = " ${S}/static"
109do_generate_rwfs_static[depends] += " \
110 mtd-utils-native:do_populate_sysroot \
111 "
112
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400113do_generate_rwfs_ubi() {
114 make_rwfs ${FLASH_UBI_OVERLAY_BASETYPE} "${FLASH_UBI_RWFS_CMD}"
115}
116do_generate_rwfs_ubi[dirs] = " ${S}/ubi"
117do_generate_rwfs_ubi[depends] += " \
118 mtd-utils-native:do_populate_sysroot \
119 "
120
121add_volume() {
122 config_file=$1
123 vol_id=$2
124 vol_type=$3
125 vol_name=$4
126 image=$5
127 vol_size=$6
128
129 echo \[$vol_name\] >> $config_file
130 echo mode=ubi >> $config_file
131 echo image=$image >> $config_file
132 echo vol_type=$vol_type >> $config_file
133 echo vol_name=$vol_name >> $config_file
134 echo vol_id=$vol_id >> $config_file
135 if [ ! -z $vol_size ]; then
136 echo vol_size=$vol_size >> $config_file
137 fi
138}
139
140do_generate_ubi() {
141 cfg=ubinize-${IMAGE_NAME}.cfg
142
143 rm -f $cfg ubi-img
144
145 # Construct the ubinize config file
146 add_volume $cfg 0 static kernel0 \
147 ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE}
148
149 add_volume $cfg 1 static rofs0 \
150 ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${FLASH_UBI_BASETYPE}
151
152 add_volume $cfg 2 dynamic rwfs rwfs.${FLASH_UBI_OVERLAY_BASETYPE} ${FLASH_UBI_RWFS_TXT_SIZE}
153
154 # Build the ubi partition image
155 ubinize -p ${FLASH_PEB_SIZE}KiB -m ${FLASH_PAGE_SIZE} -o ubi-img $cfg
156
157 # Concatenate the uboot and ubi partitions
158 mk_nor_image ${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd ${FLASH_SIZE}
159 dd bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET} \
160 if=${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} \
161 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd
162 dd bs=1k conv=notrunc seek=${FLASH_UBI_OFFSET} \
163 if=ubi-img \
164 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.ubi.mtd
165
166 cd ${IMGDEPLOYDIR}
167 ln -sf ${IMAGE_NAME}.ubi.mtd ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.ubi.mtd
168}
169do_generate_ubi[dirs] = "${S}/ubi"
170do_generate_ubi[depends] += " \
171 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
172 virtual/kernel:do_deploy \
173 u-boot:do_populate_sysroot \
174 mtd-utils-native:do_populate_sysroot \
175 "
176
Brad Bishop19fc4f82017-08-04 23:38:54 -0400177do_generate_static() {
178 # Assemble the flash image
179 mk_nor_image ${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd ${FLASH_SIZE}
180 dd bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET} \
181 if=${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} \
182 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd
183
184 dd bs=1k conv=notrunc seek=${FLASH_KERNEL_OFFSET} \
185 if=${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE} \
186 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd
187
188 dd bs=1k conv=notrunc seek=${FLASH_ROFS_OFFSET} \
189 if=${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${IMAGE_BASETYPE} \
190 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd
191
192 dd bs=1k conv=notrunc seek=${FLASH_RWFS_OFFSET} \
193 if=rwfs.${OVERLAY_BASETYPE} \
194 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd
195 # File needed for generating non-standard legacy links below
196 cp rwfs.${OVERLAY_BASETYPE} ${IMGDEPLOYDIR}/rwfs.${OVERLAY_BASETYPE}
197
198 cd ${IMGDEPLOYDIR}
199 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd
200
201 # Maintain non-standard legacy links
202 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/flash-${MACHINE}
203 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/image-bmc
204 ln -sf u-boot.${UBOOT_SUFFIX} ${IMGDEPLOYDIR}/image-u-boot
205 ln -sf ${FLASH_KERNEL_IMAGE} ${IMGDEPLOYDIR}/image-kernel
206 ln -sf ${IMAGE_LINK_NAME}.${IMAGE_BASETYPE} ${IMGDEPLOYDIR}/image-rofs
207 ln -sf rwfs.${OVERLAY_BASETYPE} ${IMGDEPLOYDIR}/image-rwfs
208}
209do_generate_static[dirs] = "${S}/static"
210do_generate_static[depends] += " \
211 ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
212 virtual/kernel:do_deploy \
213 u-boot:do_populate_sysroot \
214 "
215
216do_generate_static_alltar() {
217 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd image-bmc
218 tar -h -cvf ${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd.all.tar image-bmc
219
220 cd ${IMGDEPLOYDIR}
221
222 ln -sf ${IMAGE_NAME}.static.mtd.all.tar \
223 ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd.all.tar
224
225 # Maintain non-standard legacy link.
226 ln -sf ${IMAGE_NAME}.static.mtd.all.tar \
227 ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.all.tar
228}
229do_generate_static_alltar[vardepsexclude] = "DATETIME"
230do_generate_static_alltar[dirs] = "${S}/static"
231
232make_tar_of_images() {
233 rwfs=$1
234 rofs=$2
235 type=$3
236 shift
237 shift
238 shift
239 extra_files="$@"
240
241 # Create some links to help make the tar archive
242 ln -sf ${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} image-u-boot
243 ln -sf ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE} image-kernel
244 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$rofs image-rofs
245 ln -sf rwfs.$rwfs image-rwfs
246
247 # Create the tar archive
248 tar -h -cvf ${IMGDEPLOYDIR}/${IMAGE_NAME}.$type.mtd.tar \
249 image-u-boot image-kernel image-rofs image-rwfs $extra_files
250
251 cd ${IMGDEPLOYDIR}
252 ln -sf ${IMAGE_NAME}.$type.mtd.tar ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$type.mtd.tar
253}
254
255do_generate_static_tar() {
256 make_tar_of_images ${OVERLAY_BASETYPE} ${IMAGE_BASETYPE} static
257
258 # Maintain non-standard legacy link.
259 cd ${IMGDEPLOYDIR}
260 ln -sf ${IMAGE_NAME}.static.mtd.tar ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.tar
261}
262do_generate_static_tar[dirs] = " ${S}/static"
263do_generate_static_tar[depends] += " \
264 ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
265 virtual/kernel:do_deploy \
266 u-boot:do_populate_sysroot \
267 "
268do_generate_static_tar[vardepsexclude] = "DATETIME"
269
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400270do_generate_ubi_tar() {
271 ln -sf ${S}/MANIFEST MANIFEST
272 make_tar_of_images ${FLASH_UBI_OVERLAY_BASETYPE} ${FLASH_UBI_BASETYPE} ubi MANIFEST
273}
274do_generate_ubi_tar[dirs] = " ${S}/ubi"
275do_generate_ubi_tar[depends] += " \
276 ${PN}:do_image_${@d.getVar('FLASH_UBI_BASETYPE', True).replace('-', '_')} \
277 virtual/kernel:do_deploy \
278 u-boot:do_populate_sysroot \
279 "
280
Brad Bishop19fc4f82017-08-04 23:38:54 -0400281python do_generate_phosphor_manifest() {
282 import configparser
283 import io
284 path = d.getVar('STAGING_DIR_HOST', True) + d.getVar('sysconfdir', True)
285 path = os.path.join(path, 'os-release')
286 parser = configparser.SafeConfigParser(strict=False)
287 parser.optionxform = str
288 version = ''
289 with open(path, 'r') as fd:
290 buf = '[root]\n' + fd.read()
291 fd = io.StringIO(buf)
292 parser.readfp(fd)
293 version = parser['root']['VERSION_ID']
294
295 with open('MANIFEST', 'w') as fd:
296 fd.write('purpose=xyz.openbmc_project.Software.Version.VersionPurpose.BMC\n')
297 fd.write('version={}\n'.format(version.strip('"')))
298}
299do_generate_phosphor_manifest[dirs] = "${S}"
300do_generate_phosphor_manifest[depends] += " \
301 os-release:do_populate_sysroot \
302 "
303
304addtask generate_phosphor_manifest after do_rootfs
305addtask generate_rwfs_static after do_rootfs
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400306addtask generate_rwfs_ubi after do_rootfs
Brad Bishop19fc4f82017-08-04 23:38:54 -0400307
308python() {
309 types = d.getVar('IMAGE_FSTYPES', True).split()
310
311 if any([x in types for x in ['mtd-static', 'mtd-static-alltar']]):
312 bb.build.addtask(
313 'do_generate_static',
314 'do_image_complete',
315 'do_generate_rwfs_static', d)
316 if 'mtd-static-alltar' in types:
317 bb.build.addtask(
318 'do_generate_static_alltar',
319 'do_image_complete',
320 'do_generate_static', d)
321 if 'mtd-static-tar' in types:
322 bb.build.addtask(
323 'do_generate_static_tar',
324 'do_image_complete',
325 'do_generate_rwfs_static', d)
Brad Bishop3aa1ef62017-08-04 23:48:12 -0400326
327 if 'mtd-ubi' in types:
328 bb.build.addtask(
329 'do_generate_ubi',
330 'do_image_complete',
331 'do_generate_rwfs_ubi', d)
332 if 'mtd-ubi-tar' in types:
333 bb.build.addtask(
334 'do_generate_ubi_tar',
335 'do_image_complete',
336 'do_generate_rwfs_ubi do_generate_phosphor_manifest', d)
Brad Bishop19fc4f82017-08-04 23:38:54 -0400337}