]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blob - drivers/virt/acrn/acrn_drv.h
Merge tag 'net-next-5.13' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev...
[mirror_ubuntu-jammy-kernel.git] / drivers / virt / acrn / acrn_drv.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2
3 #ifndef __ACRN_HSM_DRV_H
4 #define __ACRN_HSM_DRV_H
5
6 #include <linux/acrn.h>
7 #include <linux/dev_printk.h>
8 #include <linux/miscdevice.h>
9 #include <linux/types.h>
10
11 #include "hypercall.h"
12
13 extern struct miscdevice acrn_dev;
14
15 #define ACRN_NAME_LEN 16
16 #define ACRN_MEM_MAPPING_MAX 256
17
18 #define ACRN_MEM_REGION_ADD 0
19 #define ACRN_MEM_REGION_DEL 2
20
21 struct acrn_vm;
22 struct acrn_ioreq_client;
23
24 /**
25 * struct vm_memory_region_op - Hypervisor memory operation
26 * @type: Operation type (ACRN_MEM_REGION_*)
27 * @attr: Memory attribute (ACRN_MEM_TYPE_* | ACRN_MEM_ACCESS_*)
28 * @user_vm_pa: Physical address of User VM to be mapped.
29 * @service_vm_pa: Physical address of Service VM to be mapped.
30 * @size: Size of this region.
31 *
32 * Structure containing needed information that is provided to ACRN Hypervisor
33 * to manage the EPT mappings of a single memory region of the User VM. Several
34 * &struct vm_memory_region_op can be batched to ACRN Hypervisor, see &struct
35 * vm_memory_region_batch.
36 */
37 struct vm_memory_region_op {
38 u32 type;
39 u32 attr;
40 u64 user_vm_pa;
41 u64 service_vm_pa;
42 u64 size;
43 };
44
45 /**
46 * struct vm_memory_region_batch - A batch of vm_memory_region_op.
47 * @vmid: A User VM ID.
48 * @reserved: Reserved.
49 * @regions_num: The number of vm_memory_region_op.
50 * @regions_gpa: Physical address of a vm_memory_region_op array.
51 *
52 * HC_VM_SET_MEMORY_REGIONS uses this structure to manage EPT mappings of
53 * multiple memory regions of a User VM. A &struct vm_memory_region_batch
54 * contains multiple &struct vm_memory_region_op for batch processing in the
55 * ACRN Hypervisor.
56 */
57 struct vm_memory_region_batch {
58 u16 vmid;
59 u16 reserved[3];
60 u32 regions_num;
61 u64 regions_gpa;
62 };
63
64 /**
65 * struct vm_memory_mapping - Memory map between a User VM and the Service VM
66 * @pages: Pages in Service VM kernel.
67 * @npages: Number of pages.
68 * @service_vm_va: Virtual address in Service VM kernel.
69 * @user_vm_pa: Physical address in User VM.
70 * @size: Size of this memory region.
71 *
72 * HSM maintains memory mappings between a User VM GPA and the Service VM
73 * kernel VA for accelerating the User VM GPA translation.
74 */
75 struct vm_memory_mapping {
76 struct page **pages;
77 int npages;
78 void *service_vm_va;
79 u64 user_vm_pa;
80 size_t size;
81 };
82
83 /**
84 * struct acrn_ioreq_buffer - Data for setting the ioreq buffer of User VM
85 * @ioreq_buf: The GPA of the IO request shared buffer of a VM
86 *
87 * The parameter for the HC_SET_IOREQ_BUFFER hypercall used to set up
88 * the shared I/O request buffer between Service VM and ACRN hypervisor.
89 */
90 struct acrn_ioreq_buffer {
91 u64 ioreq_buf;
92 };
93
94 struct acrn_ioreq_range {
95 struct list_head list;
96 u32 type;
97 u64 start;
98 u64 end;
99 };
100
101 #define ACRN_IOREQ_CLIENT_DESTROYING 0U
102 typedef int (*ioreq_handler_t)(struct acrn_ioreq_client *client,
103 struct acrn_io_request *req);
104 /**
105 * struct acrn_ioreq_client - Structure of I/O client.
106 * @name: Client name
107 * @vm: The VM that the client belongs to
108 * @list: List node for this acrn_ioreq_client
109 * @is_default: If this client is the default one
110 * @flags: Flags (ACRN_IOREQ_CLIENT_*)
111 * @range_list: I/O ranges
112 * @range_lock: Lock to protect range_list
113 * @ioreqs_map: The pending I/O requests bitmap.
114 * @handler: I/O requests handler of this client
115 * @thread: The thread which executes the handler
116 * @wq: The wait queue for the handler thread parking
117 * @priv: Data for the thread
118 */
119 struct acrn_ioreq_client {
120 char name[ACRN_NAME_LEN];
121 struct acrn_vm *vm;
122 struct list_head list;
123 bool is_default;
124 unsigned long flags;
125 struct list_head range_list;
126 rwlock_t range_lock;
127 DECLARE_BITMAP(ioreqs_map, ACRN_IO_REQUEST_MAX);
128 ioreq_handler_t handler;
129 struct task_struct *thread;
130 wait_queue_head_t wq;
131 void *priv;
132 };
133
134 #define ACRN_INVALID_VMID (0xffffU)
135
136 #define ACRN_VM_FLAG_DESTROYED 0U
137 #define ACRN_VM_FLAG_CLEARING_IOREQ 1U
138 extern struct list_head acrn_vm_list;
139 extern rwlock_t acrn_vm_list_lock;
140 /**
141 * struct acrn_vm - Properties of ACRN User VM.
142 * @list: Entry within global list of all VMs.
143 * @vmid: User VM ID.
144 * @vcpu_num: Number of virtual CPUs in the VM.
145 * @flags: Flags (ACRN_VM_FLAG_*) of the VM. This is VM
146 * flag management in HSM which is different
147 * from the &acrn_vm_creation.vm_flag.
148 * @regions_mapping_lock: Lock to protect &acrn_vm.regions_mapping and
149 * &acrn_vm.regions_mapping_count.
150 * @regions_mapping: Memory mappings of this VM.
151 * @regions_mapping_count: Number of memory mapping of this VM.
152 * @ioreq_clients_lock: Lock to protect ioreq_clients and default_client
153 * @ioreq_clients: The I/O request clients list of this VM
154 * @default_client: The default I/O request client
155 * @ioreq_buf: I/O request shared buffer
156 * @ioreq_page: The page of the I/O request shared buffer
157 * @pci_conf_addr: Address of a PCI configuration access emulation
158 * @monitor_page: Page of interrupt statistics of User VM
159 * @ioeventfds_lock: Lock to protect ioeventfds list
160 * @ioeventfds: List to link all hsm_ioeventfd
161 * @ioeventfd_client: I/O client for ioeventfds of the VM
162 * @irqfds_lock: Lock to protect irqfds list
163 * @irqfds: List to link all hsm_irqfd
164 * @irqfd_wq: Workqueue for irqfd async shutdown
165 */
166 struct acrn_vm {
167 struct list_head list;
168 u16 vmid;
169 int vcpu_num;
170 unsigned long flags;
171 struct mutex regions_mapping_lock;
172 struct vm_memory_mapping regions_mapping[ACRN_MEM_MAPPING_MAX];
173 int regions_mapping_count;
174 spinlock_t ioreq_clients_lock;
175 struct list_head ioreq_clients;
176 struct acrn_ioreq_client *default_client;
177 struct acrn_io_request_buffer *ioreq_buf;
178 struct page *ioreq_page;
179 u32 pci_conf_addr;
180 struct page *monitor_page;
181 struct mutex ioeventfds_lock;
182 struct list_head ioeventfds;
183 struct acrn_ioreq_client *ioeventfd_client;
184 struct mutex irqfds_lock;
185 struct list_head irqfds;
186 struct workqueue_struct *irqfd_wq;
187 };
188
189 struct acrn_vm *acrn_vm_create(struct acrn_vm *vm,
190 struct acrn_vm_creation *vm_param);
191 int acrn_vm_destroy(struct acrn_vm *vm);
192 int acrn_mm_region_add(struct acrn_vm *vm, u64 user_gpa, u64 service_gpa,
193 u64 size, u32 mem_type, u32 mem_access_right);
194 int acrn_mm_region_del(struct acrn_vm *vm, u64 user_gpa, u64 size);
195 int acrn_vm_memseg_map(struct acrn_vm *vm, struct acrn_vm_memmap *memmap);
196 int acrn_vm_memseg_unmap(struct acrn_vm *vm, struct acrn_vm_memmap *memmap);
197 int acrn_vm_ram_map(struct acrn_vm *vm, struct acrn_vm_memmap *memmap);
198 void acrn_vm_all_ram_unmap(struct acrn_vm *vm);
199
200 int acrn_ioreq_init(struct acrn_vm *vm, u64 buf_vma);
201 void acrn_ioreq_deinit(struct acrn_vm *vm);
202 int acrn_ioreq_intr_setup(void);
203 void acrn_ioreq_intr_remove(void);
204 void acrn_ioreq_request_clear(struct acrn_vm *vm);
205 int acrn_ioreq_client_wait(struct acrn_ioreq_client *client);
206 int acrn_ioreq_request_default_complete(struct acrn_vm *vm, u16 vcpu);
207 struct acrn_ioreq_client *acrn_ioreq_client_create(struct acrn_vm *vm,
208 ioreq_handler_t handler,
209 void *data, bool is_default,
210 const char *name);
211 void acrn_ioreq_client_destroy(struct acrn_ioreq_client *client);
212 int acrn_ioreq_range_add(struct acrn_ioreq_client *client,
213 u32 type, u64 start, u64 end);
214 void acrn_ioreq_range_del(struct acrn_ioreq_client *client,
215 u32 type, u64 start, u64 end);
216
217 int acrn_msi_inject(struct acrn_vm *vm, u64 msi_addr, u64 msi_data);
218
219 int acrn_ioeventfd_init(struct acrn_vm *vm);
220 int acrn_ioeventfd_config(struct acrn_vm *vm, struct acrn_ioeventfd *args);
221 void acrn_ioeventfd_deinit(struct acrn_vm *vm);
222
223 int acrn_irqfd_init(struct acrn_vm *vm);
224 int acrn_irqfd_config(struct acrn_vm *vm, struct acrn_irqfd *args);
225 void acrn_irqfd_deinit(struct acrn_vm *vm);
226
227 #endif /* __ACRN_HSM_DRV_H */