forked from MIrrors/gasket-driver
- Use the existing gasket_interrupt_msix_cleanup at suspend time to remove our IRQs from the system. Without doing this, we leave 13 IRQs per device registered, which can cause issues during suspend if many devices are loaded in the system. - Restore them at resume time, using the gasket_interrupt_reinit functionality. - This allows successful suspend without any errors taking the CPUs down, and passing the multi-tpu stress test after resume. Change-Id: Ied1aca8605c0cb3b64ba591d05312d10cf45343f
109 lines
3.3 KiB
C
109 lines
3.3 KiB
C
/* 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 <linux/eventfd.h>
|
|
#include <linux/pci.h>
|
|
|
|
#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);
|
|
|
|
/*
|
|
* Clean up the MSI-x subsystem.
|
|
* @interrupt_data: The interrupt data structure for this device.
|
|
*
|
|
* Performs a teardown of the MSI-x subsystem. Does not free the underlying data structures.
|
|
*/
|
|
void gasket_interrupt_msix_cleanup(struct gasket_interrupt_data *interrupt_data);
|
|
|
|
/* Handle gasket interrupt processing, called from an external handler. */
|
|
void
|
|
gasket_handle_interrupt(struct gasket_interrupt_data *interrupt_data,
|
|
int interrupt_index);
|
|
|
|
/*
|
|
* 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
|