summaryrefslogtreecommitdiff
path: root/packages/linux-kernel/build-linux-firmware.sh
diff options
context:
space:
mode:
Diffstat (limited to 'packages/linux-kernel/build-linux-firmware.sh')
-rwxr-xr-xpackages/linux-kernel/build-linux-firmware.sh95
1 files changed, 95 insertions, 0 deletions
diff --git a/packages/linux-kernel/build-linux-firmware.sh b/packages/linux-kernel/build-linux-firmware.sh
new file mode 100755
index 00000000..3194aa2c
--- /dev/null
+++ b/packages/linux-kernel/build-linux-firmware.sh
@@ -0,0 +1,95 @@
+#!/bin/bash
+
+# This script will use "list-required-firmware" to scan the kernel source repository
+# in combination with its configuration file which drivers are compiled. Some of those
+# drivers require proprietary firmware.
+#
+# All selected drivers are then precomfiled "make drivers/foo/bar.i" and we grep for
+# the magic word "UNIQUE_ID_firmware" which identifies firmware files.
+
+CWD=$(pwd)
+LINUX_SRC="linux"
+LINUX_FIRMWARE="linux-firmware"
+KERNEL_VAR_FILE=${CWD}/kernel-vars
+
+# Some firmware files might not be easy to extract (e.g. Intel iwlwifi drivers)
+# thus we simply ammend them "manually"
+ADD_FW_FILES="iwlwifi*"
+
+if [ ! -d ${LINUX_SRC} ]; then
+ echo "Kernel source missing"
+ exit 1
+fi
+
+if [ ! -d ${LINUX_FIRMWARE} ]; then
+ echo "Linux firmware repository missing"
+ exit 1
+fi
+
+. ${KERNEL_VAR_FILE}
+
+result=()
+# Retrieve firmware blobs from source files
+for FILE in $(${CWD}/list-required-firmware.py -k ${LINUX_SRC} -c ${CWD}/x86_64_vyos_defconfig -s drivers/net -s drivers/usb); do
+ cd ${CWD}/${LINUX_SRC}
+ echo "I: determine required firmware blobs for: ${FILE}"
+ make LOCALVERSION=${KERNEL_SUFFIX} ${FILE/.c/.i} > /dev/null 2>&1
+
+ if [ "$?" == "0" ]; then
+ result+=( $(grep UNIQUE_ID_firmware ${FILE/.c/.i} | cut -d" " -f12- | xargs printf "%s" | sed -e "s/;/ /g") )
+ fi
+done
+
+# Debian package will use the descriptive Git commit as version
+GIT_COMMIT=$(cd ${CWD}/${LINUX_FIRMWARE}; git describe --always)
+VYOS_FIRMWARE_NAME="vyos-linux-firmware"
+VYOS_FIRMWARE_DIR="${CWD}/${VYOS_FIRMWARE_NAME}_${GIT_COMMIT}-0_all"
+if [ -d ${VYOS_FIRMWARE_DIR} ]; then
+ # remove Debian package folder and deb file from previous runs
+ rm -rf ${VYOS_FIRMWARE_DIR}*
+fi
+mkdir -p ${VYOS_FIRMWARE_DIR}
+
+# Copy firmware file from linux firmware repository into
+# assembly folder for the vyos-firmware package
+SED_REPLACE="s@${CWD}/${LINUX_FIRMWARE}/@@"
+for FW in ${result[@]}; do
+ FW_FILE=$(basename $FW)
+
+ res=()
+ for tmp in $(find ${CWD}/linux-firmware -type f -name ${FW_FILE} | sed -e ${SED_REPLACE} )
+ do
+ res+=( "$tmp" )
+ done
+
+ for FILE in ${res[@]}; do
+ FW_DIR="${VYOS_FIRMWARE_DIR}/lib/firmware/$(dirname ${FILE})"
+ mkdir -p ${FW_DIR}
+ echo "I: install firmware: ${FILE}"
+ cp ${CWD}/linux-firmware/${FILE} ${FW_DIR}
+ done
+done
+
+# Install additional firmware files that could not be autodiscovered
+for FW in ${ADD_FW_FILES}
+do
+ FW_DIR="${VYOS_FIRMWARE_DIR}/lib/firmware/$(dirname ${FW})"
+ mkdir -p ${FW_DIR}
+ echo "I: install firmware: ${FW}"
+ cp ${CWD}/linux-firmware/${FW} ${FW_DIR}
+done
+
+# Describe Debian package
+mkdir ${VYOS_FIRMWARE_DIR}/DEBIAN
+cat << EOF >${VYOS_FIRMWARE_DIR}/DEBIAN/control
+Package: ${VYOS_FIRMWARE_NAME}
+Version: ${GIT_COMMIT}
+Section: kernel
+Priority: extra
+Architecture: all
+Maintainer: VyOS Package Maintainers <maintainers@vyos.net>
+Description: Firmware blobs for use with the Linux kernel
+EOF
+
+# Build Debian package
+fakeroot dpkg-deb --build ${VYOS_FIRMWARE_DIR}