mirror of
https://github.com/dortania/OpenCore-Legacy-Patcher.git
synced 2026-04-14 20:58:21 +10:00
574 lines
33 KiB
Python
574 lines
33 KiB
Python
# Class for handling Graphics and Audio Patches, invocation from build.py
|
|
# Copyright (C) 2020-2023, Dhinak G, Mykola Grymalyuk
|
|
|
|
import shutil
|
|
import logging
|
|
import binascii
|
|
|
|
from pathlib import Path
|
|
|
|
from resources import constants, device_probe, utilities
|
|
from resources.build import support
|
|
from data import smbios_data, model_array, os_data, cpu_data, video_bios_data
|
|
|
|
|
|
class BuildGraphicsAudio:
|
|
"""
|
|
Build Library for Graphics and Audio Support
|
|
|
|
Invoke from build.py
|
|
"""
|
|
|
|
def __init__(self, model: str, global_constants: constants.Constants, config: dict) -> None:
|
|
self.model: str = model
|
|
self.config: dict = config
|
|
self.constants: constants.Constants = global_constants
|
|
self.computer: device_probe.Computer = self.constants.computer
|
|
|
|
self.gfx0_path = None
|
|
|
|
self._build()
|
|
|
|
|
|
def _build(self) -> None:
|
|
"""
|
|
Kick off Graphics and Audio Build Process
|
|
"""
|
|
|
|
self._imac_mxm_patching()
|
|
self._graphics_handling()
|
|
self._audio_handling()
|
|
self._firmware_handling()
|
|
self._spoof_handling()
|
|
self._ioaccel_workaround()
|
|
|
|
|
|
def _graphics_handling(self) -> None:
|
|
"""
|
|
Graphics Handling
|
|
|
|
Primarily for Mac Pros and systems with Nvidia Maxwell/Pascal GPUs
|
|
"""
|
|
|
|
if self.constants.allow_oc_everywhere is False and self.constants.serial_settings != "None":
|
|
if not support.BuildSupport(self.model, self.constants, self.config).get_kext_by_bundle_path("WhateverGreen.kext")["Enabled"] is True:
|
|
support.BuildSupport(self.model, self.constants, self.config).enable_kext("WhateverGreen.kext", self.constants.whatevergreen_version, self.constants.whatevergreen_path)
|
|
|
|
# Mac Pro handling
|
|
if self.model in model_array.MacPro:
|
|
if not self.constants.custom_model:
|
|
for i, device in enumerate(self.computer.gpus):
|
|
logging.info(f"- Found dGPU ({i + 1}): {utilities.friendly_hex(device.vendor_id)}:{utilities.friendly_hex(device.device_id)}")
|
|
self.config["#Revision"][f"Hardware-MacPro-dGPU-{i + 1}"] = f"{utilities.friendly_hex(device.vendor_id)}:{utilities.friendly_hex(device.device_id)}"
|
|
|
|
if device.pci_path and device.acpi_path:
|
|
logging.info(f"- Found dGPU ({i + 1}) at {device.pci_path}")
|
|
if isinstance(device, device_probe.AMD):
|
|
logging.info("- Adding Mac Pro, Xserve DRM patches")
|
|
self.config["DeviceProperties"]["Add"][device.pci_path] = {"shikigva": 128, "unfairgva": 1, "rebuild-device-tree": 1, "agdpmod": "pikera", "enable-gva-support": 1}
|
|
elif isinstance(device, device_probe.NVIDIA):
|
|
logging.info("- Enabling Nvidia Output Patch")
|
|
self.config["DeviceProperties"]["Add"][device.pci_path] = {"rebuild-device-tree": 1, "agdpmod": "vit9696"}
|
|
self.config["UEFI"]["Quirks"]["ForgeUefiSupport"] = True
|
|
self.config["UEFI"]["Quirks"]["ReloadOptionRoms"] = True
|
|
|
|
else:
|
|
logging.info(f"- Failed to find Device path for dGPU {i + 1}")
|
|
if isinstance(device, device_probe.AMD):
|
|
logging.info("- Adding Mac Pro, Xserve DRM patches")
|
|
if "shikigva=128 unfairgva=1" not in self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"]:
|
|
logging.info("- Falling back to boot-args")
|
|
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " shikigva=128 unfairgva=1 agdpmod=pikera radgva=1" + (
|
|
" -wegtree" if "-wegtree" not in self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] else ""
|
|
)
|
|
elif isinstance(device, device_probe.NVIDIA):
|
|
logging.info("- Enabling Nvidia Output Patch")
|
|
if "-wegtree agdpmod=vit9696" not in self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"]:
|
|
logging.info("- Falling back to boot-args")
|
|
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -wegtree agdpmod=vit9696"
|
|
self.config["UEFI"]["Quirks"]["ForgeUefiSupport"] = True
|
|
self.config["UEFI"]["Quirks"]["ReloadOptionRoms"] = True
|
|
|
|
if not self.computer.gpus:
|
|
logging.info("- No socketed dGPU found")
|
|
|
|
else:
|
|
logging.info("- Adding Mac Pro, Xserve DRM patches")
|
|
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " shikigva=128 unfairgva=1 -wegtree"
|
|
|
|
if not support.BuildSupport(self.model, self.constants, self.config).get_kext_by_bundle_path("WhateverGreen.kext")["Enabled"] is True:
|
|
support.BuildSupport(self.model, self.constants, self.config).enable_kext("WhateverGreen.kext", self.constants.whatevergreen_version, self.constants.whatevergreen_path)
|
|
|
|
# Web Driver specific
|
|
if not self.constants.custom_model:
|
|
for i, device in enumerate(self.computer.gpus):
|
|
if isinstance(device, device_probe.NVIDIA):
|
|
if (
|
|
device.arch in [device_probe.NVIDIA.Archs.Fermi, device_probe.NVIDIA.Archs.Maxwell, device_probe.NVIDIA.Archs.Pascal] or
|
|
(self.constants.force_nv_web is True and device.arch in [device_probe.NVIDIA.Archs.Tesla, device_probe.NVIDIA.Archs.Kepler])
|
|
):
|
|
logging.info(f"- Enabling Web Driver Patches for GPU ({i + 1}): {utilities.friendly_hex(device.vendor_id)}:{utilities.friendly_hex(device.device_id)}")
|
|
if device.pci_path and device.acpi_path:
|
|
if device.pci_path in self.config["DeviceProperties"]["Add"]:
|
|
self.config["DeviceProperties"]["Add"][device.pci_path].update({"disable-metal": 1, "force-compat": 1})
|
|
else:
|
|
self.config["DeviceProperties"]["Add"][device.pci_path] = {"disable-metal": 1, "force-compat": 1}
|
|
support.BuildSupport(self.model, self.constants, self.config).enable_kext("WhateverGreen.kext", self.constants.whatevergreen_version, self.constants.whatevergreen_path)
|
|
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"].update({"nvda_drv": binascii.unhexlify("31")})
|
|
if "nvda_drv" not in self.config["NVRAM"]["Delete"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]:
|
|
self.config["NVRAM"]["Delete"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"] += ["nvda_drv"]
|
|
else:
|
|
if "ngfxgl=1 ngfxcompat=1" not in self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"]:
|
|
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " ngfxgl=1 ngfxcompat=1"
|
|
support.BuildSupport(self.model, self.constants, self.config).enable_kext("WhateverGreen.kext", self.constants.whatevergreen_version, self.constants.whatevergreen_path)
|
|
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"].update({"nvda_drv": binascii.unhexlify("31")})
|
|
if "nvda_drv" not in self.config["NVRAM"]["Delete"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]:
|
|
self.config["NVRAM"]["Delete"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"] += ["nvda_drv"]
|
|
|
|
def _backlight_path_detection(self) -> None:
|
|
"""
|
|
iMac MXM dGPU Backlight DevicePath Detection
|
|
"""
|
|
|
|
if not self.constants.custom_model and self.computer.dgpu and self.computer.dgpu.pci_path:
|
|
for i, device in enumerate(self.computer.gpus):
|
|
logging.info(f"- Found dGPU ({i + 1}): {utilities.friendly_hex(device.vendor_id)}:{utilities.friendly_hex(device.device_id)}")
|
|
self.config["#Revision"][f"Hardware-iMac-dGPU-{i + 1}"] = f"{utilities.friendly_hex(device.vendor_id)}:{utilities.friendly_hex(device.device_id)}"
|
|
|
|
if device.pci_path != self.computer.dgpu.pci_path:
|
|
logging.info("- device path and GFX0 Device path are different")
|
|
self.gfx0_path = device.pci_path
|
|
logging.info(f"- Set GFX0 Device Path: {self.gfx0_path}")
|
|
self.computer.dgpu.device_id = device.device_id
|
|
self.device_id = device.device_id
|
|
logging.info(f"- Found GPU Arch: {device.arch}")
|
|
if device.arch in [device_probe.AMD.Archs.Navi]:
|
|
self.computer.dgpu.arch = device.arch
|
|
|
|
# self.computer.dgpu.vendor_id = device.vendor_id
|
|
# self.vendor_id = device.vendor_id
|
|
else:
|
|
self.gfx0_path = self.computer.dgpu.pci_path
|
|
logging.info(f"- Found GFX0 Device Path: {self.gfx0_path}")
|
|
logging.info(f"- Found GPU Arch: {self.computer.dgpu.arch}")
|
|
|
|
else:
|
|
if not self.constants.custom_model:
|
|
logging.info("- Failed to find GFX0 Device path, falling back on known logic")
|
|
if self.model in ["iMac11,1", "iMac11,3"]:
|
|
self.gfx0_path = "PciRoot(0x0)/Pci(0x3,0x0)/Pci(0x0,0x0)"
|
|
elif self.model in ["iMac9,1", "iMac10,1"]:
|
|
self.gfx0_path = "PciRoot(0x0)/Pci(0xc,0x0)/Pci(0x0,0x0)"
|
|
else:
|
|
self.gfx0_path = "PciRoot(0x0)/Pci(0x1,0x0)/Pci(0x0,0x0)"
|
|
|
|
|
|
def _nvidia_mxm_patch(self, backlight_path) -> None:
|
|
"""
|
|
iMac Nvidia Kepler MXM Handler
|
|
"""
|
|
|
|
if not support.BuildSupport(self.model, self.constants, self.config).get_kext_by_bundle_path("WhateverGreen.kext")["Enabled"] is True:
|
|
# Ensure WEG is enabled as we need if for Backlight patching
|
|
support.BuildSupport(self.model, self.constants, self.config).enable_kext("WhateverGreen.kext", self.constants.whatevergreen_navi_version, self.constants.whatevergreen_navi_path)
|
|
if self.model in ["iMac11,1", "iMac11,2", "iMac11,3", "iMac10,1"]:
|
|
logging.info("- Adding Nvidia Brightness Control and DRM patches")
|
|
self.config["DeviceProperties"]["Add"][backlight_path] = {
|
|
"applbkl": binascii.unhexlify("01000000"),
|
|
"@0,backlight-control": binascii.unhexlify("01000000"),
|
|
"@0,built-in": binascii.unhexlify("01000000"),
|
|
"shikigva": 256,
|
|
"agdpmod": "vit9696",
|
|
}
|
|
if self.constants.custom_model and self.model == "iMac11,2":
|
|
# iMac11,2 can have either PciRoot(0x0)/Pci(0x3,0x0)/Pci(0x0,0x0) or PciRoot(0x0)/Pci(0x1,0x0)/Pci(0x0,0x0)
|
|
# Set both properties when we cannot run hardware detection
|
|
self.config["DeviceProperties"]["Add"]["PciRoot(0x0)/Pci(0x3,0x0)/Pci(0x0,0x0)"] = {
|
|
"applbkl": binascii.unhexlify("01000000"),
|
|
"@0,backlight-control": binascii.unhexlify("01000000"),
|
|
"@0,built-in": binascii.unhexlify("01000000"),
|
|
"shikigva": 256,
|
|
"agdpmod": "vit9696",
|
|
}
|
|
elif self.model in ["iMac12,1", "iMac12,2"]:
|
|
logging.info("- Adding Nvidia Brightness Control and DRM patches")
|
|
self.config["DeviceProperties"]["Add"][backlight_path] = {
|
|
"applbkl": binascii.unhexlify("01000000"),
|
|
"@0,backlight-control": binascii.unhexlify("01000000"),
|
|
"@0,built-in": binascii.unhexlify("01000000"),
|
|
"shikigva": 256,
|
|
"agdpmod": "vit9696",
|
|
}
|
|
logging.info("- Disabling unsupported iGPU")
|
|
self.config["DeviceProperties"]["Add"]["PciRoot(0x0)/Pci(0x2,0x0)"] = {
|
|
"name": binascii.unhexlify("23646973706C6179"),
|
|
"class-code": binascii.unhexlify("FFFFFFFF"),
|
|
}
|
|
shutil.copy(self.constants.backlight_injector_path, self.constants.kexts_path)
|
|
support.BuildSupport(self.model, self.constants, self.config).get_kext_by_bundle_path("BacklightInjector.kext")["Enabled"] = True
|
|
self.config["UEFI"]["Quirks"]["ForgeUefiSupport"] = True
|
|
self.config["UEFI"]["Quirks"]["ReloadOptionRoms"] = True
|
|
|
|
|
|
def _amd_mxm_patch(self, backlight_path) -> None:
|
|
"""
|
|
iMac AMD GCN and Navi MXM Handler
|
|
"""
|
|
|
|
logging.info("- Adding AMD DRM patches")
|
|
if not support.BuildSupport(self.model, self.constants, self.config).get_kext_by_bundle_path("WhateverGreen.kext")["Enabled"] is True:
|
|
# Ensure WEG is enabled as we need if for Backlight patching
|
|
support.BuildSupport(self.model, self.constants, self.config).enable_kext("WhateverGreen.kext", self.constants.whatevergreen_navi_version, self.constants.whatevergreen_navi_path)
|
|
|
|
if self.model == "iMac9,1":
|
|
logging.info("- Adding iMac9,1 Brightness Control and DRM patches")
|
|
support.BuildSupport(self.model, self.constants, self.config).enable_kext("BacklightInjector.kext", self.constants.backlight_injectorA_version, self.constants.backlight_injectorA_path)
|
|
|
|
if not self.constants.custom_model:
|
|
if self.computer.dgpu.device_id == 0x7340:
|
|
logging.info(f"- Adding AMD RX5500XT vBIOS injection")
|
|
self.config["DeviceProperties"]["Add"][backlight_path] = {"shikigva": 128, "unfairgva": 1, "agdpmod": "pikera", "rebuild-device-tree": 1, "enable-gva-support": 1, "ATY,bin_image": binascii.unhexlify(video_bios_data.RX5500XT_64K) }
|
|
logging.info(f"- Adding AMD RX5500XT boot-args")
|
|
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " agdpmod=pikera applbkl=3"
|
|
elif self.computer.dgpu.device_id_unspoofed == 0x6981:
|
|
logging.info(f"- Adding AMD WX3200 device spoofing")
|
|
self.config["DeviceProperties"]["Add"][backlight_path] = {"shikigva": 128, "unfairgva": 1, "agdpmod": "pikera", "rebuild-device-tree": 1, "enable-gva-support": 1, "model": "AMD Radeon Pro WX 3200", "device-id": binascii.unhexlify("FF67")}
|
|
else:
|
|
self.config["DeviceProperties"]["Add"][backlight_path] = {"shikigva": 128, "unfairgva": 1, "agdpmod": "pikera", "rebuild-device-tree": 1, "enable-gva-support": 1}
|
|
else:
|
|
self.config["DeviceProperties"]["Add"][backlight_path] = {"shikigva": 128, "unfairgva": 1, "agdpmod": "pikera", "rebuild-device-tree": 1, "enable-gva-support": 1}
|
|
|
|
if self.constants.custom_model and self.model == "iMac11,2":
|
|
# iMac11,2 can have either PciRoot(0x0)/Pci(0x3,0x0)/Pci(0x0,0x0) or PciRoot(0x0)/Pci(0x1,0x0)/Pci(0x0,0x0)
|
|
# Set both properties when we cannot run hardware detection
|
|
self.config["DeviceProperties"]["Add"]["PciRoot(0x0)/Pci(0x3,0x0)/Pci(0x0,0x0)"] = {"shikigva": 128, "unfairgva": 1, "agdpmod": "pikera", "rebuild-device-tree": 1, "enable-gva-support": 1}
|
|
if self.model in ["iMac12,1", "iMac12,2"]:
|
|
logging.info("- Disabling unsupported iGPU")
|
|
self.config["DeviceProperties"]["Add"]["PciRoot(0x0)/Pci(0x2,0x0)"] = {
|
|
"name": binascii.unhexlify("23646973706C6179"),
|
|
"class-code": binascii.unhexlify("FFFFFFFF"),
|
|
}
|
|
elif self.model in ["iMac9,1", "iMac10,1"]:
|
|
support.BuildSupport(self.model, self.constants, self.config).enable_kext("AAAMouSSE.kext", self.constants.mousse_version, self.constants.mousse_path)
|
|
if self.computer and self.computer.dgpu:
|
|
if self.computer.dgpu.arch == device_probe.AMD.Archs.Legacy_GCN_7000:
|
|
logging.info("- Adding Legacy GCN Power Gate Patches")
|
|
self.config["DeviceProperties"]["Add"][backlight_path].update({
|
|
"CAIL,CAIL_DisableDrmdmaPowerGating": 1,
|
|
"CAIL,CAIL_DisableGfxCGPowerGating": 1,
|
|
"CAIL,CAIL_DisableUVDPowerGating": 1,
|
|
"CAIL,CAIL_DisableVCEPowerGating": 1,
|
|
})
|
|
if self.constants.imac_model == "Legacy GCN":
|
|
logging.info("- Adding Legacy GCN Power Gate Patches")
|
|
self.config["DeviceProperties"]["Add"][backlight_path].update({
|
|
"CAIL,CAIL_DisableDrmdmaPowerGating": 1,
|
|
"CAIL,CAIL_DisableGfxCGPowerGating": 1,
|
|
"CAIL,CAIL_DisableUVDPowerGating": 1,
|
|
"CAIL,CAIL_DisableVCEPowerGating": 1,
|
|
})
|
|
if self.model == "iMac11,2":
|
|
self.config["DeviceProperties"]["Add"]["PciRoot(0x0)/Pci(0x3,0x0)/Pci(0x0,0x0)"].update({
|
|
"CAIL,CAIL_DisableDrmdmaPowerGating": 1,
|
|
"CAIL,CAIL_DisableGfxCGPowerGating": 1,
|
|
"CAIL,CAIL_DisableUVDPowerGating": 1,
|
|
"CAIL,CAIL_DisableVCEPowerGating": 1,
|
|
})
|
|
elif self.constants.imac_model == "AMD Lexa":
|
|
logging.info("- Adding Lexa Spoofing Patches")
|
|
self.config["DeviceProperties"]["Add"][backlight_path].update({
|
|
"model": "AMD Radeon Pro WX 3200",
|
|
"device-id": binascii.unhexlify("FF67"),
|
|
})
|
|
if self.model == "iMac11,2":
|
|
self.config["DeviceProperties"]["Add"]["PciRoot(0x0)/Pci(0x3,0x0)/Pci(0x0,0x0)"].update({
|
|
"model": "AMD Radeon Pro WX 3200",
|
|
"device-id": binascii.unhexlify("FF67"),
|
|
})
|
|
elif self.constants.imac_model == "AMD Navi":
|
|
logging.info("- Adding Navi Spoofing Patches")
|
|
navi_backlight_path = backlight_path+"/Pci(0x0,0x0)/Pci(0x0,0x0)"
|
|
self.config["DeviceProperties"]["Add"][navi_backlight_path] = {
|
|
"ATY,bin_image": binascii.unhexlify(video_bios_data.RX5500XT_64K),
|
|
"shikigva": 128,
|
|
"unfairgva": 1,
|
|
"rebuild-device-tree": 1,
|
|
"enable-gva-support": 1
|
|
}
|
|
logging.info(f"- Adding AMD RX5500XT boot-args")
|
|
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " agdpmod=pikera applbkl=3"
|
|
|
|
|
|
def _audio_handling(self) -> None:
|
|
"""
|
|
Audio Handler
|
|
"""
|
|
|
|
if (self.model in model_array.LegacyAudio or self.model in model_array.MacPro) and self.constants.set_alc_usage is True:
|
|
support.BuildSupport(self.model, self.constants, self.config).enable_kext("AppleALC.kext", self.constants.applealc_version, self.constants.applealc_path)
|
|
|
|
# Audio Patch
|
|
if self.constants.set_alc_usage is True:
|
|
if smbios_data.smbios_dictionary[self.model]["Max OS Supported"] <= os_data.os_data.high_sierra:
|
|
# Models dropped in Mojave also lost Audio support
|
|
# Xserves and MacPro4,1 are exceptions
|
|
# iMac7,1 and iMac8,1 require AppleHDA/IOAudioFamily downgrade
|
|
if not (self.model.startswith("Xserve") or self.model in ["MacPro4,1", "iMac7,1", "iMac8,1"]):
|
|
if "nForce Chipset" in smbios_data.smbios_dictionary[self.model]:
|
|
hdef_path = "PciRoot(0x0)/Pci(0x8,0x0)"
|
|
else:
|
|
hdef_path = "PciRoot(0x0)/Pci(0x1b,0x0)"
|
|
# In AppleALC, MacPro3,1's original layout is already in use, forcing layout 13 instead
|
|
if self.model == "MacPro3,1":
|
|
self.config["DeviceProperties"]["Add"][hdef_path] = {
|
|
"apple-layout-id": 90,
|
|
"use-apple-layout-id": 1,
|
|
"alc-layout-id": 13,
|
|
}
|
|
else:
|
|
self.config["DeviceProperties"]["Add"][hdef_path] = {
|
|
"apple-layout-id": 90,
|
|
"use-apple-layout-id": 1,
|
|
"use-layout-id": 1,
|
|
}
|
|
support.BuildSupport(self.model, self.constants, self.config).enable_kext("AppleALC.kext", self.constants.applealc_version, self.constants.applealc_path)
|
|
elif (self.model.startswith("MacPro") and self.model != "MacPro6,1") or self.model.startswith("Xserve"):
|
|
# Used to enable Audio support for non-standard dGPUs
|
|
support.BuildSupport(self.model, self.constants, self.config).enable_kext("AppleALC.kext", self.constants.applealc_version, self.constants.applealc_path)
|
|
|
|
# Due to regression in AppleALC 1.6.4+, temporarily use 1.6.3 and set override
|
|
if support.BuildSupport(self.model, self.constants, self.config).get_kext_by_bundle_path("AppleALC.kext")["Enabled"] is True:
|
|
self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"] += " -lilubetaall"
|
|
|
|
|
|
def _firmware_handling(self) -> None:
|
|
"""
|
|
Firmware Handler
|
|
"""
|
|
|
|
# Add UGA to GOP layer
|
|
if "UGA Graphics" in smbios_data.smbios_dictionary[self.model]:
|
|
logging.info("- Adding UGA to GOP Patch")
|
|
self.config["UEFI"]["Output"]["GopPassThrough"] = "Apple"
|
|
|
|
# GMUX handling
|
|
if self.constants.software_demux is True and self.model in ["MacBookPro8,2", "MacBookPro8,3"]:
|
|
logging.info("- Enabling software demux")
|
|
# Add ACPI patches
|
|
support.BuildSupport(self.model, self.constants, self.config).get_item_by_kv(self.config["ACPI"]["Add"], "Path", "SSDT-DGPU.aml")["Enabled"] = True
|
|
support.BuildSupport(self.model, self.constants, self.config).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
|
|
support.BuildSupport(self.model, self.constants, self.config).enable_kext("AMDGPUWakeHandler.kext", self.constants.gpu_wake_version, self.constants.gpu_wake_path)
|
|
|
|
if self.constants.dGPU_switch is True and "Switchable GPUs" in smbios_data.smbios_dictionary[self.model]:
|
|
logging.info("- Allowing GMUX switching in Windows")
|
|
self.config["Booter"]["Quirks"]["SignalAppleOS"] = True
|
|
|
|
# Force Output support PC VBIOS on Mac Pros
|
|
if self.constants.force_output_support is True:
|
|
logging.info("- Forcing GOP Support")
|
|
self.config["UEFI"]["Quirks"]["ForgeUefiSupport"] = True
|
|
self.config["UEFI"]["Quirks"]["ReloadOptionRoms"] = True
|
|
|
|
# AMD GOP VBIOS injection for AMD GCN 1-4 GPUs
|
|
if self.constants.amd_gop_injection is True:
|
|
logging.info("- Adding AMDGOP.efi")
|
|
shutil.copy(self.constants.amd_gop_driver_path, self.constants.drivers_path)
|
|
support.BuildSupport(self.model, self.constants, self.config).get_efi_binary_by_path("AMDGOP.efi", "UEFI", "Drivers")["Enabled"] = True
|
|
|
|
# Nvidia Kepler GOP VBIOS injection
|
|
if self.constants.nvidia_kepler_gop_injection is True:
|
|
logging.info("- Adding NVGOP_GK.efi")
|
|
shutil.copy(self.constants.nvidia_kepler_gop_driver_path, self.constants.drivers_path)
|
|
support.BuildSupport(self.model, self.constants, self.config).get_efi_binary_by_path("NVGOP_GK.efi", "UEFI", "Drivers")["Enabled"] = True
|
|
|
|
|
|
def _spoof_handling(self) -> None:
|
|
"""
|
|
SMBIOS Spoofing Handler
|
|
"""
|
|
|
|
if self.constants.serial_settings == "None":
|
|
return
|
|
|
|
# AppleMuxControl Override
|
|
if self.model == "MacBookPro9,1":
|
|
logging.info("- Adding AppleMuxControl Override")
|
|
amc_map_path = Path(self.constants.plist_folder_path) / Path("AppleMuxControl/Info.plist")
|
|
self.config["DeviceProperties"]["Add"]["PciRoot(0x0)/Pci(0x1,0x0)/Pci(0x0,0x0)"] = {"agdpmod": "vit9696"}
|
|
Path(self.constants.amc_kext_folder).mkdir()
|
|
Path(self.constants.amc_contents_folder).mkdir()
|
|
shutil.copy(amc_map_path, self.constants.amc_contents_folder)
|
|
support.BuildSupport(self.model, self.constants, self.config).get_kext_by_bundle_path("AMC-Override.kext")["Enabled"] = True
|
|
|
|
if self.model not in model_array.NoAGPMSupport:
|
|
logging.info("- Adding AppleGraphicsPowerManagement Override")
|
|
agpm_map_path = Path(self.constants.plist_folder_path) / Path("AppleGraphicsPowerManagement/Info.plist")
|
|
Path(self.constants.agpm_kext_folder).mkdir()
|
|
Path(self.constants.agpm_contents_folder).mkdir()
|
|
shutil.copy(agpm_map_path, self.constants.agpm_contents_folder)
|
|
support.BuildSupport(self.model, self.constants, self.config).get_kext_by_bundle_path("AGPM-Override.kext")["Enabled"] = True
|
|
|
|
if self.model in model_array.AGDPSupport:
|
|
logging.info("- Adding AppleGraphicsDevicePolicy Override")
|
|
agdp_map_path = Path(self.constants.plist_folder_path) / Path("AppleGraphicsDevicePolicy/Info.plist")
|
|
Path(self.constants.agdp_kext_folder).mkdir()
|
|
Path(self.constants.agdp_contents_folder).mkdir()
|
|
shutil.copy(agdp_map_path, self.constants.agdp_contents_folder)
|
|
support.BuildSupport(self.model, self.constants, self.config).get_kext_by_bundle_path("AGDP-Override.kext")["Enabled"] = True
|
|
|
|
# AGPM Patch
|
|
if self.model in model_array.DualGPUPatch:
|
|
logging.info("- Adding dual GPU patch")
|
|
if not self.constants.custom_model and self.computer.dgpu and self.computer.dgpu.pci_path:
|
|
self.gfx0_path = self.computer.dgpu.pci_path
|
|
logging.info(f"- Found GFX0 Device Path: {self.gfx0_path}")
|
|
else:
|
|
if not self.constants.custom_model:
|
|
logging.info("- Failed to find GFX0 Device path, falling back on known logic")
|
|
self.gfx0_path = "PciRoot(0x0)/Pci(0x1,0x0)/Pci(0x0,0x0)"
|
|
|
|
if self.model in model_array.IntelNvidiaDRM and self.constants.drm_support is True:
|
|
logging.info("- Prioritizing DRM support over Intel QuickSync")
|
|
self.config["DeviceProperties"]["Add"][self.gfx0_path] = {"agdpmod": "vit9696", "shikigva": 256}
|
|
self.config["DeviceProperties"]["Add"]["PciRoot(0x0)/Pci(0x2,0x0)"] = {
|
|
"name": binascii.unhexlify("23646973706C6179"),
|
|
"IOName": "#display",
|
|
"class-code": binascii.unhexlify("FFFFFFFF"),
|
|
}
|
|
elif self.constants.serial_settings != "None":
|
|
if self.gfx0_path not in self.config["DeviceProperties"]["Add"] or "agdpmod" not in self.config["DeviceProperties"]["Add"][self.gfx0_path]:
|
|
self.config["DeviceProperties"]["Add"][self.gfx0_path] = {"agdpmod": "vit9696"}
|
|
|
|
if self.model.startswith("iMac14,1"):
|
|
# Ensure that agdpmod is applied to iMac14,x with iGPU only
|
|
self.config["DeviceProperties"]["Add"]["PciRoot(0x0)/Pci(0x2,0x0)"] = {"agdpmod": "vit9696"}
|
|
|
|
|
|
def _imac_mxm_patching(self) -> None:
|
|
"""
|
|
General iMac MXM Handler
|
|
"""
|
|
|
|
self._backlight_path_detection()
|
|
# Check GPU Vendor
|
|
if self.constants.metal_build is True:
|
|
logging.info("- Adding Metal GPU patches on request")
|
|
if self.constants.imac_vendor == "AMD":
|
|
self._amd_mxm_patch(self.gfx0_path)
|
|
elif self.constants.imac_vendor == "Nvidia":
|
|
self._nvidia_mxm_patch(self.gfx0_path)
|
|
else:
|
|
logging.info("- Failed to find vendor")
|
|
elif not self.constants.custom_model and self.model in model_array.LegacyGPU and self.computer.dgpu:
|
|
logging.info(f"- Detected dGPU: {utilities.friendly_hex(self.computer.dgpu.vendor_id)}:{utilities.friendly_hex(self.computer.dgpu.device_id)}")
|
|
if self.computer.dgpu.arch in [
|
|
device_probe.AMD.Archs.Legacy_GCN_7000,
|
|
device_probe.AMD.Archs.Legacy_GCN_8000,
|
|
device_probe.AMD.Archs.Legacy_GCN_9000,
|
|
device_probe.AMD.Archs.Polaris,
|
|
device_probe.AMD.Archs.Polaris_Spoof,
|
|
device_probe.AMD.Archs.Vega,
|
|
device_probe.AMD.Archs.Navi,
|
|
]:
|
|
self._amd_mxm_patch(self.gfx0_path)
|
|
elif self.computer.dgpu.arch == device_probe.NVIDIA.Archs.Kepler:
|
|
self._nvidia_mxm_patch(self.gfx0_path)
|
|
|
|
def _ioaccel_workaround(self) -> None:
|
|
"""
|
|
Miscellaneous IOAccelerator Handler
|
|
|
|
When MTL bundles are missing from disk, WindowServer will repeatedly crash
|
|
This primarily occurs when installing an RSR update, where root is cleaned but AuxKC is not
|
|
"""
|
|
|
|
gpu_dict = []
|
|
if not self.constants.custom_model:
|
|
gpu_dict = self.constants.computer.gpus
|
|
else:
|
|
if not self.model in smbios_data.smbios_dictionary:
|
|
return
|
|
gpu_dict = smbios_data.smbios_dictionary[self.model]["Stock GPUs"]
|
|
|
|
# Check if KDKless and KDK GPUs are present
|
|
# We only want KDKless.kext if there are no KDK GPUs
|
|
has_kdkless_gpu = False
|
|
has_kdk_gpu = False
|
|
for gpu in gpu_dict:
|
|
if not self.constants.custom_model:
|
|
gpu = gpu.arch
|
|
if gpu in [
|
|
device_probe.Intel.Archs.Ivy_Bridge,
|
|
device_probe.Intel.Archs.Haswell,
|
|
device_probe.Intel.Archs.Broadwell,
|
|
device_probe.Intel.Archs.Skylake,
|
|
device_probe.NVIDIA.Archs.Kepler,
|
|
]:
|
|
has_kdkless_gpu = True
|
|
|
|
# Non-Metal KDK
|
|
if gpu in [
|
|
device_probe.NVIDIA.Archs.Tesla,
|
|
device_probe.NVIDIA.Archs.Maxwell,
|
|
device_probe.NVIDIA.Archs.Pascal,
|
|
device_probe.AMD.Archs.TeraScale_1,
|
|
device_probe.AMD.Archs.TeraScale_2,
|
|
device_probe.Intel.Archs.Iron_Lake,
|
|
device_probe.Intel.Archs.Sandy_Bridge,
|
|
]:
|
|
has_kdk_gpu = True
|
|
|
|
if gpu in [
|
|
# Metal KDK (always)
|
|
device_probe.AMD.Archs.Legacy_GCN_7000,
|
|
device_probe.AMD.Archs.Legacy_GCN_8000,
|
|
device_probe.AMD.Archs.Legacy_GCN_9000,
|
|
]:
|
|
has_kdk_gpu = True
|
|
|
|
if gpu in [
|
|
# Metal KDK (pre-AVX2.0)
|
|
device_probe.AMD.Archs.Polaris,
|
|
device_probe.AMD.Archs.Polaris_Spoof,
|
|
device_probe.AMD.Archs.Vega,
|
|
device_probe.AMD.Archs.Navi,
|
|
]:
|
|
if (
|
|
self.model == "MacBookPro13,3" or
|
|
smbios_data.smbios_dictionary[self.model]["CPU Generation"] <= cpu_data.cpu_data.ivy_bridge.value
|
|
):
|
|
# MacBookPro13,3 has AVX2.0 however the GPU has an unsupported framebuffer
|
|
has_kdk_gpu = True
|
|
|
|
if has_kdkless_gpu is True and has_kdk_gpu is False:
|
|
# KDKlessWorkaround is required for KDKless GPUs
|
|
support.BuildSupport(self.model, self.constants, self.config).enable_kext("KDKlessWorkaround.kext", self.constants.kdkless_version, self.constants.kdkless_path)
|
|
return
|
|
|
|
# KDKlessWorkaround supports disabling native AMD stack on Ventura for pre-AVX2.0 CPUs
|
|
# Applicable for Polaris, Vega, Navi GPUs
|
|
if smbios_data.smbios_dictionary[self.model]["CPU Generation"] > cpu_data.cpu_data.ivy_bridge.value:
|
|
return
|
|
for gpu in gpu_dict:
|
|
if not self.constants.custom_model:
|
|
gpu = gpu.arch
|
|
if gpu in [
|
|
device_probe.AMD.Archs.Polaris,
|
|
device_probe.AMD.Archs.Polaris_Spoof,
|
|
device_probe.AMD.Archs.Vega,
|
|
device_probe.AMD.Archs.Navi,
|
|
]:
|
|
support.BuildSupport(self.model, self.constants, self.config).enable_kext("KDKlessWorkaround.kext", self.constants.kdkless_version, self.constants.kdkless_path)
|
|
return
|