blob: 51259df12b8c76299d2a8cb1530011ad230fd77e [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#
16# Phosphor OpenBMC supports a fixed partition mtd layout.
17
18# Image composition
19FLASH_KERNEL_IMAGE ?= "fitImage-${INITRAMFS_IMAGE}-${MACHINE}.bin"
20IMAGE_BASETYPE ?= "squashfs-xz"
21OVERLAY_BASETYPE ?= "jffs2"
22
23IMAGE_TYPES += "mtd-static mtd-static-alltar mtd-static-tar"
24
25IMAGE_TYPEDEP_mtd-static = "${IMAGE_BASETYPE}"
26IMAGE_TYPEDEP_mtd-static-tar = "${IMAGE_BASETYPE}"
27IMAGE_TYPEDEP_mtd-static-alltar = "mtd-static"
28IMAGE_TYPES_MASKED += "mtd-static mtd-static-alltar mtd-static-tar"
29
30# Flash characteristics
31FLASH_SIZE ?= "32768"
32
33# Fixed partition offsets
34FLASH_UBOOT_OFFSET ?= "0"
35FLASH_KERNEL_OFFSET ?= "512"
36FLASH_ROFS_OFFSET ?= "4864"
37FLASH_RWFS_OFFSET ?= "28672"
38
39# Allow rwfs mkfs configuration through OVERLAY_MKFS_OPTS and OVERRIDES. However,
40# avoid setting 'ext4' or 'jffs2' in OVERRIDES as such raw filesystem types are
41# reserved for the primary image (and setting them currently breaks the build).
42# Instead, prefix the overlay override value with 'rwfs-' to avoid collisions.
43DISTROOVERRIDES .= ":static-rwfs-${OVERLAY_BASETYPE}"
44
45JFFS2_RWFS_CMD = "mkfs.jffs2 --root=jffs2 --faketime --output=rwfs.jffs2"
46
47FLASH_STATIC_RWFS_CMD_static-rwfs-jffs2 = "${JFFS2_RWFS_CMD}"
48
49mk_nor_image() {
50 image_dst="$1"
51 image_size_kb=$2
52 dd if=/dev/zero bs=1k count=$image_size_kb \
53 | tr '\000' '\377' > $image_dst
54}
55
56make_rwfs() {
57 type=$1
58 cmd=$2
59 shift
60 shift
61 opts="$@"
62
63 rm -f rwfs.$type
64 rm -rf $type
65 mkdir $type
66
67 $cmd $opts
68}
69
70do_generate_rwfs_static() {
71 make_rwfs ${OVERLAY_BASETYPE} "${FLASH_STATIC_RWFS_CMD}" ${OVERLAY_MKFS_OPTS}
72}
73do_generate_rwfs_static[dirs] = " ${S}/static"
74do_generate_rwfs_static[depends] += " \
75 mtd-utils-native:do_populate_sysroot \
76 "
77
78do_generate_static() {
79 # Assemble the flash image
80 mk_nor_image ${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd ${FLASH_SIZE}
81 dd bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET} \
82 if=${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} \
83 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd
84
85 dd bs=1k conv=notrunc seek=${FLASH_KERNEL_OFFSET} \
86 if=${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE} \
87 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd
88
89 dd bs=1k conv=notrunc seek=${FLASH_ROFS_OFFSET} \
90 if=${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.${IMAGE_BASETYPE} \
91 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd
92
93 dd bs=1k conv=notrunc seek=${FLASH_RWFS_OFFSET} \
94 if=rwfs.${OVERLAY_BASETYPE} \
95 of=${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd
96 # File needed for generating non-standard legacy links below
97 cp rwfs.${OVERLAY_BASETYPE} ${IMGDEPLOYDIR}/rwfs.${OVERLAY_BASETYPE}
98
99 cd ${IMGDEPLOYDIR}
100 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd
101
102 # Maintain non-standard legacy links
103 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/flash-${MACHINE}
104 ln -sf ${IMAGE_NAME}.static.mtd ${IMGDEPLOYDIR}/image-bmc
105 ln -sf u-boot.${UBOOT_SUFFIX} ${IMGDEPLOYDIR}/image-u-boot
106 ln -sf ${FLASH_KERNEL_IMAGE} ${IMGDEPLOYDIR}/image-kernel
107 ln -sf ${IMAGE_LINK_NAME}.${IMAGE_BASETYPE} ${IMGDEPLOYDIR}/image-rofs
108 ln -sf rwfs.${OVERLAY_BASETYPE} ${IMGDEPLOYDIR}/image-rwfs
109}
110do_generate_static[dirs] = "${S}/static"
111do_generate_static[depends] += " \
112 ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
113 virtual/kernel:do_deploy \
114 u-boot:do_populate_sysroot \
115 "
116
117do_generate_static_alltar() {
118 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd image-bmc
119 tar -h -cvf ${IMGDEPLOYDIR}/${IMAGE_NAME}.static.mtd.all.tar image-bmc
120
121 cd ${IMGDEPLOYDIR}
122
123 ln -sf ${IMAGE_NAME}.static.mtd.all.tar \
124 ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.static.mtd.all.tar
125
126 # Maintain non-standard legacy link.
127 ln -sf ${IMAGE_NAME}.static.mtd.all.tar \
128 ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.all.tar
129}
130do_generate_static_alltar[vardepsexclude] = "DATETIME"
131do_generate_static_alltar[dirs] = "${S}/static"
132
133make_tar_of_images() {
134 rwfs=$1
135 rofs=$2
136 type=$3
137 shift
138 shift
139 shift
140 extra_files="$@"
141
142 # Create some links to help make the tar archive
143 ln -sf ${DEPLOY_DIR_IMAGE}/u-boot.${UBOOT_SUFFIX} image-u-boot
144 ln -sf ${DEPLOY_DIR_IMAGE}/${FLASH_KERNEL_IMAGE} image-kernel
145 ln -sf ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$rofs image-rofs
146 ln -sf rwfs.$rwfs image-rwfs
147
148 # Create the tar archive
149 tar -h -cvf ${IMGDEPLOYDIR}/${IMAGE_NAME}.$type.mtd.tar \
150 image-u-boot image-kernel image-rofs image-rwfs $extra_files
151
152 cd ${IMGDEPLOYDIR}
153 ln -sf ${IMAGE_NAME}.$type.mtd.tar ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.$type.mtd.tar
154}
155
156do_generate_static_tar() {
157 make_tar_of_images ${OVERLAY_BASETYPE} ${IMAGE_BASETYPE} static
158
159 # Maintain non-standard legacy link.
160 cd ${IMGDEPLOYDIR}
161 ln -sf ${IMAGE_NAME}.static.mtd.tar ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.tar
162}
163do_generate_static_tar[dirs] = " ${S}/static"
164do_generate_static_tar[depends] += " \
165 ${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
166 virtual/kernel:do_deploy \
167 u-boot:do_populate_sysroot \
168 "
169do_generate_static_tar[vardepsexclude] = "DATETIME"
170
171python do_generate_phosphor_manifest() {
172 import configparser
173 import io
174 path = d.getVar('STAGING_DIR_HOST', True) + d.getVar('sysconfdir', True)
175 path = os.path.join(path, 'os-release')
176 parser = configparser.SafeConfigParser(strict=False)
177 parser.optionxform = str
178 version = ''
179 with open(path, 'r') as fd:
180 buf = '[root]\n' + fd.read()
181 fd = io.StringIO(buf)
182 parser.readfp(fd)
183 version = parser['root']['VERSION_ID']
184
185 with open('MANIFEST', 'w') as fd:
186 fd.write('purpose=xyz.openbmc_project.Software.Version.VersionPurpose.BMC\n')
187 fd.write('version={}\n'.format(version.strip('"')))
188}
189do_generate_phosphor_manifest[dirs] = "${S}"
190do_generate_phosphor_manifest[depends] += " \
191 os-release:do_populate_sysroot \
192 "
193
194addtask generate_phosphor_manifest after do_rootfs
195addtask generate_rwfs_static after do_rootfs
196
197python() {
198 types = d.getVar('IMAGE_FSTYPES', True).split()
199
200 if any([x in types for x in ['mtd-static', 'mtd-static-alltar']]):
201 bb.build.addtask(
202 'do_generate_static',
203 'do_image_complete',
204 'do_generate_rwfs_static', d)
205 if 'mtd-static-alltar' in types:
206 bb.build.addtask(
207 'do_generate_static_alltar',
208 'do_image_complete',
209 'do_generate_static', d)
210 if 'mtd-static-tar' in types:
211 bb.build.addtask(
212 'do_generate_static_tar',
213 'do_image_complete',
214 'do_generate_rwfs_static', d)
215}