sigil/nixos-modules/hardware/usb.nix

75 lines
2.2 KiB
Nix

{ config, pkgs, lib, ... }:
with lib;
{
options.hardware.genode.usb = let
mkEnableOption' = text: default:
lib.mkEnableOption text // {
inherit default;
};
in {
enable = lib.mkEnableOption "USB driver";
storage.enable = lib.mkEnableOption "USB mass storage driver";
biosHandoff = mkEnableOption' "perform the BIOS handoff procedure" true;
ehciSupport = mkEnableOption' "EHCI support" true;
ohciSupport = mkEnableOption' "OHCI support" true;
uhciSupport = mkEnableOption' "UHCI support" false;
xhciSupport = mkEnableOption' "XHCI support" true;
};
config = let
cfg = config.hardware.genode.usb;
usbEris = lib.attrsets.mapAttrs (_: lib.getEris "bin") {
inherit (pkgs.genodePackages) part_block usb_block_drv usb_drv;
};
managerConfig = pkgs.writeText "usb_device_manager.dhall" ''
let Manager = ${pkgs.genodePackages.usb_device_manager.dhall}/package.dhall
in Manager.toChildAttributes
Manager::{
, part_block.binary = "${usbEris.part_block.cap}"
, usb_block.binary = "${usbEris.usb_block_drv.cap}"
, usb_driver =
{ binary = "${usbEris.usb_drv.cap}"
, bios_handoff = True
, ehci = True
, ohci = False
, uhci = False
, xhci = False
}
}
'';
in {
hardware.genode.usb.enable = lib.mkDefault cfg.storage.enable;
hardware.genode.platform.policies = lib.optional cfg.enable
(builtins.toFile ("usb.platform-policy.dhall") ''
let Genode = env:DHALL_GENODE
in Genode.Init.Config.Policy::{
, service = "Platform"
, label = Genode.Init.LabelSelector.prefix "drivers -> usb"
, content =
[ Genode.Prelude.XML.leaf
{ name = "pci", attributes = toMap { class = "USB" } }
]
}
'');
virtualisation.qemu.options = lib.optional cfg.enable
(lib.optional (pkgs.stdenv.isi686 || pkgs.stdenv.isx86_64) "-usb"
++ lib.optional (pkgs.stdenv.isAarch32 || pkgs.stdenv.isAarch64)
"-device usb-ehci,id=usb0");
};
}