Merge upstream
This commit is contained in:
@@ -30,7 +30,8 @@ TRIP_TEMP_RANGE = [40, 97]
|
||||
UNDERVOLT_KEYS = ('UNDERVOLT', 'UNDERVOLT.AC', 'UNDERVOLT.BATTERY')
|
||||
ICCMAX_KEYS = ('ICCMAX', 'ICCMAX.AC', 'ICCMAX.BATTERY')
|
||||
power = {'source': None, 'method': 'polling'}
|
||||
HWP_VALUE = 0x20
|
||||
HWP_PERFORMANCE_VALUE = 0x20
|
||||
HWP_DEFAULT_VALUE = 0x80
|
||||
HWP_INTERVAL = 60
|
||||
|
||||
|
||||
@@ -77,7 +78,7 @@ supported_cpus = {
|
||||
'Kaby Lake (R)': (0x8E, 0x9E),
|
||||
'Coffee Lake': (0x9E,),
|
||||
'Cannon Lake': (0x66,),
|
||||
'Comet Lake': (0xA6,),
|
||||
'Comet Lake': (0xA5, 0xA6),
|
||||
}
|
||||
|
||||
|
||||
@@ -517,16 +518,17 @@ def calc_reg_values(platform_info, config):
|
||||
return regs
|
||||
|
||||
|
||||
def set_hwp():
|
||||
def set_hwp(performance_mode):
|
||||
# set HWP energy performance preference
|
||||
cur_val = readmsr(0x774, cpu=0)
|
||||
new_val = (cur_val & 0xFFFFFFFF00FFFFFF) | (HWP_VALUE << 24)
|
||||
hwp_mode = HWP_PERFORMANCE_VALUE if performance_mode else HWP_DEFAULT_VALUE
|
||||
new_val = (cur_val & 0xFFFFFFFF00FFFFFF) | (hwp_mode << 24)
|
||||
|
||||
writemsr(0x774, new_val)
|
||||
if args.debug:
|
||||
read_value = readmsr(0x774, from_bit=24, to_bit=31)[0]
|
||||
match = OK if HWP_VALUE == read_value else ERR
|
||||
log('[D] HWP - write "{:#02x}" - read "{:#02x}" - match {}'.format(HWP_VALUE, read_value, match))
|
||||
match = OK if hwp_mode == read_value else ERR
|
||||
log('[D] HWP - write "{:#02x}" - read "{:#02x}" - match {}'.format(hwp_mode, read_value, match))
|
||||
|
||||
|
||||
def set_disable_bdprochot():
|
||||
@@ -541,6 +543,23 @@ def set_disable_bdprochot():
|
||||
log('[D] BDPROCHOT - write "{:#02x}" - read "{:#02x}" - match {}'.format(0, read_value, match))
|
||||
|
||||
|
||||
def get_config_write_time():
|
||||
try:
|
||||
return os.stat(args.config).st_mtime
|
||||
except FileNotFoundError:
|
||||
return None
|
||||
|
||||
|
||||
def reload_config():
|
||||
config = load_config()
|
||||
regs = calc_reg_values(get_cpu_platform_info(), config)
|
||||
undervolt(config)
|
||||
set_icc_max(config)
|
||||
set_hwp(config.getboolean('AC', 'HWP_Mode', fallback=False))
|
||||
log('[I] Reloading changes.')
|
||||
return config, regs
|
||||
|
||||
|
||||
def power_thread(config, regs, exit_event):
|
||||
try:
|
||||
mchbar_mmio = MMIO(0xFED159A0, 8)
|
||||
@@ -550,6 +569,8 @@ def power_thread(config, regs, exit_event):
|
||||
mchbar_mmio = None
|
||||
|
||||
next_hwp_write = 0
|
||||
last_config_write_time = get_config_write_time() \
|
||||
if config.getboolean('GENERAL', 'Autoreload', fallback=False) else None
|
||||
while not exit_event.is_set():
|
||||
# log thermal status
|
||||
if args.debug:
|
||||
@@ -558,6 +579,13 @@ def power_thread(config, regs, exit_event):
|
||||
for key, value in core_thermal_status.items():
|
||||
log('[D] core {} thermal status: {} = {}'.format(index, key.replace("_", " "), value))
|
||||
|
||||
# Reload config on changes (unless it's deleted)
|
||||
if config.getboolean('GENERAL', 'Autoreload', fallback=False):
|
||||
config_write_time = get_config_write_time()
|
||||
if config_write_time and last_config_write_time != config_write_time:
|
||||
last_config_write_time = config_write_time
|
||||
config, regs = reload_config()
|
||||
|
||||
# switch back to sysfs polling
|
||||
if power['method'] == 'polling':
|
||||
power['source'] = 'BATTERY' if is_on_battery(config) else 'AC'
|
||||
@@ -628,7 +656,7 @@ def power_thread(config, regs, exit_event):
|
||||
or (power['method'] == 'polling' and not is_on_battery(config))
|
||||
)
|
||||
):
|
||||
set_hwp()
|
||||
set_hwp(enable_hwp_mode)
|
||||
next_hwp_write = time() + HWP_INTERVAL
|
||||
|
||||
else:
|
||||
@@ -791,14 +819,15 @@ def main():
|
||||
log('[I] Throttled is disabled in config file... Quitting. :(')
|
||||
return
|
||||
|
||||
undervolt(config)
|
||||
set_icc_max(config)
|
||||
set_hwp(config.getboolean('AC', 'HWP_Mode', fallback=False))
|
||||
|
||||
exit_event = Event()
|
||||
thread = Thread(target=power_thread, args=(config, regs, exit_event))
|
||||
thread.daemon = True
|
||||
thread.start()
|
||||
|
||||
undervolt(config)
|
||||
set_icc_max(config)
|
||||
|
||||
# handle dbus events for applying undervolt/IccMax on resume from sleep/hybernate
|
||||
def handle_sleep_callback(sleeping):
|
||||
if not sleeping:
|
||||
|
||||
Reference in New Issue
Block a user