# SPDX-License-Identifier: GPL-2.0-or-later # Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) # Copyright (C) 2017-present Team LibreELEC (https://libreelec.tv) PKG_NAME="linux" PKG_LICENSE="GPL" PKG_SITE="http://www.kernel.org" PKG_DEPENDS_HOST="ccache:host" PKG_DEPENDS_TARGET="linux:host kmod:host keyutils openssl:host ${KERNEL_EXTRA_DEPENDS_TARGET}" PKG_NEED_UNPACK="${LINUX_DEPENDS} $(get_pkg_directory initramfs) $(get_pkg_variable initramfs PKG_NEED_UNPACK)" PKG_LONGDESC="This package contains a precompiled kernel image and the modules." PKG_IS_KERNEL_PKG="yes" PKG_STAMP="${KERNEL_TARGET} ${KERNEL_MAKE_EXTRACMD}" PKG_PATCH_DIRS="${LINUX}" case "${LINUX}" in amlogic) PKG_VERSION="4645fefac0b24d509b962c096b0327e87f34b1d2" # 6.16.5 PKG_SHA256="45daac22ef696b17041b0ef1584332a255c6f3d26bd604f7052b1f9e65bf13f0" PKG_URL="https://github.com/torvalds/linux/archive/${PKG_VERSION}.tar.gz" PKG_SOURCE_NAME="linux-${LINUX}-${PKG_VERSION}.tar.gz" PKG_PATCH_DIRS="default rtlwifi/6.17" ;; raspberrypi) PKG_VERSION="359f37f0faefb712add32a39f98751aea67d5c1f" # 6.12.47 PKG_SHA256="85c882310e7c74657855b25bba700b5a856327a31547fe49f5758951984c92d9" PKG_URL="https://github.com/raspberrypi/linux/archive/${PKG_VERSION}.tar.gz" PKG_SOURCE_NAME="linux-${LINUX}-${PKG_VERSION}.tar.gz" PKG_PATCH_DIRS="raspberrypi rtlwifi/6.13 rtlwifi/6.14 rtlwifi/6.15 rtlwifi/6.17" ;; rockchip) PKG_VERSION="07e27ad16399afcd693be20211b0dfae63e0615f" # 6.17-rc7 PKG_SHA256="098609cc94a84dd05e1054d43f9a7c335a61edb06093d4f23bcdefa7be24c1ec" PKG_URL="https://github.com/chewitt/linux/archive/${PKG_VERSION}.tar.gz" PKG_SOURCE_NAME="linux-${LINUX}-${PKG_VERSION}.tar.gz" PKG_PATCH_DIRS="default rockchip rtlwifi/6.17" ;; *) PKG_VERSION="6.16.7" PKG_SHA256="5be3daa1f9427b1bdb34c4894d9c1adfac38cff674376fe0611a3065729a1a81" PKG_URL="https://www.kernel.org/pub/linux/kernel/v${PKG_VERSION/.*/}.x/${PKG_NAME}-${PKG_VERSION}.tar.xz" PKG_PATCH_DIRS="default rtlwifi/6.17" case ${DEVICE} in RK3288|RK3328|RK3399) PKG_PATCH_DIRS+=" rockchip-old" ;; esac ;; esac PKG_KERNEL_CFG_FILE=$(kernel_config_path) || die if [ -n "${KERNEL_TOOLCHAIN}" ]; then PKG_DEPENDS_TARGET+=" gcc-${KERNEL_TOOLCHAIN}:host" HEADERS_ARCH=${TARGET_ARCH} else PKG_DEPENDS_TARGET+=" toolchain" fi if [ "${PKG_BUILD_PERF}" != "no" ] && grep -q ^CONFIG_PERF_EVENTS= ${PKG_KERNEL_CFG_FILE}; then PKG_BUILD_PERF="yes" PKG_DEPENDS_TARGET+=" binutils elfutils libunwind zlib openssl" fi if [ "${TARGET_ARCH}" = "x86_64" ]; then PKG_DEPENDS_TARGET+=" elfutils:host pciutils" PKG_DEPENDS_UNPACK+=" intel-ucode kernel-firmware" elif [ "${TARGET_ARCH}" = "arm" -a "${DEVICE}" = "iMX6" ]; then PKG_DEPENDS_UNPACK+=" firmware-imx" fi if [[ "${KERNEL_TARGET}" = uImage* ]]; then PKG_DEPENDS_TARGET+=" u-boot-tools:host" fi if [ "${BOOTLOADER}" = "bcm2835-bootloader" -a "${TARGET_KERNEL_ARCH}" = "arm64" ]; then PKG_DEPENDS_TARGET+=" pigz:host" fi # Ensure that the dependencies of initramfs:target are built correctly, but # we don't want to add initramfs:target as a direct dependency as we install # this "manually" from within linux:target for pkg in $(get_pkg_variable initramfs PKG_DEPENDS_TARGET); do ! listcontains "${PKG_DEPENDS_TARGET}" "${pkg}" && PKG_DEPENDS_TARGET+=" ${pkg}" || true done post_patch() { # linux was already built and its build dir autoremoved - prepare it again for kernel packages if [ -d ${PKG_INSTALL}/.image ]; then cp -p ${PKG_INSTALL}/.image/.config ${PKG_BUILD} kernel_make -C ${PKG_BUILD} prepare # restore the required Module.symvers from an earlier build cp -p ${PKG_INSTALL}/.image/Module.symvers ${PKG_BUILD} fi } make_host() { : } makeinstall_host() { make \ ARCH=${HEADERS_ARCH:-${TARGET_KERNEL_ARCH}} \ HOSTCC="${TOOLCHAIN}/bin/host-gcc" \ HOSTCXX="${TOOLCHAIN}/bin/host-g++" \ HOSTCFLAGS="${HOST_CFLAGS}" \ HOSTCXXFLAGS="${HOST_CXXFLAGS}" \ HOSTLDFLAGS="${HOST_LDFLAGS}" \ INSTALL_HDR_PATH=dest \ headers_install mkdir -p ${SYSROOT_PREFIX}/usr/include cp -R dest/include/* ${SYSROOT_PREFIX}/usr/include } pre_make_target() { ( cd ${ROOT} rm -rf ${BUILD}/initramfs rm -f ${STAMPS_INSTALL}/initramfs/install_target ${STAMPS_INSTALL}/*/install_init ${SCRIPTS}/install initramfs ) pkg_lock_status "ACTIVE" "linux:target" "build" cp ${PKG_KERNEL_CFG_FILE} ${PKG_BUILD}/.config # set initramfs source ${PKG_BUILD}/scripts/config --set-str CONFIG_INITRAMFS_SOURCE "$(kernel_initramfs_confs) ${BUILD}/initramfs" # set default hostname based on ${DISTRONAME} ${PKG_BUILD}/scripts/config --set-str CONFIG_DEFAULT_HOSTNAME "${DISTRONAME}" # disable swap support if not enabled if [ ! "${SWAP_SUPPORT}" = yes ]; then ${PKG_BUILD}/scripts/config --disable CONFIG_SWAP fi # disable nfs support if not enabled if [ ! "${NFS_SUPPORT}" = yes ]; then ${PKG_BUILD}/scripts/config --disable CONFIG_NFS_FS fi # disable cifs support if not enabled if [ ! "${SAMBA_SUPPORT}" = yes ]; then ${PKG_BUILD}/scripts/config --disable CONFIG_CIFS fi # disable wireguard support if not enabled if [ ! "${WIREGUARD_SUPPORT}" = yes ]; then ${PKG_BUILD}/scripts/config --disable CONFIG_WIREGUARD fi # disable vfd support if not enabled if [ ! "${VFD_SUPPORT}" = yes ]; then ${PKG_BUILD}/scripts/config --disable CONFIG_PANEL_CHANGE_MESSAGE else # enable the module and set distro boot message ${PKG_BUILD}/scripts/config --enable CONFIG_AUXDISPLAY ${PKG_BUILD}/scripts/config --enable CONFIG_LINEDISPLAY ${PKG_BUILD}/scripts/config --enable CONFIG_TM16XX ${PKG_BUILD}/scripts/config --enable CONFIG_TM16XX_KEYPAD ${PKG_BUILD}/scripts/config --enable CONFIG_TM16XX_I2C ${PKG_BUILD}/scripts/config --enable CONFIG_TM16XX_SPI ${PKG_BUILD}/scripts/config --enable CONFIG_PANEL_CHANGE_MESSAGE ${PKG_BUILD}/scripts/config --set-str CONFIG_PANEL_BOOT_MESSAGE "${VFD_MESSAGE}" ${PKG_BUILD}/scripts/config --enable CONFIG_INPUT_MATRIXKMAP # enable led activity triggers ${PKG_BUILD}/scripts/config --enable CONFIG_LEDS_TRIGGER_TIMER # Colon ${PKG_BUILD}/scripts/config --enable CONFIG_LEDS_TRIGGER_NETDEV # LAN/WLAN ${PKG_BUILD}/scripts/config --enable CONFIG_USB_LEDS_TRIGGER_USBPORT # USB ${PKG_BUILD}/scripts/config --enable CONFIG_MMC # SD fi if [ "${TARGET_ARCH}" = "x86_64" ]; then # copy some extra firmware to linux tree mkdir -p ${PKG_BUILD}/external-firmware cp -a $(get_build_dir kernel-firmware)/.copied-firmware/{amdgpu,amd-ucode,i915,radeon,e100,rtl_nic} ${PKG_BUILD}/external-firmware cp -a $(get_build_dir intel-ucode)/intel-ucode ${PKG_BUILD}/external-firmware FW_LIST="$(find ${PKG_BUILD}/external-firmware \( -type f -o -type l \) \( -iname '*.bin' -o -iname '*.fw' -o -path '*/intel-ucode/*' \) | sed 's|.*external-firmware/||' | sort | xargs)" ${PKG_BUILD}/scripts/config --set-str CONFIG_EXTRA_FIRMWARE "${FW_LIST}" ${PKG_BUILD}/scripts/config --set-str CONFIG_EXTRA_FIRMWARE_DIR "external-firmware" elif [ "${TARGET_ARCH}" = "arm" -a "${DEVICE}" = "iMX6" ]; then mkdir -p ${PKG_BUILD}/external-firmware/imx/sdma cp -a $(get_build_dir firmware-imx)/firmware/sdma/*imx6*.bin ${PKG_BUILD}/external-firmware/imx/sdma cp -a $(get_build_dir firmware-imx)/firmware/vpu/*imx6*.bin ${PKG_BUILD}/external-firmware FW_LIST="$(find ${PKG_BUILD}/external-firmware -type f | sed 's|.*external-firmware/||' | sort | xargs)" ${PKG_BUILD}/scripts/config --set-str CONFIG_EXTRA_FIRMWARE "${FW_LIST}" ${PKG_BUILD}/scripts/config --set-str CONFIG_EXTRA_FIRMWARE_DIR "external-firmware" fi kernel_make listnewconfig if [ "${INTERACTIVE_CONFIG}" = "yes" ]; then # manually answer .config changes kernel_make oldconfig else # accept default answers for .config changes yes "" | kernel_make oldconfig >/dev/null fi if [ -f "${DISTRO_DIR}/${DISTRO}/kernel_options" ]; then while read OPTION; do [ -z "${OPTION}" -o -n "$(echo "${OPTION}" | grep '^#')" ] && continue if [ "${OPTION##*=}" == "n" -a "$(${PKG_BUILD}/scripts/config --state ${OPTION%%=*})" == "undef" ]; then continue fi if [ "$(${PKG_BUILD}/scripts/config --state ${OPTION%%=*})" != "$(echo ${OPTION##*=} | tr -d '"')" ]; then MISSING_KERNEL_OPTIONS+="\t${OPTION}\n" fi done <${DISTRO_DIR}/${DISTRO}/kernel_options if [ -n "${MISSING_KERNEL_OPTIONS}" ]; then print_color CLR_WARNING "LINUX: kernel options not correct: \n${MISSING_KERNEL_OPTIONS%%}\nPlease run ./tools/check_kernel_config\n" fi fi } make_target() { # arm64 target does not support creating uImage. # Build Image first, then wrap it using u-boot's mkimage. if [[ "${TARGET_KERNEL_ARCH}" = "arm64" && "${KERNEL_TARGET}" = uImage* ]]; then if [ -z "${KERNEL_UIMAGE_LOADADDR}" -o -z "${KERNEL_UIMAGE_ENTRYADDR}" ]; then die "ERROR: KERNEL_UIMAGE_LOADADDR and KERNEL_UIMAGE_ENTRYADDR have to be set to build uImage - aborting" fi KERNEL_UIMAGE_TARGET="${KERNEL_TARGET}" KERNEL_TARGET="${KERNEL_TARGET/uImage/Image}" fi DTC_FLAGS=-@ kernel_make ${KERNEL_TARGET} ${KERNEL_MAKE_EXTRACMD} modules if [ "${PKG_BUILD_PERF}" = "yes" ]; then ( cd tools/perf # arch specific perf build args case "${TARGET_ARCH}" in x86_64) PERF_BUILD_ARGS="ARCH=x86" ;; aarch64) PERF_BUILD_ARGS="ARCH=arm64" ;; *) PERF_BUILD_ARGS="ARCH=${TARGET_ARCH}" ;; esac WERROR=0 \ NO_LIBPERL=1 \ NO_LIBPYTHON=1 \ NO_SLANG=1 \ NO_GTK2=1 \ NO_LIBNUMA=1 \ NO_LIBAUDIT=1 \ NO_LIBTRACEEVENT=1 \ NO_LZMA=1 \ NO_SDT=1 \ NO_LIBDEBUGINFOD=1 \ NO_JVMTI=1 \ NO_LIBLLVM=1 \ NO_LIBPFM4=1 \ NO_LIBBABELTRACE=1 \ NO_CAPSTONE=1 \ NO_LIBPFM4=1 \ BUILD_BPF_SKEL=0 \ CROSS_COMPILE="${TARGET_PREFIX}" \ JOBS="${CONCURRENCY_MAKE_LEVEL}" \ make ${PERF_BUILD_ARGS} mkdir -p ${INSTALL}/usr/bin cp perf ${INSTALL}/usr/bin ) fi if [ -n "${KERNEL_UIMAGE_TARGET}" ]; then # determine compression used for kernel image KERNEL_UIMAGE_COMP=${KERNEL_UIMAGE_TARGET:7} KERNEL_UIMAGE_COMP=$(echo ${KERNEL_UIMAGE_COMP:-none} | sed 's/gz/gzip/; s/bz2/bzip2/') # calculate new load address to make kernel Image unpack to memory area after compressed image if [ "${KERNEL_UIMAGE_COMP}" != "none" ]; then COMPRESSED_SIZE=$(stat -t "arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_TARGET}" | awk '{print $2}') # align to 1 MiB COMPRESSED_SIZE=$((((${COMPRESSED_SIZE} - 1 >> 20) + 1) << 20)) PKG_KERNEL_UIMAGE_LOADADDR=$(printf '%X' "$((${KERNEL_UIMAGE_LOADADDR} + ${COMPRESSED_SIZE}))") PKG_KERNEL_UIMAGE_ENTRYADDR=$(printf '%X' "$((${KERNEL_UIMAGE_ENTRYADDR} + ${COMPRESSED_SIZE}))") else PKG_KERNEL_UIMAGE_LOADADDR=${KERNEL_UIMAGE_LOADADDR} PKG_KERNEL_UIMAGE_ENTRYADDR=${KERNEL_UIMAGE_ENTRYADDR} fi mkimage -A ${TARGET_KERNEL_ARCH} \ -O linux \ -T kernel \ -C ${KERNEL_UIMAGE_COMP} \ -a ${PKG_KERNEL_UIMAGE_LOADADDR} \ -e ${PKG_KERNEL_UIMAGE_ENTRYADDR} \ -d arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_TARGET} \ arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_UIMAGE_TARGET} KERNEL_TARGET="${KERNEL_UIMAGE_TARGET}" fi } makeinstall_target() { mkdir -p ${INSTALL}/.image cp -p arch/${TARGET_KERNEL_ARCH}/boot/${KERNEL_TARGET} System.map .config Module.symvers ${INSTALL}/.image/ kernel_make INSTALL_MOD_PATH=${INSTALL}/$(get_kernel_overlay_dir) modules_install rm -f ${INSTALL}/$(get_kernel_overlay_dir)/lib/modules/*/build rm -f ${INSTALL}/$(get_kernel_overlay_dir)/lib/modules/*/source if [ "${BOOTLOADER}" = "u-boot" ]; then mkdir -p ${INSTALL}/usr/share/bootloader for dtb in arch/${TARGET_KERNEL_ARCH}/boot/dts/*.dtb \ arch/${TARGET_KERNEL_ARCH}/boot/dts/*/*.dtb \ arch/${TARGET_KERNEL_ARCH}/boot/dts/*/*/*.dtb; do if [ -f ${dtb} ]; then cp -v ${dtb} ${INSTALL}/usr/share/bootloader fi done elif [ "${BOOTLOADER}" = "bcm2835-bootloader" ]; then # RPi firmware will decompress gzipped kernels prior to booting if [ "${TARGET_KERNEL_ARCH}" = "arm64" ]; then pigz --best --force ${INSTALL}/.image/${KERNEL_TARGET} mv ${INSTALL}/.image/${KERNEL_TARGET}.gz ${INSTALL}/.image/${KERNEL_TARGET} fi mkdir -p ${INSTALL}/usr/share/bootloader/overlays # install platform dtbs, but remove upstream kernel dtbs (i.e. without downstream # drivers and decent USB support) as these are not required by LibreELEC for dtb in arch/${TARGET_KERNEL_ARCH}/boot/dts/*.dtb \ arch/${TARGET_KERNEL_ARCH}/boot/dts/*/*.dtb \ arch/${TARGET_KERNEL_ARCH}/boot/dts/*/*/*.dtb; do if [ -f ${dtb} ]; then cp -v ${dtb} ${INSTALL}/usr/share/bootloader fi done rm -f ${INSTALL}/usr/share/bootloader/bcm283*.dtb # duplicated in overlays below safe_remove ${INSTALL}/usr/share/bootloader/overlay_map.dtb # install overlay dtbs for dtb in arch/arm/boot/dts/overlays/*.dtb \ arch/arm/boot/dts/overlays/*.dtbo; do cp ${dtb} ${INSTALL}/usr/share/bootloader/overlays 2>/dev/null || : done cp -p arch/${TARGET_KERNEL_ARCH}/boot/dts/overlays/README ${INSTALL}/usr/share/bootloader/overlays fi }