/* * Copyright (c) 2008 Travis Geiselbrecht * * Use of this source code is governed by a MIT-style * license that can be found in the LICENSE file or at * https://opensource.org/licenses/MIT */ #pragma once #include #include /* TODO: move all callers to using time.h directly */ #include __BEGIN_CDECLS typedef enum { HALT_ACTION_HALT = 0, // Spin forever. HALT_ACTION_REBOOT, // Reset the CPU. HALT_ACTION_SHUTDOWN, // Shutdown and power off. } platform_halt_action; typedef enum { HALT_REASON_UNKNOWN = 0, HALT_REASON_POR, // Cold-boot HALT_REASON_HW_WATCHDOG, // HW watchdog timer HALT_REASON_LOWVOLTAGE, // LV/Brownout condition HALT_REASON_HIGHVOLTAGE, // High voltage condition. HALT_REASON_THERMAL, // Thermal reason (probably overtemp) HALT_REASON_OTHER_HW, // Other hardware (platform) specific reason HALT_REASON_SW_RESET, // Generic Software Initiated Reboot HALT_REASON_SW_WATCHDOG, // Reboot triggered by a SW watchdog timer HALT_REASON_SW_PANIC, // Reboot triggered by a SW panic or ASSERT HALT_REASON_SW_UPDATE, // SW triggered reboot in order to begin firmware update } platform_halt_reason; /* super early platform initialization, before almost everything */ void platform_early_init(void); /* later init, after the kernel has come up */ void platform_init(void); /* called by the arch init code to get the platform to set up any mmu mappings it may need */ void platform_init_mmu_mappings(void); /* if the platform has knowledge of what caused the latest reboot, it can report * it to applications with this function. */ platform_halt_reason platform_get_reboot_reason(void); /* platform_halt is a method which is called from various places in the LK * system, and may be implemented by platforms and called by applications. This * call represents the end of the life of SW for a device; there is no returning * from this function. Callers will provide a reason for the halt, and a * suggested action for the platform to take, but it is the platform's * responsibility to determine the final action taken. For example, in the case * of a failed ASSERT or a panic, LK will call platform halt and suggest a Halt * action, but a release build on a platform with no debug channel may choose to * reboot instead as there is no one to tell about the ASSERT, and no one * waiting to debug the device in its halted state. If not overloaded by the * platform, the default behavior of platform halt will be to dprintf the * reason, and then halt execution by turning off interrupts and spinning * forever. */ void platform_halt(platform_halt_action suggested_action, platform_halt_reason reason) __NO_RETURN; /* called during chain loading to make sure drivers and platform is put into a stopped state */ void platform_quiesce(void); __END_CDECLS