commit cceb3f2ba712f5aadb33a2e4e7127c014df271fb
parent 488fdcd5ff6cce5dd19c4f25c9b9aecd8006d8a6
Author: Leah (ctucx) <git@ctu.cx>
Date: Wed, 20 Mar 2024 12:36:02 +0100
parent 488fdcd5ff6cce5dd19c4f25c9b9aecd8006d8a6
Author: Leah (ctucx) <git@ctu.cx>
Date: Wed, 20 Mar 2024 12:36:02 +0100
machines: add `coladose` `
3 files changed, 206 insertions(+), 0 deletions(-)
A
|
121
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
diff --git a/machines/coladose/0001-drm-i915-dsi-Go-back-to-the-previous-INIT_OTP-DISPLA.patch b/machines/coladose/0001-drm-i915-dsi-Go-back-to-the-previous-INIT_OTP-DISPLA.patch @@ -0,0 +1,121 @@ +From d66b7307f68403559faab9bcc1e1a32e813fbc64 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Ville=20Syrj=C3=A4l=C3=A4?= <ville.syrjala@linux.intel.com> +Date: Fri, 1 Mar 2024 19:43:35 +0200 +Subject: [PATCH] drm/i915/dsi: Go back to the previous INIT_OTP/DISPLAY_ON + order, mostly + +Reinstate commit 88b065943cb5 ("drm/i915/dsi: Do display on +sequence later on icl+"), for the most part. Turns out some +machines (eg. Chuwi Minibook X) really do need that updated order. +It is also the order the Windows driver uses. + +However we can't just undo the revert since that would again +break Lenovo 82TQ. After staring at the VBT sequences for both +machines I've concluded that the Lenovo 82TQ sequences look +somewhat broken: + - INIT_OTP is not present at all + - what should be in INIT_OTP is found in DISPLAY_ON + - what should be in DISPLAY_ON is found in BACKLIGHT_ON + (along with the actual backlight stuff) + +The Chuwi Minibook X on the other hand has a full complement +of sequences in its VBT. + +So let's try to deal with the broken sequences in the +Lenovo 82TQ VBT by simply swapping the (non-existent) +INIT_OTP sequence with the DISPLAY_ON sequence. Thus we +execute DISPLAY_ON when intending to execute INIT_OTP, +and execute nothing at all when intending to execute +DISPLAY_ON. That should be 100% equivalent to the +revert, for such broken VBTs. + +Cc: stable@vger.kernel.org +Fixes: dc524d05974f ("Revert "drm/i915/dsi: Do display on sequence later on icl+"") +References: https://gitlab.freedesktop.org/drm/intel/-/issues/10071 +Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/10334 +--- + drivers/gpu/drm/i915/display/icl_dsi.c | 3 +- + drivers/gpu/drm/i915/display/intel_bios.c | 39 +++++++++++++++++++++-- + 2 files changed, 39 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/i915/display/icl_dsi.c b/drivers/gpu/drm/i915/display/icl_dsi.c +index eda4a8b88590..ac456a2275db 100644 +--- a/drivers/gpu/drm/i915/display/icl_dsi.c ++++ b/drivers/gpu/drm/i915/display/icl_dsi.c +@@ -1155,7 +1155,6 @@ static void gen11_dsi_powerup_panel(struct intel_encoder *encoder) + } + + intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_INIT_OTP); +- intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DISPLAY_ON); + + /* ensure all panel commands dispatched before enabling transcoder */ + wait_for_cmds_dispatched_to_panel(encoder); +@@ -1256,6 +1255,8 @@ static void gen11_dsi_enable(struct intel_atomic_state *state, + /* step6d: enable dsi transcoder */ + gen11_dsi_enable_transcoder(encoder); + ++ intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_DISPLAY_ON); ++ + /* step7: enable backlight */ + intel_backlight_enable(crtc_state, conn_state); + intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_BACKLIGHT_ON); +diff --git a/drivers/gpu/drm/i915/display/intel_bios.c b/drivers/gpu/drm/i915/display/intel_bios.c +index 343726de9aa7..e989cb012637 100644 +--- a/drivers/gpu/drm/i915/display/intel_bios.c ++++ b/drivers/gpu/drm/i915/display/intel_bios.c +@@ -1955,8 +1955,8 @@ static int get_init_otp_deassert_fragment_len(struct drm_i915_private *i915, + * these devices we split the init OTP sequence into a deassert sequence and + * the actual init OTP part. + */ +-static void fixup_mipi_sequences(struct drm_i915_private *i915, +- struct intel_panel *panel) ++static void vlv_fixup_mipi_sequences(struct drm_i915_private *i915, ++ struct intel_panel *panel) + { + u8 *init_otp; + int len; +@@ -2000,6 +2000,41 @@ static void fixup_mipi_sequences(struct drm_i915_private *i915, + panel->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP] = init_otp + len - 1; + } + ++/* ++ * Some machines (eg. Lenovo 82TQ) appear to have broken ++ * VBT sequences: ++ * - INIT_OTP is not present at all ++ * - what should be in INIT_OTP is in DISPLAY_ON ++ * - what should be in DISPLAY_ON is in BACKLIGHT_ON ++ * (along with the actual backlight stuff) ++ * ++ * To make those work we simply swap DISPLAY_ON and INIT_OTP. ++ * ++ * TODO: Do we need to limit this to specific machines, ++ * or examine the contents of the sequences to ++ * avoid false positives? ++ */ ++static void icl_fixup_mipi_sequences(struct drm_i915_private *i915, ++ struct intel_panel *panel) ++{ ++ if (!panel->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP] && ++ panel->vbt.dsi.sequence[MIPI_SEQ_DISPLAY_ON]) { ++ drm_dbg_kms(&i915->drm, "Broken VBT: Swapping INIT_OTP and DISPLAY_ON sequences\n"); ++ ++ swap(panel->vbt.dsi.sequence[MIPI_SEQ_INIT_OTP], ++ panel->vbt.dsi.sequence[MIPI_SEQ_DISPLAY_ON]); ++ } ++} ++ ++static void fixup_mipi_sequences(struct drm_i915_private *i915, ++ struct intel_panel *panel) ++{ ++ if (DISPLAY_VER(i915) >= 11) ++ icl_fixup_mipi_sequences(i915, panel); ++ else if (IS_VALLEYVIEW(i915)) ++ vlv_fixup_mipi_sequences(i915, panel); ++} ++ + static void + parse_mipi_sequence(struct drm_i915_private *i915, + struct intel_panel *panel) +-- +2.43.0 +
diff --git a/machines/coladose/configuration.nix b/machines/coladose/configuration.nix @@ -0,0 +1,46 @@ +{ config, lib, pkgs, ... }: + +{ + + imports = [ + ./hardware-configuration.nix + ]; + + deployment.allowLocalDeployment = true; + + ctucxConfig.monitoring.exporters.enable = true; + + # Use the systemd-boot EFI boot loader. + boot = { + loader.systemd-boot.enable = true; + loader.efi.canTouchEfiVariables = true; + + kernelParams = [ "fbcon=rotate:1" ]; + kernelPackages = pkgs.linuxPackages_latest; + kernelPatches = [ + { + name = "fix DSI init"; + patch = ./0001-drm-i915-dsi-Go-back-to-the-previous-INIT_OTP-DISPLA.patch; + } + ]; + }; + + networking.wireless.iwd = { + enable = true; + settings = { + IPv6 = { + Enabled = true; + }; + Settings = { + AutoConnect = true; + }; + }; + }; + + services.openssh.enable = true; + + system.stateVersion = "23.11"; + home-manager.users.leah.home.stateVersion = "23.11"; + +} +
diff --git a/machines/coladose/hardware-configuration.nix b/machines/coladose/hardware-configuration.nix @@ -0,0 +1,39 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + +{ + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "xhci_pci" "nvme" "usbhid" "sdhci_pci" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; + + fileSystems."/" = + { device = "/dev/disk/by-uuid/081a8591-d8e4-4b9a-9bfd-9f23d2ebd9e1"; + fsType = "ext4"; + }; + + boot.initrd.luks.devices."root".device = "/dev/disk/by-uuid/de5910c3-bad4-420c-a5b1-90e051d95e5f"; + + fileSystems."/boot" = + { device = "/dev/disk/by-uuid/88C4-B58C"; + fsType = "vfat"; + }; + + swapDevices = [ ]; + + # Enables DHCP on each ethernet and wireless interface. In case of scripted networking + # (the default) this is the recommended approach. When using systemd-networkd it's + # still possible to use this option, but it's recommended to use it in conjunction + # with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`. + networking.useDHCP = lib.mkDefault true; + # networking.interfaces.enp0s20f0u3u1.useDHCP = lib.mkDefault true; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +}