/*
 * Copyright Meta Platforms, Inc. and its affiliates.
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief Public APIs for coredump pseudo-device driver
 */

#ifndef INCLUDE_ZEPHYR_DRIVERS_COREDUMP_H_
#define INCLUDE_ZEPHYR_DRIVERS_COREDUMP_H_

#include <zephyr/device.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief Coredump pseudo-device driver APIs
 * @defgroup coredump_device_interface Coredump pseudo-device driver APIs
 * @ingroup io_interfaces
 * @{
 */

/**
 * @brief Structure describing a region in memory that may be
 * stored in core dump at the time it is generated
 *
 * Instances of this are passed to the coredump_device_register_memory() and
 * coredump_device_unregister_memory() functions to indicate addition and removal
 * of memory regions to be captured
 */
struct coredump_mem_region_node {
	/** Node of single-linked list, do not modify */
	sys_snode_t node;

	/** Address of start of memory region */
	uintptr_t start;

	/** Size of memory region */
	size_t size;
};

/**
 * @brief Callback that occurs at dump time, data copied into dump_area will
 * be included in the dump that is generated
 *
 * @param dump_area      Pointer to area to copy data into for inclusion in dump
 * @param dump_area_size Size of available memory at dump_area
 */
typedef void (*coredump_dump_callback_t)(uintptr_t dump_area, size_t dump_area_size);

/**
 * @cond INTERNAL_HIDDEN
 *
 * For internal use only, skip these in public documentation.
 */

/*
 * Type definition of coredump API function for adding specified
 * data into coredump
 */
typedef void (*coredump_device_dump_t)(const struct device *dev);

/*
 * Type definition of coredump API function for registering a memory
 * region
 */
typedef bool (*coredump_device_register_memory_t)(const struct device *dev,
	struct coredump_mem_region_node *region);

/*
 * Type definition of coredump API function for unregistering a memory
 * region
 */
typedef bool (*coredump_device_unregister_memory_t)(const struct device *dev,
	struct coredump_mem_region_node *region);

/*
 * Type definition of coredump API function for registering a dump
 * callback
 */
typedef bool (*coredump_device_register_callback_t)(const struct device *dev,
	coredump_dump_callback_t callback);

/*
 * API which a coredump pseudo-device driver should expose
 */
__subsystem struct coredump_driver_api {
	coredump_device_dump_t              dump;
	coredump_device_register_memory_t   register_memory;
	coredump_device_unregister_memory_t unregister_memory;
	coredump_device_register_callback_t register_callback;
};

/**
 * @endcond
 */

/**
 * @brief Register a region of memory to be stored in core dump at the
 * time it is generated
 *
 * @param dev    Pointer to the device structure for the driver instance.
 * @param region Struct describing memory to be collected
 *
 * @return true if registration succeeded
 * @return false if registration failed
 */
static inline bool coredump_device_register_memory(const struct device *dev,
	struct coredump_mem_region_node *region)
{
	const struct coredump_driver_api *api =
		(const struct coredump_driver_api *)dev->api;

	return api->register_memory(dev, region);
}

/**
 * @brief Unregister a region of memory to be stored in core dump at the
 * time it is generated
 *
 * @param dev    Pointer to the device structure for the driver instance.
 * @param region Struct describing memory to be collected
 *
 * @return true if unregistration succeeded
 * @return false if unregistration failed
 */
static inline bool coredump_device_unregister_memory(const struct device *dev,
	struct coredump_mem_region_node *region)
{
	const struct coredump_driver_api *api =
		(const struct coredump_driver_api *)dev->api;

	return api->unregister_memory(dev, region);
}

/**
 * @brief Register a callback to be invoked at dump time
 *
 * @param dev      Pointer to the device structure for the driver instance.
 * @param callback Callback to be invoked at dump time
 *
 * @return true if registration succeeded
 * @return false if registration failed
 */
static inline bool coredump_device_register_callback(const struct device *dev,
	coredump_dump_callback_t callback)
{
	const struct coredump_driver_api *api =
		(const struct coredump_driver_api *)dev->api;

	return api->register_callback(dev, callback);
}

/**
 * @}
 */

#ifdef __cplusplus
}
#endif

#endif /* INCLUDE_ZEPHYR_DRIVERS_COREDUMP_H_ */
