GUI: Add MXM model and FU configuration

This commit is contained in:
Mykola Grymalyuk
2023-05-13 12:31:41 -06:00
parent 422283a3ac
commit 8c5165a06c
2 changed files with 202 additions and 55 deletions
+3 -3
View File
@@ -259,7 +259,7 @@ class BuildGraphicsAudio:
"CAIL,CAIL_DisableUVDPowerGating": 1, "CAIL,CAIL_DisableUVDPowerGating": 1,
"CAIL,CAIL_DisableVCEPowerGating": 1, "CAIL,CAIL_DisableVCEPowerGating": 1,
}) })
if self.constants.imac_model == "Legacy GCN": if self.constants.imac_model == "GCN":
logging.info("- Adding Legacy GCN Power Gate Patches") logging.info("- Adding Legacy GCN Power Gate Patches")
self.config["DeviceProperties"]["Add"][backlight_path].update({ self.config["DeviceProperties"]["Add"][backlight_path].update({
"CAIL,CAIL_DisableDrmdmaPowerGating": 1, "CAIL,CAIL_DisableDrmdmaPowerGating": 1,
@@ -274,7 +274,7 @@ class BuildGraphicsAudio:
"CAIL,CAIL_DisableUVDPowerGating": 1, "CAIL,CAIL_DisableUVDPowerGating": 1,
"CAIL,CAIL_DisableVCEPowerGating": 1, "CAIL,CAIL_DisableVCEPowerGating": 1,
}) })
elif self.constants.imac_model == "AMD Lexa": elif self.constants.imac_model == "Lexa":
logging.info("- Adding Lexa Spoofing Patches") logging.info("- Adding Lexa Spoofing Patches")
self.config["DeviceProperties"]["Add"][backlight_path].update({ self.config["DeviceProperties"]["Add"][backlight_path].update({
"model": "AMD Radeon Pro WX 3200", "model": "AMD Radeon Pro WX 3200",
@@ -285,7 +285,7 @@ class BuildGraphicsAudio:
"model": "AMD Radeon Pro WX 3200", "model": "AMD Radeon Pro WX 3200",
"device-id": binascii.unhexlify("FF67"), "device-id": binascii.unhexlify("FF67"),
}) })
elif self.constants.imac_model == "AMD Navi": elif self.constants.imac_model == "Navi":
logging.info("- Adding Navi Spoofing Patches") logging.info("- Adding Navi Spoofing Patches")
navi_backlight_path = backlight_path+"/Pci(0x0,0x0)/Pci(0x0,0x0)" navi_backlight_path = backlight_path+"/Pci(0x0,0x0)/Pci(0x0,0x0)"
self.config["DeviceProperties"]["Add"][navi_backlight_path] = { self.config["DeviceProperties"]["Add"][navi_backlight_path] = {
+199 -52
View File
@@ -7,7 +7,7 @@ import subprocess
from resources.wx_gui import gui_support from resources.wx_gui import gui_support
from resources import constants, global_settings, defaults from resources import constants, global_settings, defaults, generate_smbios
from data import model_array, sip_data, smbios_data from data import model_array, sip_data, smbios_data
class SettingsFrame(wx.Frame): class SettingsFrame(wx.Frame):
@@ -126,6 +126,9 @@ class SettingsFrame(wx.Frame):
checkbox.SetFont(wx.Font(13, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False, ".AppleSystemUIFont")) checkbox.SetFont(wx.Font(13, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False, ".AppleSystemUIFont"))
event = lambda event, warning=setting_info["warning"] if "warning" in setting_info else "", override=bool(setting_info["override_function"]) if "override_function" in setting_info else False: self.on_checkbox(event, warning, override) event = lambda event, warning=setting_info["warning"] if "warning" in setting_info else "", override=bool(setting_info["override_function"]) if "override_function" in setting_info else False: self.on_checkbox(event, warning, override)
checkbox.Bind(wx.EVT_CHECKBOX, event) checkbox.Bind(wx.EVT_CHECKBOX, event)
if "condition" in setting_info:
checkbox.Enable(setting_info["condition"])
checkbox.SetValue(setting_info["condition"])
elif setting_info["type"] == "spinctrl": elif setting_info["type"] == "spinctrl":
# Add spinctrl, and description underneath # Add spinctrl, and description underneath
@@ -137,9 +140,11 @@ class SettingsFrame(wx.Frame):
label.SetFont(wx.Font(13, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False, ".AppleSystemUIFont")) label.SetFont(wx.Font(13, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False, ".AppleSystemUIFont"))
elif setting_info["type"] == "combobox": elif setting_info["type"] == "combobox":
# Add combobox, and description underneath # Add combobox, and description underneath
combobox = wx.ComboBox(panel, value=setting_info["value"], pos=(width + 20, 10 + height), choices=setting_info["choices"], size = (100,-1)) combobox = wx.ComboBox(panel, value=setting_info["value"], pos=(width + 20, 10 + height), choices=setting_info["choices"], size = (130,-1))
combobox.SetFont(wx.Font(13, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False, ".AppleSystemUIFont")) combobox.SetFont(wx.Font(13, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD, False, ".AppleSystemUIFont"))
combobox.Bind(wx.EVT_COMBOBOX, lambda event, variable=setting: self.on_combobox(event, variable)) # combobox.Bind(wx.EVT_COMBOBOX, lambda event, variable=setting: self.on_combobox(event, variable))
if "override_function" in setting_info:
combobox.Bind(wx.EVT_COMBOBOX, lambda event, variable=setting: self.settings[tab][variable]["override_function"](event))
height += 10 height += 10
else: else:
raise Exception("Invalid setting type") raise Exception("Invalid setting type")
@@ -149,8 +154,6 @@ class SettingsFrame(wx.Frame):
description.SetFont(wx.Font(11, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False, ".AppleSystemUIFont")) description.SetFont(wx.Font(11, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False, ".AppleSystemUIFont"))
height += 40 if setting_info["type"] != "combobox" else 60 height += 40 if setting_info["type"] != "combobox" else 60
# Check number of lines in description, and adjust spacer accordingly # Check number of lines in description, and adjust spacer accordingly
description_lines = len(lines.split('\n')) description_lines = len(lines.split('\n'))
if description_lines > 1: if description_lines > 1:
@@ -178,6 +181,7 @@ class SettingsFrame(wx.Frame):
""" """
models = [model for model in smbios_data.smbios_dictionary if "_" not in model and " " not in model and smbios_data.smbios_dictionary[model]["Board ID"] is not None] models = [model for model in smbios_data.smbios_dictionary if "_" not in model and " " not in model and smbios_data.smbios_dictionary[model]["Board ID"] is not None]
socketed_gpu_models = ["iMac9,1", "iMac10,1", "iMac11,1", "iMac11,2", "iMac11,3", "iMac12,1", "iMac12,2", "MacPro3,1", "MacPro4,1", "MacPro5,1", "Xserve2,1", "Xserve3,1"]
settings = { settings = {
"Build": { "Build": {
@@ -192,6 +196,7 @@ class SettingsFrame(wx.Frame):
"Enable booting macOS from", "Enable booting macOS from",
"FireWire drives.", "FireWire drives.",
], ],
"condition": not bool(generate_smbios.check_firewire(self.constants.computer.real_model) is False and not self.constants.custom_model)
}, },
"XHCI Booting": { "XHCI Booting": {
"type": "checkbox", "type": "checkbox",
@@ -199,7 +204,8 @@ class SettingsFrame(wx.Frame):
"variable": "xhci_boot", "variable": "xhci_boot",
"description": [ "description": [
"Enable booting macOS from add-in", "Enable booting macOS from add-in",
"USB 3.0 expansion cards.", "USB 3.0 expansion cards on systems",
"without native support.",
], ],
}, },
"NVMe Booting": { "NVMe Booting": {
@@ -208,21 +214,12 @@ class SettingsFrame(wx.Frame):
"variable": "nvme_boot", "variable": "nvme_boot",
"description": [ "description": [
"Enable booting macOS from NVMe", "Enable booting macOS from NVMe",
"drives.", "drives on systems without native",
"support.",
"Note: Requires Firmware support", "Note: Requires Firmware support",
"for OpenCore to load from NVMe.", "for OpenCore to load from NVMe.",
], ],
}, },
"Wake on WLAN": {
"type": "checkbox",
"value": self.constants.enable_wake_on_wlan,
"variable": "enable_wake_on_wlan",
"description": [
"Disabled by default due to",
"performance degradation",
"on some systems from wake.",
],
},
"wrap_around 2": { "wrap_around 2": {
"type": "wrap_around", "type": "wrap_around",
}, },
@@ -231,7 +228,7 @@ class SettingsFrame(wx.Frame):
"value": self.constants.set_content_caching, "value": self.constants.set_content_caching,
"variable": "set_content_caching", "variable": "set_content_caching",
"description": [ "description": [
"Enable Content Caching.", # "Enable Content Caching.",
], ],
}, },
"APFS Trim": { "APFS Trim": {
@@ -244,12 +241,11 @@ class SettingsFrame(wx.Frame):
], ],
}, },
"Show Boot Picker": { "Show OpenCore Boot Picker": {
"type": "checkbox", "type": "checkbox",
"value": self.constants.showpicker, "value": self.constants.showpicker,
"variable": "showpicker", "variable": "showpicker",
"description": [ "description": [
"Show OpenCore boot picker",
"When disabled, users can hold ESC to", "When disabled, users can hold ESC to",
"show picker in the firmware.", "show picker in the firmware.",
], ],
@@ -259,8 +255,8 @@ class SettingsFrame(wx.Frame):
"value": self.constants.oc_timeout, "value": self.constants.oc_timeout,
"variable": "oc_timeout", "variable": "oc_timeout",
"description": [ "description": [
"Timeout for OpenCore boot picker", "Timeout before boot picker selects default",
"in seconds.", "entry in seconds.",
"Set to 0 for no timeout.", "Set to 0 for no timeout.",
], ],
@@ -306,24 +302,6 @@ class SettingsFrame(wx.Frame):
"Miscellaneous": { "Miscellaneous": {
"type": "title", "type": "title",
}, },
"AMD GOP Injection": {
"type": "checkbox",
"value": self.constants.amd_gop_injection,
"variable": "amd_gop_injection",
"description": [
"Inject AMD GOP for boot screen",
"support on PC GPUs.",
],
},
"Nvidia GOP Injection": {
"type": "checkbox",
"value": self.constants.nvidia_kepler_gop_injection,
"variable": "nvidia_kepler_gop_injection",
"description": [
"Inject Nvidia Kepler GOP for boot",
"screen support on PC GPUs.",
],
},
"Disable Firmware Throttling": { "Disable Firmware Throttling": {
"type": "checkbox", "type": "checkbox",
"value": self.constants.disable_fw_throttle, "value": self.constants.disable_fw_throttle,
@@ -334,9 +312,18 @@ class SettingsFrame(wx.Frame):
"Ex. Missing Display, Battery, etc.", "Ex. Missing Display, Battery, etc.",
], ],
}, },
"wrap_around 1": {
"type": "wrap_around", "Wake on WLAN": {
"type": "checkbox",
"value": self.constants.enable_wake_on_wlan,
"variable": "enable_wake_on_wlan",
"description": [
"Disabled by default due to",
"performance degradation",
"on some systems from wake.",
],
}, },
"Software DeMUX": { "Software DeMUX": {
"type": "checkbox", "type": "checkbox",
"value": self.constants.software_demux, "value": self.constants.software_demux,
@@ -348,13 +335,17 @@ class SettingsFrame(wx.Frame):
"Note: Requires associated NVRAM arg:", "Note: Requires associated NVRAM arg:",
"'gpu-power-prefs'.", "'gpu-power-prefs'.",
], ],
"condition": not bool(not self.constants.custom_model and self.constants.computer.real_model not in ["MacBookPro8,2", "MacBookPro8,3"])
},
"wrap_around 1": {
"type": "wrap_around",
}, },
"3rd Party NVMe PM": { "3rd Party NVMe PM": {
"type": "checkbox", "type": "checkbox",
"value": self.constants.allow_nvme_fixing, "value": self.constants.allow_nvme_fixing,
"variable": "allow_nvme_fixing", "variable": "allow_nvme_fixing",
"description": [ "description": [
"Enable 3rd party NVMe power", "Enable non-stock NVMe power",
"management in macOS.", "management in macOS.",
], ],
}, },
@@ -363,10 +354,80 @@ class SettingsFrame(wx.Frame):
"value": self.constants.allow_3rd_party_drives, "value": self.constants.allow_3rd_party_drives,
"variable": "allow_3rd_party_drives", "variable": "allow_3rd_party_drives",
"description": [ "description": [
"Enable 3rd party SATA power", "Enable non-stock SATA power",
"management in macOS.", "management in macOS.",
], ],
"condition": not bool(self.constants.computer.third_party_sata_ssd is False and not self.constants.custom_model)
}, },
"FeatureUnlock": {
"type": "combobox",
"choices": [
"Enabled",
"Partial",
"Disabled",
],
"value": "Enabled",
"variable": "",
"description": [
"Configure FeatureUnlock level.",
"Recommend lowering if your system",
"experiences memory instability.",
],
},
"Populate FeatureUnlock Override": {
"type": "populate",
"function": self._populate_fu_override,
"args": wx.Frame,
},
"Graphics": {
"type": "title",
},
"AMD GOP Injection": {
"type": "checkbox",
"value": self.constants.amd_gop_injection,
"variable": "amd_gop_injection",
"description": [
"Inject AMD GOP for boot screen",
"support on PC GPUs.",
],
"condition": not bool((not self.constants.custom_model and self.constants.computer.real_model not in socketed_gpu_models) or (self.constants.custom_model and self.constants.custom_model not in socketed_gpu_models))
},
"Nvidia GOP Injection": {
"type": "checkbox",
"value": self.constants.nvidia_kepler_gop_injection,
"variable": "nvidia_kepler_gop_injection",
"description": [
"Inject Nvidia Kepler GOP for boot",
"screen support on PC GPUs.",
],
"condition": not bool((not self.constants.custom_model and self.constants.computer.real_model not in socketed_gpu_models) or (self.constants.custom_model and self.constants.custom_model not in socketed_gpu_models))
},
"wrap_around 2": {
"type": "wrap_around",
},
"Graphics Override": {
"type": "combobox",
"choices": [
"None",
"Nvidia Kepler",
"AMD GCN",
"AMD Polaris",
"AMD Lexa",
"AMD Navi",
],
"value": "None",
"variable": "",
"description": [
"Override detected/assumed GPU on",
"socketed MXM-based iMacs.",
],
},
"Populate Graphics Override": {
"type": "populate",
"function": self._populate_graphics_override,
"args": wx.Frame,
},
}, },
"Security": { "Security": {
"Kernel Security": { "Kernel Security": {
@@ -430,6 +491,7 @@ class SettingsFrame(wx.Frame):
"By default this is disabled due to", "By default this is disabled due to",
"common GPU failures on these models.", "common GPU failures on these models.",
], ],
"condition": not bool(self.constants.computer.real_model not in ["MacBookPro8,2", "MacBookPro8,3"])
}, },
"wrap_around 1": { "wrap_around 1": {
"type": "wrap_around", "type": "wrap_around",
@@ -444,6 +506,7 @@ class SettingsFrame(wx.Frame):
"on HD3000 GPUs in Ventura and newer.", "on HD3000 GPUs in Ventura and newer.",
"Note: Disabling can cause UI corruption.", "Note: Disabling can cause UI corruption.",
], ],
"condition": not bool(self.constants.computer.real_model not in ["MacBookAir4,1","MacBookAir4,2","MacBookPro8,1","MacBookPro8,2","MacBookPro8,3","Macmini5,1"])
}, },
}, },
"SMBIOS": { "SMBIOS": {
@@ -483,12 +546,12 @@ class SettingsFrame(wx.Frame):
"wrap_around 1": { "wrap_around 1": {
"type": "wrap_around", "type": "wrap_around",
}, },
"Allow native spoofing": { "Allow spoofing native Macs": {
"type": "checkbox", "type": "checkbox",
"value": self.constants.allow_native_spoofs, "value": self.constants.allow_native_spoofs,
"variable": "allow_native_spoofs", "variable": "allow_native_spoofs",
"description": [ "description": [
"Allow OpenCore to spoof to", "Allow OpenCore to spoof",
"natively supported Macs.", "natively supported Macs.",
"Primarily used for enabling", "Primarily used for enabling",
"Universal Control.", "Universal Control.",
@@ -563,7 +626,7 @@ class SettingsFrame(wx.Frame):
"variable": "IgnoreAppUpdates", "variable": "IgnoreAppUpdates",
"constants_variable": "ignore_updates", "constants_variable": "ignore_updates",
"description": [ "description": [
"Ignore app updates", # "Ignore app updates",
], ],
"override_function": self._update_global_settings, "override_function": self._update_global_settings,
}, },
@@ -580,15 +643,15 @@ class SettingsFrame(wx.Frame):
], ],
"override_function": self._update_global_settings, "override_function": self._update_global_settings,
}, },
"Disable Unused KDKs": { "Remove Unused KDKs": {
"type": "checkbox", "type": "checkbox",
"value": global_settings.GlobalEnviromentSettings().read_property("ShouldNukeKDKs") or self.constants.should_nuke_kdks, "value": global_settings.GlobalEnviromentSettings().read_property("ShouldNukeKDKs") or self.constants.should_nuke_kdks,
"variable": "ShouldNukeKDKs", "variable": "ShouldNukeKDKs",
"constants_variable": "should_nuke_kdks", "constants_variable": "should_nuke_kdks",
"description": [ "description": [
"When enabled, the app will remove", "When enabled, the app will remove",
"unused KDKs from the system during", "unused Kernel Debug Kits from the system",
"root patching.", "during root patching.",
], ],
"override_function": self._update_global_settings, "override_function": self._update_global_settings,
}, },
@@ -651,8 +714,7 @@ class SettingsFrame(wx.Frame):
# Label: Flip individual bits corresponding to XNU's csr.h # Label: Flip individual bits corresponding to XNU's csr.h
# If you're unfamiliar with how SIP works, do not touch this menu # If you're unfamiliar with how SIP works, do not touch this menu
sip_label = wx.StaticText(panel, label="Flip individual bits corresponding to", pos=(sip_title.GetPosition()[0] - 20 sip_label = wx.StaticText(panel, label="Flip individual bits corresponding to", pos=(sip_title.GetPosition()[0] - 20, sip_title.GetPosition()[1] + 30))
, sip_title.GetPosition()[1] + 30))
sip_label.SetFont(wx.Font(13, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False, ".AppleSystemUIFont")) sip_label.SetFont(wx.Font(13, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False, ".AppleSystemUIFont"))
# Hyperlink: csr.h # Hyperlink: csr.h
@@ -886,6 +948,91 @@ Hardware Information:
self.constants.custom_board_serial_number = event.GetEventObject().GetValue() self.constants.custom_board_serial_number = event.GetEventObject().GetValue()
def _populate_fu_override(self, panel: wx.Panel) -> None:
gpu_combo_box: wx.ComboBox = None
index = 0
for child in panel.GetChildren():
if isinstance(child, wx.ComboBox):
gpu_combo_box = child
break
gpu_combo_box.Bind(wx.EVT_COMBOBOX, self.fu_selection_click)
if self.constants.fu_status is False:
gpu_combo_box.SetStringSelection("Disabled")
elif self.constants.fu_arguments is None:
gpu_combo_box.SetStringSelection("Enabled")
else:
gpu_combo_box.SetStringSelection("Partial")
def fu_selection_click(self, event: wx.Event) -> None:
value = event.GetEventObject().GetStringSelection()
if value == "Enabled":
self.constants.fu_status = True
self.constants.fu_arguments = None
return
if value == "Partial":
self.constants.fu_status = True
self.constants.fu_arguments = " -disable_sidecar_mac"
return
self.constants.fu_status = False
self.constants.fu_arguments = None
def _populate_graphics_override(self, panel: wx.Panel) -> None:
gpu_combo_box: wx.ComboBox = None
index = 0
for child in panel.GetChildren():
if isinstance(child, wx.ComboBox):
if index == 0:
index = index + 1
continue
gpu_combo_box = child
break
gpu_combo_box.Bind(wx.EVT_COMBOBOX, self.gpu_selection_click)
gpu_combo_box.SetStringSelection(f"{self.constants.imac_vendor} {self.constants.imac_model}")
socketed_gpu_models = ["iMac9,1", "iMac10,1", "iMac11,1", "iMac11,2", "iMac11,3", "iMac12,1", "iMac12,2"]
if ((not self.constants.custom_model and self.constants.computer.real_model not in socketed_gpu_models) or (self.constants.custom_model and self.constants.custom_model not in socketed_gpu_models)):
gpu_combo_box.Disable()
return
def gpu_selection_click(self, event: wx.Event) -> None:
gpu_choice = event.GetEventObject().GetStringSelection()
logging.info(f"Updating GPU Selection: {gpu_choice}")
if "AMD" in gpu_choice:
self.constants.imac_vendor = "AMD"
self.constants.metal_build = True
if "Polaris" in gpu_choice:
self.constants.imac_model = "Polaris"
elif "GCN" in gpu_choice:
self.constants.imac_model = "GCN"
elif "Lexa" in gpu_choice:
self.constants.imac_model = "Lexa"
elif "Navi" in gpu_choice:
self.constants.imac_model = "Navi"
else:
raise Exception("Unknown GPU Model")
elif "Nvidia" in gpu_choice:
self.constants.imac_vendor = "Nvidia"
self.constants.metal_build = True
if "Kepler" in gpu_choice:
self.constants.imac_model = "Kepler"
elif "GT" in gpu_choice:
self.constants.imac_model = "GT"
else:
raise Exception("Unknown GPU Model")
else:
self.constants.imac_vendor = "None"
self.constants.metal_build = False
def _get_system_settings(self, variable) -> bool: def _get_system_settings(self, variable) -> bool:
result = subprocess.run(["defaults", "read", "-g", variable], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) result = subprocess.run(["defaults", "read", "-g", variable], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
if result.returncode == 0: if result.returncode == 0: