/* SPDX-License-Identifier: GPL-2.0 */ /* * Gasket common interrupt module. Defines functions for enabling * eventfd-triggered interrupts between a Gasket device and a host process. * * Copyright (C) 2018 Google, Inc. */ #ifndef __GASKET_INTERRUPT_H__ #define __GASKET_INTERRUPT_H__ #include #include #include "gasket_core.h" /* Note that this currently assumes that device interrupts are a dense set, * numbered from 0 - (num_interrupts - 1). Should this have to change, these * APIs will have to be updated. */ /* Opaque type used to hold interrupt subsystem data. */ struct gasket_interrupt_data; /* * Initialize the interrupt module. * @gasket_dev: The Gasket device structure for the device to be initted. */ int gasket_interrupt_init(struct gasket_dev *gasket_dev); /* * Clean up a device's interrupt structure. * @gasket_dev: The Gasket information structure for this device. * * Cleans up the device's interrupts and deallocates data. */ void gasket_interrupt_cleanup(struct gasket_dev *gasket_dev); /* * Clean up and re-initialize the MSI-x subsystem. * @gasket_dev: The Gasket information structure for this device. * * Performs a teardown of the MSI-x subsystem and re-initializes it. Does not * free the underlying data structures. Returns 0 on success and an error code * on error. */ int gasket_interrupt_reinit(struct gasket_dev *gasket_dev); /* * Reset the counts stored in the interrupt subsystem. * @gasket_dev: The Gasket information structure for this device. * * Sets the counts of all interrupts in the subsystem to 0. */ int gasket_interrupt_reset_counts(struct gasket_dev *gasket_dev); /* * Associates an eventfd with a device interrupt. * @data: Pointer to device interrupt data. * @interrupt: The device interrupt to configure. * @event_fd: The eventfd to associate with the interrupt. * * Prepares the host to receive notification of device interrupts by associating * event_fd with interrupt. Upon receipt of a device interrupt, event_fd will be * signaled, after successful configuration. * * Returns 0 on success, a negative error code otherwise. */ int gasket_interrupt_set_eventfd(struct gasket_interrupt_data *interrupt_data, int interrupt, int event_fd); /* * Removes an interrupt-eventfd association. * @data: Pointer to device interrupt data. * @interrupt: The device interrupt to de-associate. * * Removes any eventfd associated with the specified interrupt, if any. */ int gasket_interrupt_clear_eventfd(struct gasket_interrupt_data *interrupt_data, int interrupt); /* * The below functions exist for backwards compatibility. * No new uses should be written. */ /* * Get the health of the interrupt subsystem. * @gasket_dev: The Gasket device struct. * * Returns DEAD if not set up, LAMED if initialization failed, and ALIVE * otherwise. */ int gasket_interrupt_system_status(struct gasket_dev *gasket_dev); #endif