From 82fe98a93c73200f93ed9df56766c43c71bfd1e3 Mon Sep 17 00:00:00 2001 From: Mykola Grymalyuk Date: Mon, 11 Oct 2021 15:50:07 -0600 Subject: [PATCH] Add Software Based deMUX Closes https://github.com/dortania/OpenCore-Legacy-Patcher/issues/559 --- CHANGELOG.md | 3 + payloads/ACPI/SSDT-DGPU.aml | Bin 0 -> 462 bytes payloads/ACPI/Source/SSDT-DGPU.dsl | 103 ++++++++++++++++++ payloads/Config/config.plist | 84 ++++++++++---- .../Kexts/Misc/AMDGPUWakeHandler-v1.0.0.zip | Bin 0 -> 9627 bytes resources/build.py | 13 +++ resources/cli_menu.py | 29 +++++ resources/constants.py | 13 +++ resources/sys_patch.py | 11 +- resources/validation.py | 1 + 10 files changed, 236 insertions(+), 21 deletions(-) create mode 100644 payloads/ACPI/SSDT-DGPU.aml create mode 100644 payloads/ACPI/Source/SSDT-DGPU.dsl create mode 100644 payloads/Kexts/Misc/AMDGPUWakeHandler-v1.0.0.zip diff --git a/CHANGELOG.md b/CHANGELOG.md index b61de996e..c4879af5f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,9 @@ - Add EFICheckDisabler - Based off stripped RestrictEvents.kext - Add SimpleMSR to disable missing battery throttling on Nehalem+ MacBooks +- Implement software demux patch set for 2011 15/17" MacBook Pros + - Alternative to hardware demux + - Adds [AMDGPUWakeHandler](https://github.com/blackgate/AMDGPUWakeHandler) ## 0.2.5 diff --git a/payloads/ACPI/SSDT-DGPU.aml b/payloads/ACPI/SSDT-DGPU.aml new file mode 100644 index 0000000000000000000000000000000000000000..17290002ecd59112f8182c6adbda68d52eab7879 GIT binary patch literal 462 zcmWFzb_qGh$iTpq>k<^==joW@9uOMu@8-rJz`)??7viJJsi3exoIx~3FFx2QKET=2 zfDOp;4~`6GU=VPWgo{Quc>22sFmf}na|K2>s)0ES4jcjIh6WrA9^3)uMivm-1jJ_# zFgG>e5OEZZ_w@5*DB!-p4l;3pr$Dq&OuT=vXTkze5XI|~SX7>w2UH-S4ptxvmgV)y z%qy(`ioRe5i^@Pm!!z?z^2>`Aj0_A6fsz*?W-4GxDg*}*RA2-&;S$6IOykXflGkua zngb=TPath SSDT-PCI.aml + + Enabled + + Comment + Requests power off of dGPU for Sandy Bridge MacBook Pros + Path + SSDT-DGPU.aml + Delete @@ -156,6 +164,36 @@ TableSignature RFNEVA== + + Base + \_SB.PCI0 + BaseSkip + 0 + Comment + _INI to XINI + Count + 1 + Enabled + + Find + X0lOSQ== + Limit + 0 + Mask + + OemTableId + + Replace + WElOSQ== + ReplaceMask + + Skip + 0 + TableLength + 0 + TableSignature + RFNEVA== + Quirks @@ -1006,6 +1044,24 @@ PlistPath Contents/Info.plist + + Arch + x86_64 + BundlePath + AMDGPUWakeHandler.kext + Comment + Force disable dGPU on wake + Enabled + + ExecutablePath + Contents/MacOS/AMDGPUWakeHandler + MaxKernel + + MinKernel + + PlistPath + Contents/Info.plist + Block @@ -1158,27 +1214,21 @@ Enabled Find - - AHQjSIs= - + AHQjSIs= Identifier kernel Limit 800 Mask - - + MaxKernel 21.1.0 MinKernel 20.4.0 Replace - - AOsjSIs= - + AOsjSIs= ReplaceMask - - + Skip 0 @@ -1194,27 +1244,21 @@ Enabled Find - - ukgBAAAx9g== - + ukgBAAAx9g== Identifier kernel Limit 256 Mask - - + MaxKernel 21.1.0 MinKernel 20.4.0 Replace - - ukgBAADrBQ== - + ukgBAADrBQ== ReplaceMask - - + Skip 0 diff --git a/payloads/Kexts/Misc/AMDGPUWakeHandler-v1.0.0.zip b/payloads/Kexts/Misc/AMDGPUWakeHandler-v1.0.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..7cad8c581f32c1b7021d2e57e3674772615f6837 GIT binary patch literal 9627 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 Vx-!{`W1pu8zXrmJe>i{q^gl<`saya6 literal 0 HcmV?d00001 diff --git a/resources/build.py b/resources/build.py index 5a94a7dd9..35aa55993 100644 --- a/resources/build.py +++ b/resources/build.py @@ -597,6 +597,19 @@ class BuildOpenCore: self.config["DeviceProperties"]["Add"][tb_device_path] = {"class-code": binascii.unhexlify("FFFFFFFF"), "device-id": binascii.unhexlify("FFFF0000")} + if self.constants.software_demux is True and self.model in ["MacBookPro8,2", "MacBookPro8,3"]: + print("- Enabling software demux") + # Add ACPI patches + self.get_item_by_kv(self.config["ACPI"]["Add"], "Path", "SSDT-DGPU.aml")["Enabled"] = True + self.get_item_by_kv(self.config["ACPI"]["Patch"], "Comment", "_INI to XINI")["Enabled"] = True + shutil.copy(self.constants.demux_ssdt_path, self.constants.acpi_path) + # Disable dGPU + # IOACPIPlane:/_SB/PCI0@0/P0P2@10000/GFX0@0 + self.config["DeviceProperties"]["Add"]["PciRoot(0x0)/Pci(0x1,0x0)/Pci(0x0,0x0)"] = {"class-code": binascii.unhexlify("FFFFFFFF"), "device-id": binascii.unhexlify("FFFF0000"), "IOName": "Dortania Disabled Card", "name": "Dortania Disabled Card"} + self.config["DeviceProperties"]["Delete"]["PciRoot(0x0)/Pci(0x1,0x0)/Pci(0x0,0x0)"] = ["class-code", "device-id", "IOName", "name"] + # Add AMDGPUWakeHandler + self.enable_kext("AMDGPUWakeHandler.kext", self.constants.gpu_wake_version, self.constants.gpu_wake_path) + # Bluetooth Detection if not self.constants.custom_model and self.computer.bluetooth_chipset: if self.computer.bluetooth_chipset in ["BRCM2070 Hub", "BRCM2046 Hub"]: diff --git a/resources/cli_menu.py b/resources/cli_menu.py index 1202e8e08..411433f7d 100644 --- a/resources/cli_menu.py +++ b/resources/cli_menu.py @@ -678,6 +678,34 @@ for Windows may prefer to only work with the dGPU and eGPU active. else: self.dGPU_switch_support() + def set_software_demux(self): + utilities.cls() + utilities.header(["Set Software Demux"]) + print( + """ +For MacBookPro8,2/3 users, it's very common for the dGPU to fail and +thus require the user to disable them via the 'gpu-power-prefs' +nvram argument. + +However this solution still allows the dGPU to pull power (6-7w). Enabling +this option will simulate a demuxed enviroment allowing the dGPU to pull nearly +no power and have the iGPU handle all tasks including brightness control. + +Note: this option requires dGPU to be disabled via NVRAM: +https://dortania.github.io/OpenCore-Legacy-Patcher/ACCEL.html#unable-to-switch-gpus-on-2011-15-and-17-macbook-pros + """ + ) + + change_menu = input("Set Software Demux?(y/n/q): ") + if change_menu in {"y", "Y", "yes", "Yes"}: + self.constants.software_demux = True + elif change_menu in {"n", "N", "no", "No"}: + self.constants.software_demux = False + elif change_menu in {"q", "Q", "Quit", "quit"}: + print("Returning to previous menu") + else: + self.set_software_demux() + def set_battery_throttle(self): utilities.cls() utilities.header(["Disable Firmware Throttling"]) @@ -948,6 +976,7 @@ system_profiler SPHardwareDataType | grep 'Model Identifier' f"Set Windows GMUX support:\tCurrently {self.constants.dGPU_switch}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).dGPU_switch_support, ], + [f"Set Software Demux:\t\tCurrently {self.constants.software_demux}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).set_software_demux], [f"Disable Battery Throttling:\tCurrently {self.constants.disable_msr_power_ctl}", MenuOptions(self.constants.custom_model or self.constants.computer.real_model, self.constants).set_battery_throttle], ] diff --git a/resources/constants.py b/resources/constants.py index fbdfc8601..08702bbc4 100644 --- a/resources/constants.py +++ b/resources/constants.py @@ -76,6 +76,10 @@ class Constants: ## https://github.com/arter97/SimpleMSR/ self.simplemsr_version = "1.0.0" # SimpleMSR + ## blackgate + ## https://github.com/blackgate/AMDGPUWakeHandler + self.gpu_wake_version = "1.0.0" + # Get resource path self.current_path = Path(__file__).parent.parent.resolve() self.payload_path = self.current_path / Path("payloads") @@ -152,6 +156,7 @@ class Constants: self.force_surplus = False # Force SurPlus patch in newer OSes self.force_latest_psp = False # Force latest PatcherSupportPkg self.disable_msr_power_ctl = False # Disable MSR Power Control (missing battery throttling) + self.software_demux = False # Enable Software Demux patch set # OS Versions ## Based off Major Kernel Version @@ -200,6 +205,10 @@ class Constants: @property def windows_ssdt_path(self): return self.payload_path / Path("ACPI/SSDT-PCI.aml") + + @property + def demux_ssdt_path(self): + return self.payload_path / Path("ACPI/SSDT-DGPU.aml") # Drivers @property @@ -334,6 +343,10 @@ class Constants: @property def simplemsr_path(self): return self.payload_kexts_path / Path(f"Misc/SimpleMSR-v{self.simplemsr_version}.zip") + + @property + def gpu_wake_path(self): + return self.payload_kexts_path / Path(f"Misc/AMDGPUWakeHandler-v{self.gpu_wake_version}.zip") @property def latebloom_path(self): diff --git a/resources/sys_patch.py b/resources/sys_patch.py index bacd74d9a..ce825f1cd 100644 --- a/resources/sys_patch.py +++ b/resources/sys_patch.py @@ -721,13 +721,22 @@ set million colour before rebooting""" self.amd_ts2 = False self.iron_gpu = False self.sandy_gpu = False + + def check_dgpu_status(self): + dgpu = self.constants.computer.dgpu + if dgpu: + if dgpu.class_code and dgpu.class_code == 0xFFFFFFFF: + # If dGPU is disabled via class-codes, assume demuxed + return False + return True + return False def detect_demux(self): # If GFX0 is missing, assume machine was demuxed # -wegnoegpu would also trigger this, so ensure arg is not present if not "-wegnoegpu" in (utilities.get_nvram("boot-args") or ""): igpu = self.constants.computer.igpu - dgpu = self.constants.computer.dgpu + dgpu = self.check_dgpu_status() if igpu and not dgpu: return True return False diff --git a/resources/validation.py b/resources/validation.py index 4f91d4145..33fe9ba54 100644 --- a/resources/validation.py +++ b/resources/validation.py @@ -67,5 +67,6 @@ def validate(settings): settings.enable_wake_on_wlan = True settings.disable_tb = True settings.force_surplus = True + settings.software_demux = True build_prebuilt() build_dumps()