mirror of
https://github.com/Fishwaldo/opensbi.git
synced 2025-06-21 21:58:54 +00:00
The spec says sbi_system_suspend() will return SBI_ERR_INVALID_PARAM when "sleep_type is reserved or is platform-specific and unimplemented" and SBI_ERR_NOT_SUPPORTED when sleep_type "is not reserved and is implemented, but the platform does not support it due to one or more missing dependencies." Ensure SBI_ERR_INVALID_PARAM is returned for reserved sleep types and that the system suspend driver can choose which of the two error types to return itself by returning an error from its check function rather than a boolean. Signed-off-by: Andrew Jones <ajones@ventanamicro.com> Reviewed-by: Anup Patel <anup@brainfault.org>
80 lines
2.4 KiB
C
80 lines
2.4 KiB
C
/*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*
|
|
* Copyright (c) 2019 Western Digital Corporation or its affiliates.
|
|
*
|
|
* Authors:
|
|
* Anup Patel <anup.patel@wdc.com>
|
|
*/
|
|
|
|
#ifndef __SBI_SYSTEM_H__
|
|
#define __SBI_SYSTEM_H__
|
|
|
|
#include <sbi/sbi_types.h>
|
|
#include <sbi/sbi_list.h>
|
|
|
|
/** System reset hardware device */
|
|
struct sbi_system_reset_device {
|
|
/** Name of the system reset device */
|
|
char name[32];
|
|
|
|
/* Check whether reset type and reason supported by the device */
|
|
int (*system_reset_check)(u32 reset_type, u32 reset_reason);
|
|
|
|
/** Reset the system */
|
|
void (*system_reset)(u32 reset_type, u32 reset_reason);
|
|
|
|
/** List */
|
|
struct sbi_dlist node;
|
|
};
|
|
|
|
static inline struct sbi_system_reset_device *to_system_reset_device(
|
|
struct sbi_dlist *node)
|
|
{
|
|
return container_of(node, struct sbi_system_reset_device, node);
|
|
}
|
|
|
|
const struct sbi_system_reset_device *sbi_system_reset_get_device(
|
|
u32 reset_type, u32 reset_reason);
|
|
|
|
void sbi_system_reset_add_device(struct sbi_system_reset_device *dev);
|
|
|
|
bool sbi_system_reset_supported(u32 reset_type, u32 reset_reason);
|
|
|
|
void __noreturn sbi_system_reset(u32 reset_type, u32 reset_reason);
|
|
|
|
/** System suspend device */
|
|
struct sbi_system_suspend_device {
|
|
/** Name of the system suspend device */
|
|
char name[32];
|
|
|
|
/**
|
|
* Check whether sleep type is supported by the device
|
|
*
|
|
* Returns 0 when @sleep_type supported, SBI_ERR_INVALID_PARAM
|
|
* when @sleep_type is reserved, or SBI_ERR_NOT_SUPPORTED when
|
|
* @sleep_type is not reserved and is implemented, but the
|
|
* platform doesn't support it due to missing dependencies.
|
|
*/
|
|
int (*system_suspend_check)(u32 sleep_type);
|
|
|
|
/**
|
|
* Suspend the system
|
|
*
|
|
* @sleep_type: The sleep type identifier passed to the SBI call.
|
|
* @mmode_resume_addr:
|
|
* This is the same as sbi_scratch.warmboot_addr. Some platforms
|
|
* may not be able to return from system_suspend(), so they will
|
|
* jump directly to this address instead. Platforms which can
|
|
* return from system_suspend() may ignore this parameter.
|
|
*/
|
|
int (*system_suspend)(u32 sleep_type, unsigned long mmode_resume_addr);
|
|
};
|
|
|
|
const struct sbi_system_suspend_device *sbi_system_suspend_get_device(void);
|
|
void sbi_system_suspend_set_device(struct sbi_system_suspend_device *dev);
|
|
void sbi_system_suspend_test_enable(void);
|
|
bool sbi_system_suspend_supported(u32 sleep_type);
|
|
int sbi_system_suspend(u32 sleep_type, ulong resume_addr, ulong opaque);
|
|
|
|
#endif
|