Skip to content

Commit f5bea16

Browse files
author
Amneesh Singh
committed
recipes-bsp: u-boot: add mechanism to boot xen
This patch provides a custom CONFIG_BOOTCOMMAND when user has enabled xen under DISTRO_FEATURES. This bootcommand runs a script from boot partition, which is boot.scr by default. The script is also provided and is compiled using mkimage as a FIT image. This script loads the Xen image, the kernel image and the FDT and then modifies the FDT to allow suitable Xen configuration and other features like shared memory and UIO. Signed-off-by: Amneesh Singh <a-singh21@ti.com>
1 parent aa83a7f commit f5bea16

5 files changed

Lines changed: 186 additions & 0 deletions

File tree

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/dts-v1/;
2+
/ {
3+
description = "Configuration from Imagebuilder to load Xen/Linux";
4+
#address-cells = <1>;
5+
images {
6+
default = "boot_scr";
7+
boot_scr {
8+
description = "default xen boot script";
9+
data = /incbin/("boot.xen.source");
10+
type = "script";
11+
compression = "none";
12+
load = <0x82000000>;
13+
entry = <0x82000000>;
14+
hash {
15+
algo = "md5";
16+
};
17+
};
18+
};
19+
};
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
xen_name=@@XEN_IMAGE_NAME@@
2+
kernel_name=@@XEN_KERNEL_IMAGE_NAME@@
3+
4+
xen_addr=@@XEN_ADDRESS@@
5+
kernel_addr=@@XEN_KERNEL_ADDRESS@@
6+
7+
for boot_target in ${boot_targets};
8+
do
9+
# only support searching mmc for now and break if kernel is scanned
10+
if test -z "${kernel_size}" && test "${boot_target}" = "mmc0" || test "${boot_target}" = "mmc1"; then
11+
setenv devtype mmc
12+
setenv bootdir /boot
13+
setenv dtbdir ${bootdir}/dtb
14+
15+
if test "${boot_target}" = "mmc0"; then
16+
setenv devnum 0
17+
elif test "${boot_target}" = "mmc1"; then
18+
setenv devnum 1
19+
fi
20+
21+
setenv loadboot ${devtype} ${devnum}:1
22+
setenv loadroot ${devtype} ${devnum}:2
23+
24+
# check xen image in boot partition then root partition
25+
if test -e ${loadboot} ${xen_name}; then
26+
echo "Loading ${xen_name}";
27+
fatload ${loadboot} ${xen_addr} ${xen_name};
28+
elif test -e ${loadroot} ${bootdir}/${xen_name}; then
29+
echo "Loading ${xen_name}";
30+
load ${loadroot} ${xen_addr} ${bootdir}/${xen_name};
31+
fi
32+
33+
# check kernel image in boot partition then root partition
34+
if test -e ${loadboot} ${kernel_name}; then
35+
echo "Loading ${kernel_name}";
36+
fatload ${loadboot} ${kernel_addr} ${kernel_name};
37+
setenv kernel_size 0x$filesize;
38+
elif test -e ${loadroot} ${bootdir}/$kernel_name}; then
39+
echo "Loading ${kernel_name}";
40+
load ${loadroot} ${kernel_addr} ${bootdir}/${kernel_name};
41+
setenv kernel_size 0x$filesize;
42+
fi
43+
44+
# load fdt from root partition
45+
if test -e ${loadroot} ${dtbdir}/${fdtfile}; then
46+
echo "Loading ${dtbdir}/${fdtfile}";
47+
load ${loadroot} ${fdtaddr} ${dtbdir}/${fdtfile};
48+
part uuid ${loadroot} rootfs_partuuid
49+
fi
50+
fi
51+
done
52+
53+
if test -z "${kernel_size}"; then
54+
echo "No kernel image found"
55+
exit
56+
fi
57+
58+
fdt addr ${fdtaddr}
59+
fdt resize 0x1000
60+
setenv fdt_high 0xffffffffffffffff
61+
62+
# fdt operations
63+
fdt set /chosen \#address-cells <0x2>
64+
fdt set /chosen \#size-cells <0x2>
65+
setenv xen_bootargs "console=dtuart dtuart=@@XEN_DTUART_SERIAL@@ dom0_mem=@@DOM0_MEM@@ dom0_max_vcpus=@@DOM0_MAX_VCPUS@@ bootscrub=0 vwfi=native"
66+
fdt set /chosen xen,xen-bootargs \"${xen_bootargs}\"
67+
68+
fdt mknod /chosen dom0
69+
fdt set /chosen/dom0 compatible "xen,linux-zimage" "xen,multiboot-module" "multiboot,module"
70+
fdt set /chosen/dom0 reg <0x0 ${kernel_addr} 0x0 ${kernel_size}>
71+
setenv dom0_bootargs "console=hvc0 earlyprintk=xen root=PARTUUID=${rootfs_partuuid} rw rootfstype=ext4 rootwait clk_ignore_unused"
72+
73+
# shared memory
74+
if test -n "@@XEN_SHMEM_ID@@"; then
75+
shmem_start=@@XEN_SHMEM_START@@
76+
shmem_size=@@XEN_SHMEM_SIZE@@
77+
shmem_node=xen_shmem@@@XEN_SHMEM_START@@
78+
uio_node=xen_uio@@@XEN_SHMEM_START@@
79+
80+
# mark it as shared
81+
fdt mknod /chosen ${shmem_node}
82+
fdt set /chosen/${shmem_node} compatible "xen,domain-shared-memory-v1"
83+
fdt set /chosen/${shmem_node} xen,shm-id "@@XEN_SHMEM_ID@@"
84+
fdt set /chosen/${shmem_node} xen,shared-mem <0x00 ${shmem_start} 0x00 ${shmem_start} 0x00 ${shmem_size}>
85+
86+
# expose as UIO to Dom0
87+
fdt mknod / ${uio_node}
88+
fdt set /${uio_node} compatible @@XEN_SHMEM_UIO_NAME@@
89+
fdt set /${uio_node} reg <0x00 ${shmem_start} 0x00 ${shmem_size}>
90+
91+
# append uio to bootargs
92+
setenv dom0_bootargs "${dom0_bootargs} uio_pdrv_genirq.of_id=@@XEN_SHMEM_UIO_NAME@@"
93+
fi
94+
95+
fdt set /chosen xen,dom0-bootargs \"${dom0_bootargs}\"
96+
97+
# Specify interrupts explicitly for the following instead of relying on ti,interrupt-ranges
98+
for dev_path in @@XEN_IRQ_DEVICES@@; do
99+
fdt get value irq_cur ${dev_path} ti,interrupt-ranges 0
100+
fdt get value irq_num ${dev_path} ti,interrupt-ranges 2
101+
102+
setexpr irq_cur ${irq_cur} + 0x20
103+
setexpr irq_end ${irq_cur} + ${irq_num}
104+
setenv irq_prop "<"
105+
106+
while itest ${irq_cur} < ${irq_end}; do
107+
setenv irq_prop "${irq_prop}0 0x${irq_cur} 4 "
108+
setexpr irq_cur ${irq_cur} + 1
109+
done
110+
111+
setenv irq_prop "${irq_prop}>"
112+
fdt set ${dev_path} interrupts ${irq_prop}
113+
done
114+
115+
echo "Booting"
116+
117+
booti ${xen_addr} - ${fdtaddr}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
CONFIG_BOOTCOMMAND="run envboot; setenv bootmeths 'script'; bootflow scan -lb"

recipes-bsp/u-boot/u-boot-ti-staging_%.bbappend

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,7 @@ TI_DM="${STAGING_DIR_HOST}${nonarch_base_libdir}/firmware/ti-dm/${PLAT_SFX}/${DM
1111

1212
EXTRA_OEMAKE += "TI_DM=${TI_DM}"
1313

14+
include ${@bb.utils.contains('DISTRO_FEATURES', 'xen', 'u-boot-xen-scr.inc', '', d)}
15+
1416
PR:append = "_tisdk_5"
1517

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
FILESEXTRAPATHS:prepend := "${THISDIR}/scripts:"
2+
3+
DEPENDS:append:k3 = " u-boot-mkimage-native"
4+
5+
SRC_URI:append:k3 = " \
6+
file://boot.xen.source.in \
7+
file://boot.xen.its \
8+
file://bootcommand.cfg \
9+
"
10+
11+
XEN_IMAGE_NAME ??= "xen"
12+
XEN_KERNEL_IMAGE_NAME ??= "Image"
13+
XEN_ADDRESS ??= "0x82040000"
14+
XEN_KERNEL_ADDRESS ??= "0x83000000"
15+
XEN_DTUART_SERIAL ??= "serial2"
16+
DOM0_MEM ??= "2G"
17+
DOM0_MAX_VCPUS ??= "1"
18+
XEN_SHMEM_ID ??= "xen-shmem"
19+
XEN_SHMEM_UIO_NAME ??= "xen-uio"
20+
XEN_SHMEM_START ??= "0x80000000"
21+
XEN_SHMEM_SIZE ??= "0x1000"
22+
23+
XEN_IRQ_DEVICES ??= ""
24+
XEN_IRQ_DEVICES:am62pxx ??= "\/bus@f0000\/bus@48000000\/interrupt-controller@48000000"
25+
26+
do_compile:append:k3() {
27+
sed -e 's/@@XEN_IMAGE_NAME@@/${XEN_IMAGE_NAME}/' \
28+
-e 's/@@XEN_KERNEL_IMAGE_NAME@@/${XEN_KERNEL_IMAGE_NAME}/' \
29+
-e 's/@@XEN_ADDRESS@@/${XEN_ADDRESS}/' \
30+
-e 's/@@XEN_KERNEL_ADDRESS@@/${XEN_KERNEL_ADDRESS}/' \
31+
-e 's/@@XEN_DTUART_SERIAL@@/${XEN_DTUART_SERIAL}/' \
32+
-e 's/@@DOM0_MEM@@/${DOM0_MEM}/' \
33+
-e 's/@@DOM0_MAX_VCPUS@@/${DOM0_MAX_VCPUS}/' \
34+
-e 's/@@XEN_IRQ_DEVICES@@/${XEN_IRQ_DEVICES}/' \
35+
-e 's/@@XEN_SHMEM_ID@@/${XEN_SHMEM_ID}/' \
36+
-e 's/@@XEN_SHMEM_UIO_NAME@@/${XEN_SHMEM_UIO_NAME}/' \
37+
-e 's/@@XEN_SHMEM_START@@/${XEN_SHMEM_START}/' \
38+
-e 's/@@XEN_SHMEM_SIZE@@/${XEN_SHMEM_SIZE}/' \
39+
"${WORKDIR}/boot.xen.source.in" > "${WORKDIR}/boot.xen.source"
40+
41+
mkimage -f ${WORKDIR}/boot.xen.its ${WORKDIR}/boot.xen.scr
42+
}
43+
44+
do_deploy:append:k3() {
45+
install -d ${DEPLOYDIR}
46+
install -m 0644 ${WORKDIR}/boot.xen.scr ${DEPLOYDIR}
47+
}

0 commit comments

Comments
 (0)