@@ -218,6 +218,25 @@ typedef struct IOMMUTLBEvent {
IOMMUTLBEntry entry;
} IOMMUTLBEvent;
+/* Page Request Interface */
+#define IOMMU_PRI_RESP_CODE_SUCCESS(val) (!(val))
+#define IOMMU_PRI_RESP_CODE_INVALID_REQUEST(val) ((val) == 0x1u)
+#define IOMMU_PRI_RESP_CODE_FAILURE(val) ((val) & 0xeu)
+
+typedef struct IOMMUPRIResponse {
+ uint8_t response_code;
+ uint16_t prgi;
+} IOMMUPRIResponse;
+
+struct IOMMUPRINotifier;
+
+typedef void (*IOMMUPRINotify)(struct IOMMUPRINotifier *notifier,
+ IOMMUPRIResponse *response);
+
+typedef struct IOMMUPRINotifier {
+ IOMMUPRINotify notify;
+} IOMMUPRINotifier;
+
/* RAM is pre-allocated and passed into qemu_ram_alloc_from_ptr */
#define RAM_PREALLOC (1 << 0)
@@ -589,6 +608,16 @@ struct IOMMUMemoryRegionClass {
IOMMUTLBEntry *result,
size_t result_length,
uint32_t *err_count);
+
+ /**
+ * @iommu_pri_request_page:
+ * This method must be implemented if the IOMMU has PRI enabled
+ *
+ * @see pci_pri_request_page_pasid
+ */
+ int (*iommu_pri_request_page)(IOMMUMemoryRegion *iommu, hwaddr addr,
+ bool lpig, uint16_t prgi, bool is_read,
+ bool is_write, bool exec_req, bool priv_req);
};
typedef struct RamDiscardListener RamDiscardListener;
@@ -878,6 +907,7 @@ struct IOMMUMemoryRegion {
QLIST_HEAD(, IOMMUNotifier) iommu_notify;
IOMMUNotifierFlag iommu_notify_flags;
+ IOMMUPRINotifier *pri_notifier;
};
#define IOMMU_NOTIFIER_FOREACH(n, mr) \
@@ -29,6 +29,7 @@ enum PCIBusFlags {
};
#define PCI_NO_PASID UINT32_MAX
+#define PCI_PRI_PRGI_MASK 0x1ffU
struct PCIBus {
BusState qbus;
The API deliberately designed to be similar to the ATS one. We define a struct that stores a function pointer to the device's callback. Registering and unregistering a notifier is done using a pair of functions that will be added in a future commit of this series. An IOMMU can support PRI by implementing the iommu_pri_request_page operation declared in IOMMUMemoryRegionClass. Signed-off-by: Clément Mathieu--Drif <clement.mathieu--drif@eviden.com> --- include/exec/memory.h | 30 ++++++++++++++++++++++++++++++ include/hw/pci/pci_bus.h | 1 + 2 files changed, 31 insertions(+)