|
| 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} |
0 commit comments