From e1b2cf65a7dcf07980a0e238e9af255d5fea3672 Mon Sep 17 00:00:00 2001 From: Andrea Ciceri Date: Mon, 28 Mar 2022 12:11:57 +0200 Subject: [PATCH 1/6] add: pinebook-pro --- README.md | 6 +- flake.nix | 1 + pine64/pinebook-pro/README.md | 97 ++++++++ pine64/pinebook-pro/default.nix | 90 +++++++ .../firmware/ap6256-firmware/default.nix | 41 ++++ pine64/pinebook-pro/kernel/default.nix | 90 +++++++ .../pinebook-pro/keyboard-updater/default.nix | 26 ++ pine64/pinebook-pro/overlay.nix | 11 + pine64/pinebook-pro/sound/reset-sound.rb | 227 ++++++++++++++++++ 9 files changed, 586 insertions(+), 3 deletions(-) create mode 100644 pine64/pinebook-pro/README.md create mode 100644 pine64/pinebook-pro/default.nix create mode 100644 pine64/pinebook-pro/firmware/ap6256-firmware/default.nix create mode 100644 pine64/pinebook-pro/kernel/default.nix create mode 100644 pine64/pinebook-pro/keyboard-updater/default.nix create mode 100644 pine64/pinebook-pro/overlay.nix create mode 100644 pine64/pinebook-pro/sound/reset-sound.rb diff --git a/README.md b/README.md index 0d782a8..3978d37 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,6 @@ There is also experimental flake support. In your `/etc/nixos/flake.nix` add the } ``` - ### Using fetchGit You can fetch the git repository directly: @@ -66,7 +65,7 @@ you can easily pin to a particular revision if you desire more stability. See code for all available configurations. | Model | Path | -|---------------------------------------------------------------------|----------------------------------------------------| +| ------------------------------------------------------------------- | -------------------------------------------------- | | [Acer Aspire 4810T](acer/aspire/4810t) | `` | | [Airis N990](airis/n990) | `` | | [Apple MacBook Air 3,X](apple/macbook-air/3) | `` | @@ -110,7 +109,7 @@ See code for all available configurations. | [Intel NUC 8i7BEH](intel/nuc/8i7beh/) | `` | | [Lenovo IdeaPad Z510](lenovo/ideapad/z510) | `` | | [Lenovo Legion 5 15arh05h](lenovo/legion/15arh05h) | `` | -| [Lenovo Legion 7 Slim 15ach6](lenovo/legion/15ach6) | `` | +| [Lenovo Legion 7 Slim 15ach6](lenovo/legion/15ach6) | `` | | [Lenovo ThinkPad E14 (AMD)](lenovo/thinkpad/e14/amd) | `` | | [Lenovo ThinkPad E14 (Intel)](lenovo/thinkpad/e14/intel) | `` | | [Lenovo ThinkPad E470](lenovo/thinkpad/e470) | `` | @@ -162,6 +161,7 @@ See code for all available configurations. | [Microsoft Surface Range](microsoft/surface) | `` | | [One-Netbook OneNetbook 4](onenetbook/4) | `` | | [PC Engines APU](pcengines/apu) | `` | +| [PINE64 Pinebook Pro](pine64/pinebook-pro/) | `` | | [Purism Librem 13v3](purism/librem/13v3) | `` | | [Purism Librem 15v3](purism/librem/13v3) | `` | | [Raspberry Pi 2](raspberry-pi/2) | `` | diff --git a/flake.nix b/flake.nix index cf698b5..990f44f 100644 --- a/flake.nix +++ b/flake.nix @@ -103,6 +103,7 @@ msi-gs60 = import ./msi/gs60; onenetbook-4 = import ./onenetbook/4; pcengines-apu = import ./pcengines/apu; + pine64-pinebook-pro = import ./pine64/pinebook-pro; purism-librem-13v3 = import ./purism/librem/13v3; purism-librem-15v3 = import ./purism/librem/15v3; raspberry-pi-2 = import ./raspberry-pi/2; diff --git a/pine64/pinebook-pro/README.md b/pine64/pinebook-pro/README.md new file mode 100644 index 0000000..bde456e --- /dev/null +++ b/pine64/pinebook-pro/README.md @@ -0,0 +1,97 @@ +> **NOTE**: This is an attempt to port [samueldr](https://github.com/samueldr/)'s [wip-pinebookpro](https://github.com/samueldr/wip-pinebook-pro) to [nixos-hardware](https://github.com/NixOS/nixos-hardware). Credit for the work done goes to the original authors. + +## Using in your configuration + +To use this configuration simply add this module to your configuration. + +```nix +{ + imports = [ + ${nixos-hardware}/pine64/pinebook-pro + ]; +} +``` + +That entry point will try to maximize the hardware compatibility. + +## Current state + +Currently everything seems to work but this is not guaranteed it will be forever. + +### Kernel + +This uses a pinned kernel that imitates a manually tested version of [Manjaro ARM kernel](https://gitlab.manjaro.org/manjaro-arm/packages/core/linux/-/blob/master/PKGBUILD), this way one can update `nixpkgs` without worrying too much. +This is default kernel but the current mainline kernel `linuxPackages_latest` seems to work too. + +### Known issues + +#### HDMI over Type-C + +HDMI over Type-C works only for the custom kernel and the audio dosen't work (it's an upstream problem). + +#### `rockchipdrm` and `efifb` + +This can be worked around by booting with the `efifb=off` kernel command-line. + +This is already handled for you by this configuration. If using the generic +UEFI AArch64 iso, you will need to add the option yourself to the command-line +using GRUB. + +#### _EFI_ and poweroff + +When booted using EFI, the system will not power off. It will stay seemingly +stuck with the LED and display turned off. + +A [workaround exists](https://github.com/Tow-Boot/Tow-Boot/commit/818cae1b84a7702f2a509927f2819900c2881979#diff-20f50d9d8d5d6c059b87ad66fbc5df26d9fc46251763547ca9bdcc75564a4368), +and is built in recent Tow-Boot (make sure your release is 2021.10-004 or more recent). + +### _Tow-Boot_ + +We highly suggest installing _Tow-Boot_ to the SPI Flash. + +- https://github.com/Tow-Boot/Tow-Boot + +Having the firmware installed to SPI makes the device act basically like a +normal computer. No need for weird incantations to setup the platform boot +firmware. + +Alternatively, starting from the _Tow-Boot_ disk image on eMMC is easier to +deal with and understand than having to deal with _U-Boot_ manually. + +### Mainline _U-Boot_ + +Mainline U-Boot has full support for graphics since 2021.04. The current +unstable relases of Nixpkgs are at 2021.04 at least. + +``` + $ nix-build -A pkgs.ubootPinebookPro +``` + +Note that the default U-Boot build does not do anything with LED on startup. + +## Keyboard firmware + +> **WARNING**: Some hardware batches for the Pinebook Pro ship with the +> wrong chip for the keyboard controller. While it will work with the +> firmware it ships with, it _may brick_ while flashing the updated +> firmware. [See this comment on the firmware repository](https://github.com/jackhumbert/pinebook-pro-keyboard-updater/issues/33#issuecomment-850889285). +> +> It is unclear how to identify said hardware from a running system. + +To determine which keyboard controller you have, you will need to disassemble +the Pinebook Pro as per [the Pine64 +wiki](https://wiki.pine64.org/wiki/Pinebook_Pro#Keyboard), and make sure that +the IC next to the U23 marking on the main board is an **SH68F83**. + +```sh + $ nix-build -A pkgs.pinebookpro-keyboard-updater + $ sudo ./result/bin/updater step-1 + $ sudo poweroff + # ... + $ sudo ./result/bin/updater step-2 + $ sudo poweroff + # ... + $ sudo ./result/bin/updater flash-kb-revised +``` + +Note: poweroff must be used, reboot does not turn the hardware "off" enough. diff --git a/pine64/pinebook-pro/default.nix b/pine64/pinebook-pro/default.nix new file mode 100644 index 0000000..692c56d --- /dev/null +++ b/pine64/pinebook-pro/default.nix @@ -0,0 +1,90 @@ +# This configuration file can be safely imported in your system configuration. +{ config, pkgs, lib, ... }: + +{ + nixpkgs.overlays = [ + (import ./overlay.nix) + ]; + + boot.kernelPackages = lib.mkDefault pkgs.pinebookpro-manjaro-kernel; + + # This list of modules is not entirely minified, but represents + # a set of modules that is required for the display to work in stage-1. + # Further minification can be done, but requires trial-and-error mainly. + boot.initrd.kernelModules = [ + # Rockchip modules + "rockchip_rga" + "rockchip_saradc" + "rockchip_thermal" + "rockchipdrm" + + # GPU/Display modules + "analogix_dp" + "cec" + "drm" + "drm_kms_helper" + "dw_hdmi" + "dw_mipi_dsi" + "gpu_sched" + "panel_edp" + "panel_simple" + "panfrost" + "pwm_bl" + + # USB / Type-C related modules + "fusb302" + "tcpm" + "typec" + + # Misc. modules + "cw2015_battery" + "gpio_charger" + "rtc_rk808" + ]; + + services.udev.extraHwdb = lib.mkMerge [ + # https://gitlab.manjaro.org/manjaro-arm/packages/community/pinebookpro-post-install/blob/master/10-usb-kbd.hwdb + '' + evdev:input:b0003v258Ap001E* + KEYBOARD_KEY_700a5=brightnessdown + KEYBOARD_KEY_700a6=brightnessup + KEYBOARD_KEY_70066=sleep + '' + + # https://github.com/elementary/os/blob/05a5a931806d4ed8bc90396e9e91b5ac6155d4d4/build-pinebookpro.sh#L253-L257 + # Disable the "keyboard mouse" in libinput. This is reported by the keyboard firmware + # and is probably a placeholder for a TrackPoint style mouse that doesn't exist + '' + evdev:input:b0003v258Ap001Ee0110-e0,1,2,4,k110,111,112,r0,1,am4,lsfw + ID_INPUT=0 + ID_INPUT_MOUSE=0 + '' + ]; + + # https://github.com/elementary/os/blob/05a5a931806d4ed8bc90396e9e91b5ac6155d4d4/build-pinebookpro.sh#L253-L257 + # Mark the keyboard as internal, so that "disable when typing" works for the touchpad + environment.etc."libinput/local-overrides.quirks".text = '' + [Pinebook Pro Keyboard] + MatchUdevType=keyboard + MatchBus=usb + MatchVendor=0x258A + MatchProduct=0x001E + AttrKeyboardIntegration=internal + ''; + + hardware.enableRedistributableFirmware = true; + hardware.firmware = [ + pkgs.pinebookpro-ap6256-firmware + ]; + + systemd.tmpfiles.rules = [ + # Tweak the minimum frequencies of the GPU and CPU governors to get a bit more performance + # https://github.com/elementary/os/blob/05a5a931806d4ed8bc90396e9e91b5ac6155d4d4/build-pinebookpro.sh#L288-L294 + "w- /sys/devices/system/cpu/cpufreq/policy0/scaling_min_freq - - - - 1200000" + "w- /sys/devices/system/cpu/cpufreq/policy4/scaling_min_freq - - - - 1008000" + "w- /sys/class/devfreq/ff9a0000.gpu/min_freq - - - - 600000000" + ]; + + # The default powersave makes the wireless connection unusable. + networking.networkmanager.wifi.powersave = lib.mkDefault false; +} diff --git a/pine64/pinebook-pro/firmware/ap6256-firmware/default.nix b/pine64/pinebook-pro/firmware/ap6256-firmware/default.nix new file mode 100644 index 0000000..3d10f04 --- /dev/null +++ b/pine64/pinebook-pro/firmware/ap6256-firmware/default.nix @@ -0,0 +1,41 @@ +{ lib +, fetchFromGitLab +, fetchurl +, runCommandNoCC +}: + +let + src = fetchFromGitLab { + domain = "gitlab.manjaro.org"; + owner = "manjaro-arm"; + repo = "packages/community/ap6256-firmware"; + rev = "007c6dd132263624db9ea6ce8dde4fc2108f21b7"; + sha256 = "sha256-Agqz05W7Rhl0NNQwpW4aQqs9YZmYyci9OXKzEKA30uk="; + }; +in +runCommandNoCC "pinebookpro-ap6256-firmware" +{ + meta = with lib; { + license = licenses.unfreeRedistributable; + }; +} '' + (PS4=" $ "; set -x + cp ${src}/"BCM4345C5.hcd" "BCM4345C5.hcd" + cp ${src}/"fw_bcm43456c5_ag.bin" "fw_bcm43456c5_ag.bin" + cp ${src}/"brcmfmac43456-sdio.clm_blob" "brcmfmac43456-sdio.clm_blob" + cp ${src}/"nvram_ap6256.txt" "nvram_ap6256.txt" + mkdir -p $out/lib/firmware/brcm + # Bluetooth firmware + install -Dm644 "BCM4345C5.hcd" -t "$out/lib/firmware/" + install -Dm644 "BCM4345C5.hcd" "$out/lib/firmware/brcm/BCM.hcd" + install -Dm644 "BCM4345C5.hcd" -t "$out/lib/firmware/brcm/" + # Wifi firmware + install -Dm644 "nvram_ap6256.txt" -t "$out/lib/firmware/" + install -Dm644 "fw_bcm43456c5_ag.bin" "$out/lib/firmware/brcm/brcmfmac43456-sdio.bin" + install -Dm644 "brcmfmac43456-sdio.clm_blob" "$out/lib/firmware/brcm/brcmfmac43456-sdio.clm_blob" + install -Dm644 "nvram_ap6256.txt" "$out/lib/firmware/brcm/brcmfmac43456-sdio.radxa,rockpi4b.txt" + install -Dm644 "nvram_ap6256.txt" "$out/lib/firmware/brcm/brcmfmac43456-sdio.radxa,rockpi4c.txt" + install -Dm644 "nvram_ap6256.txt" "$out/lib/firmware/brcm/brcmfmac43456-sdio.pine64,pinebook-pro.txt" + install -Dm644 "nvram_ap6256.txt" "$out/lib/firmware/brcm/brcmfmac43456-sdio.pine64,rockpro64-v2.1.txt" + ) +'' diff --git a/pine64/pinebook-pro/kernel/default.nix b/pine64/pinebook-pro/kernel/default.nix new file mode 100644 index 0000000..a900df7 --- /dev/null +++ b/pine64/pinebook-pro/kernel/default.nix @@ -0,0 +1,90 @@ +{ pkgs, ... }: + +let + pinnedNixpkgs = import + (builtins.fetchTarball { + name = "nixos-unstable-2022-03-28"; + url = "https://github.com/nixos/nixpkgs/archive/ce8cbe3c01fd8ee2de526ccd84bbf9b82397a510.tar.gz"; + sha256 = "19xfad7pxsp6nkrkjhn36w77w92m60ysq7njn711slw74yj6ibxv"; + }) + { + system = "aarch64-linux"; + }; + + patches = [ + # Assorted Manjaro ARM patches + "1001-arm64-dts-allwinner-add-hdmi-sound-to-pine-devices.patch" # Pine64 + "1002-arm64-dts-allwinner-add-ohci-ehci-to-h5-nanopi.patch" # Nanopi Neo Plus 2 + "1003-drm-bridge-analogix_dp-Add-enable_psr-param.patch" # Pinebook Pro + "1004-gpu-drm-add-new-display-resolution-2560x1440.patch" # Odroid + "1005-panfrost-Silence-Panfrost-gem-shrinker-loggin.patch" # Panfrost + "1006-arm64-dts-rockchip-Add-Firefly-Station-p1-support.patch" # Firelfy Station P1 + "1007-drm-rockchip-add-support-for-modeline-32MHz-e.patch" # DP Alt Mode + "1008-rk3399-rp64-pcie-Reimplement-rockchip-PCIe-bus-scan-delay.patch" # RockPro64 + "1010-arm64-dts-amlogic-add-initial-Beelink-GT1-Ultimate-dev.patch" # Beelink + "1011-arm64-dts-amlogic-add-meson-g12b-ugoos-am6-plus.patch" # Meson Ugoos + "1012-drm-panfrost-scheduler-improvements.patch" # Panfrost + "1013-arm64-dts-rockchip-Add-PCIe-bus-scan-delay-to-RockPr.patch" # RockPro64 + "1014-drm-rockchip-support-gamma-control-on-RK3399.patch" # RK3399 VOP + "1015-media-rockchip-rga-do-proper-error-checking-in-probe.patch" # Rockchip RGA + "1016-arm64-dts-rockchip-switch-to-hs200-on-rockpi4.patch" # Radxa Rock Pi 4 + "1017-arm64-dts-meson-remove-CPU-opps-below-1GHz-for-G12B-boards.patch" # AMLogic [1/2] + "1018-arm64-dts-meson-remove-CPU-opps-below-1GHz-for-SM1-boards.patch" # AMLogic [2/2] + "1019-arm64-dts-rockchip-Add-PCIe-bus-scan-delay-to-Rock-P.patch" # Radxa Rock Pi 4 + + # Assorted Pinebook, PinePhone and PineTab patches + "2001-Bluetooth-Add-new-quirk-for-broken-local-ext-features.patch" # Bluetooth + "2002-Bluetooth-btrtl-add-support-for-the-RTL8723CS.patch" # Bluetooth + "2003-arm64-allwinner-a64-enable-Bluetooth-On-Pinebook.patch" # Bluetooth + "2004-arm64-dts-allwinner-enable-bluetooth-pinetab-pinepho.patch" # Bluetooth + "2005-staging-add-rtl8723cs-driver.patch" # Realtek WiFi + "2006-arm64-dts-allwinner-pinetab-add-accelerometer.patch" # Accelerometer + "2007-arm64-dts-allwinner-pinetab-enable-jack-detection.patch" # Audio + "2008-brcmfmac-USB-probing-provides-no-board-type.patch" # Bluetooth + "2009-dts-rockchip-Adapt-and-adopt-Type-C-support-from-Pin.patch" # DP Alt Mode + + # Pinebook Pro Type-C patches from megous; original patch numbers found + # on https://xff.cz/kernels/5.17/patches/ are retained, with just the first + # digit changed from 0 to 3, to make tracking easier + "3170-arm64-dts-rk3399-pinebook-pro-Fix-USB-PD-charging.patch" + "3172-arm64-dts-rk3399-pinebook-pro-Improve-Type-C-support.patch" + "3174-arm64-dts-rk3399-pinebook-pro-Remove-redundant-pinct.patch" + "3178-arm64-dts-rk3399-pinebook-pro-Don-t-allow-usb2-phy-d.patch" + "3339-drm-rockchip-cdn-dp-Disable-CDN-DP-on-disconnect.patch" + "3355-usb-typec-fusb302-Set-the-current-before-enabling-pu.patch" + "3359-usb-typec-fusb302-Update-VBUS-state-even-if-VBUS-int.patch" + "3361-usb-typec-fusb302-Add-OF-extcon-support.patch" + "3362-usb-typec-fusb302-Fix-register-definitions.patch" + "3363-usb-typec-fusb302-Clear-interrupts-before-we-start-t.patch" + "3364-usb-typec-typec-extcon-Add-typec-extcon-bridge-drive.patch" + "3365-phy-rockchip-typec-Make-sure-the-plug-orientation-is.patch" + "3372-phy-rockchip-inno-usb2-More-robust-charger-detection.patch" + "3373-usb-typec-extcon-Don-t-touch-charger-proprties.patch" + ]; + + manjaro-patches = pinnedNixpkgs.fetchgit { + url = "https://gitlab.manjaro.org/manjaro-arm/packages/core/linux.git"; + rev = "d68667dfeb33a40a1ee5d6563ff4815e57ed9084"; + sha256 = "04wb8nx5yw1r044i2cnd1dy4fc7whgn343iid0gqmyg5rk1ack2v"; + }; + + create-patch = p: { + name = p; + patch = "${manjaro-patches}/${p}"; + }; + + manjaro-kernel = pinnedNixpkgs.linuxPackagesFor (pinnedNixpkgs.linuxKernel.kernels.linux_5_16.override { + argsOverride = rec { + kernelPatches = map create-patch patches; + version = "5.16.18"; + modDirVersion = version; + src = builtins.fetchurl { + url = "https://www.kernel.org/pub/linux/kernel/v5.x/linux-${version}.tar.xz"; + sha256 = "sha256:096f80m2czj8khvil7s037pqdf1s6pklqn5d9419jqkz7v70piry"; + }; + }; + }); +in +{ + inherit manjaro-kernel; +} diff --git a/pine64/pinebook-pro/keyboard-updater/default.nix b/pine64/pinebook-pro/keyboard-updater/default.nix new file mode 100644 index 0000000..3f3cf71 --- /dev/null +++ b/pine64/pinebook-pro/keyboard-updater/default.nix @@ -0,0 +1,26 @@ +{ stdenv, fetchFromGitHub, xxd, libusb }: + +stdenv.mkDerivation { + pname = "pinebook-pro-keyboard-updater"; + version = "2021-07-28"; + + nativeBuildInputs = [ + xxd + ]; + + buildInputs = [ + libusb + ]; + + installPhase = '' + mkdir -p $out/bin + cp -v updater $out/bin + ''; + + src = fetchFromGitHub { + owner = "dragan-simic"; + repo = "pinebook-pro-keyboard-updater"; + rev = "bd8d2ea48992b3e6ddd0b9435d21b74cdcf97224"; + hash = "sha256-3+Qsa5lk1EJrLvPSyWthqBMTqJCigbJSmnsS6hdu+w8="; + }; +} diff --git a/pine64/pinebook-pro/overlay.nix b/pine64/pinebook-pro/overlay.nix new file mode 100644 index 0000000..9cc4f50 --- /dev/null +++ b/pine64/pinebook-pro/overlay.nix @@ -0,0 +1,11 @@ +final: super: + +let + inherit (final) callPackage kernelPatches linuxPackagesFor; + kernels = callPackage ./kernel { }; +in +{ + pinebookpro-manjaro-kernel = kernels.manjaro-kernel; + pinebookpro-ap6256-firmware = callPackage ./firmware/ap6256-firmware { }; + pinebookpro-keyboard-updater = callPackage ./keyboard-updater { }; +} diff --git a/pine64/pinebook-pro/sound/reset-sound.rb b/pine64/pinebook-pro/sound/reset-sound.rb new file mode 100644 index 0000000..d92c2b7 --- /dev/null +++ b/pine64/pinebook-pro/sound/reset-sound.rb @@ -0,0 +1,227 @@ +#!/usr/bin/env nix-shell +#! nix-shell -p ruby alsaUtils -i ruby + +# This script resets the sound state to the minimum required for it to work. +# It will set the control that pulseaudio uses to 20%, everything else to the +# level expected for it to work. The rest will be off or to their default. + +require "open3" +require "shellwords" + +def run(*cmd) + puts " $ #{cmd.shelljoin}" + system(*cmd) +end + +FINAL_STATE = { + ## Simple mixer control 'Headphone',0 + ## Capabilities: pvolume + ## Playback channels: Front Left - Front Right + ## Limits: Playback 0 - 3 + ## Mono: + ## Front Left: Playback 0 [0%] [-48.00dB] + ## Front Right: Playback 0 [0%] [-48.00dB] + "Headphone,0" => "20%", + ## Simple mixer control 'Headphone Mixer',0 + ## Capabilities: volume + ## Playback channels: Front Left - Front Right + ## Capture channels: Front Left - Front Right + ## Limits: 0 - 11 + ## Front Left: 0 [0%] [-12.00dB] + ## Front Right: 0 [0%] [-12.00dB] + "Headphone Mixer,0" => "0", + ## Simple mixer control 'Mic Boost',0 + ## Capabilities: pswitch pswitch-joined + ## Playback channels: Mono + ## Mono: Playback [on] + "Mic Boost,0" => "off", + ## Simple mixer control 'Playback Polarity',0 + ## Capabilities: enum + ## Items: 'Normal' 'R Invert' 'L Invert' 'L + R Invert' + ## Item0: 'Normal' + "Playback Polarity,0" => "L Invert", + ## Simple mixer control 'Capture Polarity',0 + ## Capabilities: enum + ## Items: 'Normal' 'Invert' + ## Item0: 'Normal' + "Capture Polarity,0" => "Normal", + ## Simple mixer control 'ADC',0 + ## Capabilities: cvolume cvolume-joined + ## Capture channels: Mono + ## Limits: Capture 0 - 192 + ## Mono: Capture 0 [0%] [-99999.99dB] + "ADC,0" => "0", + ## Simple mixer control 'ADC Double Fs',0 + ## Capabilities: pswitch pswitch-joined + ## Playback channels: Mono + ## Mono: Playback [off] + "ADC Double Fs,0" => "off", + ## Simple mixer control 'ADC PGA Gain',0 + ## Capabilities: volume volume-joined + ## Playback channels: Mono + ## Capture channels: Mono + ## Limits: 0 - 10 + ## Mono: 0 [0%] + "ADC PGA Gain,0" => "0", + ## Simple mixer control 'ADC Soft Ramp',0 + ## Capabilities: pswitch pswitch-joined + ## Playback channels: Mono + ## Mono: Playback [on] + "ADC Soft Ramp,0" => "on", + ## Simple mixer control 'ALC',0 + ## Capabilities: cswitch cswitch-joined + ## Capture channels: Mono + ## Mono: Capture [off] + "ALC,0" => "nocap", + ## Simple mixer control 'ALC Capture Attack Time',0 + ## Capabilities: volume volume-joined + ## Playback channels: Mono + ## Capture channels: Mono + ## Limits: 0 - 10 + ## Mono: 0 [0%] + "ALC Capture Attack Time,0" => "0", + ## Simple mixer control 'ALC Capture Decay Time',0 + ## Capabilities: volume volume-joined + ## Playback channels: Mono + ## Capture channels: Mono + ## Limits: 0 - 10 + ## Mono: 0 [0%] + "ALC Capture Decay Time,0" => "0", + ## Simple mixer control 'ALC Capture Hold Time',0 + ## Capabilities: volume volume-joined + ## Playback channels: Mono + ## Capture channels: Mono + ## Limits: 0 - 10 + ## Mono: 0 [0%] + "ALC Capture Hold Time,0" => "0", + ## Simple mixer control 'ALC Capture Max',0 + ## Capabilities: volume volume-joined + ## Playback channels: Mono + ## Capture channels: Mono + ## Limits: 0 - 28 + ## Mono: 0 [0%] [-6.50dB] + "ALC Capture Max,0" => "0", + ## Simple mixer control 'ALC Capture Min',0 + ## Capabilities: volume volume-joined + ## Playback channels: Mono + ## Capture channels: Mono + ## Limits: 0 - 28 + ## Mono: 0 [0%] [-12.00dB] + "ALC Capture Min,0" => "0", + ## Simple mixer control 'ALC Capture Noise Gate',0 + ## Capabilities: pswitch pswitch-joined + ## Playback channels: Mono + ## Mono: Playback [off] + "ALC Capture Noise Gate,0" => "off", + ## Simple mixer control 'ALC Capture Noise Gate Threshold',0 + ## Capabilities: volume volume-joined + ## Playback channels: Mono + ## Capture channels: Mono + ## Limits: 0 - 31 + ## Mono: 0 [0%] + "ALC Capture Noise Gate Threshold,0" => "0", + ## Simple mixer control 'ALC Capture Noise Gate Type',0 + ## Capabilities: enum + ## Items: 'Constant PGA Gain' 'Mute ADC Output' + ## Item0: 'Constant PGA Gain' + "ALC Capture Noise Gate Type,0" => "Constant PGA Gain", + ## Simple mixer control 'ALC Capture Target',0 + ## Capabilities: volume volume-joined + ## Playback channels: Mono + ## Capture channels: Mono + ## Limits: 0 - 10 + ## Mono: 0 [0%] [-16.50dB] + "ALC Capture Target,0" => "0", + ## Simple mixer control 'DAC',0 + ## Capabilities: pvolume + ## Playback channels: Front Left - Front Right + ## Limits: Playback 0 - 192 + ## Mono: + ## Front Left: Playback 0 [0%] [-99999.99dB] + ## Front Right: Playback 0 [0%] [-99999.99dB] + "DAC,0" => "100%", + ## Simple mixer control 'DAC Double Fs',0 + ## Capabilities: pswitch pswitch-joined + ## Playback channels: Mono + ## Mono: Playback [off] + "DAC Double Fs,0" => "off", + ## Simple mixer control 'DAC Mono Mix',0 + ## Capabilities: pswitch pswitch-joined + ## Playback channels: Mono + ## Mono: Playback [off] + "DAC Mono Mix,0" => "off", + ## Simple mixer control 'DAC Notch Filter',0 + ## Capabilities: pswitch pswitch-joined + ## Playback channels: Mono + ## Mono: Playback [off] + "DAC Notch Filter,0" => "off", + ## Simple mixer control 'DAC Soft Ramp',0 + ## Capabilities: pswitch pswitch-joined + ## Playback channels: Mono + ## Mono: Playback [on] + "DAC Soft Ramp,0" => "on", + ## Simple mixer control 'DAC Soft Ramp Rate',0 + ## Capabilities: volume volume-joined + ## Playback channels: Mono + ## Capture channels: Mono + ## Limits: 0 - 4 + ## Mono: 0 [0%] + "DAC Soft Ramp Rate,0" => "0", + ## Simple mixer control 'DAC Source Mux',0 + ## Capabilities: enum + ## Items: 'LDATA TO LDAC, RDATA TO RDAC' 'LDATA TO LDAC, LDATA TO RDAC' 'RDATA TO LDAC, RDATA TO RDAC' 'RDATA TO LDAC, LDATA TO RDAC' + ## Item0: 'LDATA TO LDAC, RDATA TO RDAC' + "DAC Source Mux,0" => "LDATA TO LDAC, RDATA TO RDAC", + ## Simple mixer control 'DAC Stereo Enhancement',0 + ## Capabilities: volume volume-joined + ## Playback channels: Mono + ## Capture channels: Mono + ## Limits: 0 - 7 + ## Mono: 0 [0%] + "DAC Stereo Enhancement,0" => "0", + ## Simple mixer control 'Differential Mux',0 + ## Capabilities: enum + ## Items: 'lin1-rin1' 'lin2-rin2' 'lin1-rin1 with 20db Boost' 'lin2-rin2 with 20db Boost' + ## Item0: 'lin1-rin1' + "Differential Mux,0" => "lin1-rin1", + ## Simple mixer control 'Digital Mic Mux',0 + ## Capabilities: enum + ## Items: 'dmic disable' 'dmic data at high level' 'dmic data at low level' + ## Item0: 'dmic disable' + "Digital Mic Mux,0" => "dmic disable", + ## Simple mixer control 'Left Headphone Mixer LLIN',0 + ## Capabilities: pswitch pswitch-joined + ## Playback channels: Mono + ## Mono: Playback [off] + "Left Headphone Mixer LLIN,0" => "off", + ## Simple mixer control 'Left Headphone Mixer Left DAC',0 + ## Capabilities: pswitch pswitch-joined + ## Playback channels: Mono + ## Mono: Playback [off] + "Left Headphone Mixer Left DAC,0" => "on", + ## Simple mixer control 'Left Headphone Mux',0 + ## Capabilities: enum + ## Items: 'lin1-rin1' 'lin2-rin2' 'lin-rin with Boost' 'lin-rin with Boost and PGA' + ## Item0: 'lin1-rin1' + "Left Headphone Mux,0" => "lin1-rin1", + ## Simple mixer control 'Right Headphone Mixer RLIN',0 + ## Capabilities: pswitch pswitch-joined + ## Playback channels: Mono + ## Mono: Playback [off] + "Right Headphone Mixer RLIN,0" => "off", + ## Simple mixer control 'Right Headphone Mixer Right DAC',0 + ## Capabilities: pswitch pswitch-joined + ## Playback channels: Mono + ## Mono: Playback [off] + "Right Headphone Mixer Right DAC,0" => "on", + ## Simple mixer control 'Right Headphone Mux',0 + ## Capabilities: enum + ## Items: 'lin1-rin1' 'lin2-rin2' 'lin-rin with Boost' 'lin-rin with Boost and PGA' + ## Item0: 'lin1-rin1' + "Right Headphone Mux,0" => "lin1-rin1", +} + +FINAL_STATE.each do |name, value| + run("amixer", "-c0", "sset", name, value.to_s) + raise "Error setting #{name} to #{value}" unless $?.success? +end From 6d1bd5bc2e8b9992a3f57e416ba50fbed5516db6 Mon Sep 17 00:00:00 2001 From: Andrea Ciceri Date: Fri, 1 Apr 2022 19:07:06 +0200 Subject: [PATCH 2/6] Custom patched kernel is not the default anymore --- pine64/pinebook-pro/README.md | 5 +-- pine64/pinebook-pro/default.nix | 2 +- pine64/pinebook-pro/kernel/default.nix | 42 +------------------------- pine64/pinebook-pro/overlay.nix | 2 +- 4 files changed, 6 insertions(+), 45 deletions(-) diff --git a/pine64/pinebook-pro/README.md b/pine64/pinebook-pro/README.md index bde456e..178d637 100644 --- a/pine64/pinebook-pro/README.md +++ b/pine64/pinebook-pro/README.md @@ -20,8 +20,9 @@ Currently everything seems to work but this is not guaranteed it will be forever ### Kernel -This uses a pinned kernel that imitates a manually tested version of [Manjaro ARM kernel](https://gitlab.manjaro.org/manjaro-arm/packages/core/linux/-/blob/master/PKGBUILD), this way one can update `nixpkgs` without worrying too much. -This is default kernel but the current mainline kernel `linuxPackages_latest` seems to work too. +By default this uses the latest upstream kernel but the overlay makes available `pinebookpro-unstable-manjaro-kernel` +which is built from a pinned kernel version and makes available the DP alt mode over Type-C. +This kernel is unstable and some sporadic kernel panics may occur, use at your own risk. ### Known issues diff --git a/pine64/pinebook-pro/default.nix b/pine64/pinebook-pro/default.nix index 692c56d..a570d6e 100644 --- a/pine64/pinebook-pro/default.nix +++ b/pine64/pinebook-pro/default.nix @@ -6,7 +6,7 @@ (import ./overlay.nix) ]; - boot.kernelPackages = lib.mkDefault pkgs.pinebookpro-manjaro-kernel; + boot.kernelPackages = lib.mkDefault pkgs.linuxPackages_latest; # This list of modules is not entirely minified, but represents # a set of modules that is required for the display to work in stage-1. diff --git a/pine64/pinebook-pro/kernel/default.nix b/pine64/pinebook-pro/kernel/default.nix index a900df7..72880ea 100644 --- a/pine64/pinebook-pro/kernel/default.nix +++ b/pine64/pinebook-pro/kernel/default.nix @@ -12,40 +12,6 @@ let }; patches = [ - # Assorted Manjaro ARM patches - "1001-arm64-dts-allwinner-add-hdmi-sound-to-pine-devices.patch" # Pine64 - "1002-arm64-dts-allwinner-add-ohci-ehci-to-h5-nanopi.patch" # Nanopi Neo Plus 2 - "1003-drm-bridge-analogix_dp-Add-enable_psr-param.patch" # Pinebook Pro - "1004-gpu-drm-add-new-display-resolution-2560x1440.patch" # Odroid - "1005-panfrost-Silence-Panfrost-gem-shrinker-loggin.patch" # Panfrost - "1006-arm64-dts-rockchip-Add-Firefly-Station-p1-support.patch" # Firelfy Station P1 - "1007-drm-rockchip-add-support-for-modeline-32MHz-e.patch" # DP Alt Mode - "1008-rk3399-rp64-pcie-Reimplement-rockchip-PCIe-bus-scan-delay.patch" # RockPro64 - "1010-arm64-dts-amlogic-add-initial-Beelink-GT1-Ultimate-dev.patch" # Beelink - "1011-arm64-dts-amlogic-add-meson-g12b-ugoos-am6-plus.patch" # Meson Ugoos - "1012-drm-panfrost-scheduler-improvements.patch" # Panfrost - "1013-arm64-dts-rockchip-Add-PCIe-bus-scan-delay-to-RockPr.patch" # RockPro64 - "1014-drm-rockchip-support-gamma-control-on-RK3399.patch" # RK3399 VOP - "1015-media-rockchip-rga-do-proper-error-checking-in-probe.patch" # Rockchip RGA - "1016-arm64-dts-rockchip-switch-to-hs200-on-rockpi4.patch" # Radxa Rock Pi 4 - "1017-arm64-dts-meson-remove-CPU-opps-below-1GHz-for-G12B-boards.patch" # AMLogic [1/2] - "1018-arm64-dts-meson-remove-CPU-opps-below-1GHz-for-SM1-boards.patch" # AMLogic [2/2] - "1019-arm64-dts-rockchip-Add-PCIe-bus-scan-delay-to-Rock-P.patch" # Radxa Rock Pi 4 - - # Assorted Pinebook, PinePhone and PineTab patches - "2001-Bluetooth-Add-new-quirk-for-broken-local-ext-features.patch" # Bluetooth - "2002-Bluetooth-btrtl-add-support-for-the-RTL8723CS.patch" # Bluetooth - "2003-arm64-allwinner-a64-enable-Bluetooth-On-Pinebook.patch" # Bluetooth - "2004-arm64-dts-allwinner-enable-bluetooth-pinetab-pinepho.patch" # Bluetooth - "2005-staging-add-rtl8723cs-driver.patch" # Realtek WiFi - "2006-arm64-dts-allwinner-pinetab-add-accelerometer.patch" # Accelerometer - "2007-arm64-dts-allwinner-pinetab-enable-jack-detection.patch" # Audio - "2008-brcmfmac-USB-probing-provides-no-board-type.patch" # Bluetooth - "2009-dts-rockchip-Adapt-and-adopt-Type-C-support-from-Pin.patch" # DP Alt Mode - - # Pinebook Pro Type-C patches from megous; original patch numbers found - # on https://xff.cz/kernels/5.17/patches/ are retained, with just the first - # digit changed from 0 to 3, to make tracking easier "3170-arm64-dts-rk3399-pinebook-pro-Fix-USB-PD-charging.patch" "3172-arm64-dts-rk3399-pinebook-pro-Improve-Type-C-support.patch" "3174-arm64-dts-rk3399-pinebook-pro-Remove-redundant-pinct.patch" @@ -76,15 +42,9 @@ let manjaro-kernel = pinnedNixpkgs.linuxPackagesFor (pinnedNixpkgs.linuxKernel.kernels.linux_5_16.override { argsOverride = rec { kernelPatches = map create-patch patches; - version = "5.16.18"; - modDirVersion = version; - src = builtins.fetchurl { - url = "https://www.kernel.org/pub/linux/kernel/v5.x/linux-${version}.tar.xz"; - sha256 = "sha256:096f80m2czj8khvil7s037pqdf1s6pklqn5d9419jqkz7v70piry"; - }; }; }); in { - inherit manjaro-kernel; + inherit unstable-manjaro-kernel; } diff --git a/pine64/pinebook-pro/overlay.nix b/pine64/pinebook-pro/overlay.nix index 9cc4f50..d540d72 100644 --- a/pine64/pinebook-pro/overlay.nix +++ b/pine64/pinebook-pro/overlay.nix @@ -5,7 +5,7 @@ let kernels = callPackage ./kernel { }; in { - pinebookpro-manjaro-kernel = kernels.manjaro-kernel; + pinebookpro-unstable-manjaro-kernel = kernels.manjaro-kernel; pinebookpro-ap6256-firmware = callPackage ./firmware/ap6256-firmware { }; pinebookpro-keyboard-updater = callPackage ./keyboard-updater { }; } From be88ca8b75333f0f7b4ae698b8737a95f1f247f7 Mon Sep 17 00:00:00 2001 From: Andrea Ciceri Date: Fri, 8 Apr 2022 10:41:13 +0200 Subject: [PATCH 3/6] Update pine64/pinebook-pro/README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Jörg Thalheim --- pine64/pinebook-pro/README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pine64/pinebook-pro/README.md b/pine64/pinebook-pro/README.md index 178d637..473da44 100644 --- a/pine64/pinebook-pro/README.md +++ b/pine64/pinebook-pro/README.md @@ -20,9 +20,7 @@ Currently everything seems to work but this is not guaranteed it will be forever ### Kernel -By default this uses the latest upstream kernel but the overlay makes available `pinebookpro-unstable-manjaro-kernel` -which is built from a pinned kernel version and makes available the DP alt mode over Type-C. -This kernel is unstable and some sporadic kernel panics may occur, use at your own risk. +This module defaults to the latest upstream kernel. Attempts have been made to use manjaro's kernel that makes the DP alt mode available over Type-C, but it turns out that the kernel is unstable and some sporadic kernel panics may occur. If you want to test version, you can grab the nix expression from this commit: https://github.com/NixOS/nixos-hardware/blob/6d1bd5bc2e8b9992a3f57e416ba50fbed5516db6/pine64/pinebook-pro/kernel/default.nix ### Known issues From cb8db9e1bb2801fb1cd520d7bc9776117e597a73 Mon Sep 17 00:00:00 2001 From: Andrea Ciceri Date: Fri, 8 Apr 2022 10:58:58 +0200 Subject: [PATCH 4/6] New source for `ap6256-firmware` and removed unstable kernel --- pine64/pinebook-pro/default.nix | 2 +- .../firmware/ap6256-firmware/default.nix | 14 +++--- pine64/pinebook-pro/kernel/default.nix | 50 ------------------- pine64/pinebook-pro/overlay.nix | 5 +- 4 files changed, 8 insertions(+), 63 deletions(-) delete mode 100644 pine64/pinebook-pro/kernel/default.nix diff --git a/pine64/pinebook-pro/default.nix b/pine64/pinebook-pro/default.nix index a570d6e..799596c 100644 --- a/pine64/pinebook-pro/default.nix +++ b/pine64/pinebook-pro/default.nix @@ -74,7 +74,7 @@ hardware.enableRedistributableFirmware = true; hardware.firmware = [ - pkgs.pinebookpro-ap6256-firmware + (pkgs.callPackage ./firmware/ap6256-firmware { }) ]; systemd.tmpfiles.rules = [ diff --git a/pine64/pinebook-pro/firmware/ap6256-firmware/default.nix b/pine64/pinebook-pro/firmware/ap6256-firmware/default.nix index 3d10f04..2c66766 100644 --- a/pine64/pinebook-pro/firmware/ap6256-firmware/default.nix +++ b/pine64/pinebook-pro/firmware/ap6256-firmware/default.nix @@ -1,16 +1,14 @@ { lib -, fetchFromGitLab -, fetchurl +, fetchFromGitHub , runCommandNoCC }: let - src = fetchFromGitLab { - domain = "gitlab.manjaro.org"; - owner = "manjaro-arm"; - repo = "packages/community/ap6256-firmware"; - rev = "007c6dd132263624db9ea6ce8dde4fc2108f21b7"; - sha256 = "sha256-Agqz05W7Rhl0NNQwpW4aQqs9YZmYyci9OXKzEKA30uk="; + src = fetchFromGitHub { + owner = "nix-community"; + repo = "rkwifibt"; + rev = "421b7dd8f3c67f66910710838a0be03f3575a3c9"; + sha256 = "175qcjfaz7nhpyh0hxiih53k3hly407lkpxgissvldghxrw01ccn"; }; in runCommandNoCC "pinebookpro-ap6256-firmware" diff --git a/pine64/pinebook-pro/kernel/default.nix b/pine64/pinebook-pro/kernel/default.nix deleted file mode 100644 index 72880ea..0000000 --- a/pine64/pinebook-pro/kernel/default.nix +++ /dev/null @@ -1,50 +0,0 @@ -{ pkgs, ... }: - -let - pinnedNixpkgs = import - (builtins.fetchTarball { - name = "nixos-unstable-2022-03-28"; - url = "https://github.com/nixos/nixpkgs/archive/ce8cbe3c01fd8ee2de526ccd84bbf9b82397a510.tar.gz"; - sha256 = "19xfad7pxsp6nkrkjhn36w77w92m60ysq7njn711slw74yj6ibxv"; - }) - { - system = "aarch64-linux"; - }; - - patches = [ - "3170-arm64-dts-rk3399-pinebook-pro-Fix-USB-PD-charging.patch" - "3172-arm64-dts-rk3399-pinebook-pro-Improve-Type-C-support.patch" - "3174-arm64-dts-rk3399-pinebook-pro-Remove-redundant-pinct.patch" - "3178-arm64-dts-rk3399-pinebook-pro-Don-t-allow-usb2-phy-d.patch" - "3339-drm-rockchip-cdn-dp-Disable-CDN-DP-on-disconnect.patch" - "3355-usb-typec-fusb302-Set-the-current-before-enabling-pu.patch" - "3359-usb-typec-fusb302-Update-VBUS-state-even-if-VBUS-int.patch" - "3361-usb-typec-fusb302-Add-OF-extcon-support.patch" - "3362-usb-typec-fusb302-Fix-register-definitions.patch" - "3363-usb-typec-fusb302-Clear-interrupts-before-we-start-t.patch" - "3364-usb-typec-typec-extcon-Add-typec-extcon-bridge-drive.patch" - "3365-phy-rockchip-typec-Make-sure-the-plug-orientation-is.patch" - "3372-phy-rockchip-inno-usb2-More-robust-charger-detection.patch" - "3373-usb-typec-extcon-Don-t-touch-charger-proprties.patch" - ]; - - manjaro-patches = pinnedNixpkgs.fetchgit { - url = "https://gitlab.manjaro.org/manjaro-arm/packages/core/linux.git"; - rev = "d68667dfeb33a40a1ee5d6563ff4815e57ed9084"; - sha256 = "04wb8nx5yw1r044i2cnd1dy4fc7whgn343iid0gqmyg5rk1ack2v"; - }; - - create-patch = p: { - name = p; - patch = "${manjaro-patches}/${p}"; - }; - - manjaro-kernel = pinnedNixpkgs.linuxPackagesFor (pinnedNixpkgs.linuxKernel.kernels.linux_5_16.override { - argsOverride = rec { - kernelPatches = map create-patch patches; - }; - }); -in -{ - inherit unstable-manjaro-kernel; -} diff --git a/pine64/pinebook-pro/overlay.nix b/pine64/pinebook-pro/overlay.nix index d540d72..8d140f0 100644 --- a/pine64/pinebook-pro/overlay.nix +++ b/pine64/pinebook-pro/overlay.nix @@ -1,11 +1,8 @@ final: super: let - inherit (final) callPackage kernelPatches linuxPackagesFor; - kernels = callPackage ./kernel { }; + inherit (final) callPackage; in { - pinebookpro-unstable-manjaro-kernel = kernels.manjaro-kernel; - pinebookpro-ap6256-firmware = callPackage ./firmware/ap6256-firmware { }; pinebookpro-keyboard-updater = callPackage ./keyboard-updater { }; } From 710e33cb937fe4eb630c444d210b96653ddbb76a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Thalheim?= Date: Sat, 9 Apr 2022 09:02:56 +0200 Subject: [PATCH 5/6] pine64/pinebook-pro: typos in README --- pine64/pinebook-pro/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pine64/pinebook-pro/README.md b/pine64/pinebook-pro/README.md index 473da44..b6c0811 100644 --- a/pine64/pinebook-pro/README.md +++ b/pine64/pinebook-pro/README.md @@ -20,7 +20,11 @@ Currently everything seems to work but this is not guaranteed it will be forever ### Kernel -This module defaults to the latest upstream kernel. Attempts have been made to use manjaro's kernel that makes the DP alt mode available over Type-C, but it turns out that the kernel is unstable and some sporadic kernel panics may occur. If you want to test version, you can grab the nix expression from this commit: https://github.com/NixOS/nixos-hardware/blob/6d1bd5bc2e8b9992a3f57e416ba50fbed5516db6/pine64/pinebook-pro/kernel/default.nix +This module defaults to the latest upstream kernel. Attempts have been made to +use manjaro's kernel that makes the DP alt mode available over Type-C, but it +turns out that the kernel is unstable and some sporadic kernel panics may occur. +If you want to this kernel, you can grab the nix expression from this commit: +https://github.com/NixOS/nixos-hardware/blob/6d1bd5bc2e8b9992a3f57e416ba50fbed5516db6/pine64/pinebook-pro/kernel/default.nix ### Known issues From 32e12dbc2060f6bdf77a08059a063b95b2fd7d77 Mon Sep 17 00:00:00 2001 From: Andrea Ciceri Date: Tue, 12 Apr 2022 11:27:54 +0200 Subject: [PATCH 6/6] Missing clm blob for Pinebook's AP6256 firmware --- .../ap6256-firmware/brcmfmac43456-sdio.clm_blob | Bin 0 -> 14036 bytes .../firmware/ap6256-firmware/default.nix | 9 +++++---- 2 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 pine64/pinebook-pro/firmware/ap6256-firmware/brcmfmac43456-sdio.clm_blob diff --git a/pine64/pinebook-pro/firmware/ap6256-firmware/brcmfmac43456-sdio.clm_blob b/pine64/pinebook-pro/firmware/ap6256-firmware/brcmfmac43456-sdio.clm_blob new file mode 100644 index 0000000000000000000000000000000000000000..3b9b5bdc15cd0a58a000441c3903539e0e3de080 GIT binary patch literal 14036 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

( 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 m7QcS@@Zo0(74i*{{C-`s-id=U3Pxr~d;c@