{
  pkgs,
  lib,
  namespace,
  ...
}:
{
  boot = {
    # loader.raspberry-pi = {
    #   bootloader = "kernel";
    #   firmwarePackage = pkgs.raspberrypifw;
    # };
    kernelPackages = pkgs.${namespace}.linuxPackages_rpi5-lts;
    supportedFilesystems = lib.mkForce [ ];
  };

  nixpkgs = {
    overlays = [
      (_self: _super: {
        linuxPackages_pi5-16k = pkgs.linuxPackagesFor (
          pkgs.linux_6_18.override {
            structuredExtraConfig = with lib.kernel; {
              CONFIG_ARM64_4K_PAGES = lib.mkForce no;
              CONFIG_ARM64_64K_PAGES = lib.mkForce no;
              CONFIG_ARM64_16K_PAGES = lib.mkForce yes;
              CONFIG_OF_CONFIGFS = yes;
              CONFIG_CONFIGFS_FS = yes;
              CONFIG_OF_OVERLAY = yes;
            };
            ignoreConfigErrors = true;
          }
        );
      })
    ];
  };

  specialisation = {
    "linux-latest".configuration = {
      boot = {
        kernelPackages = lib.mkOverride 90 pkgs.linuxPackages_pi5-16k;
        loader.systemd-boot.installDeviceTree = true;
      };
    };
  };

  ${namespace}.hardware.raspberry-pi.config = {
    # extra-config = {
    #   armstub = "RPI_EFI.fd";
    # };
    all = {
      #   # [all] conditional filter, https://www.raspberrypi.com/documentation/computers/config_txt.html#conditional-filters

      # options = {
      #     # https://www.raspberrypi.com/documentation/computers/config_txt.html#enable_uart
      #     # in conjunction with `console=serial0,115200` in kernel command line (`cmdline.txt`)
      #     # creates a serial console, accessible using GPIOs 14 and 15 (pins
      #     #  8 and 10 on the 40-pin header)
      #     enable_uart = {
      #       enable = true;
      #       value = true;
      #     };
      #     # https://www.raspberrypi.com/documentation/computers/config_txt.html#uart_2ndstage
      #     # enable debug logging to the UART, also automatically enables
      #     # UART logging in `start.elf`
      #     uart_2ndstage = {
      #       enable = true;
      #       value = true;
      #     };
      #   };

      # Base DTB parameters
      # https://github.com/raspberrypi/linux/blob/a1d3defcca200077e1e382fe049ca613d16efd2b/arch/arm/boot/dts/overlays/README#L132
      base-dt-params = {

        # https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#enable-pcie
        pciex1 = {
          enable = true;
          value = "on";
        };
        # PCIe Gen 3.0
        # https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#pcie-gen-3-0
        pciex1_gen = {
          enable = true;
          value = "3";
        };

      };

      # extra-config = ''
      #   armstub=RPI_EFI.fd
      #   device_tree_address=0x1f0000
      #   device_tree_end=0x210000

      #   # Force 32 bpp framebuffer allocation.
      #   framebuffer_depth=32

      #   # Disable compensation for displays with overscan.
      #   disable_overscan=1

      #   # Force maximum USB power regardless of the power supply.
      #   usb_max_current_enable=1

      #   # Force maximum CPU speed.
      #   force_turbo=1
      # '';

    };
  };
}
