diff options
Diffstat (limited to 'TOOLS/patch_configs.py')
-rwxr-xr-x | TOOLS/patch_configs.py | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/TOOLS/patch_configs.py b/TOOLS/patch_configs.py new file mode 100755 index 0000000..a1447e0 --- /dev/null +++ b/TOOLS/patch_configs.py @@ -0,0 +1,186 @@ +#!/usr/bin/env python3 +import sys +import os + +CONFIG_FILE_EXT = ".config" + +UNSET = "unset" +DISABLE = "n" +ENABLE = "y" +MODULE = "m" + +GENERIC_PATCHES = [ + # kernel-fsync config + ["I2C_NCT6775", None, MODULE], + ["ZENIFY", None, ENABLE], + ["FB_SIMPLE", UNSET, ENABLE], + ["FB_EFI", UNSET, ENABLE], + ["FB_VESA", UNSET, ENABLE], + ["ACPI_EC_DEBUGFS", UNSET, MODULE], + + # device specific config + # Microsoft Surface + ["HID_IPTS", None, MODULE], + ["HID_ITHC", None, MODULE], + ["SURFACE_BOOK1_DGPU_SWITCH", None, MODULE], + ["VIDEO_DW9719", None, MODULE], + ["IPC_CLASSES", None, ENABLE], + ["LEDS_TPS68470", None, MODULE], + # Lenovo Legion + ["LEGION_LAPTOP", None, MODULE], +] + +ARCH_PATCHES = { + "x86_64": [ + # Steam Deck + ["MFD_STEAMDECK", None, MODULE], + ["SENSORS_STEAMDECK", None, MODULE], + ["LEDS_STEAMDECK", None, MODULE], + ["EXTCON_STEAMDECK", None, MODULE], + # Required by the Steam Deck for DRD, otherwise USB is borked + ["USB_DWC3", None, MODULE], + ["USB_DWC3_ULPI", None, ENABLE], + ["USB_DWC3_DUAL_ROLE", None, ENABLE], + ["USB_DWC3_PCI", None, MODULE], + ["USB_DWC3_HAPS", None, MODULE], + ["USB_DWC2", None, MODULE], + ["USB_DWC2_DUAL_ROLE", None, ENABLE], + ["USB_DWC2_PCI", None, MODULE], + ["USB_DWC2_DEBUG", None, UNSET], + ["USB_DWC2_TRACK_MISSED_SOFS", None, UNSET], + ["USB_CHIPIDEA", None, MODULE], + ["USB_CHIPIDEA_UDC", None, ENABLE], + ["USB_CHIPIDEA_HOST", None, ENABLE], + ["USB_CHIPIDEA_PCI", None, MODULE], + ["USB_CHIPIDEA_MSM", None, MODULE], + ["USB_CHIPIDEA_GENERIC", None, MODULE], + ["USB_ISP1760", None, MODULE], + ["USB_ISP1760_HCD", None, ENABLE], + ["USB_ISP1761_UDC", None, ENABLE], + ["USB_ISP1760_DUAL_ROLE", None, ENABLE], + ["USB_GADGET", None, MODULE], + ["USB_GADGET_VBUS_DRAW", None, "2"], + ["USB_GADGET_STORAGE_NUM_BUFFERS", None, "2"], + ["USB_GADGET_DEBUG", None, UNSET], + ["USB_GADGET_DEBUG_FILES", None, UNSET], + ["USB_GADGET_DEBUG_FS", None, UNSET], + ["U_SERIAL_CONSOLE", None, UNSET], + ["USB_R8A66597", None, UNSET], + ["USB_PXA27X", None, UNSET], + ["USB_MV_UDC", None, UNSET], + ["USB_MV_U3D", None, UNSET], + ["USB_M66592", None, UNSET], + ["USB_BDC_UDC", None, UNSET], + ["USB_AMD5536UDC", None, UNSET], + ["USB_NET2272", None, UNSET], + ["USB_NET2280", None, UNSET], + ["USB_GOKU", None, UNSET], + ["USB_EG20T", None, UNSET], + ["USB_DUMMY_HCD", None, UNSET], + ["USB_CONFIGFS", None, UNSET], + ["PHY_SAMSUNG_USB2", None, UNSET], + ], +} + +def generate_line(c, v) -> str: + if v == UNSET: + v = f"# {c} is not set" + else: + v = f"{c}={v}" + return v + +def apply_patches(data: str, patches, flags = None) -> str: + if flags is None: + flags = [] + + for name, *val in patches: + c = f"CONFIG_{name}" + + s = f"{c}=" + u = f"# {c} " + + if len(val) == 3 and val[2] not in flags: + print(f" Skipping {name}") + continue + + if any(x in data for x in [s, u]): + try: + i = data.index(s) + except ValueError: + i = data.index(u) + + try: + line_start = data.rindex("\n", 0, i)+1 + except ValueError: + # No newline before the config? + # Probably the first line in the file + line_start = 0 + + line_end = data.index("\n", line_start) + + line = data[line_start:line_end] + + if val[0] is not None: + # verify we found what we expect + l = generate_line(c, val[0]) + if l != line: + #print(f" Could not apply {name}: could not find expected config") + continue + data = data[:line_start] + generate_line(c, val[1]) + data[line_end:] + + elif val[0] is None: + # relevant entry does not exist yet and we don't want to replace anything specific + data += generate_line(c, val[1]) + data += "\n" + else: + print(f" Couldn't find {name}") + exit(1) + + return data + +CONFIG_FILES = sys.argv[1:] +if not CONFIG_FILES: + print("No config files given") + exit(1) + +# Verify all given inputs first before working with them +for file in CONFIG_FILES: + if not os.path.isfile(file): + print(f"{file} does not exist") + exit(1) + + filename = os.path.basename(file) + if not filename.endswith(CONFIG_FILE_EXT): + print(f"{file} does not have the right file extension") + exit(1) + + namesegs = filename[:-len(CONFIG_FILE_EXT)].split("-") + if len(namesegs) < 3: + print(f"{file} does not have the right number of segments") + exit(1) + +for file in CONFIG_FILES: + filename = os.path.basename(file) + print(f"Processing {filename}...") + + namesegs = filename[:-len(CONFIG_FILE_EXT)].split("-") + namesegs.pop(0) + + arch = namesegs.pop(0) + flavor = namesegs.pop(-1) + flags = namesegs + if "debug" not in flags: + flags.append("release") + + with open(file, "r+") as fd: + data = fd.read() + fd.seek(0) + + data = apply_patches(data, GENERIC_PATCHES, flags) + if arch in ARCH_PATCHES: + data = apply_patches(data, ARCH_PATCHES[arch], flags) + + fd.write(data) + fd.truncate() + + data = open(file, "r").read() |