0001
0002
0003
0004
0005
0006
0007 #ifndef _UAPI_LINUX_VIRTIO_IOMMU_H
0008 #define _UAPI_LINUX_VIRTIO_IOMMU_H
0009
0010 #include <linux/types.h>
0011
0012
0013 #define VIRTIO_IOMMU_F_INPUT_RANGE 0
0014 #define VIRTIO_IOMMU_F_DOMAIN_RANGE 1
0015 #define VIRTIO_IOMMU_F_MAP_UNMAP 2
0016 #define VIRTIO_IOMMU_F_BYPASS 3
0017 #define VIRTIO_IOMMU_F_PROBE 4
0018 #define VIRTIO_IOMMU_F_MMIO 5
0019 #define VIRTIO_IOMMU_F_BYPASS_CONFIG 6
0020
0021 struct virtio_iommu_range_64 {
0022 __le64 start;
0023 __le64 end;
0024 };
0025
0026 struct virtio_iommu_range_32 {
0027 __le32 start;
0028 __le32 end;
0029 };
0030
0031 struct virtio_iommu_config {
0032
0033 __le64 page_size_mask;
0034
0035 struct virtio_iommu_range_64 input_range;
0036
0037 struct virtio_iommu_range_32 domain_range;
0038
0039 __le32 probe_size;
0040 __u8 bypass;
0041 __u8 reserved[3];
0042 };
0043
0044
0045 #define VIRTIO_IOMMU_T_ATTACH 0x01
0046 #define VIRTIO_IOMMU_T_DETACH 0x02
0047 #define VIRTIO_IOMMU_T_MAP 0x03
0048 #define VIRTIO_IOMMU_T_UNMAP 0x04
0049 #define VIRTIO_IOMMU_T_PROBE 0x05
0050
0051
0052 #define VIRTIO_IOMMU_S_OK 0x00
0053 #define VIRTIO_IOMMU_S_IOERR 0x01
0054 #define VIRTIO_IOMMU_S_UNSUPP 0x02
0055 #define VIRTIO_IOMMU_S_DEVERR 0x03
0056 #define VIRTIO_IOMMU_S_INVAL 0x04
0057 #define VIRTIO_IOMMU_S_RANGE 0x05
0058 #define VIRTIO_IOMMU_S_NOENT 0x06
0059 #define VIRTIO_IOMMU_S_FAULT 0x07
0060 #define VIRTIO_IOMMU_S_NOMEM 0x08
0061
0062 struct virtio_iommu_req_head {
0063 __u8 type;
0064 __u8 reserved[3];
0065 };
0066
0067 struct virtio_iommu_req_tail {
0068 __u8 status;
0069 __u8 reserved[3];
0070 };
0071
0072 #define VIRTIO_IOMMU_ATTACH_F_BYPASS (1 << 0)
0073
0074 struct virtio_iommu_req_attach {
0075 struct virtio_iommu_req_head head;
0076 __le32 domain;
0077 __le32 endpoint;
0078 __le32 flags;
0079 __u8 reserved[4];
0080 struct virtio_iommu_req_tail tail;
0081 };
0082
0083 struct virtio_iommu_req_detach {
0084 struct virtio_iommu_req_head head;
0085 __le32 domain;
0086 __le32 endpoint;
0087 __u8 reserved[8];
0088 struct virtio_iommu_req_tail tail;
0089 };
0090
0091 #define VIRTIO_IOMMU_MAP_F_READ (1 << 0)
0092 #define VIRTIO_IOMMU_MAP_F_WRITE (1 << 1)
0093 #define VIRTIO_IOMMU_MAP_F_MMIO (1 << 2)
0094
0095 #define VIRTIO_IOMMU_MAP_F_MASK (VIRTIO_IOMMU_MAP_F_READ | \
0096 VIRTIO_IOMMU_MAP_F_WRITE | \
0097 VIRTIO_IOMMU_MAP_F_MMIO)
0098
0099 struct virtio_iommu_req_map {
0100 struct virtio_iommu_req_head head;
0101 __le32 domain;
0102 __le64 virt_start;
0103 __le64 virt_end;
0104 __le64 phys_start;
0105 __le32 flags;
0106 struct virtio_iommu_req_tail tail;
0107 };
0108
0109 struct virtio_iommu_req_unmap {
0110 struct virtio_iommu_req_head head;
0111 __le32 domain;
0112 __le64 virt_start;
0113 __le64 virt_end;
0114 __u8 reserved[4];
0115 struct virtio_iommu_req_tail tail;
0116 };
0117
0118 #define VIRTIO_IOMMU_PROBE_T_NONE 0
0119 #define VIRTIO_IOMMU_PROBE_T_RESV_MEM 1
0120
0121 #define VIRTIO_IOMMU_PROBE_T_MASK 0xfff
0122
0123 struct virtio_iommu_probe_property {
0124 __le16 type;
0125 __le16 length;
0126 };
0127
0128 #define VIRTIO_IOMMU_RESV_MEM_T_RESERVED 0
0129 #define VIRTIO_IOMMU_RESV_MEM_T_MSI 1
0130
0131 struct virtio_iommu_probe_resv_mem {
0132 struct virtio_iommu_probe_property head;
0133 __u8 subtype;
0134 __u8 reserved[3];
0135 __le64 start;
0136 __le64 end;
0137 };
0138
0139 struct virtio_iommu_req_probe {
0140 struct virtio_iommu_req_head head;
0141 __le32 endpoint;
0142 __u8 reserved[64];
0143
0144 __u8 properties[];
0145
0146
0147
0148
0149
0150 };
0151
0152
0153 #define VIRTIO_IOMMU_FAULT_R_UNKNOWN 0
0154 #define VIRTIO_IOMMU_FAULT_R_DOMAIN 1
0155 #define VIRTIO_IOMMU_FAULT_R_MAPPING 2
0156
0157 #define VIRTIO_IOMMU_FAULT_F_READ (1 << 0)
0158 #define VIRTIO_IOMMU_FAULT_F_WRITE (1 << 1)
0159 #define VIRTIO_IOMMU_FAULT_F_EXEC (1 << 2)
0160 #define VIRTIO_IOMMU_FAULT_F_ADDRESS (1 << 8)
0161
0162 struct virtio_iommu_fault {
0163 __u8 reason;
0164 __u8 reserved[3];
0165 __le32 flags;
0166 __le32 endpoint;
0167 __u8 reserved2[4];
0168 __le64 address;
0169 };
0170
0171 #endif