2022-12-31 11:52:38 +01:00
|
|
|
{ config, lib, ... }:
|
2021-05-13 02:51:38 +02:00
|
|
|
|
|
|
|
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 = {
|
|
|
|
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
|
|
|
|
];
|
|
|
|
};
|
|
|
|
}
|