From c80de035670e5b8fc91af7137c068f93ebeea7e5 Mon Sep 17 00:00:00 2001 From: souldbminersmwc Date: Sun, 14 Dec 2025 12:03:30 -0500 Subject: [PATCH] sysclk: fix kip editing backend --- Source/sys-clk/common/include/sysclk/config.h | 1 + Source/sys-clk/sysmodule/Makefile | 1 + .../sys-clk/sysmodule/src/clock_manager.cpp | 231 +++++++++--------- Source/sys-clk/sysmodule/src/config.cpp | 151 +++++++----- Source/sys-clk/sysmodule/src/config.h | 15 +- 5 files changed, 214 insertions(+), 185 deletions(-) diff --git a/Source/sys-clk/common/include/sysclk/config.h b/Source/sys-clk/common/include/sysclk/config.h index aabdcb3c..8a120ffc 100644 --- a/Source/sys-clk/common/include/sysclk/config.h +++ b/Source/sys-clk/common/include/sysclk/config.h @@ -391,6 +391,7 @@ static inline uint64_t sysclkDefaultConfigValue(SysClkConfigValue val) case SysClkConfigValue_CsvWriteIntervalMs: case HocClkConfigValue_UncappedClocks: case HocClkConfigValue_OverwriteBoostMode: + case HocClkConfigValue_KipFileName: return 0ULL; case HocClkConfigValue_EristaMaxCpuClock: return 1785ULL; diff --git a/Source/sys-clk/sysmodule/Makefile b/Source/sys-clk/sysmodule/Makefile index c5bd564a..097e5252 100644 --- a/Source/sys-clk/sysmodule/Makefile +++ b/Source/sys-clk/sysmodule/Makefile @@ -18,6 +18,7 @@ include $(DEVKITPRO)/libnx/switch_rules # EXEFS_SRC is the optional input directory containing data copied into exefs, if anything this normally should only contain "main.npdm". #--------------------------------------------------------------------------------- TARGET := horizon-oc +KIP_CUST_REV := 1 BUILD := build OUTDIR := out RESOURCES := res diff --git a/Source/sys-clk/sysmodule/src/clock_manager.cpp b/Source/sys-clk/sysmodule/src/clock_manager.cpp index b3fc65a3..e5779b6d 100644 --- a/Source/sys-clk/sysmodule/src/clock_manager.cpp +++ b/Source/sys-clk/sysmodule/src/clock_manager.cpp @@ -521,156 +521,151 @@ void ClockManager::SetRNXRTMode(ReverseNXMode mode) } void ClockManager::SetKipData() { - std::scoped_lock lock{this->contextMutex}; + if(this->config->Refresh()) { + std::scoped_lock lock{this->contextMutex}; + CustomizeTable table; - const char* kip; - if(this->config->GetConfigValue(HocClkConfigValue_KipFileName)) - kip = "sdmc:/atmosphere/kips/hoc.kip"; - else - kip = "sdmc:/atmosphere/kips/loader.kip"; + if (!cust_read_and_cache(this->config->GetConfigValue(HocClkConfigValue_KipFileName) ? "sdmc:/atmosphere/kips/loader.kip" : "sdmc:/atmosphere/kips/hoc.kip", &table)) { + FileUtils::LogLine("[clock_manager] Failed to read KIP file"); + return; + } - CustomizeTable table; + CUST_WRITE_FIELD_BATCH(&table, custRev, this->config->GetConfigValue(KipConfigValue_custRev)); + CUST_WRITE_FIELD_BATCH(&table, mtcConf, this->config->GetConfigValue(KipConfigValue_mtcConf)); + CUST_WRITE_FIELD_BATCH(&table, hpMode, this->config->GetConfigValue(KipConfigValue_hpMode)); - if (!cust_read_and_cache(kip, &table)) { - FileUtils::LogLine("[clock_manager] Failed to read KIP file"); - return; - } + CUST_WRITE_FIELD_BATCH(&table, commonEmcMemVolt, this->config->GetConfigValue(KipConfigValue_commonEmcMemVolt)); + CUST_WRITE_FIELD_BATCH(&table, eristaEmcMaxClock, this->config->GetConfigValue(KipConfigValue_eristaEmcMaxClock)); + CUST_WRITE_FIELD_BATCH(&table, marikoEmcMaxClock, this->config->GetConfigValue(KipConfigValue_marikoEmcMaxClock)); + CUST_WRITE_FIELD_BATCH(&table, marikoEmcVddqVolt, this->config->GetConfigValue(KipConfigValue_marikoEmcVddqVolt)); + CUST_WRITE_FIELD_BATCH(&table, emcDvbShift, this->config->GetConfigValue(KipConfigValue_emcDvbShift)); - CUST_WRITE_FIELD_BATCH(&table, custRev, this->config->GetConfigValue(KipConfigValue_custRev)); - CUST_WRITE_FIELD_BATCH(&table, mtcConf, this->config->GetConfigValue(KipConfigValue_mtcConf)); - CUST_WRITE_FIELD_BATCH(&table, hpMode, this->config->GetConfigValue(KipConfigValue_hpMode)); + CUST_WRITE_FIELD_BATCH(&table, t1_tRCD, this->config->GetConfigValue(KipConfigValue_t1_tRCD)); + CUST_WRITE_FIELD_BATCH(&table, t2_tRP, this->config->GetConfigValue(KipConfigValue_t2_tRP)); + CUST_WRITE_FIELD_BATCH(&table, t3_tRAS, this->config->GetConfigValue(KipConfigValue_t3_tRAS)); + CUST_WRITE_FIELD_BATCH(&table, t4_tRRD, this->config->GetConfigValue(KipConfigValue_t4_tRRD)); + CUST_WRITE_FIELD_BATCH(&table, t5_tRFC, this->config->GetConfigValue(KipConfigValue_t5_tRFC)); + CUST_WRITE_FIELD_BATCH(&table, t6_tRTW, this->config->GetConfigValue(KipConfigValue_t6_tRTW)); + CUST_WRITE_FIELD_BATCH(&table, t7_tWTR, this->config->GetConfigValue(KipConfigValue_t7_tWTR)); + CUST_WRITE_FIELD_BATCH(&table, t8_tREFI, this->config->GetConfigValue(KipConfigValue_t8_tREFI)); + CUST_WRITE_FIELD_BATCH(&table, mem_burst_read_latency, this->config->GetConfigValue(KipConfigValue_mem_burst_read_latency)); + CUST_WRITE_FIELD_BATCH(&table, mem_burst_write_latency, this->config->GetConfigValue(KipConfigValue_mem_burst_write_latency)); - CUST_WRITE_FIELD_BATCH(&table, commonEmcMemVolt, this->config->GetConfigValue(KipConfigValue_commonEmcMemVolt)); - CUST_WRITE_FIELD_BATCH(&table, eristaEmcMaxClock, this->config->GetConfigValue(KipConfigValue_eristaEmcMaxClock)); - CUST_WRITE_FIELD_BATCH(&table, marikoEmcMaxClock, this->config->GetConfigValue(KipConfigValue_marikoEmcMaxClock)); - CUST_WRITE_FIELD_BATCH(&table, marikoEmcVddqVolt, this->config->GetConfigValue(KipConfigValue_marikoEmcVddqVolt)); - CUST_WRITE_FIELD_BATCH(&table, emcDvbShift, this->config->GetConfigValue(KipConfigValue_emcDvbShift)); + CUST_WRITE_FIELD_BATCH(&table, eristaCpuUV, this->config->GetConfigValue(KipConfigValue_eristaCpuUV)); + CUST_WRITE_FIELD_BATCH(&table, eristaCpuMaxVolt, this->config->GetConfigValue(KipConfigValue_eristaCpuMaxVolt)); - CUST_WRITE_FIELD_BATCH(&table, t1_tRCD, this->config->GetConfigValue(KipConfigValue_t1_tRCD)); - CUST_WRITE_FIELD_BATCH(&table, t2_tRP, this->config->GetConfigValue(KipConfigValue_t2_tRP)); - CUST_WRITE_FIELD_BATCH(&table, t3_tRAS, this->config->GetConfigValue(KipConfigValue_t3_tRAS)); - CUST_WRITE_FIELD_BATCH(&table, t4_tRRD, this->config->GetConfigValue(KipConfigValue_t4_tRRD)); - CUST_WRITE_FIELD_BATCH(&table, t5_tRFC, this->config->GetConfigValue(KipConfigValue_t5_tRFC)); - CUST_WRITE_FIELD_BATCH(&table, t6_tRTW, this->config->GetConfigValue(KipConfigValue_t6_tRTW)); - CUST_WRITE_FIELD_BATCH(&table, t7_tWTR, this->config->GetConfigValue(KipConfigValue_t7_tWTR)); - CUST_WRITE_FIELD_BATCH(&table, t8_tREFI, this->config->GetConfigValue(KipConfigValue_t8_tREFI)); - CUST_WRITE_FIELD_BATCH(&table, mem_burst_read_latency, this->config->GetConfigValue(KipConfigValue_mem_burst_read_latency)); - CUST_WRITE_FIELD_BATCH(&table, mem_burst_write_latency, this->config->GetConfigValue(KipConfigValue_mem_burst_write_latency)); + CUST_WRITE_FIELD_BATCH(&table, marikoCpuUVLow, this->config->GetConfigValue(KipConfigValue_marikoCpuUVLow)); + CUST_WRITE_FIELD_BATCH(&table, marikoCpuUVHigh, this->config->GetConfigValue(KipConfigValue_marikoCpuUVHigh)); + CUST_WRITE_FIELD_BATCH(&table, tableConf, this->config->GetConfigValue(KipConfigValue_tableConf)); + CUST_WRITE_FIELD_BATCH(&table, marikoCpuLowVmin, this->config->GetConfigValue(KipConfigValue_marikoCpuLowVmin)); + CUST_WRITE_FIELD_BATCH(&table, marikoCpuHighVmin, this->config->GetConfigValue(KipConfigValue_marikoCpuHighVmin)); + CUST_WRITE_FIELD_BATCH(&table, marikoCpuMaxVolt, this->config->GetConfigValue(KipConfigValue_marikoCpuMaxVolt)); - CUST_WRITE_FIELD_BATCH(&table, eristaCpuUV, this->config->GetConfigValue(KipConfigValue_eristaCpuUV)); - CUST_WRITE_FIELD_BATCH(&table, eristaCpuMaxVolt, this->config->GetConfigValue(KipConfigValue_eristaCpuMaxVolt)); + CUST_WRITE_FIELD_BATCH(&table, eristaCpuBoostClock, this->config->GetConfigValue(KipConfigValue_eristaCpuBoostClock)); + CUST_WRITE_FIELD_BATCH(&table, marikoCpuBoostClock, this->config->GetConfigValue(KipConfigValue_marikoCpuBoostClock)); - CUST_WRITE_FIELD_BATCH(&table, marikoCpuUVLow, this->config->GetConfigValue(KipConfigValue_marikoCpuUVLow)); - CUST_WRITE_FIELD_BATCH(&table, marikoCpuUVHigh, this->config->GetConfigValue(KipConfigValue_marikoCpuUVHigh)); - CUST_WRITE_FIELD_BATCH(&table, tableConf, this->config->GetConfigValue(KipConfigValue_tableConf)); - CUST_WRITE_FIELD_BATCH(&table, marikoCpuLowVmin, this->config->GetConfigValue(KipConfigValue_marikoCpuLowVmin)); - CUST_WRITE_FIELD_BATCH(&table, marikoCpuHighVmin, this->config->GetConfigValue(KipConfigValue_marikoCpuHighVmin)); - CUST_WRITE_FIELD_BATCH(&table, marikoCpuMaxVolt, this->config->GetConfigValue(KipConfigValue_marikoCpuMaxVolt)); + CUST_WRITE_FIELD_BATCH(&table, eristaGpuUV, this->config->GetConfigValue(KipConfigValue_eristaGpuUV)); + CUST_WRITE_FIELD_BATCH(&table, eristaGpuVmin, this->config->GetConfigValue(KipConfigValue_eristaGpuVmin)); - CUST_WRITE_FIELD_BATCH(&table, eristaCpuBoostClock, this->config->GetConfigValue(KipConfigValue_eristaCpuBoostClock)); - CUST_WRITE_FIELD_BATCH(&table, marikoCpuBoostClock, this->config->GetConfigValue(KipConfigValue_marikoCpuBoostClock)); + CUST_WRITE_FIELD_BATCH(&table, marikoGpuUV, this->config->GetConfigValue(KipConfigValue_marikoGpuUV)); + CUST_WRITE_FIELD_BATCH(&table, marikoGpuVmin, this->config->GetConfigValue(KipConfigValue_marikoGpuVmin)); + CUST_WRITE_FIELD_BATCH(&table, marikoGpuVmax, this->config->GetConfigValue(KipConfigValue_marikoGpuVmax)); - CUST_WRITE_FIELD_BATCH(&table, eristaGpuUV, this->config->GetConfigValue(KipConfigValue_eristaGpuUV)); - CUST_WRITE_FIELD_BATCH(&table, eristaGpuVmin, this->config->GetConfigValue(KipConfigValue_eristaGpuVmin)); + CUST_WRITE_FIELD_BATCH(&table, commonGpuVoltOffset, this->config->GetConfigValue(KipConfigValue_commonGpuVoltOffset)); + CUST_WRITE_FIELD_BATCH(&table, gpuSpeedo, this->config->GetConfigValue(KipConfigValue_gpuSpeedo)); + CUST_WRITE_FIELD_BATCH(&table, marikoGpuFullUnlock, this->config->GetConfigValue(KipConfigValue_marikoGpuFullUnlock)); - CUST_WRITE_FIELD_BATCH(&table, marikoGpuUV, this->config->GetConfigValue(KipConfigValue_marikoGpuUV)); - CUST_WRITE_FIELD_BATCH(&table, marikoGpuVmin, this->config->GetConfigValue(KipConfigValue_marikoGpuVmin)); - CUST_WRITE_FIELD_BATCH(&table, marikoGpuVmax, this->config->GetConfigValue(KipConfigValue_marikoGpuVmax)); + for (int i = 0; i < 24; i++) { + table.marikoGpuVoltArray[i] = this->config->GetConfigValue((SysClkConfigValue)(KipConfigValue_g_volt_76800 + i)); + } - CUST_WRITE_FIELD_BATCH(&table, commonGpuVoltOffset, this->config->GetConfigValue(KipConfigValue_commonGpuVoltOffset)); - CUST_WRITE_FIELD_BATCH(&table, gpuSpeedo, this->config->GetConfigValue(KipConfigValue_gpuSpeedo)); - CUST_WRITE_FIELD_BATCH(&table, marikoGpuFullUnlock, this->config->GetConfigValue(KipConfigValue_marikoGpuFullUnlock)); + for (int i = 0; i < 27; i++) { + table.eristaGpuVoltArray[i] = this->config->GetConfigValue((SysClkConfigValue)(KipConfigValue_g_volt_e_76800 + i)); + } - for (int i = 0; i < 24; i++) { - table.marikoGpuVoltArray[i] = this->config->GetConfigValue((SysClkConfigValue)(KipConfigValue_g_volt_76800 + i)); - } - - for (int i = 0; i < 27; i++) { - table.eristaGpuVoltArray[i] = this->config->GetConfigValue((SysClkConfigValue)(KipConfigValue_g_volt_e_76800 + i)); - } - - if (!cust_write_table(kip, &table)) { - FileUtils::LogLine("[clock_manager] Failed to write KIP file"); + if (!cust_write_table(this->config->GetConfigValue(HocClkConfigValue_KipFileName) ? "sdmc:/atmosphere/kips/loader.kip" : "sdmc:/atmosphere/kips/hoc.kip", &table)) { + FileUtils::LogLine("[clock_manager] Failed to write KIP file"); + } } } // I know this is very hacky, but the config system in the sysmodule doesn't really support writing void ClockManager::GetKipData() { - this->config->Refresh(); - std::scoped_lock lock{this->contextMutex}; - const char* kip; - if(this->config->GetConfigValue(HocClkConfigValue_KipFileName)) - kip = "sdmc:/atmosphere/kips/hoc.kip"; - else - kip = "sdmc:/atmosphere/kips/loader.kip"; + if(this->config->Refresh()) { + std::scoped_lock lock{this->contextMutex}; - CustomizeTable table; + CustomizeTable table; - if (!cust_read_and_cache(kip, &table)) { - FileUtils::LogLine("[clock_manager] Failed to read KIP file for GetKipData"); - return; - } + if (!cust_read_and_cache(this->config->GetConfigValue(HocClkConfigValue_KipFileName) ? "sdmc:/atmosphere/kips/loader.kip" : "sdmc:/atmosphere/kips/hoc.kip", &table)) { + FileUtils::LogLine("[clock_manager] Failed to read KIP file for GetKipData"); + return; + } - SysClkConfigValueList configValues; - this->config->GetConfigValues(&configValues); + SysClkConfigValueList configValues; + this->config->GetConfigValues(&configValues); - configValues.values[KipConfigValue_custRev] = cust_get_cust_rev(&table); - configValues.values[KipConfigValue_mtcConf] = cust_get_mtc_conf(&table); - configValues.values[KipConfigValue_hpMode] = cust_get_hp_mode(&table); + configValues.values[KipConfigValue_mtcConf] = cust_get_mtc_conf(&table); + configValues.values[KipConfigValue_hpMode] = cust_get_hp_mode(&table); - configValues.values[KipConfigValue_commonEmcMemVolt] = cust_get_common_emc_volt(&table); - configValues.values[KipConfigValue_eristaEmcMaxClock] = cust_get_erista_emc_max(&table); - configValues.values[KipConfigValue_marikoEmcMaxClock] = cust_get_mariko_emc_max(&table); - configValues.values[KipConfigValue_marikoEmcVddqVolt] = cust_get_mariko_emc_vddq(&table); - configValues.values[KipConfigValue_emcDvbShift] = cust_get_emc_dvb_shift(&table); + configValues.values[KipConfigValue_commonEmcMemVolt] = cust_get_common_emc_volt(&table); + configValues.values[KipConfigValue_eristaEmcMaxClock] = cust_get_erista_emc_max(&table); + configValues.values[KipConfigValue_marikoEmcMaxClock] = cust_get_mariko_emc_max(&table); + configValues.values[KipConfigValue_marikoEmcVddqVolt] = cust_get_mariko_emc_vddq(&table); + configValues.values[KipConfigValue_emcDvbShift] = cust_get_emc_dvb_shift(&table); - configValues.values[KipConfigValue_t1_tRCD] = cust_get_tRCD(&table); - configValues.values[KipConfigValue_t2_tRP] = cust_get_tRP(&table); - configValues.values[KipConfigValue_t3_tRAS] = cust_get_tRAS(&table); - configValues.values[KipConfigValue_t4_tRRD] = cust_get_tRRD(&table); - configValues.values[KipConfigValue_t5_tRFC] = cust_get_tRFC(&table); - configValues.values[KipConfigValue_t6_tRTW] = cust_get_tRTW(&table); - configValues.values[KipConfigValue_t7_tWTR] = cust_get_tWTR(&table); - configValues.values[KipConfigValue_t8_tREFI] = cust_get_tREFI(&table); - configValues.values[KipConfigValue_mem_burst_read_latency] = cust_get_burst_read_lat(&table); - configValues.values[KipConfigValue_mem_burst_write_latency] = cust_get_burst_write_lat(&table); + configValues.values[KipConfigValue_t1_tRCD] = cust_get_tRCD(&table); + configValues.values[KipConfigValue_t2_tRP] = cust_get_tRP(&table); + configValues.values[KipConfigValue_t3_tRAS] = cust_get_tRAS(&table); + configValues.values[KipConfigValue_t4_tRRD] = cust_get_tRRD(&table); + configValues.values[KipConfigValue_t5_tRFC] = cust_get_tRFC(&table); + configValues.values[KipConfigValue_t6_tRTW] = cust_get_tRTW(&table); + configValues.values[KipConfigValue_t7_tWTR] = cust_get_tWTR(&table); + configValues.values[KipConfigValue_t8_tREFI] = cust_get_tREFI(&table); + configValues.values[KipConfigValue_mem_burst_read_latency] = cust_get_burst_read_lat(&table); + configValues.values[KipConfigValue_mem_burst_write_latency] = cust_get_burst_write_lat(&table); - configValues.values[KipConfigValue_eristaCpuUV] = cust_get_erista_cpu_uv(&table); - configValues.values[KipConfigValue_eristaCpuMaxVolt] = cust_get_erista_cpu_max_volt(&table); - configValues.values[KipConfigValue_marikoCpuUVLow] = cust_get_mariko_cpu_uv_low(&table); - configValues.values[KipConfigValue_marikoCpuUVHigh] = cust_get_mariko_cpu_uv_high(&table); - configValues.values[KipConfigValue_tableConf] = cust_get_table_conf(&table); - configValues.values[KipConfigValue_marikoCpuLowVmin] = cust_get_mariko_cpu_low_vmin(&table); - configValues.values[KipConfigValue_marikoCpuHighVmin] = cust_get_mariko_cpu_high_vmin(&table); - configValues.values[KipConfigValue_marikoCpuMaxVolt] = cust_get_mariko_cpu_max_volt(&table); - configValues.values[KipConfigValue_eristaCpuBoostClock] = cust_get_erista_cpu_boost(&table); - configValues.values[KipConfigValue_marikoCpuBoostClock] = cust_get_mariko_cpu_boost(&table); + configValues.values[KipConfigValue_eristaCpuUV] = cust_get_erista_cpu_uv(&table); + configValues.values[KipConfigValue_eristaCpuMaxVolt] = cust_get_erista_cpu_max_volt(&table); + configValues.values[KipConfigValue_marikoCpuUVLow] = cust_get_mariko_cpu_uv_low(&table); + configValues.values[KipConfigValue_marikoCpuUVHigh] = cust_get_mariko_cpu_uv_high(&table); + configValues.values[KipConfigValue_tableConf] = cust_get_table_conf(&table); + configValues.values[KipConfigValue_marikoCpuLowVmin] = cust_get_mariko_cpu_low_vmin(&table); + configValues.values[KipConfigValue_marikoCpuHighVmin] = cust_get_mariko_cpu_high_vmin(&table); + configValues.values[KipConfigValue_marikoCpuMaxVolt] = cust_get_mariko_cpu_max_volt(&table); + configValues.values[KipConfigValue_eristaCpuBoostClock] = cust_get_erista_cpu_boost(&table); + configValues.values[KipConfigValue_marikoCpuBoostClock] = cust_get_mariko_cpu_boost(&table); - configValues.values[KipConfigValue_eristaGpuUV] = cust_get_erista_gpu_uv(&table); - configValues.values[KipConfigValue_eristaGpuVmin] = cust_get_erista_gpu_vmin(&table); - configValues.values[KipConfigValue_marikoGpuUV] = cust_get_mariko_gpu_uv(&table); - configValues.values[KipConfigValue_marikoGpuVmin] = cust_get_mariko_gpu_vmin(&table); - configValues.values[KipConfigValue_marikoGpuVmax] = cust_get_mariko_gpu_vmax(&table); - configValues.values[KipConfigValue_commonGpuVoltOffset] = cust_get_common_gpu_offset(&table); - configValues.values[KipConfigValue_gpuSpeedo] = cust_get_gpu_speedo(&table); - configValues.values[KipConfigValue_marikoGpuFullUnlock] = cust_get_mariko_gpu_unlock(&table); + configValues.values[KipConfigValue_eristaGpuUV] = cust_get_erista_gpu_uv(&table); + configValues.values[KipConfigValue_eristaGpuVmin] = cust_get_erista_gpu_vmin(&table); + configValues.values[KipConfigValue_marikoGpuUV] = cust_get_mariko_gpu_uv(&table); + configValues.values[KipConfigValue_marikoGpuVmin] = cust_get_mariko_gpu_vmin(&table); + configValues.values[KipConfigValue_marikoGpuVmax] = cust_get_mariko_gpu_vmax(&table); + configValues.values[KipConfigValue_commonGpuVoltOffset] = cust_get_common_gpu_offset(&table); + configValues.values[KipConfigValue_gpuSpeedo] = cust_get_gpu_speedo(&table); + configValues.values[KipConfigValue_marikoGpuFullUnlock] = cust_get_mariko_gpu_unlock(&table); - for (int i = 0; i < 24; i++) { - configValues.values[KipConfigValue_g_volt_76800 + i] = cust_get_mariko_gpu_volt(&table, i); - } + for (int i = 0; i < 24; i++) { + configValues.values[KipConfigValue_g_volt_76800 + i] = cust_get_mariko_gpu_volt(&table, i); + } - for (int i = 0; i < 27; i++) { - configValues.values[KipConfigValue_g_volt_e_76800 + i] = cust_get_erista_gpu_volt(&table, i); - } + for (int i = 0; i < 27; i++) { + configValues.values[KipConfigValue_g_volt_e_76800 + i] = cust_get_erista_gpu_volt(&table, i); + } - if (sizeof(SysClkConfigValueList) <= sizeof(configValues)) { - if (this->config->SetConfigValues(&configValues, false)) { - FileUtils::LogLine("[clock_manager] Successfully loaded KIP data into config"); + // if(cust_get_cust_rev(&table) == KIP_CUST_REV) + // return; + + if (sizeof(SysClkConfigValueList) <= sizeof(configValues)) { + if (this->config->SetConfigValues(&configValues, false)) { + FileUtils::LogLine("[clock_manager] Successfully loaded KIP data into config"); + } else { + FileUtils::LogLine("[clock_manager] Warning: Failed to set config values from KIP"); + } } else { - FileUtils::LogLine("[clock_manager] Warning: Failed to set config values from KIP"); + FileUtils::LogLine("[clock_manager] Error: Config value list buffer size mismatch"); } } else { - FileUtils::LogLine("[clock_manager] Error: Config value list buffer size mismatch"); + FileUtils::LogLine("[clock_manager] Config refresh error in GetKipData!"); } } \ No newline at end of file diff --git a/Source/sys-clk/sysmodule/src/config.cpp b/Source/sys-clk/sysmodule/src/config.cpp index f9a57f66..8b5b5e64 100644 --- a/Source/sys-clk/sysmodule/src/config.cpp +++ b/Source/sys-clk/sysmodule/src/config.cpp @@ -1,4 +1,3 @@ - /* * Copyright (c) Souldbminer and Horizon OC Contributors * @@ -16,8 +15,7 @@ * */ -/* - * -------------------------------------------------------------------------- +/* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , * wrote this file. As long as you retain this notice you can do whatever you @@ -26,6 +24,7 @@ * -------------------------------------------------------------------------- */ + #include "config.h" #include #include @@ -198,24 +197,16 @@ bool Config::SetProfiles(std::uint64_t tid, SysClkTitleProfileList* profiles, bo std::scoped_lock lock{this->configMutex}; uint8_t numProfiles = 0; - // String pointer array passed to ini - char* iniKeys[SysClkProfile_EnumMax * SysClkModule_EnumMax + 1]; - char* iniValues[SysClkProfile_EnumMax * SysClkModule_EnumMax + 1]; - - // Char arrays to build strings - char keysStr[SysClkProfile_EnumMax * SysClkModule_EnumMax * 0x40]; - char valuesStr[SysClkProfile_EnumMax * SysClkModule_EnumMax * 0x10]; char section[17] = {0}; - - // Iteration pointers - char** ik = &iniKeys[0]; - char** iv = &iniValues[0]; - char* sk = &keysStr[0]; - char* sv = &valuesStr[0]; - std::uint32_t* mhz = &profiles->mhz[0]; - snprintf(section, sizeof(section), "%016lX", tid); + std::vector keys; + std::vector values; + keys.reserve(SysClkProfile_EnumMax * SysClkModule_EnumMax); + values.reserve(SysClkProfile_EnumMax * SysClkModule_EnumMax); + + std::uint32_t* mhz = &profiles->mhz[0]; + for(unsigned int profile = 0; profile < SysClkProfile_EnumMax; profile++) { for(unsigned int module = 0; module < SysClkModule_EnumMax; module++) @@ -224,34 +215,35 @@ bool Config::SetProfiles(std::uint64_t tid, SysClkTitleProfileList* profiles, bo { numProfiles++; - // Put key and value as string - snprintf(sk, 0x40, "%s_%s", Board::GetProfileName((SysClkProfile)profile, false), Board::GetModuleName((SysClkModule)module, false)); - snprintf(sv, 0x10, "%d", *mhz); + std::string key = std::string(Board::GetProfileName((SysClkProfile)profile, false)) + + "_" + + Board::GetModuleName((SysClkModule)module, false); + std::string value = std::to_string(*mhz); - // Add them to the ini key/value str arrays - *ik = sk; - *iv = sv; - ik++; - iv++; - - // We used those chars, get to the next ones - sk += 0x40; - sv += 0x10; + keys.push_back(key); + values.push_back(value); } - mhz++; } } - *ik = NULL; - *iv = NULL; + std::vector keyPointers; + std::vector valuePointers; + keyPointers.reserve(keys.size() + 1); + valuePointers.reserve(values.size() + 1); - if(!ini_putsection(section, (const char**)iniKeys, (const char**)iniValues, this->path.c_str())) + for(size_t i = 0; i < keys.size(); i++) { + keyPointers.push_back(keys[i].c_str()); + valuePointers.push_back(values[i].c_str()); + } + keyPointers.push_back(NULL); + valuePointers.push_back(NULL); + + if(!ini_putsection(section, keyPointers.data(), valuePointers.data(), this->path.c_str())) { return false; } - // Only actually apply changes in memory after a succesful save if(immediate) { mhz = &profiles->mhz[0]; @@ -432,46 +424,41 @@ bool Config::SetConfigValues(SysClkConfigValueList* configValues, bool immediate { std::scoped_lock lock{this->configMutex}; - // String pointer array passed to ini - const char* iniKeys[SysClkConfigValue_EnumMax + 1]; - char* iniValues[SysClkConfigValue_EnumMax + 1]; - - // char arrays to build strings - char valuesStr[SysClkConfigValue_EnumMax * 0x20]; - - // Iteration pointers - char* sv = &valuesStr[0]; - const char** ik = &iniKeys[0]; - char** iv = &iniValues[0]; + std::vector iniKeys; + std::vector iniValues; + + iniKeys.reserve(SysClkConfigValue_EnumMax + 1); + iniValues.reserve(SysClkConfigValue_EnumMax); for(unsigned int kval = 0; kval < SysClkConfigValue_EnumMax; kval++) { - if(!sysclkValidConfigValue((SysClkConfigValue)kval, configValues->values[kval]) || configValues->values[kval] == sysclkDefaultConfigValue((SysClkConfigValue)kval)) + if(!sysclkValidConfigValue((SysClkConfigValue)kval, configValues->values[kval]) || + configValues->values[kval] == sysclkDefaultConfigValue((SysClkConfigValue)kval)) { continue; } - // Put key and value as string - // And add them to the ini key/value str arrays - snprintf(sv, 0x20, "%ld", configValues->values[kval]); - *ik = sysclkFormatConfigValue((SysClkConfigValue)kval, false); - *iv = sv; - - // We used those chars, get to the next ones - sv += 0x20; - ik++; - iv++; + iniValues.push_back(std::to_string(configValues->values[kval])); + iniKeys.push_back(sysclkFormatConfigValue((SysClkConfigValue)kval, false)); } - *ik = NULL; - *iv = NULL; + // Null terminate + iniKeys.push_back(NULL); - if(!ini_putsection(CONFIG_VAL_SECTION, (const char**)iniKeys, (const char**)iniValues, this->path.c_str())) + // Build pointer array for ini function + std::vector valuePointers; + valuePointers.reserve(iniValues.size() + 1); + for(const auto& val : iniValues) { + valuePointers.push_back(val.c_str()); + } + valuePointers.push_back(NULL); + + if(!ini_putsection(CONFIG_VAL_SECTION, iniKeys.data(), valuePointers.data(), this->path.c_str())) { return false; } - // Only actually apply changes in memory after a succesful save + // Only actually apply changes in memory after a successful save if(immediate) { for(unsigned int kval = 0; kval < SysClkConfigValue_EnumMax; kval++) @@ -487,5 +474,47 @@ bool Config::SetConfigValues(SysClkConfigValueList* configValues, bool immediate } } + return true; +} + +bool Config::ResetConfigValue(SysClkConfigValue kval) +{ + if (!SYSCLK_ENUM_VALID(SysClkConfigValue, kval)) { + FileUtils::LogLine("[cfg] Invalid SysClkConfigValue: %u", kval); + return false; + } + + std::scoped_lock lock{this->configMutex}; + + std::uint64_t defaultValue = sysclkDefaultConfigValue(kval); + + std::vector iniKeys; + std::vector iniValues; + + iniKeys.reserve(2); + iniValues.reserve(1); + + const char* keyStr = sysclkFormatConfigValue(kval, false); + + iniKeys.push_back(keyStr); + iniValues.push_back(""); + + iniKeys.push_back(NULL); + + std::vector valuePointers; + valuePointers.reserve(iniValues.size() + 1); + for (const auto& val : iniValues) { + valuePointers.push_back(val.c_str()); + } + valuePointers.push_back(NULL); + + if (!ini_putsection(CONFIG_VAL_SECTION, iniKeys.data(), valuePointers.data(), this->path.c_str())) { + FileUtils::LogLine("[cfg] Failed to reset config value %u in INI", kval); + return false; + } + + this->configValues[kval] = defaultValue; + FileUtils::LogLine("[cfg] Reset config value %u to default: %llu", kval, defaultValue); + return true; } \ No newline at end of file diff --git a/Source/sys-clk/sysmodule/src/config.h b/Source/sys-clk/sysmodule/src/config.h index 41d18458..b1dc4746 100644 --- a/Source/sys-clk/sysmodule/src/config.h +++ b/Source/sys-clk/sysmodule/src/config.h @@ -15,9 +15,7 @@ * */ - -/* - * -------------------------------------------------------------------------- +/* -------------------------------------------------------------------------- * "THE BEER-WARE LICENSE" (Revision 42): * , , * wrote this file. As long as you retain this notice you can do whatever you @@ -26,6 +24,7 @@ * -------------------------------------------------------------------------- */ + #pragma once #include #include @@ -66,10 +65,15 @@ class Config const char* GetConfigValueName(SysClkConfigValue val, bool pretty); void GetConfigValues(SysClkConfigValueList* out_configValues); bool SetConfigValues(SysClkConfigValueList* configValues, bool immediate); + bool ResetConfigValue(SysClkConfigValue kval); + bool SetInternalValues(bool immediate); + bool SetConfigValue(SysClkConfigValue kval, std::uint64_t value, bool immediate = true); + + uint64_t configValues[SysClkConfigValue_EnumMax]; protected: void Load(); void Close(); - + bool kipOverride[SysClkConfigValue_EnumMax]; time_t CheckModificationTime(); std::uint32_t FindClockMHz(std::uint64_t tid, SysClkModule module, SysClkProfile profile); std::uint32_t FindClockHzFromProfiles(std::uint64_t tid, SysClkModule module, std::initializer_list profiles); @@ -84,5 +88,4 @@ class Config LockableMutex overrideMutex; std::atomic_bool enabled; std::uint32_t overrideFreqs[SysClkModule_EnumMax]; - std::uint64_t configValues[SysClkConfigValue_EnumMax]; -}; \ No newline at end of file +};