Merge pull request #251898 from ktrinh-anduril/ktrinh/improve-devicetree-infra

This commit is contained in:
Ryan Lahfa 2023-10-07 00:55:35 +02:00 committed by GitHub
commit 5fa3ea862b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 71 additions and 20 deletions

View File

@ -66,36 +66,32 @@ let
}; };
filterDTBs = src: if cfg.filter == null filterDTBs = src: if cfg.filter == null
then "${src}/dtbs" then src
else else
pkgs.runCommand "dtbs-filtered" {} '' pkgs.runCommand "dtbs-filtered" {} ''
mkdir -p $out mkdir -p $out
cd ${src}/dtbs cd ${src}
find . -type f -name '${cfg.filter}' -print0 \ find . -type f -name '${cfg.filter}' -print0 \
| xargs -0 cp -v --no-preserve=mode --target-directory $out --parents | xargs -0 cp -v --no-preserve=mode --target-directory $out --parents
''; '';
filteredDTBs = filterDTBs cfg.kernelPackage; filteredDTBs = filterDTBs cfg.dtbSource;
# Compile single Device Tree overlay source
# file (.dts) into its compiled variant (.dtbo)
compileDTS = name: f: pkgs.callPackage({ stdenv, dtc }: stdenv.mkDerivation {
name = "${name}-dtbo";
nativeBuildInputs = [ dtc ];
buildCommand = ''
$CC -E -nostdinc -I${getDev cfg.kernelPackage}/lib/modules/${cfg.kernelPackage.modDirVersion}/source/scripts/dtc/include-prefixes -undef -D__DTS__ -x assembler-with-cpp ${f} | \
dtc -I dts -O dtb -@ -o $out
'';
}) {};
# Fill in `dtboFile` for each overlay if not set already. # Fill in `dtboFile` for each overlay if not set already.
# Existence of one of these is guarded by assertion below # Existence of one of these is guarded by assertion below
withDTBOs = xs: flip map xs (o: o // { dtboFile = withDTBOs = xs: flip map xs (o: o // { dtboFile =
let
includePaths = ["${getDev cfg.kernelPackage}/lib/modules/${cfg.kernelPackage.modDirVersion}/source/scripts/dtc/include-prefixes"] ++ cfg.dtboBuildExtraIncludePaths;
extraPreprocessorFlags = cfg.dtboBuildExtraPreprocessorFlags;
in
if o.dtboFile == null then if o.dtboFile == null then
if o.dtsFile != null then compileDTS o.name o.dtsFile let
else compileDTS o.name (pkgs.writeText "dts" o.dtsText) dtsFile = if o.dtsFile == null then (pkgs.writeText "dts" o.dtsText) else o.dtsFile;
in
pkgs.deviceTree.compileDTS {
name = "${o.name}-dtbo";
inherit includePaths extraPreprocessorFlags dtsFile;
}
else o.dtboFile; } ); else o.dtboFile; } );
in in
@ -121,7 +117,39 @@ in
example = literalExpression "pkgs.linux_latest"; example = literalExpression "pkgs.linux_latest";
type = types.path; type = types.path;
description = lib.mdDoc '' description = lib.mdDoc ''
Kernel package containing the base device-tree (.dtb) to boot. Uses Kernel package where device tree include directory is from. Also used as default source of dtb package to apply overlays to
'';
};
dtboBuildExtraPreprocessorFlags = mkOption {
default = [];
example = literalExpression "[ \"-DMY_DTB_DEFINE\" ]";
type = types.listOf types.str;
description = lib.mdDoc ''
Additional flags to pass to the preprocessor during dtbo compilations
'';
};
dtboBuildExtraIncludePaths = mkOption {
default = [];
example = literalExpression ''
[
./my_custom_include_dir_1
./custom_include_dir_2
]
'';
type = types.listOf types.path;
description = lib.mdDoc ''
Additional include paths that will be passed to the preprocessor when creating the final .dts to compile into .dtbo
'';
};
dtbSource = mkOption {
default = "${cfg.kernelPackage}/dtbs";
defaultText = literalExpression "\${cfg.kernelPackage}/dtbs";
type = types.path;
description = lib.mdDoc ''
Path to dtb directory that overlays and other processing will be applied to. Uses
device trees bundled with the Linux kernel by default. device trees bundled with the Linux kernel by default.
''; '';
}; };

View File

@ -1,6 +1,29 @@
{ lib, stdenvNoCC, dtc }: { lib, stdenv, stdenvNoCC, dtc }:
with lib; { with lib; {
# Compile single Device Tree overlay source
# file (.dts) into its compiled variant (.dtb)
compileDTS = ({
name,
dtsFile,
includePaths ? [],
extraPreprocessorFlags ? []
}: stdenv.mkDerivation {
inherit name;
nativeBuildInputs = [ dtc ];
buildCommand =
let
includeFlagsStr = lib.concatMapStringsSep " " (includePath: "-I${includePath}") includePaths;
extraPreprocessorFlagsStr = lib.concatStringsSep " " extraPreprocessorFlags;
in
''
$CC -E -nostdinc ${includeFlagsStr} -undef -D__DTS__ -x assembler-with-cpp ${extraPreprocessorFlagsStr} ${dtsFile} | \
dtc -I dts -O dtb -@ -o $out
'';
});
applyOverlays = (base: overlays': stdenvNoCC.mkDerivation { applyOverlays = (base: overlays': stdenvNoCC.mkDerivation {
name = "device-tree-overlays"; name = "device-tree-overlays";
nativeBuildInputs = [ dtc ]; nativeBuildInputs = [ dtc ];