{ 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"); }; }