add speedo fuse reading and fix wafer coordinates
This commit is contained in:
@@ -63,8 +63,8 @@ typedef struct {
|
|||||||
uint32_t voltages[HocClkVoltage_EnumMax];
|
uint32_t voltages[HocClkVoltage_EnumMax];
|
||||||
u16 speedos[HocClkSpeedo_EnumMax];
|
u16 speedos[HocClkSpeedo_EnumMax];
|
||||||
u16 iddq[HocClkSpeedo_EnumMax];
|
u16 iddq[HocClkSpeedo_EnumMax];
|
||||||
u16 waferX;
|
s16 waferX;
|
||||||
u16 waferY;
|
s16 waferY;
|
||||||
|
|
||||||
// Misc stuff
|
// Misc stuff
|
||||||
GpuSchedulingMode gpuSchedulingMode;
|
GpuSchedulingMode gpuSchedulingMode;
|
||||||
|
|||||||
@@ -391,7 +391,7 @@ void AboutGui::refresh()
|
|||||||
if(IsHoag())
|
if(IsHoag())
|
||||||
RETROStatusItem->setValue(this->context->isUsingRetroSuper ? "Installed" : "Not Installed");
|
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]);
|
waferCordsItem->setValue(strings[2]);
|
||||||
|
|
||||||
s32 millis = context->temps[HocClkThermalSensor_PLLX];
|
s32 millis = context->temps[HocClkThermalSensor_PLLX];
|
||||||
|
|||||||
@@ -68,9 +68,9 @@ namespace board {
|
|||||||
#define GP_HIDREV_MAJOR_T210B01 0x2
|
#define GP_HIDREV_MAJOR_T210B01 0x2
|
||||||
#define APB_BASE 0x70000000
|
#define APB_BASE 0x70000000
|
||||||
#define FUSE_RESERVED_ODMX(x) (0x1C8 + 4 * (x))
|
#define FUSE_RESERVED_ODMX(x) (0x1C8 + 4 * (x))
|
||||||
#define FUSE_CACHE_OFFSET 0x800
|
#define FUSE_OFFSET 0x800
|
||||||
void FetchHardwareInfos() {
|
void FetchHardwareInfos() {
|
||||||
ReadFuses(fuseData);
|
ReadFuses(fuseData, fuseVirtAddr);
|
||||||
SetGpuBracket(fuseData.gpuSpeedo, speedoBracket);
|
SetGpuBracket(fuseData.gpuSpeedo, speedoBracket);
|
||||||
|
|
||||||
u32 hidrev = *(u32*)(apbVirtAddr + APB_MISC_GP_HIDREV);
|
u32 hidrev = *(u32*)(apbVirtAddr + APB_MISC_GP_HIDREV);
|
||||||
@@ -80,8 +80,8 @@ namespace board {
|
|||||||
} else {
|
} else {
|
||||||
gSocType = HocClkSocType_Erista;
|
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) {
|
if (gSocType == HocClkSocType_Mariko) {
|
||||||
switch ((odm4 & 0xF0000) >> 16) {
|
switch ((odm4 & 0xF0000) >> 16) {
|
||||||
|
|||||||
@@ -41,53 +41,20 @@ namespace board {
|
|||||||
/* >= 1754 */
|
/* >= 1754 */
|
||||||
gpuBracket = 3;
|
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;
|
void ReadFuses(FuseData &speedo, u64 fuseVa) {
|
||||||
if (R_FAILED(svcDebugActiveProcess(&debug, pid))) {
|
constexpr u32 FuseOffset = 0x800;
|
||||||
return;
|
u8 *fusePtr = reinterpret_cast<u8 *>(fuseVa) + FuseOffset;
|
||||||
}
|
|
||||||
|
|
||||||
MemoryInfo mem_info = {};
|
speedo.cpuSpeedo = *reinterpret_cast<u16 *>(fusePtr + FUSE_CPU_SPEEDO_0_CALIB);
|
||||||
u32 pageinfo = 0;
|
speedo.gpuSpeedo = *reinterpret_cast<u16 *>(fusePtr + FUSE_CPU_SPEEDO_2_CALIB);
|
||||||
u64 addr = 0;
|
speedo.socSpeedo = *reinterpret_cast<u16 *>(fusePtr + FUSE_SOC_SPEEDO_0_CALIB);
|
||||||
|
speedo.cpuIDDQ = *reinterpret_cast<u16 *>(fusePtr + FUSE_CPU_IDDQ_CALIB) * 4;
|
||||||
u8 stack[0x10] = {};
|
speedo.gpuIDDQ = *reinterpret_cast<u16 *>(fusePtr + FUSE_GPU_IDDQ_CALIB) * 5;
|
||||||
const u8 compare[0x10] = {};
|
speedo.socIDDQ = *reinterpret_cast<u16 *>(fusePtr + FUSE_SOC_IDDQ_CALIB) * 4;
|
||||||
u8 dump[0x400] = {};
|
speedo.waferX = *reinterpret_cast<s16 *>(fusePtr + FUSE_OPT_X_COORDINATE);
|
||||||
constexpr u64 PageSize = 0x1000;
|
speedo.waferY = *reinterpret_cast<s16 *>(fusePtr + FUSE_OPT_Y_COORDINATE);
|
||||||
|
speedo.waferX = (speedo.waferX & BIT(8)) ? (speedo.waferX - 512) : speedo.waferX;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,11 +30,11 @@ namespace board {
|
|||||||
u16 gpuIDDQ;
|
u16 gpuIDDQ;
|
||||||
u16 socIDDQ;
|
u16 socIDDQ;
|
||||||
|
|
||||||
u16 waferX;
|
s16 waferX;
|
||||||
u16 waferY;
|
s16 waferY;
|
||||||
};
|
};
|
||||||
|
|
||||||
void ReadFuses(FuseData &speedo);
|
void ReadFuses(FuseData &speedo, u64 fuseVa);
|
||||||
void SetGpuBracket(u16 gpuSpeedo, u8 &gpuBracket);
|
void SetGpuBracket(u16 gpuSpeedo, u8 &gpuBracket);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ namespace tsensor {
|
|||||||
shifted_ft = sign_extend32(shifted_ft, 4);
|
shifted_ft = sign_extend32(shifted_ft, 4);
|
||||||
|
|
||||||
if (tfuse->fuse_spare_realignment) {
|
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);
|
shifted_cp = sign_extend32(val, 5);
|
||||||
@@ -83,7 +83,7 @@ namespace tsensor {
|
|||||||
s16 therma, thermb;
|
s16 therma, thermb;
|
||||||
s64 temp;
|
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);
|
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;
|
val = (val & FUSE_TSENSOR_CALIB_FT_TS_BASE_MASK) >> FUSE_TSENSOR_CALIB_FT_TS_BASE_SHIFT;
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
namespace tsensor {
|
namespace tsensor {
|
||||||
|
|
||||||
#define FUSE_TSENSOR_COMMON 0xA80
|
#define FUSE_TSENSOR_COMMON 0xA80
|
||||||
#define FUSE_CACHE_OFFSET 0x800
|
#define FUSE_OFFSET 0x800
|
||||||
|
|
||||||
struct TSensorConfig {
|
struct TSensorConfig {
|
||||||
u32 tall;
|
u32 tall;
|
||||||
|
|||||||
Reference in New Issue
Block a user