# This module enables all hardware supported by NixOS: i.e., all
# firmware is included, and all devices from which one may boot are
# enabled in the initrd.  Its primary use is in the NixOS installation
# CDs.

{
  config,
  lib,
  pkgs,
  ...
}:
let
  platform = pkgs.stdenv.hostPlatform;
in
{

  options = {
    hardware.enableAllHardware = lib.mkEnableOption "Enable support for most hardware";
  };

  config = lib.mkIf config.hardware.enableAllHardware {

    # The initrd has to contain any module that might be necessary for
    # supporting the most important parts of HW like drives.
    boot.initrd.availableKernelModules =
      [
        # SATA/PATA support.
        "ahci"

        "ata_piix"

        "sata_inic162x"
        "sata_nv"
        "sata_promise"
        "sata_qstor"
        "sata_sil"
        "sata_sil24"
        "sata_sis"
        "sata_svw"
        "sata_sx4"
        "sata_uli"
        "sata_via"
        "sata_vsc"

        "pata_ali"
        "pata_amd"
        "pata_artop"
        "pata_atiixp"
        "pata_efar"
        "pata_hpt366"
        "pata_hpt37x"
        "pata_hpt3x2n"
        "pata_hpt3x3"
        "pata_it8213"
        "pata_it821x"
        "pata_jmicron"
        "pata_marvell"
        "pata_mpiix"
        "pata_netcell"
        "pata_ns87410"
        "pata_oldpiix"
        "pata_pcmcia"
        "pata_pdc2027x"
        "pata_qdi"
        "pata_rz1000"
        "pata_serverworks"
        "pata_sil680"
        "pata_sis"
        "pata_sl82c105"
        "pata_triflex"
        "pata_via"
        "pata_winbond"

        # SCSI support (incomplete).
        "3w-9xxx"
        "3w-xxxx"
        "aic79xx"
        "aic7xxx"
        "arcmsr"
        "hpsa"

        # USB support, especially for booting from USB CD-ROM
        # drives.
        "uas"

        # SD cards.
        "sdhci_pci"

        # NVMe drives
        "nvme"

        # Firewire support.  Not tested.
        "ohci1394"
        "sbp2"

        # Virtio (QEMU, KVM etc.) support.
        "virtio_net"
        "virtio_pci"
        "virtio_mmio"
        "virtio_blk"
        "virtio_scsi"
        "virtio_balloon"
        "virtio_console"

        # VMware support.
        "mptspi"
        "vmxnet3"
        "vsock"
      ]
      ++ lib.optional platform.isx86 "vmw_balloon"
      ++ lib.optionals (pkgs.stdenv.hostPlatform.isi686 || pkgs.stdenv.hostPlatform.isx86_64) [
        "vmw_vmci"
        "vmwgfx"
        "vmw_vsock_vmci_transport"

        # Hyper-V support.
        "hv_storvsc"
      ]
      ++ lib.optionals pkgs.stdenv.hostPlatform.isAarch [
        # Allwinner support
        # Required for early KMS
        "sun4i-drm"
        "sun8i-mixer" # Audio, but required for kms

        # PWM for the backlight
        "pwm-sun4i"

        # Broadcom
        "vc4"
      ]
      ++ lib.optionals pkgs.stdenv.hostPlatform.isAarch64 [
        # Most of the following falls into two categories:
        #  - early KMS / early display
        #  - early storage (e.g. USB) support

        # Broadcom

        "pcie-brcmstb"

        # Rockchip
        "dw-hdmi"
        "dw-mipi-dsi"
        "rockchipdrm"
        "rockchip-rga"
        "phy-rockchip-pcie"
        "pcie-rockchip-host"

        # Misc. uncategorized hardware

        # Used for some platform's integrated displays
        "panel-simple"
        "pwm-bl"

        # Power supply drivers, some platforms need them for USB
        "axp20x-ac-power"
        "axp20x-battery"
        "pinctrl-axp209"
        "mp8859"

        # USB drivers
        "xhci-pci-renesas"

        # Reset controllers
        "reset-raspberrypi" # Triggers USB chip firmware load.

        # Misc "weak" dependencies
        "analogix-dp"
        "analogix-anx6345" # For DP or eDP (e.g. integrated display)
      ];

    # Include lots of firmware.
    hardware.enableRedistributableFirmware = true;
  };
}
