Add support for i.MX93-EVK platform

The i.MX93 EVK provides a platform for comprehensive evaluation
of the i.MX93 application processors. This change adds support
in NixOS hardware to provide a template for customized i.MX93-based
platforms.

Signed-off-by: Govind Singh <govind.singh@tii.ae>
This commit is contained in:
Govind Singh
2025-10-21 09:28:17 +04:00
committed by Jörg Thalheim
parent 46f9982c9b
commit 34b7229b95
11 changed files with 462 additions and 3 deletions

View File

@@ -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
];
}

View File

@@ -0,0 +1,50 @@
{ lib, fetchgit, stdenv, buildPackages, pkgsCross, openssl }:
let
target-board = "imx93";
in stdenv.mkDerivation rec {
pname = "imx93-atf";
version = "2.10.0";
platform = target-board;
enableParallelBuilding = true;
src = fetchgit {
url = "https://github.com/nxp-imx/imx-atf.git";
rev = "28affcae957cb8194917b5246276630f9e6343e1";
sha256 = "sha256-a8F+Lf8pwML+tCwawS0N/mrSXWPmFhlUeOg0MCRK3VE=";
};
# Compiler dependencies
depsBuildBuild = [ buildPackages.stdenv.cc ];
nativeBuildInputs = [ pkgsCross.aarch64-embedded.stdenv.cc ];
buildInputs = [ openssl ];
makeFlags = [
"HOSTCC=$(CC_FOR_BUILD)"
"CROSS_COMPILE=${pkgsCross.aarch64-embedded.stdenv.cc.targetPrefix}"
"PLAT=${platform}"
"SPD=opteed"
"bl31"
"LDFLAGS=-no-warn-rwx-segments"
];
installPhase = ''
runHook preInstall
mkdir -p $out
cp build/${target-board}/release/bl31.bin $out
runHook postInstall
'';
hardeningDisable = [ "all" ];
dontStrip = true;
meta = with lib; {
homepage = "https://github.com/nxp-imx/imx-atf";
description = "Reference implementation of secure world software for ARMv8-A";
license = [ licenses.bsd3 ];
maintainers = with maintainers; [ govindsi ];
platforms = [ "aarch64-linux" ];
};
}

View File

@@ -0,0 +1,85 @@
{
pkgs,
}:
with pkgs;
let
fw-ver = "202406";
imx93-atf = pkgs.callPackage ./imx93-atf.nix { };
imx93-firmware = pkgs.callPackage ./imx93-firmware.nix { };
imx93-uboot = pkgs.callPackage ./imx93-uboot.nix { };
imx93-optee-os = pkgs.callPackage ./imx93-optee-os.nix { };
src = pkgs.fetchgit {
url = "https://github.com/nxp-imx/imx-mkimage.git";
#tag: lf-6.12.3
rev = "4622115cbc037f79039c4522faeced4aabea986b";
sha256 = "sha256-2gz0GxlB3jwy8PC6+cP3+MpyUzqE1vDTw8nuxK6vo3g=";
};
shortRev = builtins.substring 0 8 src.rev;
in
{
imx93-boot = pkgs.stdenv.mkDerivation rec {
inherit src;
name = "imx93-mkimage";
version = "lf-6.12.3";
postPatch = ''
substituteInPlace Makefile \
--replace 'git rev-parse --short=8 HEAD' 'echo ${shortRev}'
substituteInPlace Makefile \
--replace 'CC = gcc' 'CC = clang'
substituteInPlace iMX93/soc.mak \
--replace 'xxd' "${pkgs.vim.xxd}/bin/xxd"
substituteInPlace scripts/fspi_fcb_gen.sh \
--replace 'xxd' "${pkgs.vim.xxd}/bin/xxd"
substituteInPlace scripts/fspi_packer.sh \
--replace 'xxd' "${pkgs.vim.xxd}/bin/xxd"
patchShebangs scripts
'';
nativeBuildInputs = [
clang
git
dtc
];
buildInputs = [
git
glibc.static
zlib
zlib.static
];
buildPhase = ''
runHook preBuild
make bin
# mkimage is common across imx8 and imx9
make SOC=iMX8M mkimage_imx8
if [ -f ${imx93-uboot}/u-boot.bin ]; then
install -m 0644 ${imx93-uboot}/u-boot.bin ./iMX93/u-boot.bin
else
cat ${imx93-uboot}/u-boot-nodtb.bin ${imx93-uboot}/imx93-11x11-evk.dtb > ./iMX93/u-boot.bin
fi
install -m 0644 ${imx93-uboot}/u-boot-spl.bin ./iMX93/u-boot-spl.bin
install -m 0644 ${imx93-uboot}/u-boot-nodtb.bin ./iMX93/u-boot-nodtb.bin
install -m 0644 ${imx93-uboot}/imx93-11x11-evk.dtb ./iMX93/imx93-11x11-evk.dtb
install -m 0644 ${imx93-optee-os}/tee.bin ./iMX93/tee.bin
install -m 0644 ${imx93-atf}/bl31.bin ./iMX93/bl31.bin
install -m 0644 ${imx93-firmware}/ddr/lpddr4* ./iMX93/
install -m 0644 ${imx93-firmware}/ahab/mx93a1-ahab-container.img ./iMX93/
make SOC=iMX9 flash_singleboot
runHook postBuild
'';
installPhase = ''
runHook preInstall
mkdir -p $out/image
install -m 0644 ./iMX93/flash.bin $out/image
runHook postInstall
'';
};
}

View File

@@ -0,0 +1,47 @@
{ pkgs, ... }:
with pkgs;
stdenv.mkDerivation rec {
pname = "nxp-firmware";
version = "nxp-firmware-8.21-0.11";
# Fetch the two firmware installers from NXP
ddrFirmware = fetchurl {
url = "https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-imx-8.21.bin";
sha256 = "sha256-w0R/D4E0FczqncLvEggMs6yLvAxnOSp0/H1ZIF61pnI=";
};
ahabFirmware = fetchurl {
url = "https://www.nxp.com/lgfiles/NMG/MAD/YOCTO/firmware-sentinel-0.11.bin";
sha256 = "sha256-JpSAQXqK6apMxBAauUcof8M0VakxAh29xNm621ISvOs=";
};
nativeBuildInputs = [ coreutils bash ];
dontUnpack = true;
dontStrip = true;
installPhase = ''
mkdir -p $out
echo "Extracting DDR firmware..."
cp ${ddrFirmware} ./firmware-imx-8.21.bin
chmod +x firmware-imx-8.21.bin
./firmware-imx-8.21.bin --auto-accept
echo "Extracting AHAB firmware..."
cp ${ahabFirmware} ./firmware-sentinel-0.11.bin
chmod +x firmware-sentinel-0.11.bin
./firmware-sentinel-0.11.bin --auto-accept
echo "Copying DDR .bin files..."
mkdir -p $out/ddr
cp firmware-imx-8.21/firmware/ddr/synopsys/lpddr4*.bin $out/ddr/
echo "Copying AHAB container image..."
mkdir -p $out/ahab
cp firmware-sentinel-0.11/mx93a1-ahab-container.img $out/ahab/
'';
}

View File

@@ -0,0 +1,62 @@
{ lib, pkgs, ... }@args:
with pkgs;
buildLinux (
args
// rec {
version = "6.12.3";
name = "imx93-linux";
# modDirVersion needs to be x.y.z, will automatically add .0 if needed
modDirVersion = version;
defconfig = "imx_v8_defconfig";
# https://github.com/NixOS/nixpkgs/pull/366004
# introduced a breaking change that if a module is declared but it is not being used it will faill.
ignoreConfigErrors = true;
kernelPatches = [
];
autoModules = false;
extraConfig = ''
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
'';
src = fetchFromGitHub {
owner = "nxp-imx";
repo = "linux-imx";
# tag: lf-6.12.3
rev = "37d02f4dcbbe6677dc9f5fc17f386c05d6a7bd7a";
sha256 = "sha256-1oJMbHR8Ho0zNritEJ+TMOAyYHCW0vwhPkDfLctrZa8=";
};
meta = with lib; {
homepage = "https://github.com/nxp-imx/linux-imx";
license = [ licenses.gpl2Only ];
maintainers = with maintainers; [ govindsi ];
platforms = [ "aarch64-linux" ];
};
}
// (args.argsOverride or { })
)

View File

@@ -0,0 +1,75 @@
{
lib,
pkgs
}:
let
inherit (pkgs.buildPackages) python3;
toolchain = pkgs.gccStdenv.cc;
binutils = pkgs.gccStdenv.cc.bintools.bintools_bin;
cpp = pkgs.gcc;
in
pkgs.stdenv.mkDerivation rec {
pname = "imx93-optee-os";
version = "lf-6.12.3_1.0.0";
nativeBuildInputs = [
python3
];
enableParallelBuilding = true;
propagatedBuildInputs = with python3.pkgs; [
pycryptodomex
pyelftools
cryptography
];
src = pkgs.fetchgit {
url = "https://github.com/nxp-imx/imx-optee-os.git";
rev = "8dd180b6d149c1e1314b5869697179f665bd9ca3";
sha256 = "sha256-PoolRscdyeGevrOa5YymPTQ36edVvReMM5WshRTz+uk=";
};
meta = with lib; {
homepage = "https://github.com/nxp-imx/imx-optee-os";
license = [ licenses.bsd2 ];
maintainers = with maintainers; [ govindsi ];
platforms = [ "aarch64-linux" ];
};
postPatch = ''
substituteInPlace scripts/arm32_sysreg.py \
--replace '/usr/bin/env python3' '${python3}/bin/python'
substituteInPlace scripts/gen_tee_bin.py \
--replace '/usr/bin/env python3' '${python3}/bin/python'
substituteInPlace scripts/pem_to_pub_c.py \
--replace '/usr/bin/env python3' '${python3}/bin/python'
substituteInPlace ta/pkcs11/scripts/verify-helpers.sh \
--replace '/bin/bash' '${pkgs.bash}/bin/bash'
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=imx-mx93evk"
"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
'';
}

View File

@@ -0,0 +1,99 @@
{
stdenv,
lib,
bison,
dtc,
fetchgit,
flex,
gnutls,
libuuid,
ncurses,
openssl,
which,
perl,
buildPackages,
efitools,
}:
let
ubsrc = fetchgit {
url = "https://github.com/nxp-imx/uboot-imx.git";
#lf_v2024.04
rev = "e3219a5a73445219df605d1492687918d488055c";
sha256 = "sha256-6pXwgNzq4/XUUEmJ6sGC5pII4J5uMvlDPE9QJxjJJbQ=";
};
meta = with lib; {
homepage = "https://github.com/nxp-imx/uboot-imx";
license = [ licenses.gpl2Only ];
maintainers = with maintainers; [ govindsi ];
platforms = [ "aarch64-linux" ];
};
in
stdenv.mkDerivation {
pname = "imx93-uboot";
version = "2024.04";
src = ubsrc;
postPatch = ''
patchShebangs tools
patchShebangs scripts
'';
nativeBuildInputs = [
bison
flex
openssl
which
ncurses
libuuid
gnutls
openssl
perl
efitools
];
depsBuildBuild = [ buildPackages.stdenv.cc ];
hardeningDisable = [ "all" ];
enableParallelBuilding = true;
makeFlags = [
"DTC=${lib.getExe buildPackages.dtc}"
"CROSS_COMPILE=${stdenv.cc.targetPrefix}"
];
extraConfig = ''
CONFIG_USE_BOOTCOMMAND=y
CONFIG_BOOTCOMMAND="setenv ramdisk_addr_r 0x85000000; setenv fdt_addr_r 0x84000000; 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
'';
passAsFile = [ "extraConfig" ];
configurePhase = ''
runHook preConfigure
make imx93_11x11_evk_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 ./arch/arm/dts/imx93-11x11-evk.dtb $out
cp .config $out
runHook postInstall
'';
dontStrip = true;
}

19
nxp/imx93-evk/default.nix Normal file
View File

@@ -0,0 +1,19 @@
{ pkgs, ... }:
{
nixpkgs.overlays = [
(import ./overlay.nix)
];
imports = [
./modules.nix
];
boot.loader.grub.extraFiles = {
"imx93-11x11-evk.dtb" = "${pkgs.callPackage ./bsp/imx93-linux.nix { }}/dtbs/freescale/imx93-11x11-evk.dtb";
};
hardware.deviceTree = {
filter = "imx93-*.dtb";
name = "imx93-11x11-evk.dtb";
};
}

17
nxp/imx93-evk/modules.nix Normal file
View File

@@ -0,0 +1,17 @@
{
pkgs,
lib,
...
}:
{
nixpkgs.hostPlatform = "aarch64-linux";
boot = {
kernelPackages = pkgs.linuxPackagesFor (pkgs.callPackage ./bsp/imx93-linux.nix { });
initrd.includeDefaultModules = lib.mkForce false;
};
disabledModules = [ "profiles/all-hardware.nix" ];
hardware.deviceTree.enable = true;
}

View File

@@ -0,0 +1,3 @@
final: _prev: {
inherit (final.callPackage ./bsp/imx93-boot.nix { pkgs = final; }) imx93-boot;
}