raspberry-pi/4: Add modesetting option

This commit is contained in:
Samuel Dionne-Riel 2021-05-12 20:51:38 -04:00
parent 9e58ee154c
commit 38af9c5048
2 changed files with 111 additions and 0 deletions

View file

@ -1,6 +1,10 @@
{ lib, pkgs, ...}: { lib, pkgs, ...}:
{ {
imports = [
./modesetting.nix
];
boot = { boot = {
kernelPackages = lib.mkDefault pkgs.linuxPackages_rpi4; kernelPackages = lib.mkDefault pkgs.linuxPackages_rpi4;
initrd.availableKernelModules = [ "usbhid" "usb_storage" "vc4" ]; initrd.availableKernelModules = [ "usbhid" "usb_storage" "vc4" ];

View file

@ -0,0 +1,107 @@
{ config, lib, pkgs, ... }:
let
cfg = config.hardware.raspberry-pi."4".fkms-3d;
in
{
options.hardware = {
raspberry-pi."4".fkms-3d = {
enable = lib.mkEnableOption ''
Enable modesetting through fkms-3d
'';
cma = lib.mkOption {
type = lib.types.int;
default = 512;
description = ''
Amount of CMA (contiguous memory allocator) to reserve, in MiB.
The foundation overlay defaults to 256MiB, for backward compatibility.
As the Raspberry Pi 4 family of hardware has ample amount of memory, we
can reserve more without issue.
Additionally, reserving too much is not an issue. The kernel will use
CMA last if the memory is needed.
'';
};
};
};
config = lib.mkIf cfg.enable {
# Configure for modesetting in the device tree
hardware.deviceTree = {
filter = "bcm2711-rpi-*.dtb";
overlays = [
# Equivalent to:
# https://github.com/raspberrypi/linux/blob/rpi-5.10.y/arch/arm/boot/dts/overlays/cma-overlay.dts
{
name = "rpi4-cma-overlay";
dtsText = ''
// SPDX-License-Identifier: GPL-2.0
/dts-v1/;
/plugin/;
/ {
compatible = "brcm,bcm2711";
fragment@0 {
target = <&cma>;
__overlay__ {
size = <(${toString cfg.cma} * 1024 * 1024)>;
};
};
};
'';
}
# Equivalent to:
# https://github.com/raspberrypi/linux/blob/rpi-5.10.y/arch/arm/boot/dts/overlays/vc4-fkms-v3d-overlay.dts
{
name = "rpi4-vc4-fkms-v3d-overlay";
dtsText = ''
// SPDX-License-Identifier: GPL-2.0
/dts-v1/;
/plugin/;
/ {
compatible = "brcm,bcm2711";
fragment@1 {
target = <&fb>;
__overlay__ {
status = "disabled";
};
};
fragment@2 {
target = <&firmwarekms>;
__overlay__ {
status = "okay";
};
};
fragment@3 {
target = <&v3d>;
__overlay__ {
status = "okay";
};
};
fragment@4 {
target = <&vc4>;
__overlay__ {
status = "okay";
};
};
};
'';
}
];
};
# Also configure the system for modesetting.
services.xserver.videoDrivers = lib.mkBefore [
"modesetting" # Prefer the modesetting driver in X11
"fbdev" # Fallback to fbdev
];
};
}