aspeed: Build a wic image for the eMMC User Data Area

The U-Boot SPL and U-Boot proper would be programmed to the
Boot Area Hardware Partitions of the eMMC. The kernel and user
space would go into the User Data Area. This commit creates an
image that can be programmed into that User Data Area. Layout:

 --- - ----- -------- -------- ----- ------- ------ -------- -------
|GPT| | env | boot-a | boot-b | fs-a | fs-b | rwfs | hostfw |GPT-sec|
 --- - ----- -------- -------- ------ ------ ------ -------- -------
      ^ 1MB    64MB     64MB    1GB     1GB    7GB     5GB
      |
      0x5000

Primary GPT size (Beginning of image):
512B (Protective MBR) + 512B (Primary Header) + 16KB (Primary Table)
First partition (u-boot-env) is 4K-aligned, which puts it at offset 0x5000

Secondary GPT size (End of image):
16KB (Secondary Table) + 512B (Secondary Header)

Since the secondary GPT is expected to be at the end of the device,
the initramfs can issue a "sgdisk -e /dev/mmcblk0" on first boot
to move it to the end.

The first partition holds the U-Boot environment. The following two
partitions hold a filesystem with the fitImage file. Code update
would reflash the full filesystem with the fitImage during an update.

U-Boot can then be programmed to look for the kernel in partitions
boot-a or boot-b.

The remaining is a set of ext4 filesystems for user space, read-write,
and host firmware.

The size for the host firmware partition is configurable to be able
to build an image of different size. The reason is that the tacoma
system is has a User Data area just 1GB smaller than rainier.

Design doc: https://gerrit.openbmc-project.xyz/c/openbmc/docs/+/28443

Tested: Adding "WKS_HOSTFW_SIZE = "4G"" to the tacoma.conf file
        created a 14GB wic file:
$ ls -lh *wic
-rw-r--r-- 1 anoo 532919 15G Jul 14 08:18 obmc-phosphor-image-rainier.wic
-rw-r--r-- 1 anoo 532919 14G Jul 14 08:36 obmc-phosphor-image-witherspoon-tacoma.wi

$ wic ls obmc-phosphor-image-rainier.wic
Num     Start        End          Size      Fstype
...
 7    9798963200  15167672319   5368709120  ext4

$ wic ls obmc-phosphor-image-witherspoon-tacoma.wic
Num     Start        End          Size      Fstype
...
 7    9798963200  14093930495   4294967296  ext4

(From meta-aspeed rev: b8a647297e3f9fe724f8ee1736bb9da3806d788e)

Change-Id: I18b8a15ac8eddb6abfbc7b70429ef45ffc170d9a
Signed-off-by: Adriana Kobylak <anoo@us.ibm.com>
Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
diff --git a/meta-aspeed/conf/machine/include/aspeed.inc b/meta-aspeed/conf/machine/include/aspeed.inc
index a2316cf..c3c5f18 100644
--- a/meta-aspeed/conf/machine/include/aspeed.inc
+++ b/meta-aspeed/conf/machine/include/aspeed.inc
@@ -13,6 +13,11 @@
 INITRAMFS_IMAGE ?= "aspeed-image-initramfs"
 INITRAMFS_FSTYPES ?= "cpio.xz"
 
+WKS_FILE ?= "emmc-aspeed.wks.in"
+WKS_FILE_DEPENDS ?= "virtual/kernel"
+WKS_HOSTFW_SIZE ?= "5G"
+IMAGE_BOOT_FILES ?= "fitImage-${INITRAMFS_IMAGE}-${MACHINE}-${MACHINE};fitImage"
+
 MACHINE_EXTRA_RRECOMMENDS += "udev-aspeed-vuart udev-aspeed-mtd-partitions"
 
 MACHINEOVERRIDES =. "aspeed:"
diff --git a/meta-aspeed/wic/emmc-aspeed.wks.in b/meta-aspeed/wic/emmc-aspeed.wks.in
new file mode 100644
index 0000000..8163521
--- /dev/null
+++ b/meta-aspeed/wic/emmc-aspeed.wks.in
@@ -0,0 +1,30 @@
+# short-description: Create an image for eMMC
+# long-description: Creates an eMMC card image for the User Data Area that can
+# be used with the Aspeed SoC family.
+#
+# Assumes a minimum flash size of 16GB.
+# Assumes U-Boot is stored elsewhere, such as an eMMC boot volume or NOR flash.
+#
+#  --- - ----- -------- -------- -------- -------- ------ -------- -------
+# |GPT| | env | boot-a | boot-b | rofs-a | rofs-b | rwfs | hostfw |GPT-sec|
+#  --- - ----- -------- -------- -------- -------- ------ -------- -------
+#       ^ 1MB    64MB     64MB     1GB      1GB     7GB     5GB
+#       |
+#       0x5000
+#
+# Primary GPT size (Beginning of image):
+# 512B (Protective MBR) + 512B (Primary Header) + 16KB (Primary Table)
+# First partition (u-boot-env) is 4K-aligned, which puts it at offset 0x5000
+#
+# Secondary GPT size (End of image):
+# 16KB (Secondary Table) + 512B (Secondary Header)
+
+bootloader --ptable gpt
+
+part --align 4 --fixed-size 1M --label u-boot-env
+part --fstype=ext4 --fixed-size 64M --source bootimg-partition --label boot-a
+part --fstype=ext4 --fixed-size 64M --source bootimg-partition --label boot-b
+part --fstype=ext4 --fixed-size 1G --source rootfs --label rofs-a
+part --fstype=ext4 --fixed-size 1G --source rootfs --label rofs-b
+part --fstype=ext4 --fixed-size 7G --label rwfs
+part --fstype=ext4 --fixed-size ${WKS_HOSTFW_SIZE} --label hostfw