Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

radxa/rock-4c-plus: init #1329

Merged
merged 3 commits into from
Feb 6, 2025
Merged
Show file tree
Hide file tree
Changes from 2 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 README.md
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,7 @@ See code for all available configurations.
| [Purism Librem 13v3](purism/librem/13v3) | `<nixos-hardware/purism/librem/13v3>` |
| [Purism Librem 15v3](purism/librem/13v3) | `<nixos-hardware/purism/librem/15v3>` |
| [Purism Librem 5r4](purism/librem/5r4) | `<nixos-hardware/purism/librem/5r4>` |
| [Radxa ROCK 4C+](radxa/rock-4c-plus) | `<nixos-hardware/radxa/rock-4c-plus>` |
| [Raspberry Pi 2](raspberry-pi/2) | `<nixos-hardware/raspberry-pi/2>` |
| [Raspberry Pi 3](raspberry-pi/3) | `<nixos-hardware/raspberry-pi/3>` |
| [Raspberry Pi 4](raspberry-pi/4) | `<nixos-hardware/raspberry-pi/4>` |
Expand Down
1 change: 1 addition & 0 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,7 @@
raspberry-pi-3 = import ./raspberry-pi/3;
raspberry-pi-4 = import ./raspberry-pi/4;
raspberry-pi-5 = import ./raspberry-pi/5;
rock-4c-plus = import ./radxa/rock-4c-plus;
kobol-helios4 = import ./kobol/helios4;
samsung-np900x3c = import ./samsung/np900x3c;
slimbook-hero-rpl-rtx = import ./slimbook/hero/rpl-rtx;
Expand Down
94 changes: 94 additions & 0 deletions radxa/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
# NixOS support for Radxa devices

Radxa provides the NixOS implementation in the form of `nixos-hardware` modules
for advanced users.

Our goals are:

* Only use `nixpkgs` provided packages.
* Provide a consistent and simple experience to use our NixOS module.
* Targetted audiences are advanced users who care mostly about CPU compute, storage, and network.
* No support guarantee. We are not here to teach people how to use NixOS.

We explicitly want to avoid packaging the entire vendor SDK bootloader and kernel
in Nix. Those are not going to be accepted in `nixpkgs`, and our targetted audiences
like homelabbers generally ignore the additional hardware features.

This also aligns with [NixOS on ARM](https://wiki.nixos.org/wiki/NixOS_on_ARM)'s
definition of "support":

> Support for those board assumes as much is supported as Mainline Linux supports.

## Characteristic of the default profiles

* Using `linuxPackages_latest`
* `bcachefs` rootfs with zstd compression and password-less encryption enabled
* EFI boot chain provided by `systemd-boot`
* Default serial console enabled with baud rate matches the platform firmware
* No automatic partition expansion, as the module is only focusing on hardware

## Common Nix flake pattern

Below is an annoated flake example to create the initial boot image.

```
{
description = "Example NixOS configurations for Radxa product";
# To build, run `nix build .#nixosConfigurations.radxa.config.system.build.diskoImages`

inputs = {
disko.url = "github:nix-community/disko";
disko.inputs.nixpkgs.follows = "nixpkgs";
nixos-hardware.url = "github:NixOS/nixos-hardware";
nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.11";
nixpkgs-unfree.url = "github:numtide/nixpkgs-unfree/nixos-unstable";
};

outputs = inputs@{
self,
disko,
nixos-hardware,
nixpkgs,
nixpkgs-unfree,
}: {
nixosConfigurations = {
radxa = nixpkgs.lib.nixosSystem {
specialArgs = { inherit inputs; };
system = "aarch64-linux";
modules = [
nixos-hardware.nixosModules.rock-4c-plus # Update the system according to your device.
disko.nixosModules.disko # disko usage is optional in the running system, but we need it to generate the initial boot image.
"${nixos-hardware}/radxa/disko.nix" # Common Radxa Disko profile. it is system-agnostic.
{
disko = {
imageBuilder = {
# Avoid double emulation to significantly speed up image building process.
# Update the system according to your host system.
# See https://github.com/nix-community/disko/issues/856
qemu = nixpkgs.legacyPackages.x86_64-linux.qemu + "/bin/qemu-system-aarch64 -M virt -cpu cortex-a57";
};
# Default image size is 2G for a small basic CLI system.
# devices.disk.main.imageSize = "2G";
};

# Override the default bootloader with a cross built one.
# Use this if you do not have binfmt configured on your system.
# For NixOS, please add `boot.binfmt.emulatedSystems = [ "aarch64-linux" ];` to your system configuration.
# Update the system and the firmware package according to your device.
# hardware.radxa.rock-4c-plus.platformFirmware = nixpkgs-unfree.legacyPackages.x86_64-linux.pkgsCross.aarch64-multiplatform.ubootRock4CPlus;

users.users.radxa = {
isNormalUser = true;
initialPassword = "radxa";
extraGroups = [ "wheel" ];
};
services.openssh.enable = true;
networking.hostName = "radxa";
system.stateVersion = "24.11";
}
];
};
};
};
}
```
22 changes: 22 additions & 0 deletions radxa/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{ lib
, pkgs
, config
, ...
}:
let
cfg = config.hardware.radxa;
in {
options.hardware.radxa = {
enable = lib.mkEnableOption "Radxa system support";
};

config = lib.mkIf cfg.enable {
boot = {
# Currently enable bcachefs automatically set
# kernelPackages = lib.mkDefault pkgs.linuxPackages_latest;
kernelPackages = lib.mkOverride 990 pkgs.linuxPackages_latest;
supportedFilesystems = [ "bcachefs" ];
loader.systemd-boot.enable = lib.mkDefault true;
};
};
}
12 changes: 12 additions & 0 deletions radxa/disko.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{ lib
, pkgs
, config
, ...
}:
let
cfg = config.hardware.radxa;
in {
imports = [
../rockchip/disko.nix
];
}
31 changes: 31 additions & 0 deletions radxa/rock-4c-plus/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{ lib
, pkgs
, config
, ...
}:
let
cfg = config.hardware.radxa.rock-4c-plus;
rkCfg = config.hardware.rockchip;
in {
imports = [
../.
../../rockchip/rk3399
];

options.hardware.radxa.rock-4c-plus = {
platformFirmware = lib.mkPackageOption pkgs "ubootRock4CPlus" { };
};

config = {
hardware = {
radxa.enable = true;
rockchip = {
rk3399.enable = true;
diskoExtraPostVM = ''
dd conv=notrunc,fsync if=${cfg.platformFirmware}/idbloader.img of=$out/${rkCfg.diskoImageName} bs=512 seek=64
dd conv=notrunc,fsync if=${cfg.platformFirmware}/u-boot.itb of=$out/${rkCfg.diskoImageName} bs=512 seek=16384
'';
};
};
};
}
33 changes: 33 additions & 0 deletions rockchip/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{ lib
, pkgs
, config
, ...
}:
let
cfg = config.hardware.rockchip;
in {
options.hardware.rockchip = {
enable = lib.mkEnableOption "Rockchip SoC support";
diskoImageName = lib.mkOption {
type = lib.types.str;
default = "main.raw";
description = ''
The output image name for Disko.
Can be used by diskoExtraPostVM.
'';
};
diskoExtraPostVM = lib.mkOption {
type = lib.types.str;
description = ''
The post VM hook for Disko's Image Builder.
Can be used to install platform firmware like U-Boot.
'';
};
};

config = lib.mkIf cfg.enable {
boot = {
kernelParams = [ "console=ttyS2,1500000n8" ];
};
};
}
62 changes: 62 additions & 0 deletions rockchip/disko.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
{ lib
, pkgs
, config
, ...
}:
let
cfg = config.hardware.rockchip;
in {
imports = [
rk3399/disko.nix
];

config = lib.mkIf cfg.enable {
disko = {
imageBuilder = {
extraRootModules = [ "bcachefs" ];
extraPostVM = cfg.diskoExtraPostVM;
};
memSize = lib.mkDefault 4096; # Default 1024 MB will throw "Cannot allocate memory" error
devices.disk.main = {
type = "disk";
imageSize = lib.mkDefault "2G";
content = {
type = "gpt";
partitions = {
ESP = {
type = "EF00";
# Firmware backoff
start = "16M";
size = "500M";
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
mountOptions = [ "umask=0022" ];
};
};
root = {
size = "100%";
content = {
type = "filesystem";
format = "bcachefs";
mountpoint = "/";
extraArgs = [
"--metadata_checksum=xxhash"
"--data_checksum=xxhash"
"--compression=zstd"
"--background_compression=zstd"
"--str_hash=siphash"
"--wide_macs"
"--encrypted"
"--no_passphrase"
"--discard"
];
};
};
};
};
};
};
};
}
20 changes: 20 additions & 0 deletions rockchip/rk3399/default.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{ lib
, pkgs
, config
, ...
}:
let
cfg = config.hardware.rockchip.rk3399;
in {
imports = [
../.
];

options.hardware.rockchip.rk3399 = {
enable = lib.mkEnableOption "Rockchip RK3399 support";
};

config = lib.mkIf cfg.enable {
hardware.rockchip.enable = true;
};
}
14 changes: 14 additions & 0 deletions rockchip/rk3399/disko.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{ lib
, pkgs
, config
, ...
}:
let
cfg = config.hardware.rockchip.rk3399;
in {
config = lib.mkIf cfg.enable {
nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
"arm-trusted-firmware-rk3399"
];
};
}
Loading