summaryrefslogtreecommitdiffstats
path: root/meta-xilinx-core/classes-recipe/qemuboot-xilinx.bbclass
diff options
context:
space:
mode:
Diffstat (limited to 'meta-xilinx-core/classes-recipe/qemuboot-xilinx.bbclass')
-rw-r--r--meta-xilinx-core/classes-recipe/qemuboot-xilinx.bbclass140
1 files changed, 140 insertions, 0 deletions
diff --git a/meta-xilinx-core/classes-recipe/qemuboot-xilinx.bbclass b/meta-xilinx-core/classes-recipe/qemuboot-xilinx.bbclass
new file mode 100644
index 00000000..7466ab5e
--- /dev/null
+++ b/meta-xilinx-core/classes-recipe/qemuboot-xilinx.bbclass
@@ -0,0 +1,140 @@
1
2# enable the overrides for the context of the conf only
3OVERRIDES .= ":qemuboot-xilinx"
4
5# Default machine targets for Xilinx QEMU (FDT Generic)
6# Allow QB_MACHINE to be overridden by a BSP config
7QB_MACHINE ?= "${QB_MACHINE_XILINX}"
8QB_RNG=""
9QB_MACHINE_XILINX:aarch64 = "-machine arm-generic-fdt"
10QB_MACHINE_XILINX:arm = "-M arm-generic-fdt-7series"
11QB_MACHINE_XILINX:microblaze = "-M microblaze-fdt-plnx"
12
13QB_SYSTEM_NAME ?= "${@qemu_target_binary(d)}"
14QB_DEFAULT_FSTYPE ?= "${@qemu_rootfs_params(d,'fstype')}"
15QB_ROOTFS ?= "${@qemu_rootfs_params(d,'rootfs')}"
16QB_ROOTFS_OPT ?= "${@qemu_rootfs_params(d,'rootfs-opt')}"
17QB_DTB ?= "${@qemu_default_dtb(d)}"
18
19# defaults
20QB_DEFAULT_KERNEL ?= "none"
21QB_DEFAULT_KERNEL:zynq ?= "${@'zImage' if \
22 d.getVar('INITRAMFS_IMAGE_BUNDLE') != '1' else 'zImage-initramfs-${MACHINE}.bin'}"
23QB_DEFAULT_KERNEL:microblaze ?= "${@'simpleImage.mb' if \
24 d.getVar('INITRAMFS_IMAGE_BUNDLE') != '1' else 'simpleImage.mb-initramfs-${MACHINE}.bin'}"
25
26inherit qemuboot
27
28def qemu_target_binary(data):
29 package_arch = data.getVar("PACKAGE_ARCH")
30 qemu_target_binary = (data.getVar("QEMU_TARGET_BINARY_%s" % package_arch) or "")
31 if qemu_target_binary:
32 return qemu_target_binary
33
34 target_arch = data.getVar("TARGET_ARCH")
35 if target_arch == "microblazeeb":
36 target_arch = "microblaze"
37 elif target_arch == "aarch64":
38 target_arch += "-multiarch"
39 elif target_arch == "arm":
40 target_arch = "aarch64"
41 return "qemu-system-%s" % target_arch
42
43def qemu_add_extra_args(data):
44 initramfs_image = data.getVar('INITRAMFS_IMAGE') or ""
45 bundle_image = data.getVar('INITRAMFS_IMAGE_BUNDLE') or ""
46 deploy_dir = data.getVar('DEPLOY_DIR_IMAGE') or ""
47 machine_name = data.getVar('MACHINE') or ""
48 soc_family = data.getVar('SOC_FAMILY') or ""
49 qb_extra_args = ''
50 # Add kernel image and boot.scr to qemu boot command when initramfs_image supplied
51 kernel_name = ''
52 bootscr_image = '%s/boot.scr' % deploy_dir
53 if soc_family in ('zynqmp', 'versal'):
54 kernel_name = 'Image'
55 bootscr_loadaddr = '0x20000000'
56 if initramfs_image:
57 kernel_image = '%s/%s' % (deploy_dir, kernel_name)
58 if bundle_image == "1":
59 kernel_image = '%s/%s-initramfs-%s.bin' % (deploy_dir, kernel_name, machine_name)
60 kernel_loadaddr = '0x200000'
61 if kernel_name:
62 qb_extra_args = ' -device loader,file=%s,addr=%s,force-raw=on' % (kernel_image, kernel_loadaddr)
63 qb_extra_args += ' -device loader,file=%s,addr=%s,force-raw=on' % (bootscr_image, bootscr_loadaddr)
64 if soc_family == 'versal':
65 qb_extra_args += ' -boot mode=5'
66 else:
67 if soc_family in ('zynqmp', 'versal'):
68 qb_extra_args = ' -boot mode=5'
69 return qb_extra_args
70
71def qemu_rootfs_params(data, param):
72 initramfs_image = data.getVar('INITRAMFS_IMAGE') or ""
73 bundle_image = data.getVar('INITRAMFS_IMAGE_BUNDLE') or ""
74 soc_family = data.getVar('SOC_FAMILY') or ""
75 tune_features = (data.getVar('TUNE_FEATURES') or []).split()
76 if 'microblaze' in tune_features:
77 soc_family = 'microblaze'
78 soc_variant = data.getVar('SOC_VARIANT') or ""
79
80 if param == 'rootfs':
81 return 'none' if bundle_image == "1" else ''
82
83 elif param == 'fstype':
84 fstype_dict = {
85 "microblaze": "cpio.gz",
86 "zynq": "cpio.gz",
87 "zynqmp": "cpio.gz.u-boot",
88 "versal": "cpio.gz.u-boot.qemu-sd-fatimg"
89 }
90 if not initramfs_image:
91 image_fs = data.getVar('IMAGE_FSTYPES')
92 if 'wic.qemu-sd' in image_fs:
93 return 'wic.qemu-sd'
94 if soc_family not in fstype_dict:
95 return ""
96 return fstype_dict[soc_family]
97
98 elif param == 'rootfs-opt':
99 sd_index = "1"
100 if soc_family == 'zynq':
101 sd_index = "0"
102 if soc_family == 'versal' and soc_variant == 'net':
103 sd_index = "0"
104
105 # Device is using a disk
106 if not initramfs_image:
107 return ' -drive if=sd,index=%s,file=@ROOTFS@,format=raw' % (sd_index)
108
109 # Device is using a ramdisk
110 if soc_family not in ('zynq', 'microblaze'):
111 return ' -device loader,file=@ROOTFS@,addr=0x04000000,force-raw=on'
112
113 # Ramdisk must be compiled into the kernel
114 return ''
115
116def qemu_default_dtb(data):
117 if data.getVar("IMAGE_BOOT_FILES", True):
118 dtbs = data.getVar("IMAGE_BOOT_FILES", True).split(" ")
119 # IMAGE_BOOT_FILES has extra renaming info in the format '<source>;<target>'
120 # Note: Wildcard sources work here only because runqemu expands them at run time
121 dtbs = [f.split(";")[0] for f in dtbs]
122 dtbs = [f for f in dtbs if f.endswith(".dtb")]
123 if len(dtbs) != 0:
124 return dtbs[0]
125 return ""
126
127def qemu_default_serial(data):
128 if data.getVar("SERIAL_CONSOLES", True):
129 first_console = data.getVar("SERIAL_CONSOLES", True).split(" ")[0]
130 speed, console = first_console.split(";", 1)
131 # zynqmp uses earlycon and stdout (in dtb)
132 if "zynqmp" in data.getVar("MACHINEOVERRIDES", True).split(":"):
133 return ""
134 return "console=%s,%s earlyprintk" % (console, speed)
135 return ""
136
137def qemu_zynqmp_unhalt(data, multiarch):
138 if multiarch:
139 return "-global xlnx,zynqmp-boot.cpu-num=0 -global xlnx,zynqmp-boot.use-pmufw=true"
140 return "-device loader,addr=0xfd1a0104,data=0x8000000e,data-len=4 -device loader,addr=0xfd1a0104,data=0x8000000e,data-len=4"