VirtualBox

source: vbox/trunk/src/VBox/Additions/linux/drm/vbox_drv.h@ 65193

Last change on this file since 65193 was 64919, checked in by vboxsync, 8 years ago

bugref:8677: Additions/Graphics/Wayland: Fedora 25 issues: fix sending virtual screen offset hints (recent guests only). If the hints are not for disjoint screen areas (GNOME Shell requires this), replace them with default ones. Having valid hints lets us know the virtual screen layout inside GNOME Shell/Wayland unless the user has manually changed it inside the guest, and we need this information to get the (absolute) pointer input mapping right. The code also detects and handles separately the special cases of the fbdev console being active and X.Org (a single large framebuffer for all screens in video memory).

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.6 KB
Line 
1/* $Id: vbox_drv.h 64919 2016-12-16 16:56:09Z vboxsync $ */
2/** @file
3 * VirtualBox Additions Linux kernel video driver
4 */
5
6/*
7 * Copyright (C) 2013-2016 Oracle Corporation
8 *
9 * This file is part of VirtualBox Open Source Edition (OSE), as
10 * available from http://www.virtualbox.org. This file is free software;
11 * you can redistribute it and/or modify it under the terms of the GNU
12 * General Public License (GPL) as published by the Free Software
13 * Foundation, in version 2 as it comes in the "COPYING" file of the
14 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
15 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
16 * --------------------------------------------------------------------
17 *
18 * This code is based on
19 * ast_drv.h
20 * with the following copyright and permission notice:
21 *
22 * Copyright 2012 Red Hat Inc.
23 *
24 * Permission is hereby granted, free of charge, to any person obtaining a
25 * copy of this software and associated documentation files (the
26 * "Software"), to deal in the Software without restriction, including
27 * without limitation the rights to use, copy, modify, merge, publish,
28 * distribute, sub license, and/or sell copies of the Software, and to
29 * permit persons to whom the Software is furnished to do so, subject to
30 * the following conditions:
31 *
32 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
33 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
34 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
35 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
36 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
37 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
38 * USE OR OTHER DEALINGS IN THE SOFTWARE.
39 *
40 * The above copyright notice and this permission notice (including the
41 * next paragraph) shall be included in all copies or substantial portions
42 * of the Software.
43 *
44 */
45/*
46 * Authors: Dave Airlie <[email protected]>
47 */
48#ifndef __VBOX_DRV_H__
49#define __VBOX_DRV_H__
50
51#define LOG_GROUP LOG_GROUP_DEV_VGA
52
53#include <VBox/VBoxVideoGuest.h>
54
55#include <drm/drmP.h>
56#include <drm/drm_fb_helper.h>
57
58#include <drm/ttm/ttm_bo_api.h>
59#include <drm/ttm/ttm_bo_driver.h>
60#include <drm/ttm/ttm_placement.h>
61#include <drm/ttm/ttm_memory.h>
62#include <drm/ttm/ttm_module.h>
63
64#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0)
65# include <drm/drm_gem.h>
66#endif
67
68/* #include "vboxvideo.h" */
69
70#include "product-generated.h"
71
72#define DRIVER_AUTHOR VBOX_VENDOR
73
74#define DRIVER_NAME "vboxvideo"
75#define DRIVER_DESC VBOX_PRODUCT " Graphics Card"
76#define DRIVER_DATE "20130823"
77
78#define DRIVER_MAJOR 1
79#define DRIVER_MINOR 0
80#define DRIVER_PATCHLEVEL 0
81
82#define VBOX_MAX_CURSOR_WIDTH 64
83#define VBOX_MAX_CURSOR_HEIGHT 64
84#define CURSOR_PIXEL_COUNT VBOX_MAX_CURSOR_WIDTH * VBOX_MAX_CURSOR_HEIGHT
85#define CURSOR_DATA_SIZE CURSOR_PIXEL_COUNT * 4 + CURSOR_PIXEL_COUNT / 8
86
87#define VBOX_MAX_SCREENS 32
88
89struct vbox_fbdev;
90
91struct vbox_private {
92 struct drm_device *dev;
93
94 uint8_t __iomem *mapped_vram;
95 HGSMIGUESTCOMMANDCONTEXT submit_info;
96 struct VBVABUFFERCONTEXT *vbva_info;
97 bool any_pitch;
98 unsigned num_crtcs;
99 /** Amount of available VRAM, including space used for buffers. */
100 uint32_t full_vram_size;
101 /** Amount of available VRAM, not including space used for buffers. */
102 uint32_t available_vram_size;
103 /** Offset of mapped VRAM area in full VRAM. */
104 uint32_t vram_map_start;
105 /** Offset to the host flags in the VRAM. */
106 uint32_t host_flags_offset;
107 /** Array of structures for receiving mode hints. */
108 VBVAMODEHINT *last_mode_hints;
109
110 struct vbox_fbdev *fbdev;
111
112 int fb_mtrr;
113
114 struct {
115 struct drm_global_reference mem_global_ref;
116 struct ttm_bo_global_ref bo_global_ref;
117 struct ttm_bo_device bdev;
118 bool mm_initialised;
119 } ttm;
120
121 struct mutex hw_mutex;
122 bool isr_installed;
123 /** We decide whether or not user-space supports display hot-plug
124 * depending on whether they react to a hot-plug event after the initial
125 * mode query. */
126 bool initial_mode_queried;
127 struct work_struct hotplug_work;
128 uint32_t input_mapping_width;
129 uint32_t input_mapping_height;
130 /** Is user-space using an X.Org-style layout of one large frame-buffer
131 * encompassing all screen ones or is the fbdev console active? */
132 bool single_framebuffer;
133 uint32_t cursor_width;
134 uint32_t cursor_height;
135 uint32_t cursor_hot_x;
136 uint32_t cursor_hot_y;
137 size_t cursor_data_size;
138 uint8_t cursor_data[CURSOR_DATA_SIZE];
139};
140
141#undef CURSOR_PIXEL_COUNT
142#undef CURSOR_DATA_SIZE
143
144int vbox_driver_load(struct drm_device *dev, unsigned long flags);
145int vbox_driver_unload(struct drm_device *dev);
146void vbox_driver_lastclose(struct drm_device *dev);
147
148struct vbox_gem_object;
149
150#ifndef VGA_PORT_HGSMI_HOST
151# define VGA_PORT_HGSMI_HOST 0x3b0
152# define VGA_PORT_HGSMI_GUEST 0x3d0
153#endif
154
155struct vbox_connector {
156 struct drm_connector base;
157 char name[32];
158 struct vbox_crtc *vbox_crtc;
159 struct {
160 uint16_t width;
161 uint16_t height;
162 bool disconnected;
163 } mode_hint;
164};
165
166struct vbox_crtc {
167 struct drm_crtc base;
168 bool blanked;
169 bool disconnected;
170 unsigned crtc_id;
171 uint32_t fb_offset;
172 bool cursor_enabled;
173 uint16_t x_hint;
174 uint16_t y_hint;
175};
176
177struct vbox_encoder {
178 struct drm_encoder base;
179};
180
181struct vbox_framebuffer {
182 struct drm_framebuffer base;
183 struct drm_gem_object *obj;
184};
185
186struct vbox_fbdev {
187 struct drm_fb_helper helper;
188 struct vbox_framebuffer afb;
189 int size;
190 struct ttm_bo_kmap_obj mapping;
191 int x1, y1, x2, y2; /* dirty rect */
192 spinlock_t dirty_lock;
193};
194
195#define to_vbox_crtc(x) container_of(x, struct vbox_crtc, base)
196#define to_vbox_connector(x) container_of(x, struct vbox_connector, base)
197#define to_vbox_encoder(x) container_of(x, struct vbox_encoder, base)
198#define to_vbox_framebuffer(x) container_of(x, struct vbox_framebuffer, base)
199
200extern int vbox_mode_init(struct drm_device *dev);
201extern void vbox_mode_fini(struct drm_device *dev);
202
203#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0)
204# define DRM_MODE_FB_CMD drm_mode_fb_cmd
205#else
206# define DRM_MODE_FB_CMD drm_mode_fb_cmd2
207#endif
208
209#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 15, 0)
210# define CRTC_FB(crtc) (crtc)->fb
211#else
212# define CRTC_FB(crtc) (crtc)->primary->fb
213#endif
214
215void vbox_enable_accel(struct vbox_private *vbox);
216void vbox_disable_accel(struct vbox_private *vbox);
217void vbox_report_caps(struct vbox_private *vbox);
218
219void vbox_framebuffer_dirty_rectangles(struct drm_framebuffer *fb,
220 struct drm_clip_rect *rects,
221 unsigned num_rects);
222
223int vbox_framebuffer_init(struct drm_device *dev,
224 struct vbox_framebuffer *vbox_fb,
225#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0)
226 const
227#endif
228 struct DRM_MODE_FB_CMD *mode_cmd,
229 struct drm_gem_object *obj);
230
231int vbox_fbdev_init(struct drm_device *dev);
232void vbox_fbdev_fini(struct drm_device *dev);
233void vbox_fbdev_set_suspend(struct drm_device *dev, int state);
234void vbox_fbdev_set_base(struct vbox_private *vbox, unsigned long gpu_addr);
235
236struct vbox_bo {
237 struct ttm_buffer_object bo;
238 struct ttm_placement placement;
239 struct ttm_bo_kmap_obj kmap;
240 struct drm_gem_object gem;
241#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 18, 0)
242 u32 placements[3];
243#else
244 struct ttm_place placements[3];
245#endif
246 int pin_count;
247};
248#define gem_to_vbox_bo(gobj) container_of((gobj), struct vbox_bo, gem)
249
250static inline struct vbox_bo *
251vbox_bo(struct ttm_buffer_object *bo)
252{
253 return container_of(bo, struct vbox_bo, bo);
254}
255
256
257#define to_vbox_obj(x) container_of(x, struct vbox_gem_object, base)
258
259extern int vbox_dumb_create(struct drm_file *file,
260 struct drm_device *dev,
261 struct drm_mode_create_dumb *args);
262#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 12, 0)
263extern int vbox_dumb_destroy(struct drm_file *file,
264 struct drm_device *dev,
265 uint32_t handle);
266#endif
267
268extern void vbox_gem_free_object(struct drm_gem_object *obj);
269extern int vbox_dumb_mmap_offset(struct drm_file *file,
270 struct drm_device *dev,
271 uint32_t handle,
272 uint64_t *offset);
273
274#define DRM_FILE_PAGE_OFFSET (0x10000000ULL >> PAGE_SHIFT)
275
276int vbox_mm_init(struct vbox_private *vbox);
277void vbox_mm_fini(struct vbox_private *vbox);
278
279int vbox_bo_create(struct drm_device *dev, int size, int align,
280 uint32_t flags, struct vbox_bo **pvboxbo);
281
282int vbox_gem_create(struct drm_device *dev,
283 u32 size, bool iskernel,
284 struct drm_gem_object **obj);
285
286int vbox_bo_pin(struct vbox_bo *bo, u32 pl_flag, u64 *gpu_addr);
287int vbox_bo_unpin(struct vbox_bo *bo);
288
289static inline int vbox_bo_reserve(struct vbox_bo *bo, bool no_wait)
290{
291 int ret;
292
293#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0)
294 ret = ttm_bo_reserve(&bo->bo, true, no_wait, NULL);
295#else
296 ret = ttm_bo_reserve(&bo->bo, true, no_wait, false, 0);
297#endif
298 if (ret)
299 {
300 if (ret != -ERESTARTSYS && ret != -EBUSY)
301 DRM_ERROR("reserve failed %p\n", bo);
302 return ret;
303 }
304 return 0;
305}
306
307static inline void vbox_bo_unreserve(struct vbox_bo *bo)
308{
309 ttm_bo_unreserve(&bo->bo);
310}
311
312void vbox_ttm_placement(struct vbox_bo *bo, int domain);
313int vbox_bo_push_sysram(struct vbox_bo *bo);
314int vbox_mmap(struct file *filp, struct vm_area_struct *vma);
315
316/* vbox_irq.c */
317int vbox_irq_init(struct vbox_private *vbox);
318void vbox_irq_fini(struct vbox_private *vbox);
319void vbox_report_hotplug(struct vbox_private *vbox);
320irqreturn_t vbox_irq_handler(int irq, void *arg);
321#endif
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette