Skip to content
Open
Show file tree
Hide file tree
Changes from all 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);
29 changes: 29 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,28 @@ 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) {
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 | SfBufferAttr_HipcAutoSelect,
SfBufferAttr_Out | SfBufferAttr_HipcAutoSelect,
},
.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;
}