diff --git a/Source/hoc-clk/common/include/hocclk/clock_manager.h b/Source/hoc-clk/common/include/hocclk/clock_manager.h index 2207552c..151f3c6f 100644 --- a/Source/hoc-clk/common/include/hocclk/clock_manager.h +++ b/Source/hoc-clk/common/include/hocclk/clock_manager.h @@ -63,8 +63,8 @@ typedef struct { uint32_t voltages[HocClkVoltage_EnumMax]; u16 speedos[HocClkSpeedo_EnumMax]; u16 iddq[HocClkSpeedo_EnumMax]; - u16 waferX; - u16 waferY; + s16 waferX; + s16 waferY; // Misc stuff GpuSchedulingMode gpuSchedulingMode; diff --git a/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp b/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp index 257eebae..4b4649a9 100644 --- a/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp +++ b/Source/hoc-clk/overlay/src/ui/gui/about_gui.cpp @@ -391,7 +391,7 @@ void AboutGui::refresh() if(IsHoag()) RETROStatusItem->setValue(this->context->isUsingRetroSuper ? "Installed" : "Not Installed"); - sprintf(strings[2], "X: %u Y: %u", this->context->waferX, this->context->waferY); + sprintf(strings[2], "X: %d Y: %d", this->context->waferX, this->context->waferY); waferCordsItem->setValue(strings[2]); s32 millis = context->temps[HocClkThermalSensor_PLLX]; diff --git a/Source/hoc-clk/sysmodule/src/board/board.cpp b/Source/hoc-clk/sysmodule/src/board/board.cpp index bd5068b1..ab7b9768 100644 --- a/Source/hoc-clk/sysmodule/src/board/board.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board.cpp @@ -68,9 +68,9 @@ namespace board { #define GP_HIDREV_MAJOR_T210B01 0x2 #define APB_BASE 0x70000000 #define FUSE_RESERVED_ODMX(x) (0x1C8 + 4 * (x)) - #define FUSE_CACHE_OFFSET 0x800 + #define FUSE_OFFSET 0x800 void FetchHardwareInfos() { - ReadFuses(fuseData); + ReadFuses(fuseData, fuseVirtAddr); SetGpuBracket(fuseData.gpuSpeedo, speedoBracket); u32 hidrev = *(u32*)(apbVirtAddr + APB_MISC_GP_HIDREV); @@ -80,8 +80,8 @@ namespace board { } else { gSocType = HocClkSocType_Erista; } - - u32 odm4 = *(u32*)(fuseVirtAddr + FUSE_CACHE_OFFSET + FUSE_RESERVED_ODMX(4)); + + u32 odm4 = *(u32*)(fuseVirtAddr + FUSE_OFFSET + FUSE_RESERVED_ODMX(4)); if (gSocType == HocClkSocType_Mariko) { switch ((odm4 & 0xF0000) >> 16) { diff --git a/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp b/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp index b7c373ad..d1e9c2bb 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp +++ b/Source/hoc-clk/sysmodule/src/board/board_fuse.cpp @@ -41,53 +41,20 @@ namespace board { /* >= 1754 */ gpuBracket = 3; } - // TODO: read the fuses without the USB debug hack - void ReadFuses(FuseData &speedo) { - u64 pid = 0; - constexpr u64 UsbID = 0x0100000000000006; - if (R_FAILED(pmdmntGetProcessId(&pid, UsbID))) { - return; - } - Handle debug; - if (R_FAILED(svcDebugActiveProcess(&debug, pid))) { - return; - } + void ReadFuses(FuseData &speedo, u64 fuseVa) { + constexpr u32 FuseOffset = 0x800; + u8 *fusePtr = reinterpret_cast(fuseVa) + FuseOffset; - MemoryInfo mem_info = {}; - u32 pageinfo = 0; - u64 addr = 0; - - u8 stack[0x10] = {}; - const u8 compare[0x10] = {}; - u8 dump[0x400] = {}; - constexpr u64 PageSize = 0x1000; - - while (true) { - if (R_FAILED(svcQueryDebugProcessMemory(&mem_info, &pageinfo, debug, addr)) || mem_info.addr < addr) { - break; - } - - if (mem_info.type == MemType_Io && mem_info.size == PageSize) { - if (R_FAILED(svcReadDebugProcessMemory(stack, debug, mem_info.addr, sizeof(stack)))) { - break; - } - - if (memcmp(stack, compare, sizeof(stack)) == 0) { - if (R_FAILED(svcReadDebugProcessMemory(dump, debug, mem_info.addr + 0x800, sizeof(dump)))) { - break; - } - - - svcCloseHandle(debug); - return; - } - } - - addr = mem_info.addr + mem_info.size; - } - - svcCloseHandle(debug); + speedo.cpuSpeedo = *reinterpret_cast(fusePtr + FUSE_CPU_SPEEDO_0_CALIB); + speedo.gpuSpeedo = *reinterpret_cast(fusePtr + FUSE_CPU_SPEEDO_2_CALIB); + speedo.socSpeedo = *reinterpret_cast(fusePtr + FUSE_SOC_SPEEDO_0_CALIB); + speedo.cpuIDDQ = *reinterpret_cast(fusePtr + FUSE_CPU_IDDQ_CALIB) * 4; + speedo.gpuIDDQ = *reinterpret_cast(fusePtr + FUSE_GPU_IDDQ_CALIB) * 5; + speedo.socIDDQ = *reinterpret_cast(fusePtr + FUSE_SOC_IDDQ_CALIB) * 4; + speedo.waferX = *reinterpret_cast(fusePtr + FUSE_OPT_X_COORDINATE); + speedo.waferY = *reinterpret_cast(fusePtr + FUSE_OPT_Y_COORDINATE); + speedo.waferX = (speedo.waferX & BIT(8)) ? (speedo.waferX - 512) : speedo.waferX; } } diff --git a/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp b/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp index 11c47aa6..4acb11b2 100644 --- a/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp +++ b/Source/hoc-clk/sysmodule/src/board/board_fuse.hpp @@ -30,11 +30,11 @@ namespace board { u16 gpuIDDQ; u16 socIDDQ; - u16 waferX; - u16 waferY; + s16 waferX; + s16 waferY; }; - void ReadFuses(FuseData &speedo); + void ReadFuses(FuseData &speedo, u64 fuseVa); void SetGpuBracket(u16 gpuSpeedo, u8 &gpuBracket); } diff --git a/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.cpp b/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.cpp index 9be99147..38bcb33b 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.cpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.cpp @@ -60,7 +60,7 @@ namespace tsensor { shifted_ft = sign_extend32(shifted_ft, 4); if (tfuse->fuse_spare_realignment) { - val = ReadReg(fuseVa, tfuse->fuse_spare_realignment + FUSE_CACHE_OFFSET); + val = ReadReg(fuseVa, tfuse->fuse_spare_realignment + FUSE_OFFSET); } shifted_cp = sign_extend32(val, 5); @@ -83,7 +83,7 @@ namespace tsensor { s16 therma, thermb; s64 temp; - val = ReadReg(fuseVa, offset + FUSE_CACHE_OFFSET); + val = ReadReg(fuseVa, offset + FUSE_OFFSET); actual_tsensor_cp = (shared->base_cp * 64) + sign_extend32(val, 12); val = (val & FUSE_TSENSOR_CALIB_FT_TS_BASE_MASK) >> FUSE_TSENSOR_CALIB_FT_TS_BASE_SHIFT; diff --git a/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.hpp b/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.hpp index 9ff6935d..f219d761 100644 --- a/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.hpp +++ b/Source/hoc-clk/sysmodule/src/tsensor/tsensor_common.hpp @@ -27,7 +27,7 @@ namespace tsensor { #define FUSE_TSENSOR_COMMON 0xA80 - #define FUSE_CACHE_OFFSET 0x800 + #define FUSE_OFFSET 0x800 struct TSensorConfig { u32 tall;