Skip to content
Open
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions nx/include/switch/services/clkrst.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,6 @@ Result clkrstOpenSession(ClkrstSession* session_out, PcvModuleId module_id, u32
void clkrstCloseSession(ClkrstSession* session);
Result clkrstSetClockRate(ClkrstSession* session, u32 hz);
Result clkrstGetClockRate(ClkrstSession* session, u32 *out_hz);
Result clkrstSetMinimumVoltageClockRate(ClkrstSession *session, u32 hz);
Result clkrstGetPossibleClockRates(ClkrstSession *session, u32 *rates, s32 max_count, PcvClockRatesListType *out_type, s32 *out_count);
Result clkrstGetDvfsTable(ClkrstSession *session, u32 *out_rate_table, s32 in_rate_count, u32 *out_voltage_table, s32 in_voltage_count, s32 *out_count);
33 changes: 33 additions & 0 deletions nx/source/services/clkrst.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,10 @@ Result clkrstGetClockRate(ClkrstSession* session, u32 *out_hz) {
return serviceDispatchOut(&session->s, 8, *out_hz);
}

Result clkrstSetMinimumVoltageClockRate(ClkrstSession *session, u32 hz) {
return serviceDispatchIn(&session->s, 9, hz);
}

Result clkrstGetPossibleClockRates(ClkrstSession *session, u32 *rates, s32 max_count, PcvClockRatesListType *out_type, s32 *out_count) {
struct {
s32 type;
Expand All @@ -61,3 +65,32 @@ Result clkrstGetPossibleClockRates(ClkrstSession *session, u32 *rates, s32 max_c

return rc;
}

Result clkrstGetDvfsTable(ClkrstSession *session, u32 *out_rate_table, s32 in_rate_count, u32 *out_voltage_table, s32 in_voltage_count, s32 *out_count) {
if (hosversionBefore(3,0,0)) {
return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
}

const struct {
s32 rate_count;
s32 voltage_count;
} in = { in_rate_count, in_voltage_count };

s32 out = 0;
Result rc = serviceDispatchInOut(&session->s, 11, in, out,
.buffer_attrs = {
SfBufferAttr_Out | (hosversionAtLeast(7,0,0) ? SfBufferAttr_HipcAutoSelect : SfBufferAttr_HipcPointer),
SfBufferAttr_Out | (hosversionAtLeast(7,0,0) ? SfBufferAttr_HipcAutoSelect : SfBufferAttr_HipcPointer),
},
.buffers = {
{ out_rate_table, in_rate_count * sizeof(u32) },
{ out_voltage_table, in_voltage_count * sizeof(u32) },
},
);

if (R_SUCCEEDED(rc) && out_count) {
*out_count = out;
}

return rc;
}