android_kernel_xiaomi_sm8350/include/soc/qcom/subsystem_notif.h
Tony Truong 48468550eb soc: qcom: subsys_notif: Add early SSR notifications for PCIe DRV
PCIe DRV needs to recover the link as soon as possible before
the device on the other side of the link times out. Allow PCIe
DRV to register for early SSR notifications to have a chance of
making the recovery latency.

Change-Id: I75ce59075efcebc7c4457d300f7558b837d725a0
Signed-off-by: Tony Truong <truong@codeaurora.org>
2019-12-11 17:57:51 -08:00

120 lines
3.3 KiB
C

/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (c) 2011, 2013-2014, 2018-2019, The Linux Foundation. All rights reserved.
*/
/*
* Subsystem restart notifier API header
*
*/
#ifndef _SUBSYS_NOTIFIER_H
#define _SUBSYS_NOTIFIER_H
#include <linux/notifier.h>
enum subsys_notif_type {
SUBSYS_BEFORE_SHUTDOWN,
SUBSYS_AFTER_SHUTDOWN,
SUBSYS_BEFORE_POWERUP,
SUBSYS_AFTER_POWERUP,
SUBSYS_BEFORE_AUTH_AND_RESET,
SUBSYS_RAMDUMP_NOTIFICATION,
SUBSYS_POWERUP_FAILURE,
SUBSYS_PROXY_VOTE,
SUBSYS_PROXY_UNVOTE,
SUBSYS_SOC_RESET,
SUBSYS_NOTIF_TYPE_COUNT
};
enum early_subsys_notif_type {
XPORT_LAYER_NOTIF,
PCIE_DRV_LAYER_NOTIF,
NUM_EARLY_NOTIFS
};
#if IS_ENABLED(CONFIG_MSM_SUBSYSTEM_RESTART)
/* Use the subsys_notif_register_notifier API to register for notifications for
* a particular subsystem. This API will return a handle that can be used to
* un-reg for notifications using the subsys_notif_unregister_notifier API by
* passing in that handle as an argument.
*
* On receiving a notification, the second (unsigned long) argument of the
* notifier callback will contain the notification type, and the third (void *)
* argument will contain the handle that was returned by
* subsys_notif_register_notifier.
*/
void *subsys_notif_register_notifier(
const char *subsys_name, struct notifier_block *nb);
int subsys_notif_unregister_notifier(void *subsys_handle,
struct notifier_block *nb);
/* Use the subsys_notif_init_subsys API to initialize the notifier chains form
* a particular subsystem. This API will return a handle that can be used to
* queue notifications using the subsys_notif_queue_notification API by passing
* in that handle as an argument.
*/
void *subsys_notif_add_subsys(const char *subsys_name);
int subsys_notif_queue_notification(void *subsys_handle,
enum subsys_notif_type notif_type,
void *data);
void *subsys_get_early_notif_info(const char *subsys_name);
int subsys_register_early_notifier(const char *subsys_name,
enum early_subsys_notif_type notif_type,
void (*early_notif_cb)(void *),
void *data);
int subsys_unregister_early_notifier(const char *subsys_name, enum
early_subsys_notif_type notif_type);
void subsys_send_early_notifications(void *early_notif_handle);
#else
static inline void *subsys_notif_register_notifier(
const char *subsys_name, struct notifier_block *nb)
{
return NULL;
}
static inline int subsys_notif_unregister_notifier(void *subsys_handle,
struct notifier_block *nb)
{
return 0;
}
static inline void *subsys_notif_add_subsys(const char *subsys_name)
{
return NULL;
}
static inline int subsys_notif_queue_notification(void *subsys_handle,
enum subsys_notif_type notif_type,
void *data)
{
return 0;
}
static inline void *subsys_get_early_notif_info(const char *subsys_name)
{
return NULL;
}
static inline int subsys_register_early_notifier(const char *subsys_name,
enum early_subsys_notif_type notif_type,
void (*early_notif_cb)(void *),
void *data)
{
return -ENOTSUPP;
}
static inline int subsys_unregister_early_notifier(const char *subsys_name,
enum early_subsys_notif_type
notif_type)
{
return -ENOTSUPP;
}
static inline void subsys_send_early_notifications(void *early_notif_handle)
{
}
#endif /* CONFIG_MSM_SUBSYSTEM_RESTART */
#endif