|
@@ -986,6 +986,148 @@ enum vfio_device_mig_state {
|
|
VFIO_DEVICE_STATE_RUNNING_P2P = 5,
|
|
VFIO_DEVICE_STATE_RUNNING_P2P = 5,
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+ * Upon VFIO_DEVICE_FEATURE_SET, allow the device to be moved into a low power
|
|
|
|
+ * state with the platform-based power management. Device use of lower power
|
|
|
|
+ * states depends on factors managed by the runtime power management core,
|
|
|
|
+ * including system level support and coordinating support among dependent
|
|
|
|
+ * devices. Enabling device low power entry does not guarantee lower power
|
|
|
|
+ * usage by the device, nor is a mechanism provided through this feature to
|
|
|
|
+ * know the current power state of the device. If any device access happens
|
|
|
|
+ * (either from the host or through the vfio uAPI) when the device is in the
|
|
|
|
+ * low power state, then the host will move the device out of the low power
|
|
|
|
+ * state as necessary prior to the access. Once the access is completed, the
|
|
|
|
+ * device may re-enter the low power state. For single shot low power support
|
|
|
|
+ * with wake-up notification, see
|
|
|
|
+ * VFIO_DEVICE_FEATURE_LOW_POWER_ENTRY_WITH_WAKEUP below. Access to mmap'd
|
|
|
|
+ * device regions is disabled on LOW_POWER_ENTRY and may only be resumed after
|
|
|
|
+ * calling LOW_POWER_EXIT.
|
|
|
|
+ */
|
|
|
|
+#define VFIO_DEVICE_FEATURE_LOW_POWER_ENTRY 3
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * This device feature has the same behavior as
|
|
|
|
+ * VFIO_DEVICE_FEATURE_LOW_POWER_ENTRY with the exception that the user
|
|
|
|
+ * provides an eventfd for wake-up notification. When the device moves out of
|
|
|
|
+ * the low power state for the wake-up, the host will not allow the device to
|
|
|
|
+ * re-enter a low power state without a subsequent user call to one of the low
|
|
|
|
+ * power entry device feature IOCTLs. Access to mmap'd device regions is
|
|
|
|
+ * disabled on LOW_POWER_ENTRY_WITH_WAKEUP and may only be resumed after the
|
|
|
|
+ * low power exit. The low power exit can happen either through LOW_POWER_EXIT
|
|
|
|
+ * or through any other access (where the wake-up notification has been
|
|
|
|
+ * generated). The access to mmap'd device regions will not trigger low power
|
|
|
|
+ * exit.
|
|
|
|
+ *
|
|
|
|
+ * The notification through the provided eventfd will be generated only when
|
|
|
|
+ * the device has entered and is resumed from a low power state after
|
|
|
|
+ * calling this device feature IOCTL. A device that has not entered low power
|
|
|
|
+ * state, as managed through the runtime power management core, will not
|
|
|
|
+ * generate a notification through the provided eventfd on access. Calling the
|
|
|
|
+ * LOW_POWER_EXIT feature is optional in the case where notification has been
|
|
|
|
+ * signaled on the provided eventfd that a resume from low power has occurred.
|
|
|
|
+ */
|
|
|
|
+struct vfio_device_low_power_entry_with_wakeup {
|
|
|
|
+ __s32 wakeup_eventfd;
|
|
|
|
+ __u32 reserved;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+#define VFIO_DEVICE_FEATURE_LOW_POWER_ENTRY_WITH_WAKEUP 4
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Upon VFIO_DEVICE_FEATURE_SET, disallow use of device low power states as
|
|
|
|
+ * previously enabled via VFIO_DEVICE_FEATURE_LOW_POWER_ENTRY or
|
|
|
|
+ * VFIO_DEVICE_FEATURE_LOW_POWER_ENTRY_WITH_WAKEUP device features.
|
|
|
|
+ * This device feature IOCTL may itself generate a wakeup eventfd notification
|
|
|
|
+ * in the latter case if the device had previously entered a low power state.
|
|
|
|
+ */
|
|
|
|
+#define VFIO_DEVICE_FEATURE_LOW_POWER_EXIT 5
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Upon VFIO_DEVICE_FEATURE_SET start/stop device DMA logging.
|
|
|
|
+ * VFIO_DEVICE_FEATURE_PROBE can be used to detect if the device supports
|
|
|
|
+ * DMA logging.
|
|
|
|
+ *
|
|
|
|
+ * DMA logging allows a device to internally record what DMAs the device is
|
|
|
|
+ * initiating and report them back to userspace. It is part of the VFIO
|
|
|
|
+ * migration infrastructure that allows implementing dirty page tracking
|
|
|
|
+ * during the pre copy phase of live migration. Only DMA WRITEs are logged,
|
|
|
|
+ * and this API is not connected to VFIO_DEVICE_FEATURE_MIG_DEVICE_STATE.
|
|
|
|
+ *
|
|
|
|
+ * When DMA logging is started a range of IOVAs to monitor is provided and the
|
|
|
|
+ * device can optimize its logging to cover only the IOVA range given. Each
|
|
|
|
+ * DMA that the device initiates inside the range will be logged by the device
|
|
|
|
+ * for later retrieval.
|
|
|
|
+ *
|
|
|
|
+ * page_size is an input that hints what tracking granularity the device
|
|
|
|
+ * should try to achieve. If the device cannot do the hinted page size then
|
|
|
|
+ * it's the driver choice which page size to pick based on its support.
|
|
|
|
+ * On output the device will return the page size it selected.
|
|
|
|
+ *
|
|
|
|
+ * ranges is a pointer to an array of
|
|
|
|
+ * struct vfio_device_feature_dma_logging_range.
|
|
|
|
+ *
|
|
|
|
+ * The core kernel code guarantees to support by minimum num_ranges that fit
|
|
|
|
+ * into a single kernel page. User space can try higher values but should give
|
|
|
|
+ * up if the above can't be achieved as of some driver limitations.
|
|
|
|
+ *
|
|
|
|
+ * A single call to start device DMA logging can be issued and a matching stop
|
|
|
|
+ * should follow at the end. Another start is not allowed in the meantime.
|
|
|
|
+ */
|
|
|
|
+struct vfio_device_feature_dma_logging_control {
|
|
|
|
+ __aligned_u64 page_size;
|
|
|
|
+ __u32 num_ranges;
|
|
|
|
+ __u32 __reserved;
|
|
|
|
+ __aligned_u64 ranges;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+struct vfio_device_feature_dma_logging_range {
|
|
|
|
+ __aligned_u64 iova;
|
|
|
|
+ __aligned_u64 length;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+#define VFIO_DEVICE_FEATURE_DMA_LOGGING_START 6
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Upon VFIO_DEVICE_FEATURE_SET stop device DMA logging that was started
|
|
|
|
+ * by VFIO_DEVICE_FEATURE_DMA_LOGGING_START
|
|
|
|
+ */
|
|
|
|
+#define VFIO_DEVICE_FEATURE_DMA_LOGGING_STOP 7
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * Upon VFIO_DEVICE_FEATURE_GET read back and clear the device DMA log
|
|
|
|
+ *
|
|
|
|
+ * Query the device's DMA log for written pages within the given IOVA range.
|
|
|
|
+ * During querying the log is cleared for the IOVA range.
|
|
|
|
+ *
|
|
|
|
+ * bitmap is a pointer to an array of u64s that will hold the output bitmap
|
|
|
|
+ * with 1 bit reporting a page_size unit of IOVA. The mapping of IOVA to bits
|
|
|
|
+ * is given by:
|
|
|
|
+ * bitmap[(addr - iova)/page_size] & (1ULL << (addr % 64))
|
|
|
|
+ *
|
|
|
|
+ * The input page_size can be any power of two value and does not have to
|
|
|
|
+ * match the value given to VFIO_DEVICE_FEATURE_DMA_LOGGING_START. The driver
|
|
|
|
+ * will format its internal logging to match the reporting page size, possibly
|
|
|
|
+ * by replicating bits if the internal page size is lower than requested.
|
|
|
|
+ *
|
|
|
|
+ * The LOGGING_REPORT will only set bits in the bitmap and never clear or
|
|
|
|
+ * perform any initialization of the user provided bitmap.
|
|
|
|
+ *
|
|
|
|
+ * If any error is returned userspace should assume that the dirty log is
|
|
|
|
+ * corrupted. Error recovery is to consider all memory dirty and try to
|
|
|
|
+ * restart the dirty tracking, or to abort/restart the whole migration.
|
|
|
|
+ *
|
|
|
|
+ * If DMA logging is not enabled, an error will be returned.
|
|
|
|
+ *
|
|
|
|
+ */
|
|
|
|
+struct vfio_device_feature_dma_logging_report {
|
|
|
|
+ __aligned_u64 iova;
|
|
|
|
+ __aligned_u64 length;
|
|
|
|
+ __aligned_u64 page_size;
|
|
|
|
+ __aligned_u64 bitmap;
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+#define VFIO_DEVICE_FEATURE_DMA_LOGGING_REPORT 8
|
|
|
|
+
|
|
/* -------- API for Type1 VFIO IOMMU -------- */
|
|
/* -------- API for Type1 VFIO IOMMU -------- */
|
|
|
|
|
|
/**
|
|
/**
|