Refactor Device Probing

This commit is contained in:
Mykola Grymalyuk
2021-05-05 12:28:24 -06:00
parent 332376030e
commit 057b8739d3
6 changed files with 132 additions and 145 deletions
+2 -8
View File
@@ -12,7 +12,7 @@ import platform
import argparse import argparse
from pathlib import Path from pathlib import Path
from Resources import Build, ModelArray, Constants, SysPatch, Utilities, CliMenu from Resources import Build, ModelArray, Constants, SysPatch, Utilities, CliMenu, DeviceProbe
class OpenCoreLegacyPatcher(): class OpenCoreLegacyPatcher():
@@ -30,13 +30,7 @@ class OpenCoreLegacyPatcher():
if self.current_model in ModelArray.NoAPFSsupport: if self.current_model in ModelArray.NoAPFSsupport:
self.constants.serial_settings = "Moderate" self.constants.serial_settings = "Moderate"
if self.current_model in ModelArray.LegacyGPU: if self.current_model in ModelArray.LegacyGPU:
try: dgpu_vendor,dgpu_device = DeviceProbe.pci_probe().gpu_probe("GFX0")
dgpu_devices = plistlib.loads(subprocess.run("ioreg -r -n GFX0 -a".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode())
dgpu_vendor = self.hexswap(binascii.hexlify(dgpu_devices[0]["vendor-id"]).decode()[:4])
dgpu_device = self.hexswap(binascii.hexlify(dgpu_devices[0]["device-id"]).decode()[:4])
except ValueError:
dgpu_vendor = ""
dgpu_device = ""
if (dgpu_vendor == self.constants.pci_amd_ati and dgpu_device in ModelArray.AMDMXMGPUs) or (dgpu_vendor == self.constants.pci_nvidia and dgpu_device in ModelArray.NVIDIAMXMGPUs): if (dgpu_vendor == self.constants.pci_amd_ati and dgpu_device in ModelArray.AMDMXMGPUs) or (dgpu_vendor == self.constants.pci_nvidia and dgpu_device in ModelArray.NVIDIAMXMGPUs):
self.constants.sip_status = True self.constants.sip_status = True
+2 -8
View File
@@ -10,7 +10,7 @@ import sys
import time import time
import platform import platform
from Resources import Build, ModelArray, Constants, SysPatch, Utilities, CliMenu from Resources import Build, ModelArray, Constants, SysPatch, Utilities, CliMenu, DeviceProbe
class OpenCoreLegacyPatcher(): class OpenCoreLegacyPatcher():
@@ -27,13 +27,7 @@ class OpenCoreLegacyPatcher():
if self.current_model in ModelArray.NoAPFSsupport: if self.current_model in ModelArray.NoAPFSsupport:
self.constants.serial_settings = "Moderate" self.constants.serial_settings = "Moderate"
if self.current_model in ModelArray.LegacyGPU: if self.current_model in ModelArray.LegacyGPU:
try: dgpu_vendor,dgpu_device = DeviceProbe.pci_probe().gpu_probe("GFX0")
dgpu_devices = plistlib.loads(subprocess.run("ioreg -r -n GFX0 -a".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode())
dgpu_vendor = self.hexswap(binascii.hexlify(dgpu_devices[0]["vendor-id"]).decode()[:4])
dgpu_device = self.hexswap(binascii.hexlify(dgpu_devices[0]["device-id"]).decode()[:4])
except ValueError:
dgpu_vendor = ""
dgpu_device = ""
if (dgpu_vendor == self.constants.pci_amd_ati and dgpu_device in ModelArray.AMDMXMGPUs) or (dgpu_vendor == self.constants.pci_nvidia and dgpu_device in ModelArray.NVIDIAMXMGPUs): if (dgpu_vendor == self.constants.pci_amd_ati and dgpu_device in ModelArray.AMDMXMGPUs) or (dgpu_vendor == self.constants.pci_nvidia and dgpu_device in ModelArray.NVIDIAMXMGPUs):
self.constants.sip_status = True self.constants.sip_status = True
+27 -79
View File
@@ -15,7 +15,7 @@ import ast
from pathlib import Path from pathlib import Path
from datetime import date from datetime import date
from Resources import Constants, ModelArray, Utilities from Resources import Constants, ModelArray, Utilities, DeviceProbe
def human_fmt(num): def human_fmt(num):
@@ -44,33 +44,6 @@ class BuildOpenCore:
hex_str = "".join(["".join(x) for x in hex_rev]) hex_str = "".join(["".join(x) for x in hex_rev])
return hex_str.upper() return hex_str.upper()
def check_pciid(self, print_status):
try:
self.constants.igpu_devices = plistlib.loads(subprocess.run("ioreg -r -n IGPU -a".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode())
self.constants.igpu_vendor = self.hexswap(binascii.hexlify(self.constants.igpu_devices[0]["vendor-id"]).decode()[:4])
self.constants.igpu_device = self.hexswap(binascii.hexlify(self.constants.igpu_devices[0]["device-id"]).decode()[:4])
if print_status is True:
print(f"- Detected iGPU: {self.constants.igpu_vendor}:{self.constants.igpu_device}")
self.config["#Revision"]["Hardware-iGPU"] = f"{self.constants.igpu_vendor}:{self.constants.igpu_device}"
except ValueError:
if print_status is True:
print("- No iGPU detected")
self.constants.igpu_devices = ""
self.config["#Revision"]["Hardware-iGPU"] = "No iGPU detected"
try:
self.constants.dgpu_devices = plistlib.loads(subprocess.run("ioreg -r -n GFX0 -a".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode())
self.constants.dgpu_vendor = self.hexswap(binascii.hexlify(self.constants.dgpu_devices[0]["vendor-id"]).decode()[:4])
self.constants.dgpu_device = self.hexswap(binascii.hexlify(self.constants.dgpu_devices[0]["device-id"]).decode()[:4])
if print_status is True:
print(f"- Detected dGPU: {self.constants.dgpu_vendor}:{self.constants.dgpu_device}")
self.config["#Revision"]["Hardware-GFX0"] = f"{self.constants.dgpu_vendor}:{self.constants.dgpu_device}"
except ValueError:
if print_status is True:
print("- No dGPU detected")
self.constants.dgpu_devices = ""
self.config["#Revision"]["Hardware-GFX0"] = "No dGPU detected"
def build_efi(self): def build_efi(self):
Utilities.cls() Utilities.cls()
print(f"Building Configuration for model: {self.model}") print(f"Building Configuration for model: {self.model}")
@@ -148,24 +121,23 @@ class BuildOpenCore:
for i in storage_devices: for i in storage_devices:
storage_vendor = self.hexswap(binascii.hexlify(i["vendor-id"]).decode()[:4]) storage_vendor = self.hexswap(binascii.hexlify(i["vendor-id"]).decode()[:4])
storage_device = self.hexswap(binascii.hexlify(i["device-id"]).decode()[:4]) storage_device = self.hexswap(binascii.hexlify(i["device-id"]).decode()[:4])
print(f'- Fixing PCIe Drive ({x}) reporting') print(f'- Fixing PCIe Storage Controller ({x}) reporting')
try: try:
storage_path = [line.strip().split("= ", 1)[1] for line in storage_path_gfx.split("\n") if f'{storage_vendor}:{storage_device}'.lower() in line.strip()][0] storage_path = [line.strip().split("= ", 1)[1] for line in storage_path_gfx.split("\n") if f'{storage_vendor}:{storage_device}'.lower() in line.strip()][0]
self.config["DeviceProperties"]["Add"][storage_path] = { "built-in": 1} self.config["DeviceProperties"]["Add"][storage_path] = { "built-in": 1}
except IndexError: except IndexError:
print(f"- Failed to find Device path for PCIe drive {x}, falling back to Innie") print(f"- Failed to find Device path for PCIe Storage Controller {x}, falling back to Innie")
if self.get_kext_by_bundle_path("Innie.kext")["Enabled"] is False: if self.get_kext_by_bundle_path("Innie.kext")["Enabled"] is False:
self.enable_kext("Innie.kext", self.constants.innie_version, self.constants.innie_path) self.enable_kext("Innie.kext", self.constants.innie_version, self.constants.innie_path)
x = x + 1 x = x + 1
except ValueError: except ValueError:
print("- No PCIe Drives found to fix") print("- No PCIe Storage Controllers found to fix")
except IndexError: except IndexError:
print("- No PCIe Drives found to fix") print("- No PCIe Storage Controllers found to fix")
if not self.constants.custom_model: if not self.constants.custom_model:
nvme_devices = plistlib.loads(subprocess.run("ioreg -c IOPCIDevice -r -d2 -a".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode()) nvme_devices = plistlib.loads(subprocess.run("ioreg -c IOPCIDevice -r -d2 -a".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode())
nvme_devices = [i for i in nvme_devices if i.get("IORegistryEntryChildren", None) and i["vendor-id"] != binascii.unhexlify("6B100000") and i["IORegistryEntryChildren"][0]["IORegistryEntryName"] == "IONVMeController"] nvme_devices = [i for i in nvme_devices if i.get("IORegistryEntryChildren", None) and i["vendor-id"] != binascii.unhexlify("6B100000") and i["IORegistryEntryChildren"][0]["IORegistryEntryName"] == "IONVMeController"]
nvme_path_gfx: str = subprocess.run([self.constants.gfxutil_path] + f"-v".split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout.decode()
try: try:
x = 1 x = 1
for i in nvme_devices: for i in nvme_devices:
@@ -174,24 +146,18 @@ class BuildOpenCore:
nvme_aspm = i["pci-aspm-default"] nvme_aspm = i["pci-aspm-default"]
# Disable Bit 0 (L0s), enable Bit 1 (L1) # Disable Bit 0 (L0s), enable Bit 1 (L1)
if not isinstance(nvme_aspm, int): if not isinstance(nvme_aspm, int):
#print("- Converting variable")
binascii.unhexlify(nvme_aspm) binascii.unhexlify(nvme_aspm)
nvme_aspm = self.hexswap(nvme_aspm) nvme_aspm = self.hexswap(nvme_aspm)
nvme_aspm = int(nvme_aspm, 16) nvme_aspm = int(nvme_aspm, 16)
nvme_aspm = (nvme_aspm & (~3)) | 2 nvme_aspm = (nvme_aspm & (~3)) | 2
print(f'- Found 3rd Party NVMe SSD ({x}): {nvme_vendor}:{nvme_device}') print(f'- Found 3rd Party NVMe SSD ({x}): {nvme_vendor}:{nvme_device}')
self.config["#Revision"][f"Hardware-NVMe-{x}"] = f'{nvme_vendor}:{nvme_device}' self.config["#Revision"][f"Hardware-NVMe-{x}"] = f'{nvme_vendor}:{nvme_device}'
try: try:
nvme_path = [line.strip().split("= ", 1)[1] for line in nvme_path_gfx.split("\n") if f'{nvme_vendor}:{nvme_device}'.lower() in line.strip()][0] nvme_path = DeviceProbe.pci_probe().deviceproperty_probe(nvme_vendor, nvme_device)
nvme_path_parent = "/".join(nvme_path.split("/")[:-1]) nvme_path_parent = DeviceProbe.pci_probe().device_property_parent(nvme_path)
print(f"- Found NVMe ({x}) at {nvme_path}") print(f"- Found NVMe ({x}) at {nvme_path}")
#print(f"- Found NVMe({x}) Parent at {nvme_path_parent}")
self.config["DeviceProperties"]["Add"][nvme_path] = {"pci-aspm-default": nvme_aspm, "built-in": 1} self.config["DeviceProperties"]["Add"][nvme_path] = {"pci-aspm-default": nvme_aspm, "built-in": 1}
self.config["DeviceProperties"]["Add"][nvme_path_parent] = {"pci-aspm-default": nvme_aspm} self.config["DeviceProperties"]["Add"][nvme_path_parent] = {"pci-aspm-default": nvme_aspm}
except IndexError: except IndexError:
print(f"- Failed to find Device path for NVMe {x}") print(f"- Failed to find Device path for NVMe {x}")
if "-nvmefaspm" not in self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"]: if "-nvmefaspm" not in self.config["NVRAM"]["Add"]["7C436110-AB2A-4BBB-A880-FE41995C9F82"]["boot-args"]:
@@ -210,13 +176,11 @@ class BuildOpenCore:
self.enable_kext("AirportBrcmFixup.kext", self.constants.airportbcrmfixup_version, self.constants.airportbcrmfixup_path) self.enable_kext("AirportBrcmFixup.kext", self.constants.airportbcrmfixup_version, self.constants.airportbcrmfixup_path)
self.get_kext_by_bundle_path("AirportBrcmFixup.kext/Contents/PlugIns/AirPortBrcmNIC_Injector.kext")["Enabled"] = True self.get_kext_by_bundle_path("AirportBrcmFixup.kext/Contents/PlugIns/AirPortBrcmNIC_Injector.kext")["Enabled"] = True
if not self.constants.custom_model: if not self.constants.custom_model:
arpt_path: str = subprocess.run([self.constants.gfxutil_path] + f"-v".split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout.decode() arpt_path = DeviceProbe.pci_probe().deviceproperty_probe(wifi_vendor, wifi_device)
try: if arpt_path:
arpt_path = [line.strip().split("= ", 1)[1] for line in arpt_path.split("\n") if f"{wifi_vendor}:{wifi_device}".lower() in line.strip()][0]
print(f"- Found ARPT device at {arpt_path}") print(f"- Found ARPT device at {arpt_path}")
default_path = False default_path = False
except IndexError: else:
print("- Failed to find Device path")
default_path = True default_path = True
if default_path is True: if default_path is True:
if self.model in ModelArray.nvidiaHDEF: if self.model in ModelArray.nvidiaHDEF:
@@ -238,35 +202,17 @@ class BuildOpenCore:
# WiFi patches # WiFi patches
# TODO: -a is not supported in Lion and older, need to add proper fix # TODO: -a is not supported in Lion and older, need to add proper fix
if self.constants.detected_os > self.constants.lion: if self.constants.detected_os > self.constants.lion and not self.constants.custom_model:
try: wifi_vendor,wifi_device,wifi_ioname = DeviceProbe.pci_probe().wifi_probe()
wifi_devices = plistlib.loads(subprocess.run("ioreg -r -n ARPT -a".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode()) if wifi_vendor:
except ValueError: print(f"- Found Wireless Device {wifi_vendor}:{wifi_device} ({wifi_ioname})")
# Work-around Mac Pros where Wifi card may not be named ARPT (ie. installed in dedicated PCIe card slot) self.config["#Revision"]["Hardware-Wifi"] = f"{wifi_vendor}:{wifi_device} ({wifi_ioname}"
wifi_devices = plistlib.loads(subprocess.run("ioreg -c IOPCIDevice -r -d2 -a".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode())
vendor_atheros = binascii.unhexlify("E4140000")
vendor_broadcom = binascii.unhexlify("8C160000")
wifi_devices = [i for i in wifi_devices if i["vendor-id"] == vendor_atheros or i["vendor-id"] == vendor_broadcom and i["class-code"] == binascii.unhexlify("00800200")]
try:
wifi_vendor = self.hexswap(binascii.hexlify(wifi_devices[0]["vendor-id"]).decode()[:4])
wifi_device = self.hexswap(binascii.hexlify(wifi_devices[0]["device-id"]).decode()[:4])
wifi_ioname = wifi_devices[0]["IOName"]
if not self.constants.custom_model:
if wifi_ioname in ["pci14e4,4353", "pci14e4,4331"]:
print(f"- Detected Wifi Card: {wifi_ioname}")
self.config["#Revision"]["Hardware-Wifi"] = f"{wifi_ioname}"
else:
print(f"- Detected Wifi Card: {wifi_vendor}:{wifi_device}")
self.config["#Revision"]["Hardware-Wifi"] = f"{wifi_vendor}:{wifi_device}"
except IndexError:
wifi_devices = ""
else: else:
wifi_devices = "" wifi_vendor = ""
print("- Can't run Wifi hardware detection on Snow Leopard and older") print("- Unable to run Wireless hardware detection")
if self.constants.wifi_build is True: if self.constants.wifi_build is True:
print("- Skipping Wifi patches on request") print("- Skipping Wifi patches on request")
elif not self.constants.custom_model and wifi_devices: elif not self.constants.custom_model and wifi_vendor:
if wifi_vendor == self.constants.pci_broadcom: if wifi_vendor == self.constants.pci_broadcom:
# This works around OCLP spoofing the Wifi card and therefore unable to actually detect the correct device # This works around OCLP spoofing the Wifi card and therefore unable to actually detect the correct device
if wifi_device in ModelArray.BCM4360Wifi and wifi_ioname not in ["pci14e4,4353", "pci14e4,4331"]: if wifi_device in ModelArray.BCM4360Wifi and wifi_ioname not in ["pci14e4,4353", "pci14e4,4331"]:
@@ -447,13 +393,15 @@ class BuildOpenCore:
else: else:
print("- Failed to find vendor") print("- Failed to find vendor")
elif not self.constants.custom_model: elif not self.constants.custom_model:
self.check_pciid(True) dgpu_vendor,dgpu_device = DeviceProbe.pci_probe().gpu_probe("GFX0")
if self.constants.dgpu_vendor == self.constants.pci_amd_ati and self.constants.dgpu_device in ModelArray.AMDMXMGPUs: if dgpu_vendor:
backlight_path_detection(self) print(f"- Detected dGPU: {dgpu_vendor}:{dgpu_device}")
amd_patch(self, self.gfx0_path) if dgpu_vendor == self.constants.pci_amd_ati and dgpu_device in ModelArray.AMDMXMGPUs:
elif self.constants.dgpu_vendor == self.constants.pci_nvidia and self.constants.dgpu_device in ModelArray.NVIDIAMXMGPUs: backlight_path_detection(self)
backlight_path_detection(self) amd_patch(self, self.gfx0_path)
nvidia_patch(self, self.gfx0_path) elif dgpu_vendor == self.constants.pci_nvidia and dgpu_device in ModelArray.NVIDIAMXMGPUs:
backlight_path_detection(self)
nvidia_patch(self, self.gfx0_path)
if self.model in ModelArray.MacPro71: if self.model in ModelArray.MacPro71:
if not self.constants.custom_model: if not self.constants.custom_model:
mp_dgpu_devices = plistlib.loads(subprocess.run("ioreg -c IOPCIDevice -r -d2 -a".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode()) mp_dgpu_devices = plistlib.loads(subprocess.run("ioreg -c IOPCIDevice -r -d2 -a".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode())
-4
View File
@@ -48,10 +48,6 @@ class Constants:
self.custom_mxm_gpu: str = None self.custom_mxm_gpu: str = None
self.current_gpuv: str = None self.current_gpuv: str = None
self.current_gpud: str = None self.current_gpud: str = None
self.igpu_vendor = ""
self.igpu_device = ""
self.dgpu_vendor = ""
self.dgpu_device = ""
# Patcher Settings # Patcher Settings
self.opencore_debug = False self.opencore_debug = False
+77
View File
@@ -0,0 +1,77 @@
# Probe devices, return device entries
# Copyright (C) 2021 Mykola Grymalyuk
from __future__ import print_function
import binascii
import plistlib
import shutil
import subprocess
import uuid
import os
import sys
import platform
from pathlib import Path
from Resources import Constants, ModelArray, Utilities
class pci_probe:
def __init__(self):
self.constants = Constants.Constants()
def hexswap(self, input_hex: str):
hex_pairs = [input_hex[i:i + 2] for i in range(0, len(input_hex), 2)]
hex_rev = hex_pairs[::-1]
hex_str = "".join(["".join(x) for x in hex_rev])
return hex_str.upper()
# Converts given device IDs to DeviceProperty pathing, requires ACPI pathing as DeviceProperties shouldn't be used otherwise
def deviceproperty_probe(self, vendor_id, device_id):
gfxutil_output: str = subprocess.run([self.constants.gfxutil_path] + f"-v".split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT).stdout.decode()
try:
#device_path = [line.strip().split("= ", 1)[1] for line in gfxutil_output.split("\n") if f'{vendor_id}:{device_id}'.lower() in line.strip() and f'{acpi_path}' in line.strip()][0]
device_path = [line.strip().split("= ", 1)[1] for line in gfxutil_output.split("\n") if f'{vendor_id}:{device_id}'.lower() in line.strip()][0]
return device_path
except IndexError:
#print(f"- No DevicePath found for {vendor_id}:{device_id} at {acpi_path}")
print(f"- No DevicePath found for {vendor_id}:{device_id}")
return ""
# Returns the device path of parent controller
def device_property_parent(self, device_path):
device_path_parent = "/".join(device_path.split("/")[:-1])
return device_path_parent
# GPU probing, note best way to handle is:
# vendor,device,acpi_path = gpu_vendor_probe("GFX0")
#
# Note gpu_probe should only be used on IGPU and GFX0 entries
def gpu_probe(self, gpu_type):
print(f"- Probing IOService for device: {gpu_type}")
try:
devices = plistlib.loads(subprocess.run(f"ioreg -r -n {gpu_type} -a".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode())
vendor_id = self.hexswap(binascii.hexlify(devices[0]["vendor-id"]).decode()[:4])
device_id = self.hexswap(binascii.hexlify(devices[0]["device-id"]).decode()[:4])
try:
acpi_path = devices[0]["acpi-path"]
return vendor_id, device_id, acpi_path
except KeyError:
print(f"- No ACPI entry found for {gpu_type}")
return vendor_id, device_id, ""
except ValueError:
print(f"- No IOService entry found for {gpu_type}")
return "", "", ""
def wifi_probe(self):
try:
devices = plistlib.loads(subprocess.run("ioreg -r -n ARPT -a".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode())
except ValueError:
devices = plistlib.loads(subprocess.run("ioreg -c IOPCIDevice -r -d2 -a".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode())
try:
devices = [i for i in devices if i["class-code"] == binascii.unhexlify(self.constants.classcode_wifi)]
vendor_id = self.hexswap(binascii.hexlify(devices[0]["vendor-id"]).decode()[:4])
device_id = self.hexswap(binascii.hexlify(devices[0]["device-id"]).decode()[:4])
ioname = devices[0]["IOName"]
return vendor_id, device_id, ioname
except ValueError:
print(f"- No IOService entry found for Wireless Card")
return "", "", ""
+24 -46
View File
@@ -18,7 +18,7 @@ import os
from pathlib import Path from pathlib import Path
from datetime import date from datetime import date
from Resources import Constants, ModelArray, Utilities from Resources import Constants, ModelArray, Utilities, DeviceProbe
class PatchSysVolume: class PatchSysVolume:
@@ -121,52 +121,29 @@ class PatchSysVolume:
subprocess.run(f"sudo chmod -R 755 {self.mount_private_frameworks}/DisplayServices.framework".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode() subprocess.run(f"sudo chmod -R 755 {self.mount_private_frameworks}/DisplayServices.framework".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode()
subprocess.run(f"sudo chown -R root:wheel {self.mount_private_frameworks}/DisplayServices.framework".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode() subprocess.run(f"sudo chown -R root:wheel {self.mount_private_frameworks}/DisplayServices.framework".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode()
def check_pciid(self):
try:
self.igpu_devices = plistlib.loads(subprocess.run("ioreg -r -n IGPU -a".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode())
self.igpu_devices = [i for i in self.igpu_devices if i["class-code"] == binascii.unhexlify("00000300")]
self.igpu_vendor = self.hexswap(binascii.hexlify(self.igpu_devices[0]["vendor-id"]).decode()[:4])
self.igpu_device = self.hexswap(binascii.hexlify(self.igpu_devices[0]["device-id"]).decode()[:4])
print(f"- Detected iGPU: {self.igpu_vendor}:{self.igpu_device}")
except ValueError:
print("- No iGPU detected")
self.igpu_devices = ""
try:
self.dgpu_devices = plistlib.loads(subprocess.run("ioreg -r -n GFX0 -a".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode())
self.dgpu_devices = [i for i in self.dgpu_devices if i["class-code"] == binascii.unhexlify("00000300")]
self.dgpu_vendor = self.hexswap(binascii.hexlify(self.dgpu_devices[0]["vendor-id"]).decode()[:4])
self.dgpu_device = self.hexswap(binascii.hexlify(self.dgpu_devices[0]["device-id"]).decode()[:4])
try:
self.nvidia_arch = self.dgpu_devices[0]["NVArch"]
except KeyError:
self.nvidia_arch = ""
print(f"- Detected dGPU: {self.dgpu_vendor}:{self.dgpu_device}")
except ValueError:
print("- No dGPU detected")
self.dgpu_devices = ""
def gpu_accel_patches_11(self): def gpu_accel_patches_11(self):
if self.dgpu_devices: igpu_vendor,igpu_device = DeviceProbe.pci_probe().gpu_probe("IGPU")
if self.dgpu_vendor == self.constants.pci_nvidia: dgpu_vendor,dgpu_device = DeviceProbe.pci_probe().gpu_probe("GFX0")
if self.nvidia_arch == self.constants.arch_kepler and self.constants.assume_legacy is True and self.constants.detected_os > self.constants.big_sur: if dgpu_vendor:
print("- Merging legacy Nvidia Kepler Kexts and Bundles") if dgpu_vendor == self.constants.pci_nvidia:
self.add_new_binaries(ModelArray.AddNvidiaKeplerAccel11, self.constants.legacy_nvidia_kepler_path) #if self.nvidia_arch == self.constants.arch_kepler and self.constants.assume_legacy is True and self.constants.detected_os > self.constants.big_sur:
else: # print("- Merging legacy Nvidia Kepler Kexts and Bundles")
print("- Merging legacy Nvidia Tesla and Fermi Kexts and Bundles") # self.add_new_binaries(ModelArray.AddNvidiaKeplerAccel11, self.constants.legacy_nvidia_kepler_path)
self.delete_old_binaries(ModelArray.DeleteNvidiaAccel11) #else:
self.add_new_binaries(ModelArray.AddNvidiaAccel11, self.constants.legacy_nvidia_path) print("- Merging legacy Nvidia Tesla and Fermi Kexts and Bundles")
elif self.dgpu_vendor == self.constants.pci_amd_ati: self.delete_old_binaries(ModelArray.DeleteNvidiaAccel11)
self.add_new_binaries(ModelArray.AddNvidiaAccel11, self.constants.legacy_nvidia_path)
elif dgpu_vendor == self.constants.pci_amd_ati:
print("- Merging legacy AMD Kexts and Bundles") print("- Merging legacy AMD Kexts and Bundles")
self.delete_old_binaries(ModelArray.DeleteAMDAccel11) self.delete_old_binaries(ModelArray.DeleteAMDAccel11)
self.add_new_binaries(ModelArray.AddAMDAccel11, self.constants.legacy_amd_path) self.add_new_binaries(ModelArray.AddAMDAccel11, self.constants.legacy_amd_path)
if self.igpu_devices: if igpu_vendor:
if self.igpu_vendor == self.constants.pci_intel: if igpu_vendor == self.constants.pci_intel:
if self.igpu_device in ModelArray.IronLakepciid: if igpu_device in ModelArray.IronLakepciid:
print("- Merging legacy Intel 1st Gen Kexts and Bundles") print("- Merging legacy Intel 1st Gen Kexts and Bundles")
self.delete_old_binaries(ModelArray.DeleteNvidiaAccel11) self.delete_old_binaries(ModelArray.DeleteNvidiaAccel11)
self.add_new_binaries(ModelArray.AddIntelGen1Accel, self.constants.legacy_intel_gen1_path) self.add_new_binaries(ModelArray.AddIntelGen1Accel, self.constants.legacy_intel_gen1_path)
elif self.igpu_device in ModelArray.SandyBridgepiciid: elif igpu_device in ModelArray.SandyBridgepiciid:
print("- Merging legacy Intel 2nd Gen Kexts and Bundles") print("- Merging legacy Intel 2nd Gen Kexts and Bundles")
self.delete_old_binaries(ModelArray.DeleteNvidiaAccel11) self.delete_old_binaries(ModelArray.DeleteNvidiaAccel11)
self.add_new_binaries(ModelArray.AddIntelGen2Accel, self.constants.legacy_intel_gen2_path) self.add_new_binaries(ModelArray.AddIntelGen2Accel, self.constants.legacy_intel_gen2_path)
@@ -176,11 +153,11 @@ class PatchSysVolume:
# subprocess.run(f"sudo cp -R {self.constants.legacy_amd_path}/AMD-Link/AppleIntelSNBGraphicsFB.kext {self.mount_extensions}".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode() # subprocess.run(f"sudo cp -R {self.constants.legacy_amd_path}/AMD-Link/AppleIntelSNBGraphicsFB.kext {self.mount_extensions}".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode()
# Code for when Ivy Bridge binares are presumably removed from macOS 12, code currently # Code for when Ivy Bridge binares are presumably removed from macOS 12, code currently
#elif self.igpu_device in ModelArray.IvyBridgepciid: #elif igpu_device in ModelArray.IvyBridgepciid:
# print("- Merging legacy Intel 3rd Gen Kexts and Bundles") # print("- Merging legacy Intel 3rd Gen Kexts and Bundles")
# self.add_new_binaries(ModelArray.AddIntelGen3Accel, self.constants.legacy_intel_gen3_path) # self.add_new_binaries(ModelArray.AddIntelGen3Accel, self.constants.legacy_intel_gen3_path)
elif self.igpu_vendor == self.constants.pci_nvidia: elif igpu_vendor == self.constants.pci_nvidia:
if not self.dgpu_devices: if not dgpu_devices:
# Avoid patching twice, as Nvidia iGPUs will only have Nvidia dGPUs # Avoid patching twice, as Nvidia iGPUs will only have Nvidia dGPUs
print("- Merging legacy Nvidia Kexts and Bundles") print("- Merging legacy Nvidia Kexts and Bundles")
self.delete_old_binaries(ModelArray.DeleteNvidiaAccel11) self.delete_old_binaries(ModelArray.DeleteNvidiaAccel11)
@@ -222,10 +199,10 @@ class PatchSysVolume:
subprocess.run(f"sudo find {self.constants.payload_apple_root_path} -name '.DS_Store' -delete".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode() subprocess.run(f"sudo find {self.constants.payload_apple_root_path} -name '.DS_Store' -delete".split(), stdout=subprocess.PIPE).stdout.decode().strip().encode()
if self.model in ModelArray.LegacyGPU or self.constants.assume_legacy is True: if self.model in ModelArray.LegacyGPU or self.constants.assume_legacy is True:
self.check_pciid() dgpu_vendor,dgpu_device = DeviceProbe.pci_probe().gpu_probe("GFX0")
if self.dgpu_devices and self.dgpu_vendor == self.constants.pci_amd_ati and self.dgpu_device in ModelArray.AMDMXMGPUs: if dgpu_vendor and dgpu_vendor == self.constants.pci_amd_ati and dgpu_device in ModelArray.AMDMXMGPUs:
print("- Detected Metal-based AMD GPU, skipping legacy patches") print("- Detected Metal-based AMD GPU, skipping legacy patches")
elif self.dgpu_devices and self.dgpu_vendor == self.constants.pci_nvidia and self.dgpu_device in ModelArray.NVIDIAMXMGPUs: elif dgpu_vendor and dgpu_vendor == self.constants.pci_nvidia and dgpu_device in ModelArray.NVIDIAMXMGPUs:
print("- Detected Metal-based Nvidia GPU, skipping legacy patches") print("- Detected Metal-based Nvidia GPU, skipping legacy patches")
else: else:
print("- Detected legacy GPU, attempting legacy acceleration patches") print("- Detected legacy GPU, attempting legacy acceleration patches")
@@ -334,6 +311,7 @@ class PatchSysVolume:
def start_patch(self): def start_patch(self):
# Check SIP # Check SIP
# self.check_files()
if self.constants.custom_model is not None: if self.constants.custom_model is not None:
print("Root Patching must be done on target machine!") print("Root Patching must be done on target machine!")
elif self.model in ModelArray.NoRootPatch11 and self.constants.assume_legacy is False: elif self.model in ModelArray.NoRootPatch11 and self.constants.assume_legacy is False: