hc
2024-08-12 0517ab8c70e05fc5877c0c6dae1a5f42a16dcf88
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/* SPDX-License-Identifier: BSD-3-Clause */
/*
 * Virtio-iommu definition v0.12
 *
 * Copyright (C) 2019 Arm Ltd.
 */
#ifndef _UAPI_LINUX_VIRTIO_IOMMU_H
#define _UAPI_LINUX_VIRTIO_IOMMU_H
 
#include <linux/types.h>
 
/* Feature bits */
#define VIRTIO_IOMMU_F_INPUT_RANGE        0
#define VIRTIO_IOMMU_F_DOMAIN_RANGE        1
#define VIRTIO_IOMMU_F_MAP_UNMAP        2
#define VIRTIO_IOMMU_F_BYPASS            3
#define VIRTIO_IOMMU_F_PROBE            4
#define VIRTIO_IOMMU_F_MMIO            5
 
struct virtio_iommu_range_64 {
   __le64                    start;
   __le64                    end;
};
 
struct virtio_iommu_range_32 {
   __le32                    start;
   __le32                    end;
};
 
struct virtio_iommu_config {
   /* Supported page sizes */
   __le64                    page_size_mask;
   /* Supported IOVA range */
   struct virtio_iommu_range_64        input_range;
   /* Max domain ID size */
   struct virtio_iommu_range_32        domain_range;
   /* Probe buffer size */
   __le32                    probe_size;
};
 
/* Request types */
#define VIRTIO_IOMMU_T_ATTACH            0x01
#define VIRTIO_IOMMU_T_DETACH            0x02
#define VIRTIO_IOMMU_T_MAP            0x03
#define VIRTIO_IOMMU_T_UNMAP            0x04
#define VIRTIO_IOMMU_T_PROBE            0x05
 
/* Status types */
#define VIRTIO_IOMMU_S_OK            0x00
#define VIRTIO_IOMMU_S_IOERR            0x01
#define VIRTIO_IOMMU_S_UNSUPP            0x02
#define VIRTIO_IOMMU_S_DEVERR            0x03
#define VIRTIO_IOMMU_S_INVAL            0x04
#define VIRTIO_IOMMU_S_RANGE            0x05
#define VIRTIO_IOMMU_S_NOENT            0x06
#define VIRTIO_IOMMU_S_FAULT            0x07
#define VIRTIO_IOMMU_S_NOMEM            0x08
 
struct virtio_iommu_req_head {
   __u8                    type;
   __u8                    reserved[3];
};
 
struct virtio_iommu_req_tail {
   __u8                    status;
   __u8                    reserved[3];
};
 
struct virtio_iommu_req_attach {
   struct virtio_iommu_req_head        head;
   __le32                    domain;
   __le32                    endpoint;
   __u8                    reserved[8];
   struct virtio_iommu_req_tail        tail;
};
 
struct virtio_iommu_req_detach {
   struct virtio_iommu_req_head        head;
   __le32                    domain;
   __le32                    endpoint;
   __u8                    reserved[8];
   struct virtio_iommu_req_tail        tail;
};
 
#define VIRTIO_IOMMU_MAP_F_READ            (1 << 0)
#define VIRTIO_IOMMU_MAP_F_WRITE        (1 << 1)
#define VIRTIO_IOMMU_MAP_F_MMIO            (1 << 2)
 
#define VIRTIO_IOMMU_MAP_F_MASK            (VIRTIO_IOMMU_MAP_F_READ |    \
                        VIRTIO_IOMMU_MAP_F_WRITE |    \
                        VIRTIO_IOMMU_MAP_F_MMIO)
 
struct virtio_iommu_req_map {
   struct virtio_iommu_req_head        head;
   __le32                    domain;
   __le64                    virt_start;
   __le64                    virt_end;
   __le64                    phys_start;
   __le32                    flags;
   struct virtio_iommu_req_tail        tail;
};
 
struct virtio_iommu_req_unmap {
   struct virtio_iommu_req_head        head;
   __le32                    domain;
   __le64                    virt_start;
   __le64                    virt_end;
   __u8                    reserved[4];
   struct virtio_iommu_req_tail        tail;
};
 
#define VIRTIO_IOMMU_PROBE_T_NONE        0
#define VIRTIO_IOMMU_PROBE_T_RESV_MEM        1
 
#define VIRTIO_IOMMU_PROBE_T_MASK        0xfff
 
struct virtio_iommu_probe_property {
   __le16                    type;
   __le16                    length;
};
 
#define VIRTIO_IOMMU_RESV_MEM_T_RESERVED    0
#define VIRTIO_IOMMU_RESV_MEM_T_MSI        1
 
struct virtio_iommu_probe_resv_mem {
   struct virtio_iommu_probe_property    head;
   __u8                    subtype;
   __u8                    reserved[3];
   __le64                    start;
   __le64                    end;
};
 
struct virtio_iommu_req_probe {
   struct virtio_iommu_req_head        head;
   __le32                    endpoint;
   __u8                    reserved[64];
 
   __u8                    properties[];
 
   /*
    * Tail follows the variable-length properties array. No padding,
    * property lengths are all aligned on 8 bytes.
    */
};
 
/* Fault types */
#define VIRTIO_IOMMU_FAULT_R_UNKNOWN        0
#define VIRTIO_IOMMU_FAULT_R_DOMAIN        1
#define VIRTIO_IOMMU_FAULT_R_MAPPING        2
 
#define VIRTIO_IOMMU_FAULT_F_READ        (1 << 0)
#define VIRTIO_IOMMU_FAULT_F_WRITE        (1 << 1)
#define VIRTIO_IOMMU_FAULT_F_EXEC        (1 << 2)
#define VIRTIO_IOMMU_FAULT_F_ADDRESS        (1 << 8)
 
struct virtio_iommu_fault {
   __u8                    reason;
   __u8                    reserved[3];
   __le32                    flags;
   __le32                    endpoint;
   __u8                    reserved2[4];
   __le64                    address;
};
 
#endif