Created
September 13, 2022 11:42
-
-
Save Shados/ec5712f4f8189734288cab6eb53cd952 to your computer and use it in GitHub Desktop.
NixOS hardware quirks/fixes config for RedmiBook Pro 15 2022
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ lib, stdenv, src, fetchFromGitHub, kernel }: | |
stdenv.mkDerivation rec { | |
name = "blue8852be-module-${version}-${kernel.version}"; | |
version = "1.0.2"; | |
inherit src; | |
hardeningDisable = [ "pic" ]; | |
nativeBuildInputs = kernel.moduleBuildDependencies; | |
buildPhase = '' | |
make -C ${kernel.dev}/lib/modules/${kernel.modDirVersion}/build M=`pwd` modules | |
''; | |
installPhase = '' | |
mkdir -p $out/lib/modules/${kernel.modDirVersion}/kernel/drivers/bluetooth/ | |
for x in $(find . -name '*.ko'); do | |
cp $x $out/lib/modules/${kernel.modDirVersion}/kernel/drivers/bluetooth/ | |
done | |
''; | |
meta = with lib; { | |
maintainers = [ maintainers.arobyn ]; | |
license = [ licenses.agpl3 ]; | |
platforms = [ "i686-linux" "x86_64-linux" ]; | |
description = "blue8852be bluetooth chip drivers"; | |
homepage = "https://github.com/vrolife/modern_laptop"; | |
}; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ config, lib, pkgs, ... }: | |
let | |
inherit (lib) mkMerge optionalString versionAtLeast; | |
pins = import ./sources.nix { }; | |
outOfTreeModules = kernel: { | |
blue8852be = pkgs.callPackage ./blue8852be.nix { | |
src = "${pins.modern_laptop.outPath}/drivers/blue8852be"; | |
inherit kernel; | |
}; | |
redmibook_dmic = pkgs.callPackage ./redmibook_dmic.nix { | |
src = "${pins.modern_laptop.outPath}/drivers/redmibook_dmic"; | |
inherit kernel; | |
}; | |
redmibook_kbd_backlight = pkgs.callPackage ./redmibook_kbd_backlight.nix { | |
src = "${pins.modern_laptop.outPath}/drivers/redmibook_kbd_backlight"; | |
inherit kernel; | |
}; | |
redmibook_wmi = pkgs.callPackage ./redmibook_wmi.nix { | |
src = "${pins.modern_laptop.outPath}/drivers/redmibook_wmi"; | |
inherit kernel; | |
}; | |
rtw8852be = pkgs.callPackage ./rtw8852be.nix { | |
src = pins.rtw8852be.outPath; | |
inherit kernel; | |
}; | |
}; | |
in | |
{ | |
config = mkMerge [ | |
{ # Using 5.18 as base version works best with current vrolife/modern_laptop checkout | |
boot.kernelPackages = pkgs.linuxPackages_5_18; | |
} | |
{ # Keyboard fixes | |
boot.kernelPatches = [ | |
# Required to make the keyboard work at all | |
{ name = "redmibook-kernel-fix"; | |
patch = ./keyboard_fix.patch; | |
} | |
]; | |
# For some reason, the Enter key sends the scan code for KP_Enter (affects | |
# windows too, no idea how to fix it there) | |
services.udev.extraHwdb = '' | |
# Matches the RedmiBook Pro 15 2022's internal keyboard only | |
evdev:atkbd:dmi:bvn*:bvr*:bd*:svnTIMI:pnRedmiBookPro152022:pvr* | |
KEYBOARD_KEY_9c=enter # remap KP_Enter to Enter | |
''; | |
} | |
{ # Keyboard backlight control | |
boot.extraModulePackages = with (outOfTreeModules config.boot.kernelPackages.kernel); [ | |
redmibook_kbd_backlight | |
]; | |
boot.kernelModules = [ | |
"redmibook_kbd_backlight" | |
]; | |
} | |
{ # Some FN keys are handled by this separate WMI keyboard | |
boot.extraModulePackages = with (outOfTreeModules config.boot.kernelPackages.kernel); [ | |
redmibook_wmi | |
]; | |
boot.kernelModules = [ | |
"redmibook_wmi" | |
]; | |
} | |
{ # Required to make the touchpad work on >= 5.18.18, see nixpkgs#185890 | |
# code comments | |
boot.kernelPatches = [ | |
{ name = "touchpad-fix"; | |
extraConfig = optionalString (versionAtLeast config.boot.kernelPackages.kernel.version "5.18.18")'' | |
PINCTRL_AMD y | |
''; | |
patch = null; | |
} | |
]; | |
} | |
{ # Bluetooth | |
boot.extraModulePackages = with (outOfTreeModules config.boot.kernelPackages.kernel); [ | |
blue8852be # bt | |
]; | |
boot.kernelModules = [ | |
"blue8852be" | |
]; | |
} | |
{ # Wifi | |
boot.extraModulePackages = with (outOfTreeModules config.boot.kernelPackages.kernel); [ | |
rtw8852be # wifi | |
]; | |
boot.kernelModules = [ | |
"rtw8852be" | |
]; | |
} | |
{ # Microphone | |
boot.extraModulePackages = with (outOfTreeModules config.boot.kernelPackages.kernel); [ | |
redmibook_dmic | |
]; | |
} | |
{ # Prevent hibernation issues, but causes heyboard light to always be on | |
# after sleep, and abolishes LPS0 | |
boot.kernelParams = [ | |
"acpi_osi=!" "acpi_osi=Linux" | |
]; | |
} | |
# FIXME: Fingerprint driver support currently non-existent for my 27c6:589a | |
# device, see the Goodix Fingerprint Linux Development discord server | |
]; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From: Chuanhong Guo <gch981213@gmail.com> | |
To: linux-acpi@vger.kernel.org | |
Cc: Tighe Donnelly <tighe.donnelly@protonmail.com>, | |
Chuanhong Guo <gch981213@gmail.com>, | |
Mario Limonciello <mario.limonciello@amd.com>, | |
"Rafael J. Wysocki" <rafael@kernel.org>, | |
Len Brown <lenb@kernel.org>, | |
linux-kernel@vger.kernel.org (open list) | |
Subject: [PATCH v6] ACPI: skip IRQ override on AMD Zen platforms | |
Date: Tue, 12 Jul 2022 10:00:58 +0800 [thread overview] | |
Message-ID: <20220712020058.90374-1-gch981213@gmail.com> (raw) | |
IRQ override isn't needed on modern AMD Zen systems. | |
There's an active low keyboard IRQ on AMD Ryzen 6000 and it will stay | |
this way on newer platforms. This IRQ override breaks keyboards for | |
almost all Ryzen 6000 laptops currently on the market. | |
Skip this IRQ override for all AMD Zen platforms because this IRQ | |
override is supposed to be a workaround for buggy ACPI DSDT and we can't | |
have a long list of all future AMD CPUs/Laptops in the kernel code. | |
If a device with buggy ACPI DSDT shows up, a separated list containing | |
just them should be created. | |
Suggested-by: Mario Limonciello <mario.limonciello@amd.com> | |
Signed-off-by: Chuanhong Guo <gch981213@gmail.com> | |
--- | |
Change sice v5: reworked | |
drivers/acpi/resource.c | 10 ++++++++++ | |
1 file changed, 10 insertions(+) | |
diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c | |
index c2d494784425..510cdec375c4 100644 | |
--- a/drivers/acpi/resource.c | |
+++ b/drivers/acpi/resource.c | |
@@ -416,6 +416,16 @@ static bool acpi_dev_irq_override(u32 gsi, u8 triggering, u8 polarity, | |
{ | |
int i; | |
+#ifdef CONFIG_X86 | |
+ /* | |
+ * IRQ override isn't needed on modern AMD Zen systems and | |
+ * this override breaks active low IRQs on AMD Ryzen 6000 and | |
+ * newer systems. Skip it. | |
+ */ | |
+ if (boot_cpu_has(X86_FEATURE_ZEN)) | |
+ return false; | |
+#endif | |
+ | |
for (i = 0; i < ARRAY_SIZE(skip_override_table); i++) { | |
const struct irq_override_cmp *entry = &skip_override_table[i]; | |
-- | |
2.36.1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ lib, stdenv, src, fetchFromGitHub, kernel }: | |
stdenv.mkDerivation rec { | |
name = "redmibook_dmic-module-${version}-${kernel.version}"; | |
version = "1.0.1"; | |
inherit src; | |
hardeningDisable = [ "pic" ]; | |
nativeBuildInputs = kernel.moduleBuildDependencies; | |
buildPhase = '' | |
make -C ${kernel.dev}/lib/modules/${kernel.modDirVersion}/build M=`pwd` modules | |
''; | |
installPhase = '' | |
mkdir -p $out/lib/modules/${kernel.modDirVersion}/kernel/sound/soc/amd/yc/ | |
for x in $(find . -name '*.ko'); do | |
cp $x $out/lib/modules/${kernel.modDirVersion}/kernel/sound/soc/amd/yc/ | |
done | |
''; | |
meta = with lib; { | |
maintainers = [ maintainers.arobyn ]; | |
license = [ licenses.agpl3 ]; | |
platforms = [ "i686-linux" "x86_64-linux" ]; | |
description = "RedmiBook Pro 15 2022 microphone driver"; | |
homepage = "https://github.com/vrolife/modern_laptop"; | |
}; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ lib, stdenv, src, fetchFromGitHub, kernel }: | |
stdenv.mkDerivation rec { | |
name = "redmibook_kbd_backlight-module-${version}-${kernel.version}"; | |
version = "1.0.4"; | |
inherit src; | |
hardeningDisable = [ "pic" ]; | |
nativeBuildInputs = kernel.moduleBuildDependencies; | |
buildPhase = '' | |
make -C ${kernel.dev}/lib/modules/${kernel.modDirVersion}/build M=`pwd` modules | |
''; | |
installPhase = '' | |
mkdir -p $out/lib/modules/${kernel.modDirVersion}/updates/ | |
for x in $(find . -name '*.ko'); do | |
cp $x $out/lib/modules/${kernel.modDirVersion}/updates/ | |
done | |
''; | |
meta = with lib; { | |
maintainers = [ maintainers.arobyn ]; | |
license = [ licenses.agpl3 ]; | |
platforms = [ "i686-linux" "x86_64-linux" ]; | |
description = "RedmiBook Pro 15 2022 keyboard backlight control driver"; | |
homepage = "https://github.com/vrolife/modern_laptop"; | |
}; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ lib, stdenv, src, fetchFromGitHub, kernel }: | |
stdenv.mkDerivation rec { | |
name = "redmibook_wmi-module-${version}-${kernel.version}"; | |
version = "1.0.3"; | |
inherit src; | |
hardeningDisable = [ "pic" ]; | |
nativeBuildInputs = kernel.moduleBuildDependencies; | |
buildPhase = '' | |
make -C ${kernel.dev}/lib/modules/${kernel.modDirVersion}/build M=`pwd` modules | |
''; | |
installPhase = '' | |
mkdir -p $out/lib/modules/${kernel.modDirVersion}/updates/ | |
for x in $(find . -name '*.ko'); do | |
cp $x $out/lib/modules/${kernel.modDirVersion}/updates/ | |
done | |
''; | |
meta = with lib; { | |
maintainers = [ maintainers.arobyn ]; | |
license = [ licenses.agpl3 ]; | |
platforms = [ "i686-linux" "x86_64-linux" ]; | |
description = "RedmiBook Pro 15 2022 keyboard WMI keys driver"; | |
homepage = "https://github.com/vrolife/modern_laptop"; | |
}; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ lib, stdenv, src, fetchFromGitHub, kernel, bc }: | |
stdenv.mkDerivation rec { | |
name = "rtw8852be-module-unstable-github-${kernel.version}"; | |
inherit src; | |
hardeningDisable = [ "pic" ]; | |
nativeBuildInputs = kernel.moduleBuildDependencies ++ [ bc ]; | |
buildFlags = [ | |
"KSRC=${kernel.dev}/lib/modules/${kernel.modDirVersion}/build" | |
]; | |
installPhase = '' | |
mkdir -p $out/lib/modules/${kernel.modDirVersion}/kernel/drivers/net/wireless/ | |
install -p -m 644 8852be.ko $out/lib/modules/${kernel.modDirVersion}/kernel/drivers/net/wireless/ | |
''; | |
meta = with lib; { | |
maintainers = [ maintainers.arobyn ]; | |
license = [ licenses.agpl3 ]; | |
platforms = [ "i686-linux" "x86_64-linux" ]; | |
description = "rtw8852be wifi chip drivers"; | |
homepage = "https://github.com/vrolife/modern_laptop"; | |
}; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"modern_laptop": { | |
"branch": "main", | |
"description": "Redmi Book Pro 14/15 2022 锐龙版/Ryzen Linux 键盘驱动/keyboard driver", | |
"homepage": "", | |
"owner": "vrolife", | |
"repo": "modern_laptop", | |
"rev": "a6650284b83079bcd8e92b16725035bb24531f2a", | |
"sha256": "08a2nd14p37z400m396c0xd7zd3qx1lxa2hwhwq8n2r8pnckqmgy", | |
"type": "tarball", | |
"url": "https://github.com/vrolife/modern_laptop/archive/a6650284b83079bcd8e92b16725035bb24531f2a.tar.gz", | |
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz" | |
}, | |
"rtw8852be": { | |
"branch": "main", | |
"description": "Linux driver for RTW8852BE PCIe card", | |
"homepage": null, | |
"owner": "lwfinger", | |
"repo": "rtw8852be", | |
"rev": "06ae393d3fcb5cbede7ccec8013b0f8e205a4ee7", | |
"sha256": "1vr8a70rr7kyfvghhbwpp7nbhh0m1p6s3x9h53ian3kkwqp0gv8p", | |
"type": "tarball", | |
"url": "https://github.com/lwfinger/rtw8852be/archive/06ae393d3fcb5cbede7ccec8013b0f8e205a4ee7.tar.gz", | |
"url_template": "https://github.com/<owner>/<repo>/archive/<rev>.tar.gz" | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# This file has been generated by Niv. | |
let | |
# | |
# The fetchers. fetch_<type> fetches specs of type <type>. | |
# | |
fetch_file = pkgs: name: spec: | |
let | |
name' = sanitizeName name + "-src"; | |
in | |
if spec.builtin or true then | |
builtins_fetchurl { inherit (spec) url sha256; name = name'; } | |
else | |
pkgs.fetchurl { inherit (spec) url sha256; name = name'; }; | |
fetch_tarball = pkgs: name: spec: | |
let | |
name' = sanitizeName name + "-src"; | |
in | |
if spec.builtin or true then | |
builtins_fetchTarball { name = name'; inherit (spec) url sha256; } | |
else | |
pkgs.fetchzip { name = name'; inherit (spec) url sha256; }; | |
fetch_git = name: spec: | |
let | |
ref = | |
if spec ? ref then spec.ref else | |
if spec ? branch then "refs/heads/${spec.branch}" else | |
if spec ? tag then "refs/tags/${spec.tag}" else | |
abort "In git source '${name}': Please specify `ref`, `tag` or `branch`!"; | |
in | |
builtins.fetchGit { url = spec.repo; inherit (spec) rev; inherit ref; }; | |
fetch_local = spec: spec.path; | |
fetch_builtin-tarball = name: throw | |
''[${name}] The niv type "builtin-tarball" is deprecated. You should instead use `builtin = true`. | |
$ niv modify ${name} -a type=tarball -a builtin=true''; | |
fetch_builtin-url = name: throw | |
''[${name}] The niv type "builtin-url" will soon be deprecated. You should instead use `builtin = true`. | |
$ niv modify ${name} -a type=file -a builtin=true''; | |
# | |
# Various helpers | |
# | |
# https://github.com/NixOS/nixpkgs/pull/83241/files#diff-c6f540a4f3bfa4b0e8b6bafd4cd54e8bR695 | |
sanitizeName = name: | |
( | |
concatMapStrings (s: if builtins.isList s then "-" else s) | |
( | |
builtins.split "[^[:alnum:]+._?=-]+" | |
((x: builtins.elemAt (builtins.match "\\.*(.*)" x) 0) name) | |
) | |
); | |
# The set of packages used when specs are fetched using non-builtins. | |
mkPkgs = sources: system: | |
let | |
sourcesNixpkgs = | |
import (builtins_fetchTarball { inherit (sources.nixpkgs) url sha256; }) { inherit system; }; | |
hasNixpkgsPath = builtins.any (x: x.prefix == "nixpkgs") builtins.nixPath; | |
hasThisAsNixpkgsPath = <nixpkgs> == ./.; | |
in | |
if builtins.hasAttr "nixpkgs" sources | |
then sourcesNixpkgs | |
else if hasNixpkgsPath && ! hasThisAsNixpkgsPath then | |
import <nixpkgs> {} | |
else | |
abort | |
'' | |
Please specify either <nixpkgs> (through -I or NIX_PATH=nixpkgs=...) or | |
add a package called "nixpkgs" to your sources.json. | |
''; | |
# The actual fetching function. | |
fetch = pkgs: name: spec: | |
if ! builtins.hasAttr "type" spec then | |
abort "ERROR: niv spec ${name} does not have a 'type' attribute" | |
else if spec.type == "file" then fetch_file pkgs name spec | |
else if spec.type == "tarball" then fetch_tarball pkgs name spec | |
else if spec.type == "git" then fetch_git name spec | |
else if spec.type == "local" then fetch_local spec | |
else if spec.type == "builtin-tarball" then fetch_builtin-tarball name | |
else if spec.type == "builtin-url" then fetch_builtin-url name | |
else | |
abort "ERROR: niv spec ${name} has unknown type ${builtins.toJSON spec.type}"; | |
# If the environment variable NIV_OVERRIDE_${name} is set, then use | |
# the path directly as opposed to the fetched source. | |
replace = name: drv: | |
let | |
saneName = stringAsChars (c: if isNull (builtins.match "[a-zA-Z0-9]" c) then "_" else c) name; | |
ersatz = builtins.getEnv "NIV_OVERRIDE_${saneName}"; | |
in | |
if ersatz == "" then drv else | |
# this turns the string into an actual Nix path (for both absolute and | |
# relative paths) | |
if builtins.substring 0 1 ersatz == "/" then /. + ersatz else /. + builtins.getEnv "PWD" + "/${ersatz}"; | |
# Ports of functions for older nix versions | |
# a Nix version of mapAttrs if the built-in doesn't exist | |
mapAttrs = builtins.mapAttrs or ( | |
f: set: with builtins; | |
listToAttrs (map (attr: { name = attr; value = f attr set.${attr}; }) (attrNames set)) | |
); | |
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/lists.nix#L295 | |
range = first: last: if first > last then [] else builtins.genList (n: first + n) (last - first + 1); | |
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L257 | |
stringToCharacters = s: map (p: builtins.substring p 1 s) (range 0 (builtins.stringLength s - 1)); | |
# https://github.com/NixOS/nixpkgs/blob/0258808f5744ca980b9a1f24fe0b1e6f0fecee9c/lib/strings.nix#L269 | |
stringAsChars = f: s: concatStrings (map f (stringToCharacters s)); | |
concatMapStrings = f: list: concatStrings (map f list); | |
concatStrings = builtins.concatStringsSep ""; | |
# https://github.com/NixOS/nixpkgs/blob/8a9f58a375c401b96da862d969f66429def1d118/lib/attrsets.nix#L331 | |
optionalAttrs = cond: as: if cond then as else {}; | |
# fetchTarball version that is compatible between all the versions of Nix | |
builtins_fetchTarball = { url, name ? null, sha256 }@attrs: | |
let | |
inherit (builtins) lessThan nixVersion fetchTarball; | |
in | |
if lessThan nixVersion "1.12" then | |
fetchTarball ({ inherit url; } // (optionalAttrs (!isNull name) { inherit name; })) | |
else | |
fetchTarball attrs; | |
# fetchurl version that is compatible between all the versions of Nix | |
builtins_fetchurl = { url, name ? null, sha256 }@attrs: | |
let | |
inherit (builtins) lessThan nixVersion fetchurl; | |
in | |
if lessThan nixVersion "1.12" then | |
fetchurl ({ inherit url; } // (optionalAttrs (!isNull name) { inherit name; })) | |
else | |
fetchurl attrs; | |
# Create the final "sources" from the config | |
mkSources = config: | |
mapAttrs ( | |
name: spec: | |
if builtins.hasAttr "outPath" spec | |
then abort | |
"The values in sources.json should not have an 'outPath' attribute" | |
else | |
spec // { outPath = replace name (fetch config.pkgs name spec); } | |
) config.sources; | |
# The "config" used by the fetchers | |
mkConfig = | |
{ sourcesFile ? if builtins.pathExists ./sources.json then ./sources.json else null | |
, sources ? if isNull sourcesFile then {} else builtins.fromJSON (builtins.readFile sourcesFile) | |
, system ? builtins.currentSystem | |
, pkgs ? mkPkgs sources system | |
}: rec { | |
# The sources, i.e. the attribute set of spec name to spec | |
inherit sources; | |
# The "pkgs" (evaluated nixpkgs) to use for e.g. non-builtin fetchers | |
inherit pkgs; | |
}; | |
in | |
mkSources (mkConfig {}) // { __functor = _: settings: mkSources (mkConfig settings); } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment