Linux-libre 5.4.48-gnu
[librecmc/linux-libre.git] / drivers / virt / vboxguest / vboxguest_core.h
1 /* SPDX-License-Identifier: (GPL-2.0 OR CDDL-1.0) */
2 /* Copyright (C) 2010-2016 Oracle Corporation */
3
4 #ifndef __VBOXGUEST_CORE_H__
5 #define __VBOXGUEST_CORE_H__
6
7 #include <linux/input.h>
8 #include <linux/interrupt.h>
9 #include <linux/kernel.h>
10 #include <linux/list.h>
11 #include <linux/miscdevice.h>
12 #include <linux/spinlock.h>
13 #include <linux/wait.h>
14 #include <linux/workqueue.h>
15 #include <linux/vboxguest.h>
16 #include "vmmdev.h"
17
18 struct vbg_session;
19
20 /** VBox guest memory balloon. */
21 struct vbg_mem_balloon {
22         /** Work handling VMMDEV_EVENT_BALLOON_CHANGE_REQUEST events */
23         struct work_struct work;
24         /** Pre-allocated vmmdev_memballoon_info req for query */
25         struct vmmdev_memballoon_info *get_req;
26         /** Pre-allocated vmmdev_memballoon_change req for inflate / deflate */
27         struct vmmdev_memballoon_change *change_req;
28         /** The current number of chunks in the balloon. */
29         u32 chunks;
30         /** The maximum number of chunks in the balloon. */
31         u32 max_chunks;
32         /**
33          * Array of pointers to page arrays. A page * array is allocated for
34          * each chunk when inflating, and freed when the deflating.
35          */
36         struct page ***pages;
37 };
38
39 /**
40  * Per bit usage tracker for a u32 mask.
41  *
42  * Used for optimal handling of guest properties and event filter.
43  */
44 struct vbg_bit_usage_tracker {
45         /** Per bit usage counters. */
46         u32 per_bit_usage[32];
47         /** The current mask according to per_bit_usage. */
48         u32 mask;
49 };
50
51 /** VBox guest device (data) extension. */
52 struct vbg_dev {
53         struct device *dev;
54         /** The base of the adapter I/O ports. */
55         u16 io_port;
56         /** Pointer to the mapping of the VMMDev adapter memory. */
57         struct vmmdev_memory *mmio;
58         /** Host version */
59         char host_version[64];
60         /** Host features */
61         unsigned int host_features;
62         /**
63          * Dummy page and vmap address for reserved kernel virtual-address
64          * space for the guest mappings, only used on hosts lacking vtx.
65          */
66         struct page *guest_mappings_dummy_page;
67         void *guest_mappings;
68         /** Spinlock protecting pending_events. */
69         spinlock_t event_spinlock;
70         /** Preallocated struct vmmdev_events for the IRQ handler. */
71         struct vmmdev_events *ack_events_req;
72         /** Wait-for-event list for threads waiting for multiple events. */
73         wait_queue_head_t event_wq;
74         /** Mask of pending events. */
75         u32 pending_events;
76         /** Wait-for-event list for threads waiting on HGCM async completion. */
77         wait_queue_head_t hgcm_wq;
78         /** Pre-allocated hgcm cancel2 req. for cancellation on timeout */
79         struct vmmdev_hgcm_cancel2 *cancel_req;
80         /** Mutex protecting cancel_req accesses */
81         struct mutex cancel_req_mutex;
82         /** Pre-allocated mouse-status request for the input-device handling. */
83         struct vmmdev_mouse_status *mouse_status_req;
84         /** Input device for reporting abs mouse coordinates to the guest. */
85         struct input_dev *input;
86
87         /** Memory balloon information. */
88         struct vbg_mem_balloon mem_balloon;
89
90         /** Lock for session related items in vbg_dev and vbg_session */
91         struct mutex session_mutex;
92         /** Events we won't permit anyone to filter out. */
93         u32 fixed_events;
94         /**
95          * Usage counters for the host events (excludes fixed events),
96          * Protected by session_mutex.
97          */
98         struct vbg_bit_usage_tracker event_filter_tracker;
99         /**
100          * The event filter last reported to the host (or UINT32_MAX).
101          * Protected by session_mutex.
102          */
103         u32 event_filter_host;
104
105         /**
106          * Usage counters for guest capabilities. Indexed by capability bit
107          * number, one count per session using a capability.
108          * Protected by session_mutex.
109          */
110         struct vbg_bit_usage_tracker guest_caps_tracker;
111         /**
112          * The guest capabilities last reported to the host (or UINT32_MAX).
113          * Protected by session_mutex.
114          */
115         u32 guest_caps_host;
116
117         /**
118          * Heartbeat timer which fires with interval
119          * cNsHearbeatInterval and its handler sends
120          * VMMDEVREQ_GUEST_HEARTBEAT to VMMDev.
121          */
122         struct timer_list heartbeat_timer;
123         /** Heartbeat timer interval in ms. */
124         int heartbeat_interval_ms;
125         /** Preallocated VMMDEVREQ_GUEST_HEARTBEAT request. */
126         struct vmmdev_request_header *guest_heartbeat_req;
127
128         /** "vboxguest" char-device */
129         struct miscdevice misc_device;
130         /** "vboxuser" char-device */
131         struct miscdevice misc_device_user;
132 };
133
134 /** The VBoxGuest per session data. */
135 struct vbg_session {
136         /** Pointer to the device extension. */
137         struct vbg_dev *gdev;
138
139         /**
140          * Array containing HGCM client IDs associated with this session.
141          * These will be automatically disconnected when the session is closed.
142          * Protected by vbg_gdev.session_mutex.
143          */
144         u32 hgcm_client_ids[64];
145         /**
146          * Host events requested by the session.
147          * An event type requested in any guest session will be added to the
148          * host filter. Protected by vbg_gdev.session_mutex.
149          */
150         u32 event_filter;
151         /**
152          * Guest capabilities for this session.
153          * A capability claimed by any guest session will be reported to the
154          * host. Protected by vbg_gdev.session_mutex.
155          */
156         u32 guest_caps;
157         /** VMMDEV_REQUESTOR_* flags */
158         u32 requestor;
159         /** Set on CANCEL_ALL_WAITEVENTS, protected by vbg_devevent_spinlock. */
160         bool cancel_waiters;
161 };
162
163 int  vbg_core_init(struct vbg_dev *gdev, u32 fixed_events);
164 void vbg_core_exit(struct vbg_dev *gdev);
165 struct vbg_session *vbg_core_open_session(struct vbg_dev *gdev, u32 requestor);
166 void vbg_core_close_session(struct vbg_session *session);
167 int  vbg_core_ioctl(struct vbg_session *session, unsigned int req, void *data);
168 int  vbg_core_set_mouse_status(struct vbg_dev *gdev, u32 features);
169
170 irqreturn_t vbg_core_isr(int irq, void *dev_id);
171
172 void vbg_linux_mouse_event(struct vbg_dev *gdev);
173
174 /* Private (non exported) functions form vboxguest_utils.c */
175 void *vbg_req_alloc(size_t len, enum vmmdev_request_type req_type,
176                     u32 requestor);
177 void vbg_req_free(void *req, size_t len);
178 int vbg_req_perform(struct vbg_dev *gdev, void *req);
179 int vbg_hgcm_call32(
180         struct vbg_dev *gdev, u32 requestor, u32 client_id, u32 function,
181         u32 timeout_ms, struct vmmdev_hgcm_function_parameter32 *parm32,
182         u32 parm_count, int *vbox_status);
183
184 #endif