summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-05-19 18:28:35 +0300
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2019-05-19 18:28:35 +0300
commit29c7a7b85f51377fa1c1cd25b87f8bc598765817 (patch)
tree39d6578cfdcc6f565238cbd3446966689b192f12
Initial import
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
-rwxr-xr-xkbuild.sh416
1 files changed, 416 insertions, 0 deletions
diff --git a/kbuild.sh b/kbuild.sh
new file mode 100755
index 0000000..b979b36
--- /dev/null
+++ b/kbuild.sh
@@ -0,0 +1,416 @@
+#!/bin/sh
+
+set -e
+
+#OPTIONS='CONFIG_DEBUG_SECTION_MISMATCH=y'
+#OPTIONS='C=1'
+OPTIONS="KALLSYMS_EXTRA_PASS=0"
+KCFLAGS="-Werror -Wno-error=cpp"
+
+NFS_ROOT=$HOME/src/netboot
+TFTP_ROOT=$HOME/tftpboot
+
+echo $PWD | grep -q libcamera && PLATFORM=x86
+echo $PWD | grep -q media && PLATFORM=omap3
+echo $PWD | grep -q omap && PLATFORM=omap4+
+echo $PWD | grep -q plusoptix && PLATFORM=imx7
+echo $PWD | grep -q renesas && PLATFORM=gen3
+echo $PWD | grep -q xilinx && PLATFORM=zynqmp
+
+do_compile_doc=0
+do_menu_config=0
+do_package_deb=0
+opt_bootloader=
+opt_cmdline_file=
+opt_defconfig=
+
+while [[ $# != 0 ]] ; do
+ option=$1
+ shift
+
+ case $option in
+ --bootloader)
+ opt_bootloader=$1
+ if [[ ! -r $opt_bootloader ]] ; then
+ echo "Boot loader file $opt_bootloader is not readable"
+ exit 1
+ fi
+ shift
+ ;;
+ --cmdline)
+ opt_cmdline_file=$1
+ if [[ ! -r $opt_cmdline_file ]] ; then
+ echo "Command line file $opt_cmdline_file is not readable"
+ exit 1
+ fi
+ shift
+ ;;
+ --config)
+ do_menu_config=1
+ ;;
+ --deb)
+ do_package_deb=1
+ ;;
+ --defconfig)
+ opt_defconfig=$1
+ if [[ ! -r $opt_defconfig ]] ; then
+ echo "defconfig file $opt_defconfig is not readable"
+ exit 1
+ fi
+ shift
+ ;;
+ --doc)
+ do_compile_doc=1
+ ;;
+ --*)
+ echo "Unrecognized option $option"
+ exit 1
+ ;;
+ *)
+ PLATFORM=$option
+ ;;
+ esac
+done
+
+case $PLATFORM in
+ gen3)
+ ARCH=arm64
+ BOOT_DIR=$TFTP_ROOT/gen3
+ DTBS="renesas/r8a7795-es1-h3ulcb.dtb renesas/r8a7795-es1-salvator-x.dtb renesas/r8a7795-h3ulcb.dtb renesas/r8a7795-h3ulcb-kf.dtb renesas/r8a7795-salvator-x.dtb renesas/r8a7795-salvator-xs.dtb renesas/r8a7796-m3ulcb.dtb renesas/r8a7796-salvator-x.dtb renesas/r8a77995-draak.dtb"
+ DTBS=$(cd arch/arm64/boot/dts ; ls renesas/*.dts | sed 's/\.dts/.dtb/')
+ #DTBS="renesas/r8a77965-salvator-xs.dtb"
+ IMAGE=FIT
+ LOADADDR=0x48080000
+ ;;
+ imx7)
+ ARCH=arm
+ #BOOT_DIR=$TFTP_ROOT/imx7
+ BOOT_DIR=$NFS_ROOT/arm32/boot
+ DTBS="imx7d-sx-pl-emar.dtb imx7d-sx-pl-test.dtb"
+ IMAGE=zImage
+ LOADADDR=0x80008000
+ ;;
+ omap3)
+ ARCH=arm
+ BOOT_DIR=$TFTP_ROOT/omap3
+ DTBS="omap3-beagle-xm.dtb omap3-overo-storm-tobi.dtb"
+ IMAGE=zImage
+ ;;
+ omap4+)
+ ARCH=arm
+ BOOT_DIR=$TFTP_ROOT/omap4
+ DTBS="omap4-panda.dtb omap4-panda-es.dtb am57xx-evm-reva3.dtb:am57xx-beagle-x15.dtb"
+ IMAGE=FIT
+ LOADADDR=0x80008000
+ ;;
+ scarlet)
+ ARCH=arm64
+ BOOT_DIR=$NFS_ROOT/arm64/boot
+ CMDLINE="console=ttyS2,115200n8 earlyprintk=ttyS2,115200n8 console=tty1 init=/sbin/init root=PARTUUID=%U/PARTNROFF=1 rootwait rw noinitrd ignore_loglevel"
+ CMDLINE="console=ttyS2,115200n8 earlyprintk=ttyS2,115200n8 console=tty1 ip=dhcp root=/dev/nfs rootwait rw noinitrd ignore_loglevel"
+ DTBS="rockchip/rk3399-gru-scarlet-inx.dtb"
+ IMAGE=cros-arm
+ LOADADDR=0
+ ;;
+ soraka)
+ ARCH=x86
+ BOOT_DIR=$TFTP_ROOT/x86
+ CMDLINE="console=ttyS0,115200n8 earlyprintk=ttyS0,115200n8 console=tty1 ip=dhcp root=/dev/nfs rootwait rw noinitrd ignore_loglevel"
+ IMAGE=cros-x86
+ KCFLAGS="$KCFLAGS -Wno-error=frame-larger-than="
+ ;;
+ x86)
+ ARCH=x86
+ BOOT_DIR=$TFTP_ROOT/x86
+ IMAGE=bzImage
+ KCFLAGS="$KCFLAGS -Wno-error=frame-larger-than="
+ ;;
+ zynqmp)
+ ARCH=arm64
+ BOOT_DIR=$TFTP_ROOT/xilinx
+ DTBS="xilinx/zynqmp-zcu106-revA.dtb"
+ IMAGE=Image
+ LOADADDR=0x10000000
+ KCFLAGS="$KCFLAGS -Wno-error=packed-not-aligned -Wno-error=sizeof-pointer-memaccess -Wno-error=stringop-truncation -Wno-error=stringop-overflow"
+ target_dir=$NFS_ROOT/zynqmp
+ ;;
+ *)
+ echo "Invalid platform $PLATFORM"
+ exit 1
+ ;;
+esac
+
+case $ARCH in
+ arm)
+ arch_dir=arm32
+ cross_compile=arm-buildroot-linux-uclibcgnueabihf-
+ image_kernel=zImage
+ ;;
+ arm64)
+ arch_dir=arm64
+ cross_compile=aarch64-buildroot-linux-gnu-
+ image_kernel=Image
+ ;;
+ x86)
+ arch_dir=x86
+ cross_compile=
+ image_kernel=bzImage
+ ;;
+esac
+
+target_dir=${target_dir:-$NFS_ROOT/$arch_dir}
+output_dir=${output_dir:-$PWD/output/$arch_dir}
+
+#
+# Parallelize make with twice as many jobs as CPUs
+#
+
+num_cpus=$(cat /proc/cpuinfo | grep '^processor\b' | wc -l)
+pmake="make -j$((num_cpus*2))"
+
+OPTIONS="KALLSYMS_EXTRA_PASS=0 KCFLAGS='$KCFLAGS'"
+
+echo "Compiling for platform $PLATFORM with $num_cpus CPUs"
+
+mkdir -p $output_dir/
+
+if [[ -n "$opt_defconfig" ]] ; then
+ mkdir -p $output_dir/arch/$ARCH/configs/
+ cp $opt_defconfig $output_dir/arch/$ARCH/configs/build_defconfig
+ make ARCH=$ARCH O=$output_dir build_defconfig
+ rm $output_dir/arch/$ARCH/configs/build_defconfig
+fi
+
+if [[ $do_menu_config = 1 ]] ; then
+ make ARCH=$ARCH O=$output_dir menuconfig
+ exit 0
+fi
+
+#
+# Compile documentation if requested
+#
+
+if [[ $do_compile_doc = 1 ]] ; then
+ $pmake ARCH=$ARCH O=$output_dir DOCBOOKS='' htmldocs
+fi
+
+#
+# Compile the kernel, modules and DTBs
+#
+
+dtbs=
+for dtb in $DTBS ; do
+ dtb=${dtb/:*/}
+ dtbs="$dtbs $dtb"
+done
+
+eval $pmake ARCH=$ARCH O=$output_dir CROSS_COMPILE=$cross_compile $OPTIONS \
+ $image_kernel $dtbs
+
+grep 'CONFIG_MODULES=y' $output_dir/.config > /dev/null && modules=modules
+if [[ x$modules == xmodules ]] ; then
+ eval $pmake ARCH=$ARCH O=$output_dir CROSS_COMPILE=$cross_compile $OPTIONS \
+ $modules
+fi
+
+version=$(cat $output_dir/include/generated/utsrelease.h | cut -d '"' -f 2)
+
+#
+# Create the image
+#
+
+make_fit_image() {
+ local kernel_its=$output_dir/arch/$ARCH/boot/kernel_fdt.its
+
+ cat <<EOF > $kernel_its
+/dts-v1/;
+/ {
+ description = "Kernel + FDT image for $board board";
+ #address-cells = <1>;
+
+ images {
+ kernel {
+ description = "Linux kernel";
+ data = /incbin/("$output_dir/arch/$ARCH/boot/$image_kernel");
+ type = "kernel";
+ arch = "$ARCH";
+ os = "linux";
+ compression = "none";
+ load = <$LOADADDR>;
+ entry = <$LOADADDR>;
+ hash-1 {
+ algo = "crc32";
+ };
+ hash-2 {
+ algo = "sha1";
+ };
+ };
+EOF
+
+ local dtb
+
+ for dtb in $DTBS ; do
+ local src=${dtb/:*/}
+ local dst=${dtb/*:/}
+ dst=${dst/*\//}
+
+ cat <<EOF >> $kernel_its
+ fdt-$dst {
+ description = "Flattened Device Tree blob $dst";
+ data = /incbin/("$output_dir/arch/$ARCH/boot/dts/$src");
+ type = "flat_dt";
+ arch = "$ARCH";
+ compression = "none";
+ hash-1 {
+ algo = "crc32";
+ };
+ hash-2 {
+ algo = "sha1";
+ };
+ };
+EOF
+ done
+
+ local config=$(echo $DTBS | sed 's/.*[:/]//')
+ cat <<EOF >> $kernel_its
+ };
+
+ configurations {
+ default = "conf-$config";
+EOF
+ for dtb in $DTBS ; do
+ local dst=${dtb/*:/}
+ dst=${dst/*\//}
+
+ cat <<EOF >> $kernel_its
+ conf-$dst {
+ description = "Boot Linux kernel with $dst blob";
+ kernel = "kernel";
+ fdt = "fdt-$dst";
+ };
+EOF
+ done
+
+ cat <<EOF >> $kernel_its
+ };
+};
+EOF
+
+ PATH="$output_dir/scripts/dtc:$PATH" mkimage -f $kernel_its ${kernel_its/its/itb}
+}
+
+make_srec_image() {
+ local image=$output_dir/arch/$ARCH/boot/$image_kernel
+
+ cat $image | lzma -z -e > $image.xz
+ objcopy -I binary -O srec --srec-forceS3 --srec-len 516 \
+ $image.xz $image.xz.srec
+
+ for dtb in $DTBS ; do
+ local src=${dtb/:*/}
+
+ objcopy -I binary -O srec --srec-forceS3 --srec-len 516 \
+ $src $src.srec
+ done
+}
+
+make_uboot_image() {
+ mkimage -A $ARCH -O linux -T kernel -C none -a $LOADADDR -e $LOADADDR \
+ -n "Linux-${version}" -d $output_dir/arch/$ARCH/boot/$kernel_image \
+ $output_dir/arch/$ARCH/boot/uImage
+}
+
+make_cros_image() {
+ local boot_dir=$output_dir/arch/$ARCH/boot
+ local vmlinuz=$boot_dir/$1
+ local bootloader
+ local config
+
+ if [[ -f $opt_bootloader ]] ; then
+ bootloader=$opt_bootloader
+ else
+ dd if=/dev/zero of=$boot_dir/bootloader bs=512 count=1
+ bootloader=$boot_dir/bootloader
+ fi
+
+ if [[ -f $opt_cmdline_file ]] ; then
+ config=$opt_cmdline_file
+ else
+ echo "$CMDLINE" > $boot_dir/cmdline
+ config=$boot_dir/cmdline
+ fi
+
+ vbutil_kernel \
+ --pack $boot_dir/vmlinuz.image \
+ --version 1 \
+ --vmlinuz $vmlinuz \
+ --arch $ARCH \
+ --keyblock /usr/share/vboot/devkeys/kernel.keyblock \
+ --signprivate /usr/share/vboot/devkeys/kernel_data_key.vbprivk \
+ --config $config \
+ --bootloader $bootloader
+}
+
+case $IMAGE in
+FIT)
+ make_fit_image
+ image_file=$output_dir/arch/$ARCH/boot/kernel_fdt.itb
+ ;;
+cros-arm)
+ make_fit_image
+ make_cros_image kernel_fdt.itb
+ image_file=$output_dir/arch/$ARCH/boot/vmlinuz.image
+ ;;
+cros-x86)
+ make_fit_image
+ make_cros_image bzImage
+ image_file=$output_dir/arch/$ARCH/boot/vmlinuz.image
+ ;;
+srec)
+ make_srec_image
+ image_file=$output_dir/arch/$ARCH/boot/$kernel_image.xz.srec
+ ;;
+uImage)
+ make_uboot_image
+ image_file=$output_dir/arch/$ARCH/boot/uImage
+ ;;
+*)
+ image_file=$output_dir/arch/$ARCH/boot/$IMAGE
+ ;;
+esac
+
+#
+# Copy the files to their destination directories
+#
+
+copy_dtbs() {
+ local dtb
+ local target_dir=$1
+
+ for dtb in $DTBS ; do
+ local src=${dtb/:*/}
+ local dst=${dtb/*:/}
+ dst=${dst/*\//}
+
+ cp $output_dir/arch/${ARCH}/boot/dts/$src* $target_dir/$dst
+ done
+}
+
+mkdir -p $BOOT_DIR
+cp $image_file $BOOT_DIR/
+
+if [[ $IMAGE != FIT && $IMAGE != cros-arm && $IMAGE != cros-x86 ]] ; then
+ copy_dtbs $BOOT_DIR/
+fi
+
+if [[ x$modules = xmodules ]] ; then
+ $pmake ARCH=$ARCH O=$output_dir CROSS_COMPILE=$cross_compile INSTALL_MOD_PATH=$target_dir modules_install
+ echo "Kernel modules installed to $target_dir/lib/modules/$version"
+fi
+
+if [[ $do_package_deb = 1 ]] ; then
+ $pmake ARCH=$ARCH O=$output_dir CROSS_COMPILE=$cross_compile bindeb-pkg
+fi
+
+echo "Kernel image available in $image_file"
+echo "Build $version completed at $(date)"