0001
0002
0003 #ifndef __ACRN_HSM_DRV_H
0004 #define __ACRN_HSM_DRV_H
0005
0006 #include <linux/acrn.h>
0007 #include <linux/dev_printk.h>
0008 #include <linux/miscdevice.h>
0009 #include <linux/types.h>
0010
0011 #include "hypercall.h"
0012
0013 extern struct miscdevice acrn_dev;
0014
0015 #define ACRN_NAME_LEN 16
0016 #define ACRN_MEM_MAPPING_MAX 256
0017
0018 #define ACRN_MEM_REGION_ADD 0
0019 #define ACRN_MEM_REGION_DEL 2
0020
0021 struct acrn_vm;
0022 struct acrn_ioreq_client;
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037 struct vm_memory_region_op {
0038 u32 type;
0039 u32 attr;
0040 u64 user_vm_pa;
0041 u64 service_vm_pa;
0042 u64 size;
0043 };
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058 struct vm_memory_region_batch {
0059 u16 vmid;
0060 u16 reserved[3];
0061 u32 regions_num;
0062 u64 regions_gpa;
0063 struct vm_memory_region_op regions_op[];
0064 };
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077 struct vm_memory_mapping {
0078 struct page **pages;
0079 int npages;
0080 void *service_vm_va;
0081 u64 user_vm_pa;
0082 size_t size;
0083 };
0084
0085
0086
0087
0088
0089
0090
0091
0092 struct acrn_ioreq_buffer {
0093 u64 ioreq_buf;
0094 };
0095
0096 struct acrn_ioreq_range {
0097 struct list_head list;
0098 u32 type;
0099 u64 start;
0100 u64 end;
0101 };
0102
0103 #define ACRN_IOREQ_CLIENT_DESTROYING 0U
0104 typedef int (*ioreq_handler_t)(struct acrn_ioreq_client *client,
0105 struct acrn_io_request *req);
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121 struct acrn_ioreq_client {
0122 char name[ACRN_NAME_LEN];
0123 struct acrn_vm *vm;
0124 struct list_head list;
0125 bool is_default;
0126 unsigned long flags;
0127 struct list_head range_list;
0128 rwlock_t range_lock;
0129 DECLARE_BITMAP(ioreqs_map, ACRN_IO_REQUEST_MAX);
0130 ioreq_handler_t handler;
0131 struct task_struct *thread;
0132 wait_queue_head_t wq;
0133 void *priv;
0134 };
0135
0136 #define ACRN_INVALID_VMID (0xffffU)
0137
0138 #define ACRN_VM_FLAG_DESTROYED 0U
0139 #define ACRN_VM_FLAG_CLEARING_IOREQ 1U
0140 extern struct list_head acrn_vm_list;
0141 extern rwlock_t acrn_vm_list_lock;
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168 struct acrn_vm {
0169 struct list_head list;
0170 u16 vmid;
0171 int vcpu_num;
0172 unsigned long flags;
0173 struct mutex regions_mapping_lock;
0174 struct vm_memory_mapping regions_mapping[ACRN_MEM_MAPPING_MAX];
0175 int regions_mapping_count;
0176 spinlock_t ioreq_clients_lock;
0177 struct list_head ioreq_clients;
0178 struct acrn_ioreq_client *default_client;
0179 struct acrn_io_request_buffer *ioreq_buf;
0180 struct page *ioreq_page;
0181 u32 pci_conf_addr;
0182 struct page *monitor_page;
0183 struct mutex ioeventfds_lock;
0184 struct list_head ioeventfds;
0185 struct acrn_ioreq_client *ioeventfd_client;
0186 struct mutex irqfds_lock;
0187 struct list_head irqfds;
0188 struct workqueue_struct *irqfd_wq;
0189 };
0190
0191 struct acrn_vm *acrn_vm_create(struct acrn_vm *vm,
0192 struct acrn_vm_creation *vm_param);
0193 int acrn_vm_destroy(struct acrn_vm *vm);
0194 int acrn_mm_region_add(struct acrn_vm *vm, u64 user_gpa, u64 service_gpa,
0195 u64 size, u32 mem_type, u32 mem_access_right);
0196 int acrn_mm_region_del(struct acrn_vm *vm, u64 user_gpa, u64 size);
0197 int acrn_vm_memseg_map(struct acrn_vm *vm, struct acrn_vm_memmap *memmap);
0198 int acrn_vm_memseg_unmap(struct acrn_vm *vm, struct acrn_vm_memmap *memmap);
0199 int acrn_vm_ram_map(struct acrn_vm *vm, struct acrn_vm_memmap *memmap);
0200 void acrn_vm_all_ram_unmap(struct acrn_vm *vm);
0201
0202 int acrn_ioreq_init(struct acrn_vm *vm, u64 buf_vma);
0203 void acrn_ioreq_deinit(struct acrn_vm *vm);
0204 int acrn_ioreq_intr_setup(void);
0205 void acrn_ioreq_intr_remove(void);
0206 void acrn_ioreq_request_clear(struct acrn_vm *vm);
0207 int acrn_ioreq_client_wait(struct acrn_ioreq_client *client);
0208 int acrn_ioreq_request_default_complete(struct acrn_vm *vm, u16 vcpu);
0209 struct acrn_ioreq_client *acrn_ioreq_client_create(struct acrn_vm *vm,
0210 ioreq_handler_t handler,
0211 void *data, bool is_default,
0212 const char *name);
0213 void acrn_ioreq_client_destroy(struct acrn_ioreq_client *client);
0214 int acrn_ioreq_range_add(struct acrn_ioreq_client *client,
0215 u32 type, u64 start, u64 end);
0216 void acrn_ioreq_range_del(struct acrn_ioreq_client *client,
0217 u32 type, u64 start, u64 end);
0218
0219 int acrn_msi_inject(struct acrn_vm *vm, u64 msi_addr, u64 msi_data);
0220
0221 int acrn_ioeventfd_init(struct acrn_vm *vm);
0222 int acrn_ioeventfd_config(struct acrn_vm *vm, struct acrn_ioeventfd *args);
0223 void acrn_ioeventfd_deinit(struct acrn_vm *vm);
0224
0225 int acrn_irqfd_init(struct acrn_vm *vm);
0226 int acrn_irqfd_config(struct acrn_vm *vm, struct acrn_irqfd *args);
0227 void acrn_irqfd_deinit(struct acrn_vm *vm);
0228
0229 #endif