blob: 98043318c21ea06a0cf9e2845718394a51c25691 [file] [log] [blame]
# SPDX-License-Identifier: (GPL-2.0+ OR MIT)
#
# Copyright (c) 2019 Amlogic, Inc. All rights reserved.
#
#!/bin/bash
exec_name=$0
set -o errtrace
trap 'echo Fatal error: script ${exec_name} aborting at line $LINENO,\
command \"$BASH_COMMAND\" returned $?; exit 1' ERR
root_dir=$(dirname $(readlink -f "$0"))
PATH=${root_dir}/../prebuilt/toolchain/aarch64/bin/:${PATH}
export PATH
arch=arm64
clang=aarch64-cros-linux-gnu-clang
clangxx=aarch64-cros-linux-gnu-clang++
cross_compile=aarch64-cros-linux-gnu-
cpu_num=$(grep -c processor /proc/cpuinfo)
readonly fctname="fct"
readonly bootdir=./arch/arm64/boot
function usage(){
echo "Usage: ${exec_name} <board> [workspace path] [-d]"
echo "supported boards: spencer-b1/b3/b4 venus-b1/b3/b4"
echo
echo "-d : Build deterministicly. Use git revision and timestamp and"
echo " generic user and host for /proc/version"
}
function deterministic_build(){
local deterministic_build=false
if [[ "$1" == "-d" ]]; then
deterministic_build=true
shift
fi
# Set variables for deterministic kernel builds
# These correspond to scripts/mkcompile_h
if [[ "$deterministic_build" == true ]]; then
export KBUILD_BUILD_VERSION=0
export KBUILD_BUILD_TIMESTAMP="$(git log -1 --format=%cd \
--date=format:'%a %b %d %H:%M:%S %Y') \
($(git rev-parse HEAD | head -c 8))"
export KBUILD_BUILD_USER=user
export KBUILD_BUILD_HOST=host
else
# Add git hash to date. This corresponds to scripts/mkcompile_h
# This shows up in /proc/version
export KBUILD_BUILD_TIMESTAMP="$(date) ($(git rev-parse HEAD | head -c 8))"
fi
}
function run_kernel_make(){
echo "***** building $4 *****"
make CC=$clang CROSS_COMPILE=$1 ARCH=$3 -j$2 $4 CONFIG_DEBUG_SECTION_MISMATCH=y
echo "***** completed building $4 *****"
}
function build_kernel(){
local kernel_path=$(readlink -f $1)
local defconfig_file_name=$2
# If it is b series board, use bx defconfig.
local board_type=`echo ${defconfig_file_name} | cut -d "-" -f2 | cut -c 1`
if [[ "$board_type" == "b" ]]; then
local product_surname=`echo ${defconfig_file_name} | cut -d "-" -f1`
defconfig_file_name=${product_surname}-bx_defconfig
fi
pushd $kernel_path
# Make a clean build and check .config and defconfig if different then abort.
# make clean
cp common_drivers/arch/arm64/configs/${defconfig_file_name} \
arch/arm64/configs/${defconfig_file_name}
run_kernel_make $cross_compile $cpu_num $arch $defconfig_file_name
diff .config arch/arm64/configs/${defconfig_file_name}
run_kernel_make $cross_compile $cpu_num $arch all
rm -f arch/arm64/configs/${defconfig_file_name}
popd
}
function build_dtb(){
local kernel_path=$(readlink -f $1)
local dtb_file_name=$2
pushd $kernel_path
run_kernel_make $cross_compile $cpu_num $arch $dtb_file_name
popd
}
# Append $1 which is an integer value to the file at path $2. $1 is appended as
# a binary little endian integer.
append_uint32_le() {
local val=$1
local file=$2
printf "0: %.8x" ${val} | sed -E 's/0: (..)(..)(..)(..)/0: \4\3\2\1/' \
| xxd -r -g0 >> ${file}
}
# Pack the kernel along with its dtb file
# The format is [header][compressed kernel][dtb file]
#
# header is little endian and consists of
# struct {
# char magic[KDTB_MAGIC_SZ];
# uint32_t kernel_size;
# uint32_t dtb_size;
# };
pack_kernel() {
local dtb_file=$1
local product=$2
local board_name=$3
local factory=$4
local compressed_kernel=${bootdir}/Image.lz4
local magic="KDTB"
if [ ! -z ${factory} ]; then
local packed_kernel=${bootdir}/${factory}_kernel.${product}.gz-dtb.\
${board_name}
else
local packed_kernel=${bootdir}/kernel.${product}.gz-dtb.${board_name}
fi
echo -n ${magic} > ${packed_kernel}
append_uint32_le $(stat -c %s ${compressed_kernel}) ${packed_kernel}
append_uint32_le $(stat -c %s ${dtb_file}) ${packed_kernel}
cat ${compressed_kernel} ${dtb_file} >> ${packed_kernel}
}
if (( $# < 1 ))
then
usage
exit 2
fi
readonly kernel_dir=.
readonly board=$1
readonly workspace_path=$2
deterministic_build $3
product=`echo ${board} | cut -d "-" -f1`
case $product in
spencer|venus)
build_kernel ${kernel_dir} ${board}_defconfig
dtb_file_name=${board}.dtb
path_to_dtb_file=common_drivers/arch/arm64/boot/dts/amlogic/${dtb_file_name}
build_dtb ${kernel_dir} ${dtb_file_name}
cp common_drivers/arch/arm64/boot/dts/amlogic/${dtb_file_name} arch/arm64/boot
pack_kernel $path_to_dtb_file ${product} ${board}
# build factory kernel
fct_dtb_file_name=${fctname}_${dtb_file_name}
path_to_fct_dtb_file=common_drivers/arch/arm64/boot/dts/amlogic/${fct_dtb_file_name}
build_dtb ${kernel_dir} ${fct_dtb_file_name}
cp common_drivers/arch/arm64/boot/dts/amlogic/${fct_dtb_file_name} arch/arm64/boot
pack_kernel $path_to_fct_dtb_file ${product} ${board} ${fctname}
if [ ! -z $workspace_path ]; then
prebuilt_path=${workspace_path}/vendor/amlogic/${product}/prebuilt
kernel_path=${prebuilt_path}/kernel_5.15
mkdir -p ${kernel_path}
cp ${bootdir}/kernel.${product}.gz-dtb.${board} \
${kernel_path}
cp ${path_to_dtb_file} ${kernel_path}/${board}.dtb
# Factory directory
fct_kernel_path=${prebuilt_path}/factory/kernel_5.15
mkdir -p ${fct_kernel_path}
cp ${bootdir}/${fctname}_kernel.${product}.gz-dtb.${board} \
${fct_kernel_path}/kernel.${product}.gz-dtb.${board}
#copy all ko
#Installed after the system mounted
kernel_modules=${kernel_path}/modules
fct_kernel_modules=${fct_kernel_path}/modules
mkdir -p ${kernel_modules}
mkdir -p ${fct_kernel_modules}
#Installed before the system mounted
root_modules=${prebuilt_path}/root_modules
mkdir -p ${root_modules}
#ko in ramdisk.img
cp common_drivers/drivers/gki_tool/amlogic-gkitool.ko \
${root_modules}/amlogic-gkitool.${board}.ko
cp common_drivers/drivers/memory_debug/amlogic-memory-debug.ko \
${root_modules}/amlogic-memory-debug.${board}.ko
cp common_drivers/drivers/clk/meson/amlogic-clk.ko \
${root_modules}/amlogic-clk.${board}.ko
cp common_drivers/drivers/clk/meson/amlogic-clk-soc-c2.ko \
${root_modules}/amlogic-clk-soc-c2.${board}.ko
cp common_drivers/drivers/gpio/amlogic-gpio.ko \
${root_modules}/amlogic-gpio.${board}.ko
cp common_drivers/drivers/gpio/amlogic-pinctrl-soc-c2.ko \
${root_modules}/amlogic-pinctrl-soc-c2.${board}.ko
cp common_drivers/drivers/efuse_unifykey/amlogic-efuse-unifykey.ko \
${root_modules}/amlogic-efuse-unifykey.${board}.ko
cp common_drivers/drivers/pwm/amlogic-pwm.ko \
${root_modules}/amlogic-pwm.${board}.ko
cp drivers/regulator/pwm-regulator.ko \
${root_modules}/pwm-regulator.${board}.ko
cp common_drivers/drivers/reset/amlogic-reset.ko \
${root_modules}/amlogic-reset.${board}.ko
cp common_drivers/drivers/power/amlogic-power.ko \
${root_modules}/amlogic-power.${board}.ko
cp common_drivers/drivers/cpufreq/amlogic-cpufreq.ko \
${root_modules}/amlogic-cpufreq.${board}.ko
cp common_drivers/drivers/mmc/host/amlogic-mmc.ko \
${root_modules}/amlogic-mmc.${board}.ko
cp common_drivers/drivers/mailbox/amlogic-mailbox.ko \
${root_modules}/amlogic-mailbox.${board}.ko
cp common_drivers/drivers/i2c/busses/amlogic-i2c.ko \
${root_modules}/amlogic-i2c.${board}.ko
cp common_drivers/drivers/led/aw2015/leds-aw2015.ko \
${root_modules}/leds-aw2015.${board}.ko
#ko in system.img
#TEE
cp common_drivers/drivers/char/hw_random/amlogic-rng.ko \
${kernel_modules}/amlogic-rng.${board}.ko
cp common_drivers/drivers/crypto/amlogic-crypto-dma.ko \
${kernel_modules}/amlogic-crypto-dma.${board}.ko
cp common_drivers/drivers/aml_tee/tee.ko \
${kernel_modules}/tee.${board}.ko
cp common_drivers/drivers/aml_tee/optee/optee.ko \
${kernel_modules}/optee.${board}.ko
cp common_drivers/drivers/tee/amlogic-tee.ko \
${kernel_modules}/amlogic-tee.${board}.ko
cp common_drivers/drivers/cpu_info/amlogic-cpuinfo.ko \
${kernel_modules}/amlogic-cpuinfo.${board}.ko
cp common_drivers/drivers/pm/amlogic-pm.ko \
${kernel_modules}/amlogic-pm.${board}.ko
cp drivers/usb/host/xhci-plat-hcd.ko \
${kernel_modules}/xhci-plat-hcd.${board}.ko
cp drivers/usb/dwc3/dwc3.ko \
${kernel_modules}/dwc3.${board}.ko
cp drivers/usb/dwc3/dwc3-of-simple.ko \
${kernel_modules}/dwc3-of-simple.${board}.ko
cp common_drivers/drivers/usb/amlogic-usb.ko \
${kernel_modules}/amlogic-usb.${board}.ko
cp common_drivers/drivers/usb/dwc_otg.ko \
${kernel_modules}/dwc_otg.${board}.ko
cp common_drivers/drivers/spi/amlogic-spi.ko \
${kernel_modules}/amlogic-spi.${board}.ko
cp common_drivers/drivers/iio/adc/amlogic-adc.ko \
${kernel_modules}/amlogic-adc.${board}.ko
cp common_drivers/drivers/rtc/amlogic-rtc.ko \
${kernel_modules}/amlogic-rtc.${board}.ko
cp common_drivers/drivers/thermal/amlogic-thermal.ko \
${kernel_modules}/amlogic-thermal.${board}.ko
cp drivers/hwmon/hwmon.ko \
${kernel_modules}/hwmon.${board}.ko
cp drivers/hwmon/ntc_thermistor.ko \
${kernel_modules}/ntc_thermistor.${board}.ko
cp common_drivers/drivers/icr/icr-core.ko \
${kernel_modules}/icr-core.${board}.ko
cp common_drivers/drivers/icr/awinic-aw8637c.ko \
${kernel_modules}/awinic-aw8637c.${board}.ko
cp common_drivers/drivers/efuse_info/amlogic-efuseinfo.ko \
${kernel_modules}/amlogic-efuseinfo.${board}.ko
cp common_drivers/drivers/media/aml_media.ko \
${kernel_modules}/aml_media.${board}.ko
cp common_drivers/drivers/host/amlogic-host.ko \
${kernel_modules}/amlogic-host.${board}.ko
cp common_drivers/drivers/fts/amlogic-fts.ko \
${kernel_modules}/amlogic-fts.${board}.ko
cp common_drivers/sound/soc/codecs/amlogic/amlogic-snd-dummy-pdm.ko \
${kernel_modules}/amlogic-snd-dummy-pdm.${board}.ko
cp common_drivers/sound/soc/codecs/amlogic/amlogic-snd-codec-dummy.ko \
${kernel_modules}/amlogic-snd-codec-dummy.${board}.ko
cp common_drivers/sound/soc/codecs/amlogic/amlogic-snd-codec-a1.ko \
${kernel_modules}/amlogic-snd-codec-a1.${board}.ko
cp common_drivers/sound/soc/amlogic/amlogic-snd-soc.ko \
${kernel_modules}/amlogic-snd-soc.${board}.ko
# Media Modules
cp common_drivers/drivers/media_modules/common/media_clock/media_clock.ko \
${kernel_modules}/media_clock.${board}.ko
cp common_drivers/drivers/media_modules/frame_sink/encoder/multi/amlogic-multienc.ko \
${kernel_modules}/amlogic-multienc.${board}.ko
cp common_drivers/drivers/media_modules/common/firmware/firmware.ko \
${kernel_modules}/firmware.${board}.ko
cp common_drivers/drivers/media_modules/frame_sink/encoder/jpeg/amlogic-jpegenc.ko \
${kernel_modules}/amlogic-jpegenc.${board}.ko
if [[ ${product} == "venus" ]]; then
cp common_drivers/drivers/mux/amlogic-mux-gpio.ko \
${kernel_modules}/amlogic-mux-gpio.${board}.ko
cp common_drivers/drivers/led/lp5009/leds-lp5009.ko \
${kernel_modules}/leds-lp5009.${board}.ko
cp common_drivers/drivers/led/aw210xx/leds-aw210xx.ko \
${kernel_modules}/leds-aw210xx.${board}.ko
cp common_drivers/drivers/hwmon/ptc_thermistor.ko \
${kernel_modules}/ptc_thermistor.${board}.ko
cp drivers/mux/mux-core.ko \
${kernel_modules}/mux-core.${board}.ko
cp drivers/iio/multiplexer/iio-mux.ko \
${kernel_modules}/iio-mux.${board}.ko
cp drivers/power/supply/bq256xx_charger.ko \
${kernel_modules}/bq256xx_charger.${board}.ko
cp common_drivers/drivers/ssr/ssr-core.ko \
${kernel_modules}/ssr-core.${board}.ko
cp common_drivers/drivers/ssr/ps13216_regmap.ko \
${kernel_modules}/ps13216_regmap.${board}.ko
cp common_drivers/drivers/ssr/ps13216_ssr.ko \
${kernel_modules}/ps13216_ssr.${board}.ko
fi
cp common_drivers/drivers/timestamp/amlogic-timestamp.ko \
${kernel_modules}/amlogic-timestamp.${board}.ko
cp common_drivers/drivers/wireless/amlogic-wireless.ko \
${kernel_modules}/amlogic-wireless.${board}.ko
cp common_drivers/drivers/bluesleep/bluesleep.ko \
${kernel_modules}/bluesleep.${board}.ko
#copy overlay FS module
cp fs/overlayfs/overlay.ko ${kernel_modules}/overlay.${board}.ko
cp fs/exportfs/exportfs.ko ${kernel_modules}/exportfs.${board}.ko
#remove debug symbol
${cross_compile}strip --strip-debug ${kernel_path}/modules/*
${cross_compile}strip --strip-debug ${root_modules}/*
#copy ko to factory
cp ${kernel_modules}/* ${fct_kernel_modules}/
fi
;;
*)
echo "unknown board: $board"
exit 1
esac