Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,7 @@
nxp-imx8mp-evk = import ./nxp/imx8mp-evk;
nxp-imx8mq-evk = import ./nxp/imx8mq-evk;
nxp-imx8qm-mek = import ./nxp/imx8qm-mek;
nxp-imx93-evk = import ./nxp/imx93-evk;
hardkernel-odroid-hc4 = import ./hardkernel/odroid-hc4;
hardkernel-odroid-h3 = import ./hardkernel/odroid-h3;
hardkernel-odroid-h4 = import ./hardkernel/odroid-h4;
Expand Down
7 changes: 4 additions & 3 deletions nxp/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,18 @@ Code snippet example that enables imx8qm configuration:
}
```

### 2.2 For imx8mq-evk/imx8mp-evk
### 2.2 For imx8mq-evk/imx8mp-evk/imx93-evk
This NXP overlay is used for generating sdimage.
Current configuration uses uboot as a bootloader. It provides an options to use optee-os which is currently disabled. It can be enabled using `enable-tee` boolean argument avalable in `imx8m<q/p>-boot.nix`, which is `false` by default.
Current configuration uses uboot as a bootloader. It provides an options to use optee-os which is currently disabled. It can be enabled using `enable-tee` boolean argument avalable in `imx8m<q/p>-boot.nix`, which is `false` by default in imx8m platform.

Code snippet example that enables 'imx8mp-evk/emx8mq-evk' configuration:
Code snippet example that enables 'imx8mp-evk/imx8mq-evk/imx93-evk' configuration:

```
{ nixos-hardware, }: {
system = "aarch64-linux";
modules = [
nixos-hardware.nixosModules.imx8mp-evk #For imx8mp-evk
#nixos-hardware.nixosModules.imx93-evk #For imx93-evk
#nixos-hardware.nixosModules.imx8mq-evk #For imx8mq-evk
];
}
Expand Down
56 changes: 56 additions & 0 deletions nxp/common/bsp/imx-linux-builder.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Parameterized Linux kernel builder for i.MX platforms
# This builder is used across i.MX93, i.MX8MP, i.MX8MQ and similar platforms
{ lib, pkgs, ... }@args:
let
inherit (pkgs) buildLinux;

# Import common kernel configuration
kernelConfig = import ../lib/kernel-config.nix;
in
# Platform-specific parameters
{
pname,
version,
src,
defconfig ? "imx_v8_defconfig",
# Optional parameters
extraConfig ? "",
kernelPatches ? [ ],
autoModules ? false,
ignoreConfigErrors ? true,
extraMeta ? { },
}:
let
# Combine common i.MX kernel config with platform-specific config
finalExtraConfig = kernelConfig.imxCommonKernelConfig + extraConfig;
in
buildLinux (
args
// rec {
inherit
version
defconfig
kernelPatches
autoModules
ignoreConfigErrors
;
name = pname;

# modDirVersion needs to be x.y.z, will automatically add .0 if needed
modDirVersion = version;

extraConfig = finalExtraConfig;

inherit src;

meta =
with lib;
{
homepage = "https://github.com/nxp-imx/linux-imx";
license = [ licenses.gpl2Only ];
platforms = [ "aarch64-linux" ];
}
// extraMeta;
}
// (args.argsOverride or { })
)
89 changes: 89 additions & 0 deletions nxp/common/bsp/imx-optee-builder.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
# Parameterized OP-TEE OS builder for i.MX platforms
# This builder is used across i.MX93, i.MX8MP, i.MX8MQ and similar platforms
{
lib,
pkgs,
# Platform-specific parameters
pname,
version,
platformFlavor,
src,
# Optional parameters
meta ? { },
}:
let
inherit (pkgs.buildPackages) python3;
toolchain = pkgs.gccStdenv.cc;
binutils = pkgs.gccStdenv.cc.bintools.bintools_bin;
cpp = pkgs.gcc;

# Determine PLATFORM and PLATFORM_FLAVOR from platformFlavor
# Format can be either "imx-mx93evk" (full platform string) or "mx8mpevk" (just flavor, platform is "imx")
# Check if it starts with "imx-" to determine if it's a full platform string or just a flavor
hasFullPlatform = lib.hasPrefix "imx-" platformFlavor;
platform = if hasFullPlatform then platformFlavor else "imx";
flavor = if hasFullPlatform then null else platformFlavor;
in
pkgs.stdenv.mkDerivation {
inherit pname version src;

nativeBuildInputs = [
python3
];

enableParallelBuilding = true;

propagatedBuildInputs = with python3.pkgs; [
pycryptodomex
pyelftools
cryptography
];

# Common postPatch for all i.MX platforms
# This is the major source of code duplication - ~60 lines of identical substitutions
postPatch = ''
# Patch all script shebangs automatically
patchShebangs scripts/
patchShebangs ta/

# Patch toolchain paths in mk/gcc.mk
substituteInPlace mk/gcc.mk \
--replace "\$(CROSS_COMPILE_\$(sm))objcopy" ${binutils}/bin/${toolchain.targetPrefix}objcopy
substituteInPlace mk/gcc.mk \
--replace "\$(CROSS_COMPILE_\$(sm))objdump" ${binutils}/bin/${toolchain.targetPrefix}objdump
substituteInPlace mk/gcc.mk \
--replace "\$(CROSS_COMPILE_\$(sm))nm" ${binutils}/bin/${toolchain.targetPrefix}nm
substituteInPlace mk/gcc.mk \
--replace "\$(CROSS_COMPILE_\$(sm))readelf" ${binutils}/bin/${toolchain.targetPrefix}readelf
substituteInPlace mk/gcc.mk \
--replace "\$(CROSS_COMPILE_\$(sm))ar" ${binutils}/bin/${toolchain.targetPrefix}ar
substituteInPlace mk/gcc.mk \
--replace "\$(CROSS_COMPILE_\$(sm))cpp" ${cpp}/bin/cpp
'';

makeFlags =
[
"PLATFORM=${platform}"
]
++ lib.optionals (!hasFullPlatform) [
"PLATFORM_FLAVOR=${flavor}"
]
++ [
"CFG_ARM64_core=y"
"CFG_TEE_TA_LOG_LEVEL=0"
"CFG_TEE_CORE_LOG_LEVEL=0"
"CROSS_COMPILE=${toolchain}/bin/${toolchain.targetPrefix}"
"CROSS_COMPILE64=${toolchain}/bin/${toolchain.targetPrefix}"
];

installPhase = ''
mkdir -p $out
cp ./out/arm-plat-imx/core/tee-raw.bin $out/tee.bin
'';

meta = {
homepage = "https://github.com/nxp-imx/imx-optee-os";
license = [ lib.licenses.bsd2 ];
platforms = [ "aarch64-linux" ];
} // meta;
}
97 changes: 97 additions & 0 deletions nxp/common/bsp/imx-uboot-builder.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
# Parameterized U-Boot builder for i.MX platforms
# This builder is used across i.MX93, i.MX8MP, i.MX8MQ and similar platforms
{
lib,
stdenv,
buildPackages,
# Required dependencies
bison,
dtc,
flex,
gnutls,
libuuid,
ncurses,
openssl,
perl,
efitools,
which,
# Platform-specific parameters
pname,
version,
src,
defconfig,
ramdiskAddr,
fdtAddr,
dtbPath,
# Optional parameters
extraConfig ? "",
extraNativeBuildInputs ? [ ],
}:
let
# Import common U-Boot configuration
ubootConfig = import ../lib/uboot-config.nix;

# Generate the common config with platform-specific memory addresses
commonConfig = ubootConfig.imxCommonUbootConfig {
inherit ramdiskAddr fdtAddr;
};

# Combine common config with any platform-specific extra config
finalExtraConfig = commonConfig + extraConfig;
in
stdenv.mkDerivation {
inherit pname version src;

postPatch = ''
patchShebangs tools
patchShebangs scripts
'';

nativeBuildInputs = [
bison
flex
openssl
which
ncurses
libuuid
gnutls
perl
efitools
] ++ extraNativeBuildInputs;

depsBuildBuild = [ buildPackages.stdenv.cc ];
hardeningDisable = [ "all" ];
enableParallelBuilding = true;

makeFlags = [
"DTC=${lib.getExe buildPackages.dtc}"
"CROSS_COMPILE=${stdenv.cc.targetPrefix}"
];

extraConfig = finalExtraConfig;

passAsFile = [ "extraConfig" ];

configurePhase = ''
runHook preConfigure

make ${defconfig}
cat $extraConfigPath >> .config

runHook postConfigure
'';

installPhase = ''
runHook preInstall

mkdir -p $out
cp ./u-boot-nodtb.bin $out
cp ./spl/u-boot-spl.bin $out
cp ${dtbPath} $out
cp .config $out

runHook postInstall
'';

dontStrip = true;
}
29 changes: 29 additions & 0 deletions nxp/common/lib/kernel-config.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Shared kernel configuration for i.MX platforms
# This configuration is used across i.MX93, i.MX8MP, i.MX8MQ and similar platforms
{
# Common kernel extra configuration for i.MX platforms
# Includes: virtualization support, EFI boot, RAID, USB/IP, framebuffer settings
imxCommonKernelConfig = ''
CRYPTO_TLS m
TLS y
MD_RAID0 m
MD_RAID1 m
MD_RAID10 m
MD_RAID456 m
DM_VERITY m
LOGO y
FRAMEBUFFER_CONSOLE_DEFERRED_TAKEOVER n
FB_EFI n
EFI_STUB y
EFI y
VIRTIO y
VIRTIO_PCI y
VIRTIO_BLK y
DRM_VIRTIO_GPU y
EXT4_FS y
USBIP_CORE m
USBIP_VHCI_HCD m
USBIP_HOST m
USBIP_VUDC m
'';
}
33 changes: 33 additions & 0 deletions nxp/common/lib/uboot-config.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Shared U-Boot configuration for i.MX platforms
# This configuration is used across i.MX93, i.MX8MP, i.MX8MQ and similar platforms
{
# Generate common U-Boot extra configuration for i.MX platforms
# ramdiskAddr and fdtAddr are platform-specific memory addresses
imxCommonUbootConfig =
{ ramdiskAddr, fdtAddr }:
''
CONFIG_USE_BOOTCOMMAND=y
CONFIG_BOOTCOMMAND="setenv ramdisk_addr_r ${ramdiskAddr}; setenv fdt_addr_r ${fdtAddr}; run distro_bootcmd; "
CONFIG_CMD_BOOTEFI_SELFTEST=y
CONFIG_CMD_BOOTEFI=y
CONFIG_EFI_LOADER=y
CONFIG_BLK=y
CONFIG_PARTITIONS=y
CONFIG_DM_DEVICE_REMOVE=n
CONFIG_CMD_CACHE=y
'';

# Common U-Boot native build inputs for i.MX platforms
imxCommonUbootNativeBuildInputs = [
"bison"
"flex"
"openssl"
"which"
"ncurses"
"libuuid"
"gnutls"
"openssl"
"perl"
"efitools"
];
}
Loading