Files
Horizon-OC/Source/OnDeviceConfig/source/kip_handler.cpp
souldbminersmwc 708be969cb hoc-sys/loader/config-pc/config-device - move unsafe freqs setting to hoc-sys
This allows stuff to be changed on the fly
2025-10-23 15:54:20 -04:00

246 lines
7.0 KiB
C++

/*
* HOC Configurator - KIP Handler Implementation
* Copyright (C) Dominatorul, Souldbminer
*/
#include "kip_handler.hpp"
#include <fstream>
#include <cstring>
#include <vector>
bool KipHandler::readKip() {
std::ifstream file(kipPath, std::ios::binary);
if (!file.is_open()) {
return false;
}
// Read entire file
file.seekg(0, std::ios::end);
size_t fileSize = file.tellg();
file.seekg(0, std::ios::beg);
std::vector<uint8_t> buffer(fileSize);
file.read(reinterpret_cast<char*>(buffer.data()), fileSize);
file.close();
// Find CUST magic
size_t magicPos = 0;
bool found = false;
for (size_t i = 0; i < fileSize - 4; i++) {
if (memcmp(&buffer[i], MAGIC, 4) == 0) {
magicPos = i + 4;
found = true;
break;
}
}
if (!found) {
return false;
}
// Read structure (assuming packed uint32_t structure)
size_t offset = magicPos;
auto readU32 = [&]() -> uint32_t {
uint32_t val;
memcpy(&val, &buffer[offset], sizeof(uint32_t));
offset += sizeof(uint32_t);
return val;
};
data.custRev = readU32();
data.mtcConf = readU32();
data.commonCpuBoostClock = readU32();
data.commonEmcMemVolt = readU32();
data.eristaCpuMaxVolt = readU32();
data.eristaEmcMaxClock = readU32();
data.marikoCpuMaxVolt = readU32();
data.marikoEmcMaxClock = readU32();
data.marikoEmcVddqVolt = readU32();
data.marikoCpuUV = readU32();
data.marikoGpuUV = readU32();
data.eristaCpuUV = readU32();
data.eristaGpuUV = readU32();
data.commonGpuVoltOffset = readU32();
data.marikoEmcDvbShift = readU32();
// Memory timings
data.t1_tRCD = readU32();
data.t2_tRP = readU32();
data.t3_tRAS = readU32();
data.t4_tRRD = readU32();
data.t5_tRFC = readU32();
data.t6_tRTW = readU32();
data.t7_tWTR = readU32();
data.t8_tREFI = readU32();
data.mem_burst_latency = readU32();
// Additional voltages
data.marikoCpuVmin = readU32();
data.eristaGpuVmin = readU32();
data.marikoGpuVmin = readU32();
data.marikoGpuVmax = readU32();
// GPU voltages Mariko
data.g_volt_76800 = readU32();
data.g_volt_153600 = readU32();
data.g_volt_230400 = readU32();
data.g_volt_307200 = readU32();
data.g_volt_384000 = readU32();
data.g_volt_460800 = readU32();
data.g_volt_537600 = readU32();
data.g_volt_614400 = readU32();
data.g_volt_691200 = readU32();
data.g_volt_768000 = readU32();
data.g_volt_844800 = readU32();
data.g_volt_921600 = readU32();
data.g_volt_998400 = readU32();
data.g_volt_1075200 = readU32();
data.g_volt_1152000 = readU32();
data.g_volt_1228800 = readU32();
data.g_volt_1267200 = readU32();
data.g_volt_1305600 = readU32();
data.g_volt_1344000 = readU32();
data.g_volt_1382400 = readU32();
data.g_volt_1420800 = readU32();
data.g_volt_1459200 = readU32();
data.g_volt_1497600 = readU32();
data.g_volt_1536000 = readU32();
// GPU voltages Erista
data.g_volt_e_76800 = readU32();
data.g_volt_e_153600 = readU32();
data.g_volt_e_230400 = readU32();
data.g_volt_e_307200 = readU32();
data.g_volt_e_384000 = readU32();
data.g_volt_e_460800 = readU32();
data.g_volt_e_537600 = readU32();
data.g_volt_e_614400 = readU32();
data.g_volt_e_691200 = readU32();
data.g_volt_e_768000 = readU32();
data.g_volt_e_844800 = readU32();
data.g_volt_e_921600 = readU32();
data.g_volt_e_998400 = readU32();
data.g_volt_e_1075200 = readU32();
return true;
}
bool KipHandler::writeKip() {
std::fstream file(kipPath, std::ios::in | std::ios::out | std::ios::binary);
if (!file.is_open()) {
return false;
}
// Read entire file
file.seekg(0, std::ios::end);
size_t fileSize = file.tellg();
file.seekg(0, std::ios::beg);
std::vector<uint8_t> buffer(fileSize);
file.read(reinterpret_cast<char*>(buffer.data()), fileSize);
// Find CUST magic
size_t magicPos = 0;
bool found = false;
for (size_t i = 0; i < fileSize - 4; i++) {
if (memcmp(&buffer[i], MAGIC, 4) == 0) {
magicPos = i + 4;
found = true;
break;
}
}
if (!found) {
file.close();
return false;
}
// Write structure
size_t offset = magicPos;
auto writeU32 = [&](uint32_t val) {
memcpy(&buffer[offset], &val, sizeof(uint32_t));
offset += sizeof(uint32_t);
};
writeU32(data.custRev);
writeU32(data.mtcConf);
writeU32(data.commonCpuBoostClock);
writeU32(data.commonEmcMemVolt);
writeU32(data.eristaCpuMaxVolt);
writeU32(data.eristaEmcMaxClock);
writeU32(data.marikoCpuMaxVolt);
writeU32(data.marikoEmcMaxClock);
writeU32(data.marikoEmcVddqVolt);
writeU32(data.marikoCpuUV);
writeU32(data.marikoGpuUV);
writeU32(data.eristaCpuUV);
writeU32(data.eristaGpuUV);
writeU32(data.commonGpuVoltOffset);
writeU32(data.marikoEmcDvbShift);
// Memory timings
writeU32(data.t1_tRCD);
writeU32(data.t2_tRP);
writeU32(data.t3_tRAS);
writeU32(data.t4_tRRD);
writeU32(data.t5_tRFC);
writeU32(data.t6_tRTW);
writeU32(data.t7_tWTR);
writeU32(data.t8_tREFI);
writeU32(data.mem_burst_latency);
// Additional voltages
writeU32(data.marikoCpuVmin);
writeU32(data.eristaGpuVmin);
writeU32(data.marikoGpuVmin);
writeU32(data.marikoGpuVmax);
// GPU voltages Mariko
writeU32(data.g_volt_76800);
writeU32(data.g_volt_153600);
writeU32(data.g_volt_230400);
writeU32(data.g_volt_307200);
writeU32(data.g_volt_384000);
writeU32(data.g_volt_460800);
writeU32(data.g_volt_537600);
writeU32(data.g_volt_614400);
writeU32(data.g_volt_691200);
writeU32(data.g_volt_768000);
writeU32(data.g_volt_844800);
writeU32(data.g_volt_921600);
writeU32(data.g_volt_998400);
writeU32(data.g_volt_1075200);
writeU32(data.g_volt_1152000);
writeU32(data.g_volt_1228800);
writeU32(data.g_volt_1267200);
writeU32(data.g_volt_1305600);
writeU32(data.g_volt_1344000);
writeU32(data.g_volt_1382400);
writeU32(data.g_volt_1420800);
writeU32(data.g_volt_1459200);
writeU32(data.g_volt_1497600);
writeU32(data.g_volt_1536000);
// GPU voltages Erista
writeU32(data.g_volt_e_76800);
writeU32(data.g_volt_e_153600);
writeU32(data.g_volt_e_230400);
writeU32(data.g_volt_e_307200);
writeU32(data.g_volt_e_384000);
writeU32(data.g_volt_e_460800);
writeU32(data.g_volt_e_537600);
writeU32(data.g_volt_e_614400);
writeU32(data.g_volt_e_691200);
writeU32(data.g_volt_e_768000);
writeU32(data.g_volt_e_844800);
writeU32(data.g_volt_e_921600);
writeU32(data.g_volt_e_998400);
writeU32(data.g_volt_e_1075200);
// Write back to file
file.seekp(0, std::ios::beg);
file.write(reinterpret_cast<char*>(buffer.data()), fileSize);
file.close();
return true;
}