diff --git a/Source/hoc-clk/common/include/hocclk/clock_manager.h b/Source/hoc-clk/common/include/hocclk/clock_manager.h index 151f3c6f..4c0da674 100644 --- a/Source/hoc-clk/common/include/hocclk/clock_manager.h +++ b/Source/hoc-clk/common/include/hocclk/clock_manager.h @@ -94,7 +94,7 @@ typedef struct }; } HocClkTitleProfileList; -#define HOCCLK_FREQ_LIST_MAX 32 +#define HOCCLK_FREQ_LIST_MAX 48 #define HOCCLK_GLOBAL_PROFILE_TID 0xA111111111111111 diff --git a/Source/hoc-clk/common/include/hocclk/config.h b/Source/hoc-clk/common/include/hocclk/config.h index d31f8023..603effdd 100644 --- a/Source/hoc-clk/common/include/hocclk/config.h +++ b/Source/hoc-clk/common/include/hocclk/config.h @@ -73,6 +73,7 @@ typedef enum { HocClkConfigValue_IsFirstLoad, HocClkConfigValue_AulaDisplayColorPreset, + HocClkConfigValue_MarikoMiddleFreqs, KipConfigValue_custRev, // KipConfigValue_mtcConf, @@ -289,7 +290,8 @@ static inline const char* hocclkFormatConfigValue(HocClkConfigValue val, bool pr return pretty ? "RAM Frequency Display Unit" : "RAM_display_unit"; case HocClkConfigValue_AulaDisplayColorPreset: return pretty ? "Aula Display Color Preset" : "aula_color_preset"; - + case HocClkConfigValue_MarikoMiddleFreqs: + return pretty ? "Mariko Middle Clocks" : "mariko_middle_freqs"; // KIP config values case KipConfigValue_custRev: return pretty ? "Custom Revision" : "kip_cust_rev"; @@ -502,6 +504,7 @@ static inline uint64_t hocclkDefaultConfigValue(HocClkConfigValue val) case HocClkConfigValue_LiveCpuUv: case HocClkConfigValue_GPUSchedulingMethod: case HocClkConfigValue_MemoryFrequencyMeasurementMode: + case HocClkConfigValue_MarikoMiddleFreqs: return 0ULL; case HocClkConfigValue_RamDisplayUnit: return (uint64_t)RamDisplayUnit_MHz; @@ -561,6 +564,7 @@ static inline uint64_t hocclkValidConfigValue(HocClkConfigValue val, uint64_t in case HocClkConfigValue_EnableExperimentalSettings: case HocClkConfigValue_LiveCpuUv: case HocClkConfigValue_GPUSchedulingMethod: + case HocClkConfigValue_MarikoMiddleFreqs: return (input & 0x1) == input; case KipConfigValue_custRev: diff --git a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp index 30f213a8..e1a97c08 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/misc_gui.cpp @@ -649,7 +649,9 @@ protected: if (R_FAILED(rc)) [[unlikely]] { FatalGui::openWithResultCode("hocclkIpcGetConfigValues", rc); return; } this->listElement->addItem(new tsl::elm::CategoryHeader("Experimental Settings")); ValueThresholds thresholdsDisabled(0, 0); - + if(IsMariko()) { + addConfigToggle(HocClkConfigValue_MarikoMiddleFreqs, nullptr, true); + } addConfigToggle(HocClkConfigValue_LiveCpuUv, nullptr); std::vector gpuSchedMethodValues = { NamedValue("INI", GpuSchedulingOverrideMethod_Ini), diff --git a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp index c9e4af13..c096b8ee 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_freq.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_freq.cpp @@ -40,6 +40,7 @@ #include "../file/errors.hpp" #include "../soc/pllmb.hpp" #include "../file/config.hpp" +#include "../soc/gm20b.hpp" namespace board { PcvModule GetPcvModule(HocClkModule hocclkModule) { @@ -77,7 +78,6 @@ namespace board { Result rc = 0; bool usesGovenor = module > HocClkModule_MEM; - if (module == HocClkModule_Display) { display::SetRate(hz); return; @@ -87,27 +87,35 @@ namespace board { return; } + bool useGm20b = (module == HocClkModule_GPU) && (GetSocType() == HocClkSocType_Mariko) && (hz % 38400000 == 0) && (hz % 76800000 != 0); + + u32 pcvHz = useGm20b ? ((hz + 76800000 - 1) / 76800000) * 76800000 : hz; + if (HOSSVC_HAS_CLKRST) { ClkrstSession session = {}; rc = clkrstOpenSession(&session, GetPcvModuleId(module), 3); ASSERT_RESULT_OK(rc, "clkrstOpenSession"); - ClkrstSetHz(session, hz); + ClkrstSetHz(session, pcvHz); /* Voltage bug workaround. */ if (module == HocClkModule_CPU) { svcSleepThread(300'000); - ClkrstSetHz(session, hz); + ClkrstSetHz(session, pcvHz); } clkrstCloseSession(&session); } else { - PcvSetHz(GetPcvModule(module), hz); + PcvSetHz(GetPcvModule(module), pcvHz); if (module == HocClkModule_CPU) { svcSleepThread(300'000); - PcvSetHz(GetPcvModule(module), hz); + PcvSetHz(GetPcvModule(module), pcvHz); } } + + if (useGm20b) { + gm20b::setClock(hz / 1000); + } } u32 GetDisplayRate(u32 hz) { diff --git a/Source/hoc-clk/sysmodule/src/file/kip.cpp b/Source/hoc-clk/sysmodule/src/file/kip.cpp index d4e4c69d..196097c9 100644 --- a/Source/hoc-clk/sysmodule/src/file/kip.cpp +++ b/Source/hoc-clk/sysmodule/src/file/kip.cpp @@ -161,148 +161,143 @@ namespace kip { void GetKipData() { FILE* fp; - if (config::Refresh()) { - fp = fopen("sdmc:/atmosphere/kips/hoc.kip", "r"); + fp = fopen("sdmc:/atmosphere/kips/hoc.kip", "r"); - if (fp == NULL) { - notification::writeNotification("Horizon OC\nKip opening failed"); - kipAvailable = false; - return; - } else { - kipAvailable = true; - fclose(fp); - } + if (fp == NULL) { + notification::writeNotification("Horizon OC\nKip opening failed"); + kipAvailable = false; + return; + } else { + kipAvailable = true; + fclose(fp); + } - HocClkConfigValueList configValues; - config::GetConfigValues(&configValues); + HocClkConfigValueList configValues; + config::GetConfigValues(&configValues); - CustomizeTable table; - if (!cust_read_and_cache("sdmc:/atmosphere/kips/hoc.kip", &table)) { - fileUtils::LogLine("[kip] Failed to read KIP file for GetKipData"); - notification::writeNotification("Horizon OC\nKip read failed"); - return; - } + CustomizeTable table; + if (!cust_read_and_cache("sdmc:/atmosphere/kips/hoc.kip", &table)) { + fileUtils::LogLine("[kip] Failed to read KIP file for GetKipData"); + notification::writeNotification("Horizon OC\nKip read failed"); + return; + } - // if(cust_get_cust_rev(&table) != CUST_REV) { - // notification::writeNotification("Horizon OC\nKip version mismatch\nPlease reinstall Horizon OC"); - // return; - // } + // if(cust_get_cust_rev(&table) != CUST_REV) { + // notification::writeNotification("Horizon OC\nKip version mismatch\nPlease reinstall Horizon OC"); + // return; + // } - if ((u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip") != config::GetConfigValue(KipCrc32) && !config::GetConfigValue(HocClkConfigValue_IsFirstLoad)) { - SetKipData(); - notification::writeNotification("Horizon OC\nKIP has been updated\nPlease reboot your console"); - return; - } - if (config::GetConfigValue(HocClkConfigValue_IsFirstLoad) == true) { - configValues.values[HocClkConfigValue_IsFirstLoad] = (u64)false; - notification::writeNotification("Horizon OC has been installed"); - } + if ((u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip") != config::GetConfigValue(KipCrc32) && !config::GetConfigValue(HocClkConfigValue_IsFirstLoad)) { + SetKipData(); + notification::writeNotification("Horizon OC\nKIP has been updated\nPlease reboot your console"); + return; + } + if (config::GetConfigValue(HocClkConfigValue_IsFirstLoad) == true) { + configValues.values[HocClkConfigValue_IsFirstLoad] = (u64)false; + notification::writeNotification("Horizon OC has been installed"); + } - configValues.values[KipCrc32] = (u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip"); // write checksum - // configValues.values[KipConfigValue_mtcConf] = cust_get_mtc_conf(&table); - clockManager::gContext.custRev = cust_get_cust_rev(&table); + configValues.values[KipCrc32] = (u64)crc32::checksum_file("sdmc:/atmosphere/kips/hoc.kip"); // write checksum + // configValues.values[KipConfigValue_mtcConf] = cust_get_mtc_conf(&table); + clockManager::gContext.custRev = cust_get_cust_rev(&table); - u16 kipVersion = cust_get_kip_version(&table); - if (kipVersion != KIP_VERSION) { - notification::writeNotification("Horizon OC\nKip version mismatch detected!"); - } + u16 kipVersion = cust_get_kip_version(&table); + if (kipVersion != KIP_VERSION) { + notification::writeNotification("Horizon OC\nKip version mismatch detected!"); + } - clockManager::gContext.kipVersion = kipVersion; - configValues.values[KipConfigValue_hpMode] = cust_get_hp_mode(&table); + clockManager::gContext.kipVersion = kipVersion; + 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_eristaEmcMaxClock1] = cust_get_erista_emc_max1(&table); - configValues.values[KipConfigValue_eristaEmcMaxClock2] = cust_get_erista_emc_max2(&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_marikoSocVmax] = cust_get_marikoSocVmax(&table); + configValues.values[KipConfigValue_commonEmcMemVolt] = cust_get_common_emc_volt(&table); + configValues.values[KipConfigValue_eristaEmcMaxClock] = cust_get_erista_emc_max(&table); + configValues.values[KipConfigValue_eristaEmcMaxClock1] = cust_get_erista_emc_max1(&table); + configValues.values[KipConfigValue_eristaEmcMaxClock2] = cust_get_erista_emc_max2(&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_marikoSocVmax] = cust_get_marikoSocVmax(&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_stepMode] = cust_get_step_mode(&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_stepMode] = cust_get_step_mode(&table); - configValues.values[KipConfigValue_timingEmcTbreak] = cust_get_timing_emc_tbreak(&table); - configValues.values[KipConfigValue_low_t6_tRTW] = cust_get_low_t6_tRTW(&table); - configValues.values[KipConfigValue_low_t7_tWTR] = cust_get_low_t7_tWTR(&table); - configValues.values[KipConfigValue_t2_tRP_cap] = cust_get_tRP_cap(&table); + configValues.values[KipConfigValue_timingEmcTbreak] = cust_get_timing_emc_tbreak(&table); + configValues.values[KipConfigValue_low_t6_tRTW] = cust_get_low_t6_tRTW(&table); + configValues.values[KipConfigValue_low_t7_tWTR] = cust_get_low_t7_tWTR(&table); + configValues.values[KipConfigValue_t2_tRP_cap] = cust_get_tRP_cap(&table); - configValues.values[KipConfigValue_read_latency_1333] = cust_get_read_latency_1333(&table); - configValues.values[KipConfigValue_read_latency_1600] = cust_get_read_latency_1600(&table); - configValues.values[KipConfigValue_read_latency_1866] = cust_get_read_latency_1866(&table); - configValues.values[KipConfigValue_read_latency_2133] = cust_get_read_latency_2133(&table); + configValues.values[KipConfigValue_read_latency_1333] = cust_get_read_latency_1333(&table); + configValues.values[KipConfigValue_read_latency_1600] = cust_get_read_latency_1600(&table); + configValues.values[KipConfigValue_read_latency_1866] = cust_get_read_latency_1866(&table); + configValues.values[KipConfigValue_read_latency_2133] = cust_get_read_latency_2133(&table); - configValues.values[KipConfigValue_write_latency_1333] = cust_get_write_latency_1333(&table); - configValues.values[KipConfigValue_write_latency_1600] = cust_get_write_latency_1600(&table); - configValues.values[KipConfigValue_write_latency_1866] = cust_get_write_latency_1866(&table); - configValues.values[KipConfigValue_write_latency_2133] = cust_get_write_latency_2133(&table); + configValues.values[KipConfigValue_write_latency_1333] = cust_get_write_latency_1333(&table); + configValues.values[KipConfigValue_write_latency_1600] = cust_get_write_latency_1600(&table); + configValues.values[KipConfigValue_write_latency_1866] = cust_get_write_latency_1866(&table); + configValues.values[KipConfigValue_write_latency_2133] = cust_get_write_latency_2133(&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_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_eristaCpuVmin] = cust_get_eristaCpuVmin(&table); - configValues.values[KipConfigValue_eristaCpuMaxVolt] = cust_get_erista_cpu_max_volt(&table); - configValues.values[KipConfigValue_eristaCpuUnlock] = cust_get_eristaCpuUnlock(&table); + configValues.values[KipConfigValue_eristaCpuUV] = cust_get_erista_cpu_uv(&table); + configValues.values[KipConfigValue_eristaCpuVmin] = cust_get_eristaCpuVmin(&table); + configValues.values[KipConfigValue_eristaCpuMaxVolt] = cust_get_erista_cpu_max_volt(&table); + configValues.values[KipConfigValue_eristaCpuUnlock] = cust_get_eristaCpuUnlock(&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_marikoCpuMaxClock] = cust_get_marikoCpuMaxClock(&table); - configValues.values[KipConfigValue_eristaCpuBoostClock] = cust_get_erista_cpu_boost(&table); - configValues.values[KipConfigValue_marikoCpuBoostClock] = cust_get_mariko_cpu_boost(&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_marikoCpuMaxClock] = cust_get_marikoCpuMaxClock(&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] = board::GetFuseData()->gpuSpeedo; // cust_get_gpu_speedo(&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] = board::GetFuseData()->gpuSpeedo; // cust_get_gpu_speedo(&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); + } - configValues.values[KipConfigValue_t7_tWTR_fine_tune] = cust_get_tWTR_fine_tune(&table); - configValues.values[KipConfigValue_t6_tRTW_fine_tune] = cust_get_tRTW_fine_tune(&table); + configValues.values[KipConfigValue_t7_tWTR_fine_tune] = cust_get_tWTR_fine_tune(&table); + configValues.values[KipConfigValue_t6_tRTW_fine_tune] = cust_get_tRTW_fine_tune(&table); - // if(cust_get_cust_rev(&table) == KIP_CUST_REV) - // return; + // if(cust_get_cust_rev(&table) == KIP_CUST_REV) + // return; - if (sizeof(HocClkConfigValueList) <= sizeof(configValues)) { - if (config::SetConfigValues(&configValues, false)) { - fileUtils::LogLine("[kip] KIP loaded. CRC32: %ld (Cust Rev %ld)", configValues.values[KipCrc32], configValues.values[KipConfigValue_custRev]); - for (u64 i = KipConfigValue_hpMode; i < HocClkConfigValue_EnumMax; i++) { - fileUtils::LogLine("%s: %ld", hocclkFormatConfigValue((HocClkConfigValue)i, false), configValues.values[i]); - } - } else { - fileUtils::LogLine("[kip] Warning: Failed to set config values from KIP"); - notification::writeNotification("Horizon OC\nKip config set failed"); + if (sizeof(HocClkConfigValueList) <= sizeof(configValues)) { + if (config::SetConfigValues(&configValues, false)) { + fileUtils::LogLine("[kip] KIP loaded. CRC32: %ld (Cust Rev %ld)", configValues.values[KipCrc32], configValues.values[KipConfigValue_custRev]); + for (u64 i = KipConfigValue_hpMode; i < HocClkConfigValue_EnumMax; i++) { + fileUtils::LogLine("%s: %ld", hocclkFormatConfigValue((HocClkConfigValue)i, false), configValues.values[i]); } } else { - fileUtils::LogLine("[kip] Error: Config value list buffer size mismatch"); - notification::writeNotification("Horizon OC\nConfig Buffer Mismatch"); + fileUtils::LogLine("[kip] Warning: Failed to set config values from KIP"); + notification::writeNotification("Horizon OC\nKip config set failed"); } } else { - fileUtils::LogLine("[kip] Config refresh error in GetKipData!"); - notification::writeNotification("Horizon OC\nConfig refresh failed"); + fileUtils::LogLine("[kip] Error: Config value list buffer size mismatch"); + notification::writeNotification("Horizon OC\nConfig Buffer Mismatch"); } } } \ No newline at end of file diff --git a/Source/hoc-clk/sysmodule/src/main.cpp b/Source/hoc-clk/sysmodule/src/main.cpp index 6716e144..318060ee 100644 --- a/Source/hoc-clk/sysmodule/src/main.cpp +++ b/Source/hoc-clk/sysmodule/src/main.cpp @@ -135,7 +135,7 @@ int main(int argc, char** argv) return 1; } config::Initialize(); - + config::Refresh(); // Get config from file board::Initialize(); processManagement::Initialize(); diff --git a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp index 87f20a1b..7b24ca8a 100644 --- a/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp +++ b/Source/hoc-clk/sysmodule/src/mgr/clock_manager.cpp @@ -181,6 +181,40 @@ namespace clockManager { std::uint32_t *hz = &gFreqTable[module].list[0]; gFreqTable[module].count = 0; + + if (module == HocClkModule_GPU && board::GetSocType() == HocClkSocType_Mariko) { + constexpr u32 kStep = 38400000; + constexpr u32 kPcvStep = 76800000; + constexpr u32 kMax = 1228800000; + + for (u32 f = kPcvStep; f <= kMax && gFreqTable[module].count < HOCCLK_FREQ_LIST_MAX; f += kStep) { + if (f % kPcvStep != 0) { + if (!middleFreqs) continue; + *hz = f; + gFreqTable[module].count++; + hz++; + } else { + for (u32 i = 0; i < count; i++) { + if (freqs[i] == f) { + *hz = f; + gFreqTable[module].count++; + hz++; + break; + } + } + } + } + + for (u32 i = 0; i < count && gFreqTable[module].count < HOCCLK_FREQ_LIST_MAX; i++) { + if (freqs[i] > kMax && IsAssignableHz(module, freqs[i])) { + *hz = freqs[i]; + gFreqTable[module].count++; + hz++; + } + } + return; + } + for (std::uint32_t i = 0; i < count; i++) { if (!IsAssignableHz(module, freqs[i])) { continue;