{ lib, config, pkgs, ... }: let rpmsgexport = pkgs.stdenv.mkDerivation { name = "rpmsgexport"; src = pkgs.fetchFromGitHub { repo = "rpmsgexport"; owner = "andersson"; rev = "324d88d668f36c6a5e6a9c2003a050b8a5a3cd60"; hash = "sha256-k38gj+vtEE6/s+vALzW1jiuE3HdQqaGiICdAWndu6aU="; }; makeFlags = ["prefix=${placeholder "out"}"]; }; modemmanager_ = pkgs.callPackage ./modem-manager.nix {}; drm-framebuffer = pkgs.stdenv.mkDerivation { name = "drm-framebuffer"; src = pkgs.fetchFromGitHub { owner = "embear-engineering"; repo = "drm-framebuffer"; rev = "80e862bd13bc0f96848af1c1b24b4b0e1fe5b23c"; hash = "sha256-YBRG8FUbhwAgquzehvo5Mu+xODcWOOG1HTMtUhNq6xo="; }; nativeBuildInputs = [ pkgs.pkg-config ]; buildInputs = with pkgs; [ libdrm ]; preBuild = '' makeFlagsArray+=("CFLAGS=$($PKG_CONFIG --libs --cflags libdrm)") ''; makeFlags = [ "DESTDIR=${placeholder "out"}" "bindir=/bin" ]; }; modemFirmware = config.mobile.device.firmware.override { modem = ./local/harpia-modem; }; secrets = import ./local/secrets.nix; in { imports = [ (import ../mobile-nixos/lib/configuration.nix { device = "motorola-harpia"; }) ]; config = { mobile = { adbd.enable = true; boot.stage-1.firmware = [ modemFirmware pkgs.wireless-regdb ]; }; hardware.firmware = [ modemFirmware pkgs.wireless-regdb ]; system.stateVersion = "23.11"; boot.kernelParams = [ "dyndbg=\"file drivers/base/firmware_loader/main.c +fmp\"" # "dyndbg=\"file drivers/gpu/drm/panel/msm8953-generated/panel-boe-bs052fhm-a00-6c01.c +fmp\"" # "dyndbg=\"file drivers/video/backlight/qcom-wled.c +fmp\"" ]; # according to fdisk, /dev/mmcblk0p41 is 30469887-7471104=22998783 # blocks, and if we let it get resized by whatever magic this is # (I'm assuming systemd-growfs), on the subsequent boot we'll get # an error # EXT4-fs (mmcblk0p41): bad geometry: block count 2883067 exceeds size of device (2874848 blocks) # in which neither number matches the reported size (they're both # about 10% of it). cool. boot.growPartition = lib.mkForce false; fileSystems."/" = lib.mkDefault { autoResize = lib.mkForce false; }; services.udev.extraRules = '' ACTION!="add|change|move|bind", GOTO="mm_qcom_soc_end" # Process only known wwan, net and rpmsg ports SUBSYSTEM=="net", DRIVERS=="bam-dmux", GOTO="mm_qcom_soc_process" # SUBSYSTEM=="platform", DRIVERS=="bam-dmux", GOTO="mm_qcom_soc_process" SUBSYSTEM=="net", DRIVERS=="ipa", GOTO="mm_qcom_soc_process" SUBSYSTEM=="wwan", DRIVERS=="qcom-q6v5-mss", GOTO="mm_qcom_soc_process" SUBSYSTEM=="rpmsg", DRIVERS=="qcom-q6v5-mss", GOTO="mm_qcom_soc_process" GOTO="mm_qcom_soc_end" LABEL="mm_qcom_soc_process" # Flag the port as being part of the SoC ENV{ID_MM_QCOM_SOC}="1" # # # # Add a common physdev UID to all ports in the Qualcomm SoC, so that they # # are all bound together to the same modem object. # # # # The MSM8916, MSM8974, .... Qualcomm SoCs use the combination of RPMSG/WWAN # # based control ports plus BAM-DMUX based network ports. # # ENV{ID_MM_PHYSDEV_UID}="qcom-soc" # port type hints for the rpmsgexport-ed ports SUBSYSTEM=="rpmsg", ATTR{name}=="DATA*", ATTR{name}=="*_CNTL", ENV{ID_MM_PORT_TYPE_QMI}="1" SUBSYSTEM=="rpmsg", ATTR{name}=="DATA*", ATTR{name}!="*_CNTL", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}="1" # ignore every other port without explicit hints SUBSYSTEM=="rpmsg", ENV{ID_MM_PORT_TYPE_QMI}!="1", ENV{ID_MM_PORT_TYPE_AT_SECONDARY}!="1", ENV{ID_MM_PORT_IGNORE}="1" # explicitly ignore ports intended for USB tethering (DATA40, DATA40_CNTL) SUBSYSTEM=="rpmsg", ATTR{name}=="DATA40*", ENV{ID_MM_PORT_IGNORE}="1" KERNEL=="rmnet_usb*", ENV{ID_MM_PORT_IGNORE}="1" # flag all rpmsg ports under this plugin as candidate # KERNEL=="rpmsg*", SUBSYSTEM=="rpmsg", ENV{ID_MM_CANDIDATE}="1" KERNEL=="rpmsg*", SUBSYSTEM=="rpmsg", ENV{ID_MM_CANDIDATE}="1" LABEL="mm_qcom_soc_end" ACTION!="add|change|move|bind", GOTO="mm_candidate_end" # # Opening bound but disconnected Bluetooth RFCOMM ttys would initiate the # # connection. Don't do that. KERNEL=="rfcomm*", DEVPATH=="*/virtual/*", GOTO="mm_candidate_end" # */ SUBSYSTEM=="net", ENV{ID_MM_CANDIDATE}="1" # WWAN subsystem port handling # - All USB devices ignored for now, only PCI devices expected # - Only "wwan_port" device types processed (single ports); we fully ignore # the "wwan_dev" device type (full device, not just one port) SUBSYSTEMS=="usb", GOTO="mm_candidate_end" SUBSYSTEM=="wwan", ENV{DEVTYPE}=="wwan_dev", GOTO="mm_candidate_end" SUBSYSTEM=="wwan", ENV{ID_MM_CANDIDATE}="1" LABEL="mm_candidate_end" # unlock the gps engine SUBSYSTEM=="wwan", ENV{DEVNAME}=="/dev/wwan0qmi0", ENV{DEVTYPE}=="wwan_port", \ RUN+="${pkgs.libqmi}/bin/qmicli -pd $env{DEVNAME} --loc-set-engine-lock=none" ''; systemd.services.ModemManager = { wantedBy = [ "multi-user.target" ]; serviceConfig = let script = pkgs.writeScript "start-modem-manager" '' #!${pkgs.bash}/bin/bash source ${config.system.build.setEnvironment} ${modemmanager_}/bin/ModemManager ''; in { StandardInput = "journal"; StandardError = "journal"; StandardOutput = "journal"; SyslogIdentifier = "ModemManager"; ExecStart = script; Restart = "always"; }; }; networking = { useDHCP = true; hostName = "biscuit"; networkmanager = { enable = false; }; useNetworkd = true; inherit (secrets) wireless; }; services.openssh.enable = true; environment.systemPackages = with pkgs; [ drm-framebuffer]; users.users.dan = { isNormalUser = true; uid = 1000; extraGroups = [ "wheel" "libvirtd" "docker" "dialout" ]; openssh.authorizedKeys.keys = import ../telent-nixos-config/users/dan/authorized-keys.nix; }; users.users.root.openssh.authorizedKeys.keys = import ../telent-nixos-config/users/dan/authorized-keys.nix; fileSystems."/boot" = { device = "/dev/disk/by-partlabel/system"; fsType = "ext4"; }; hardware.opengl = { enable = true; driSupport = true; }; systemd.services = { rmtfs = # the four files in here are partition images: # partlabel => filename # modemst1 => modem_fs1 # modemst2 => modem_fs2 # fsc => modem_fsc # fsg => modem_fsg let files = pkgs.runCommand "rmtfs" {} '' mkdir -p $out/lib/firmware cp ${./local/uncompressed-firmware/rmtfs}/* $out/lib/firmware ''; in { wantedBy = [ "multi-user.target" ]; serviceConfig = { # https://github.com/andersson/rmtfs/blob/7a5ae7e0a57be3e09e0256b51b9075ee6b860322/rmtfs.c#L507-L541 ExecStart = "${pkgs.rmtfs}/bin/rmtfs -s -r -o ${files}/lib/firmware"; Restart = "always"; RestartSec = "10"; }; }; }; }; }