{ lib ? import , hostPlatform ? lib.systems.examples.aarch64-multiplatform }: let # order matters! this is also the order in which the modules are insmoded modules_insmod = [ "drivers/video/backlight/pwm_bl.ko" "drivers/gpu/drm/panel/panel-simple.ko" "drivers/gpu/drm/bridge/analogix/analogix_dp.ko" "drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.ko" "drivers/gpu/drm/bridge/synopsys/dw-hdmi.ko" "drivers/gpu/drm/rockchip/rockchipdrm.ko" "drivers/usb/dwc3/dwc3-of-simple.ko" "drivers/usb/dwc3/dwc3.ko" "drivers/usb/host/ehci-hcd.ko" "drivers/usb/host/ehci-platform.ko" "drivers/usb/host/ohci-hcd.ko" "drivers/usb/host/ohci-platform.ko" "drivers/usb/storage/usb-storage.ko" "drivers/usb/storage/uas.ko" "drivers/usb/host/xhci-hcd.ko" "drivers/usb/host/xhci-plat-hcd.ko" ]; # FIXME: need firmware for mwifiex and ath9k as well. modules_noinsmod = [ "lib/crypto/libarc4.ko" "net/mac80211/mac80211.ko" "drivers/net/wireless/ath/ath9k/ath9k.ko" "drivers/net/wireless/ath/ath9k/ath9k_common.ko" "drivers/net/wireless/ath/ath9k/ath9k_htc.ko" "drivers/net/wireless/ath/ath9k/ath9k_hw.ko" "drivers/net/wireless/ath/ath.ko" "drivers/net/wireless/marvell/mwifiex/mwifiex_pcie.ko" "drivers/net/wireless/marvell/mwifiex/mwifiex.ko" ]; in { inherit hostPlatform; overlays = [(final: prev: { nixpkgsOnBuildForHost = prev.nixpkgsOnBuildForBuild.pkgsCross.aarch64-multiplatform; platform_name = "kevin"; kernel = final.lib.makeOverridable (prev.kernel.override { config = ./linux.config; buildTargets = [ "Image" "dtbs" ]; }).overrideAttrs (a: { postInstall = (a.postInstall or "") + '' lzma < arch/arm64/boot/Image > $out/Image.lzma cp arch/arm64/boot/dts/rockchip/rk3399-gru-kevin.dtb $out/ ''; }); inherit modules_insmod; userspace = prev.userspace.override { }; initramfs = prev.initramfs.override { modules = modules_insmod ++ modules_noinsmod; }; coreboot = let atf = final.nixpkgsOnBuildForHost.callPackage (import ./atf) { buildArmTrustedFirmware = (final.nixpkgsOnBuildForHost.callPackage (import ) { unfreeIncludeHDCPBlob = false; openssl = null; # not sure why they would link in openssl... }).buildArmTrustedFirmware; }; fit = final.nixpkgsOnBuildForBuild.callPackage (import ./fit) { inherit (final) initramfs kernel; }; in final.lib.makeOverridable (prev.coreboot.override { payload = "${fit}/Image.fit"; fmap = ./custom.fmap; config = ./coreboot.config; coreboot-toolchain = with final.coreboot-toolchain; [ aarch64 ]; linux-command-line="console=ttyS2,115200n8"; }).overrideAttrs (a: { postConfigure = '' echo CONFIG_ARM64_BL31_EXTERNAL_FILE=\"${atf}/bl31.elf\" >> .config mkdir -p 3rdparty/arm-trusted-firmware/plat/rockchip/common/include/ ln -s ${atf}/plat_params.h 3rdparty/arm-trusted-firmware/plat/rockchip/common/include/ mkdir -p 3rdparty/arm-trusted-firmware/plat/rockchip/rk3399/include/shared/ ln -s ${atf}/bl31_param.h 3rdparty/arm-trusted-firmware/plat/rockchip/rk3399/include/shared/ mkdir -p 3rdparty/arm-trusted-firmware ln -s ${atf}/include 3rdparty/arm-trusted-firmware/include ''; }); ecfw = final.nixpkgsOnBuildForBuild.callPackage (import ./ecfw { boardName = "kevin"; }) { # We have to use gcc6; later versions fail with: # /build/ccyHxnc6.s: Assembler messages # /build/ccyHxnc6.s:5105: Error: offset out of range # binaries downloaded from ARM, Inc #arm-none-eabi-gcc = final.nixpkgsOnBuildForBuild.gcc-arm-embedded-6; # built fromm source arm-none-eabi-gcc = final.nixpkgsOnBuildForBuild.pkgsCross.arm-embedded.buildPackages.gcc6; }; ecfw-scripts = final.nixpkgsOnBuildForHost.callPackage (import ./ecfw/scripts.nix) { inherit (final) ectool ecfw; flashrom-chromebook = final.flashrom; }; flashrom = prev.flashrom.override { forChromebook = true; }; ectool = final.nixpkgsOnBuildForHost.callPackage (import ../../util/ectool { boardName = "kevin"; }) { }; })]; }