Fix CpuSuspend not making it to finalize_powerdown()

This commit is contained in:
Michael Scire 2018-03-09 23:55:41 -08:00
parent c2676c359c
commit ab2b8e4db5

View file

@ -13,6 +13,7 @@
#include "fuse.h" #include "fuse.h"
#include "i2c.h" #include "i2c.h"
#include "lp0.h" #include "lp0.h"
#include "masterkey.h"
#include "pmc.h" #include "pmc.h"
#include "se.h" #include "se.h"
#include "smc_api.h" #include "smc_api.h"
@ -23,11 +24,11 @@ extern const uint8_t bpmpfw_bin[];
extern const uint32_t bpmpfw_bin_size; extern const uint32_t bpmpfw_bin_size;
/* Save security engine, and go to sleep. */ /* Save security engine, and go to sleep. */
void save_se_and_power_down_cpu(void) { void save_se_and_power_down_cpu(void) {
uint32_t tzram_cmac[0x4] = {0}; uint32_t tzram_cmac[0x4] = {0};
uint8_t *tzram_encryption_src = (uint8_t *)(LP0_ENTRY_GET_RAM_SEGMENT_ADDRESS(LP0_ENTRY_RAM_SEGMENT_ID_ENCRYPTED_TZRAM)); uint8_t *tzram_encryption_dst = (uint8_t *)(LP0_ENTRY_GET_RAM_SEGMENT_ADDRESS(LP0_ENTRY_RAM_SEGMENT_ID_ENCRYPTED_TZRAM));
uint8_t *tzram_encryption_dst = (uint8_t *)(LP0_ENTRY_GET_RAM_SEGMENT_ADDRESS(LP0_ENTRY_RAM_SEGMENT_ID_CURRENT_TZRAM)); uint8_t *tzram_encryption_src = (uint8_t *)(LP0_ENTRY_GET_RAM_SEGMENT_ADDRESS(LP0_ENTRY_RAM_SEGMENT_ID_CURRENT_TZRAM));
uint8_t *tzram_store_address = (uint8_t *)(WARMBOOT_GET_RAM_SEGMENT_ADDRESS(WARMBOOT_RAM_SEGMENT_ID_TZRAM)); uint8_t *tzram_store_address = (uint8_t *)(WARMBOOT_GET_RAM_SEGMENT_ADDRESS(WARMBOOT_RAM_SEGMENT_ID_TZRAM));
clear_priv_smc_in_progress(); clear_priv_smc_in_progress();
@ -71,7 +72,7 @@ void save_se_and_power_down_cpu(void) {
if (!configitem_is_retail()) { if (!configitem_is_retail()) {
/* TODO: uart_log("OYASUMI"); */ /* TODO: uart_log("OYASUMI"); */
} }
finalize_powerdown(); finalize_powerdown();
} }
@ -84,6 +85,7 @@ uint32_t cpu_suspend(uint64_t power_state, uint64_t entrypoint, uint64_t argumen
unsigned int current_core = get_core_id(); unsigned int current_core = get_core_id();
clkrst_reboot(CARDEVICE_I2C1); clkrst_reboot(CARDEVICE_I2C1);
if (configitem_should_profile_battery() && !i2c_query_ti_charger_bit_7()) { if (configitem_should_profile_battery() && !i2c_query_ti_charger_bit_7()) {
/* Profile the battery. */ /* Profile the battery. */
i2c_set_ti_charger_bit_7(); i2c_set_ti_charger_bit_7();
@ -120,8 +122,15 @@ uint32_t cpu_suspend(uint64_t power_state, uint64_t entrypoint, uint64_t argumen
generic_panic(); generic_panic();
} }
/* For debugging, make this check always pass. */
if ((mkey_get_revision() < MASTERKEY_REVISION_400_CURRENT || (get_debug_authentication_status() & 3) == 3)) {
FLOW_CTLR_HALT_COP_EVENTS_0 = 0x50000000;
} else {
FLOW_CTLR_HALT_COP_EVENTS_0 = 0x40000000;
}
/* Jamais Vu mitigation #2: Ensure the BPMP is halted. */ /* Jamais Vu mitigation #2: Ensure the BPMP is halted. */
if ((get_debug_authentication_status() & 3) == 3) { if (mkey_get_revision() < MASTERKEY_REVISION_400_CURRENT || (get_debug_authentication_status() & 3) == 3) {
/* BPMP should just be plainly halted, in debugging conditions. */ /* BPMP should just be plainly halted, in debugging conditions. */
if (FLOW_CTLR_HALT_COP_EVENTS_0 != 0x50000000) { if (FLOW_CTLR_HALT_COP_EVENTS_0 != 0x50000000) {
generic_panic(); generic_panic();