Skip to content

Commit

Permalink
bpc.mitm/exo: support pmic reboot/shutdown on mariko (thanks @CTCaer)
Browse files Browse the repository at this point in the history
  • Loading branch information
SciresM committed Oct 12, 2023
1 parent 71d0274 commit 2ec3e14
Show file tree
Hide file tree
Showing 7 changed files with 55 additions and 16 deletions.
28 changes: 23 additions & 5 deletions exosphere/program/source/secmon_user_power_management.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,15 @@ namespace ams::secmon {

}

void PerformUserRebootByPmic() {
/* Ensure that i2c-5 is usable for communicating with the pmic. */
clkrst::EnableI2c5Clock();
i2c::Initialize(i2c::Port_5);

/* Reboot. */
pmic::ShutdownSystem(true);
}

void PerformUserRebootToRcm() {
/* Configure the bootrom to boot to rcm. */
reg::Write(PMC + APBDEV_PMC_SCRATCH0, 0x2);
Expand Down Expand Up @@ -100,11 +109,20 @@ namespace ams::secmon {
}

void PerformUserShutDown() {
/* Load our reboot stub to iram. */
LoadRebootStub(RebootStubAction_ShutDown);

/* Reboot. */
PerformPmcReboot();
if (fuse::GetSocType() == fuse::SocType_Mariko) {
/* Ensure that i2c-5 is usable for communicating with the pmic. */
clkrst::EnableI2c5Clock();
i2c::Initialize(i2c::Port_5);

/* On Mariko shutdown via pmic. */
pmic::ShutdownSystem(false);
} else /* if (fuse::GetSocType() == fuse::SocType_Erista) */ {
/* Load our reboot stub to iram. */
LoadRebootStub(RebootStubAction_ShutDown);

/* Reboot. */
PerformPmcReboot();
}
}

}
2 changes: 2 additions & 0 deletions exosphere/program/source/secmon_user_power_management.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,13 @@ namespace ams::secmon {
UserRebootType_ToRcm = 1,
UserRebootType_ToPayload = 2,
UserRebootType_ToFatalError = 3,
UserRebootType_ByPmic = 4,
};

void PerformUserRebootToRcm();
void PerformUserRebootToPayload();
void PerformUserRebootToFatalError();
void PerformUserRebootByPmic();
void PerformUserShutDown();

}
14 changes: 8 additions & 6 deletions exosphere/program/source/smc/secmon_smc_info.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,9 @@ namespace ams::secmon::smc {
case UserRebootType_ToFatalError:
PerformUserRebootToFatalError();
break;
case UserRebootType_ByPmic:
PerformUserRebootByPmic();
break;
default:
return SmcResult::InvalidArgument;
}
Expand All @@ -365,18 +368,17 @@ namespace ams::secmon::smc {
case UserRebootType_ToFatalError:
PerformUserRebootToFatalError();
break;
case UserRebootType_ByPmic:
PerformUserRebootByPmic();
break;
default:
return SmcResult::InvalidArgument;
}
}
break;
case ConfigItem::ExosphereNeedsShutdown:
if (soc_type == fuse::SocType_Erista) {
if (args.r[3] != 0) {
PerformUserShutDown();
}
} else /* if (soc_type == fuse::SocType_Mariko) */ {
return SmcResult::NotSupported;
if (args.r[3] != 0) {
PerformUserShutDown();
}
break;
case ConfigItem::ExospherePayloadAddress:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ namespace ams::exosphere {
void ForceRebootToRcm();
void ForceRebootToIramPayload();
void ForceRebootToFatalError();
void ForceRebootByPmic();
void ForceShutdown();

bool IsRcmBugPatched();
Expand Down
4 changes: 4 additions & 0 deletions libraries/libstratosphere/source/ams/ams_exosphere_api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ namespace ams::exosphere {
R_ABORT_UNLESS(spl::impl::SetConfig(spl::ConfigItem::ExosphereNeedsReboot, 3));
}

void ForceRebootByPmic() {
R_ABORT_UNLESS(spl::impl::SetConfig(spl::ConfigItem::ExosphereNeedsReboot, 4));
}

void ForceShutdown() {
R_ABORT_UNLESS(spl::impl::SetConfig(spl::ConfigItem::ExosphereNeedsShutdown, 1));
}
Expand Down
17 changes: 17 additions & 0 deletions stratosphere/ams_mitm/source/bpc_mitm/bpc_ams_power_utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ namespace ams::mitm::bpc {
Standard,
ToRcm,
ToPayload,
ByPmic,
};

/* Globals. */
Expand Down Expand Up @@ -93,6 +94,9 @@ namespace ams::mitm::bpc {

void RebootSystem() {
switch (g_reboot_type) {
case RebootType::ByPmic:
exosphere::ForceRebootByPmic();
break;
case RebootType::ToRcm:
exosphere::ForceRebootToRcm();
break;
Expand All @@ -113,6 +117,11 @@ namespace ams::mitm::bpc {
}

void SetRebootPayload(const void *payload, size_t payload_size) {
/* Mariko does not support reboot-to-payload. */
if (spl::GetSocType() == spl::SocType_Mariko) {
return;
}

/* Clear payload buffer */
std::memset(g_reboot_payload, 0xCC, sizeof(g_reboot_payload));

Expand All @@ -131,6 +140,9 @@ namespace ams::mitm::bpc {
}

Result LoadRebootPayload() {
/* Mariko does not support reboot-to-payload. */
R_SUCCEED_IF(spl::GetSocType() == spl::SocType_Mariko)

/* Clear payload buffer */
std::memset(g_reboot_payload, 0xCC, sizeof(g_reboot_payload));

Expand Down Expand Up @@ -163,6 +175,11 @@ namespace ams::mitm::bpc {
g_reboot_type = RebootType::ToPayload;
}

/* TODO: Should we actually allow control over this on mariko? */
if (spl::GetSocType() == spl::SocType_Mariko) {
g_reboot_type = RebootType::ByPmic;
}

R_SUCCEED();
}

Expand Down
5 changes: 0 additions & 5 deletions stratosphere/ams_mitm/source/bpc_mitm/bpcmitm_module.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -67,11 +67,6 @@ namespace ams::mitm::bpc {
/* Wait until initialization is complete. */
mitm::WaitInitialized();

/* On Mariko, we can't reboot to payload/do exosphere-shutdown...so there is no point in bpc.mitm. */
if (spl::GetSocType() == spl::SocType_Mariko) {
return;
}

/* Create bpc mitm. */
const sm::ServiceName service_name = (hos::GetVersion() >= hos::Version_2_0_0) ? MitmServiceName : DeprecatedMitmServiceName;

Expand Down

0 comments on commit 2ec3e14

Please sign in to comment.