Skip to content
Draft
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions microsoft/surface/common/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ let
supportedKernels =
let
lts-kernel = {
version = "6.18.13";
hash = "sha256-7Sw8Vf045oNsCU/ONW8lZ/lRYTC3M1SimFeWA2jFaH8=";
version = "6.19.8";
hash = "sha256-qtpHItuLz6C5cyhRhW1AUIK2pPouOrBnvo2xfN0RWzg=";
};

in
Expand All @@ -38,8 +38,8 @@ let
linux-surface = pkgs.fetchFromGitHub {
owner = "linux-surface";
repo = "linux-surface";
rev = "829ceccd5970ed3621a30d9fcfb2fe6584a3aab7";
hash = "sha256-H/qjP2dR5yjUvHUhI6pis+EHHSRXxc4+c4zir/pDA54=";
rev = "debian-6.19.8-1";
hash = "sha256-FY8zblKKJca2pfFr8gbl1+zk1B89FgzEYYSxDIzmQgA=";
};

# Fetch and build the kernel
Expand Down
165 changes: 165 additions & 0 deletions microsoft/surface/common/kernel/6.19/patches.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
{
lib,
kernel ? lib.kernel,
patchSrc,
version,
}:

[
{
name = "microsoft-surface-patches-linux-${version}";
patch = null;
structuredExtraConfig = with kernel; {
##
## Surface Aggregator Module
##
CONFIG_SURFACE_AGGREGATOR = module;
# CONFIG_SURFACE_AGGREGATOR_ERROR_INJECTION is not set
CONFIG_SURFACE_AGGREGATOR_BUS = yes;
CONFIG_SURFACE_AGGREGATOR_CDEV = module;
CONFIG_SURFACE_AGGREGATOR_HUB = module;
CONFIG_SURFACE_AGGREGATOR_REGISTRY = module;
CONFIG_SURFACE_AGGREGATOR_TABLET_SWITCH = module;

CONFIG_SURFACE_ACPI_NOTIFY = module;
CONFIG_SURFACE_DTX = module;
CONFIG_SURFACE_PLATFORM_PROFILE = module;

CONFIG_SURFACE_HID = module;
CONFIG_SURFACE_KBD = module;

CONFIG_BATTERY_SURFACE = module;
CONFIG_CHARGER_SURFACE = module;

CONFIG_SENSORS_SURFACE_TEMP = module;
CONFIG_SENSORS_SURFACE_FAN = module;

CONFIG_RTC_DRV_SURFACE = module;

##
## Surface Hotplug
##
CONFIG_SURFACE_HOTPLUG = module;

##
## IPTS and ITHC touchscreen
##
## This only enables the user interface for IPTS/ITHC data.
## For the touchscreen to work, you need to install iptsd.
##
CONFIG_HID_IPTS = module;
CONFIG_HID_ITHC = module;
CONFIG_INTEL_THC_HID = module;
CONFIG_INTEL_QUICKSPI = module;

##
## Cameras: IPU3
##
CONFIG_VIDEO_DW9719 = module;
CONFIG_VIDEO_IPU3_IMGU = module;
CONFIG_VIDEO_IPU3_CIO2 = module;
CONFIG_IPU_BRIDGE = module;
CONFIG_INTEL_SKL_INT3472 = module;
CONFIG_REGULATOR_TPS68470 = module;
CONFIG_COMMON_CLK_TPS68470 = module;
CONFIG_LEDS_TPS68470 = module;

##
## Cameras: Sensor drivers
##
CONFIG_VIDEO_OV5693 = module;
CONFIG_VIDEO_OV7251 = module;
CONFIG_VIDEO_OV8865 = module;

##
## Surface 3: atomisp causes problems (see issue #1095). Disable it for now.
##
# CONFIG_INTEL_ATOMISP is not set

##
## ALS Sensor for Surface Book 3, Surface Laptop 3, Surface Pro 7
##
CONFIG_APDS9960 = module;

##
## Build-in UFS support (required for some Surface Go devices)
##
CONFIG_SCSI_UFSHCD = module;
CONFIG_SCSI_UFSHCD_PCI = module;

##
## Other Drivers
##
CONFIG_INPUT_SOC_BUTTON_ARRAY = module;
CONFIG_SURFACE_3_POWER_OPREGION = module;
CONFIG_SURFACE_PRO3_BUTTON = module;
CONFIG_SURFACE_GPE = module;
CONFIG_SURFACE_BOOK1_DGPU_SWITCH = module;
CONFIG_HID_SURFACE = module;
};
}
{
name = "ms-surface/0001-secureboot";
patch = patchSrc + "/0001-secureboot.patch";
}
{
name = "ms-surface/0002-surface3";
patch = patchSrc + "/0002-surface3.patch";
}
{
name = "ms-surface/0003-mwifiex";
patch = patchSrc + "/0003-mwifiex.patch";
}
{
name = "ms-surface/0004-ath10k";
patch = patchSrc + "/0004-ath10k.patch";
}
{
name = "ms-surface/0005-ipts";
patch = patchSrc + "/0005-ipts.patch";
}
{
name = "ms-surface/0006-ithc";
patch = patchSrc + "/0006-ithc.patch";
}
{
name = "ms-surface/0007-surface-sam";
patch = patchSrc + "/0007-surface-sam.patch";
}
{
name = "ms-surface/0008-surface-sam-over-hid";
patch = patchSrc + "/0008-surface-sam-over-hid.patch";
}
{
name = "ms-surface/0009-surface-button";
patch = patchSrc + "/0009-surface-button.patch";
}
{
name = "ms-surface/0010-surface-typecover";
patch = patchSrc + "/0010-surface-typecover.patch";
}
{
name = "ms-surface/0011-surface-shutdown";
patch = patchSrc + "/0011-surface-shutdown.patch";
}
{
name = "ms-surface/0012-surface-gpe";
patch = patchSrc + "/0012-surface-gpe.patch";
}
{
name = "ms-surface/0013-cameras";
patch = patchSrc + "/0013-cameras.patch";
}
{
name = "ms-surface/0014-amd-gpio";
patch = patchSrc + "/0014-amd-gpio.patch";
}
{
name = "ms-surface/0015-rtc";
patch = patchSrc + "/0015-rtc.patch";
}
{
name = "ms-surface/0016-hid-surface";
patch = patchSrc + "/0016-hid-surface.patch";
}
]
136 changes: 136 additions & 0 deletions microsoft/surface/common/kernel/update.py
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's possible there's already a more cared for or battle-tested script than this, @Mic92 ?

Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
#!/usr/bin/env python3

import json
import os
import re
import subprocess

KERNEL_VERSION = os.getenv("KERNEL", "6.19.8")
LINUX_SURFACE_VERSION = os.getenv("LINUX_SURFACE", "debian-6.19.8-1")


class Version:
def __init__(self, version: str):
self.version = version

def __str__(self) -> str:
return self.version

@property
def version(self) -> str:
return self.__version

@version.setter
def version(self, version):
self.__version = version
self.__split()

def __split(self):
suffix = ""
numbers = self.__version.split(".", 2)
self.major = numbers[0]
self.minor = numbers[1]
try:
suffix = re.match(r'(\d+|)(\D.*|)$', numbers[2])
except Exception:
print(f"{numbers=}")
raise

try:
self.patch = suffix.group(1)
self.pre_release = suffix.group(2)
except Exception:
print(f"{numbers=} {suffix=}")
raise


class NixPrefetchMessage:
def __init__(self, version: str, download_type: str):
self.version = Version(version)
self.download_type = download_type

def message(self):
return f"# Version {self.version}, {self.download_type}: {self.download_hash!r}"


class NixPrefetch(NixPrefetchMessage):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.download_metadata = {}

@property
def download_hash(self):
try:
return self.download_metadata["hash"]
except Exception:
print(f"{self.download_metadata=}")
raise

def extract_metadata(self, json_output):
self.download_metadata = json.loads(json_output)
return self

def prefetch(self):
out = subprocess.run(self.command, stdout=subprocess.PIPE)
out.check_returncode()
try:
self.extract_metadata(out.stdout)
except subprocess.CalledProcessError as e:
print(out.stdout)
print(e)
raise
return self


class NixPrefetchFile(NixPrefetch):
@property
def command(self):
return ["nix", "store", "prefetch-file", "--json", self.url]


class NixPrefetchGithub(NixPrefetch):
def __init__(self, owner: str, repo: str, **kwargs):
super().__init__(**kwargs)
self.owner = owner
self.repo = repo

@property
def command(self):
return ["nix-prefetch-github", "--rev", str(self.version), self.owner, self.repo]


class NixPrefetchLinuxKernel(NixPrefetchFile):
def __init__(self, **kwargs):
super().__init__(download_type="Linux Kernel", **kwargs)

@property
def url(self):
return f"https://cdn.kernel.org/pub/linux/kernel/v{self.version.major}.x/linux-{self.version}.tar.xz"


class NixPrefetchSurfacePatch(NixPrefetchGithub):
def __init__(self, **kwargs):
super().__init__(
download_type="Microsoft Surface Kernel Patch",
owner="linux-surface",
repo="linux-surface",
**kwargs,
)


#####


def main():
message = "\n".join(
[
NixPrefetchLinuxKernel(version=KERNEL_VERSION).prefetch().message(),
NixPrefetchSurfacePatch(version=LINUX_SURFACE_VERSION).prefetch().message(),
]
)
print(message)
with open("../default.nix", "a") as file:
print(message, file=file)


main()