VirtualBox

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

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

bugref:8677: Additions/Graphics/Wayland: Fedora 25 issues: remove functionality from the vboxvideo drm driver for moving unused buffers in video RAM to system RAM. This was copied and pasted from the driver for the memory-strapped AST driver, and not so relevant for us. However it was having the unintended consequence that when GNOME Shell page-flipped in a new buffer it was ending up at the same video RAM address as the old one (I unfortunately currently do not understand the details), leading the graphics card to think that nothing had changed on-screen. Now unaccelerated updates are working correctly in multi-monitor Fedora 25 guests, though probably still not very efficiently.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.4 KB
Line 
1/* $Id: vbox_drv.h 64830 2016-12-12 09:55:37Z 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 bool vga2_clone;
100 /** Amount of available VRAM, including space used for buffers. */
101 uint32_t full_vram_size;
102 /** Amount of available VRAM, not including space used for buffers. */
103 uint32_t available_vram_size;
104 /** Offset of mapped VRAM area in full VRAM. */
105 uint32_t vram_map_start;
106 /** Offset to the host flags in the VRAM. */
107 uint32_t host_flags_offset;
108 /** Array of structures for receiving mode hints. */
109 VBVAMODEHINT *last_mode_hints;
110
111 struct vbox_fbdev *fbdev;
112
113 int fb_mtrr;
114
115 struct {
116 struct drm_global_reference mem_global_ref;
117 struct ttm_bo_global_ref bo_global_ref;
118 struct ttm_bo_device bdev;
119 bool mm_initialised;
120 } ttm;
121
122 struct mutex hw_mutex;
123 bool isr_installed;
124 /** We decide whether or not user-space supports display hot-plug
125 * depending on whether they react to a hot-plug event after the initial
126 * mode query. */
127 bool initial_mode_queried;
128 struct work_struct hotplug_work;
129 uint32_t input_mapping_width;
130 uint32_t input_mapping_height;
131 uint32_t cursor_width;
132 uint32_t cursor_height;
133 uint32_t cursor_hot_x;
134 uint32_t cursor_hot_y;
135 size_t cursor_data_size;
136 uint8_t cursor_data[CURSOR_DATA_SIZE];
137};
138
139#undef CURSOR_PIXEL_COUNT
140#undef CURSOR_DATA_SIZE
141
142int vbox_driver_load(struct drm_device *dev, unsigned long flags);
143int vbox_driver_unload(struct drm_device *dev);
144void vbox_driver_lastclose(struct drm_device *dev);
145
146struct vbox_gem_object;
147
148#ifndef VGA_PORT_HGSMI_HOST
149# define VGA_PORT_HGSMI_HOST 0x3b0
150# define VGA_PORT_HGSMI_GUEST 0x3d0
151#endif
152
153struct vbox_connector {
154 struct drm_connector base;
155 char name[32];
156 struct vbox_crtc *vbox_crtc;
157 struct {
158 uint16_t width;
159 uint16_t height;
160 bool disconnected;
161 } mode_hint;
162};
163
164struct vbox_crtc {
165 struct drm_crtc base;
166 bool blanked;
167 bool disconnected;
168 unsigned crtc_id;
169 uint32_t fb_offset;
170 bool cursor_enabled;
171};
172
173struct vbox_encoder {
174 struct drm_encoder base;
175};
176
177struct vbox_framebuffer {
178 struct drm_framebuffer base;
179 struct drm_gem_object *obj;
180};
181
182struct vbox_fbdev {
183 struct drm_fb_helper helper;
184 struct vbox_framebuffer afb;
185 int size;
186 struct ttm_bo_kmap_obj mapping;
187 int x1, y1, x2, y2; /* dirty rect */
188 spinlock_t dirty_lock;
189};
190
191#define to_vbox_crtc(x) container_of(x, struct vbox_crtc, base)
192#define to_vbox_connector(x) container_of(x, struct vbox_connector, base)
193#define to_vbox_encoder(x) container_of(x, struct vbox_encoder, base)
194#define to_vbox_framebuffer(x) container_of(x, struct vbox_framebuffer, base)
195
196extern int vbox_mode_init(struct drm_device *dev);
197extern void vbox_mode_fini(struct drm_device *dev);
198
199#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 3, 0)
200# define DRM_MODE_FB_CMD drm_mode_fb_cmd
201#else
202# define DRM_MODE_FB_CMD drm_mode_fb_cmd2
203#endif
204
205#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 15, 0)
206# define CRTC_FB(crtc) (crtc)->fb
207#else
208# define CRTC_FB(crtc) (crtc)->primary->fb
209#endif
210
211void vbox_enable_accel(struct vbox_private *vbox);
212void vbox_disable_accel(struct vbox_private *vbox);
213void vbox_report_caps(struct vbox_private *vbox);
214
215void vbox_framebuffer_dirty_rectangles(struct drm_framebuffer *fb,
216 struct drm_clip_rect *rects,
217 unsigned num_rects);
218
219int vbox_framebuffer_init(struct drm_device *dev,
220 struct vbox_framebuffer *vbox_fb,
221#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0)
222 const
223#endif
224 struct DRM_MODE_FB_CMD *mode_cmd,
225 struct drm_gem_object *obj);
226
227int vbox_fbdev_init(struct drm_device *dev);
228void vbox_fbdev_fini(struct drm_device *dev);
229void vbox_fbdev_set_suspend(struct drm_device *dev, int state);
230void vbox_fbdev_set_base(struct vbox_private *vbox, unsigned long gpu_addr);
231
232struct vbox_bo {
233 struct ttm_buffer_object bo;
234 struct ttm_placement placement;
235 struct ttm_bo_kmap_obj kmap;
236 struct drm_gem_object gem;
237#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 18, 0)
238 u32 placements[3];
239#else
240 struct ttm_place placements[3];
241#endif
242 int pin_count;
243};
244#define gem_to_vbox_bo(gobj) container_of((gobj), struct vbox_bo, gem)
245
246static inline struct vbox_bo *
247vbox_bo(struct ttm_buffer_object *bo)
248{
249 return container_of(bo, struct vbox_bo, bo);
250}
251
252
253#define to_vbox_obj(x) container_of(x, struct vbox_gem_object, base)
254
255extern int vbox_dumb_create(struct drm_file *file,
256 struct drm_device *dev,
257 struct drm_mode_create_dumb *args);
258#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 12, 0)
259extern int vbox_dumb_destroy(struct drm_file *file,
260 struct drm_device *dev,
261 uint32_t handle);
262#endif
263
264extern void vbox_gem_free_object(struct drm_gem_object *obj);
265extern int vbox_dumb_mmap_offset(struct drm_file *file,
266 struct drm_device *dev,
267 uint32_t handle,
268 uint64_t *offset);
269
270#define DRM_FILE_PAGE_OFFSET (0x10000000ULL >> PAGE_SHIFT)
271
272int vbox_mm_init(struct vbox_private *vbox);
273void vbox_mm_fini(struct vbox_private *vbox);
274
275int vbox_bo_create(struct drm_device *dev, int size, int align,
276 uint32_t flags, struct vbox_bo **pvboxbo);
277
278int vbox_gem_create(struct drm_device *dev,
279 u32 size, bool iskernel,
280 struct drm_gem_object **obj);
281
282int vbox_bo_pin(struct vbox_bo *bo, u32 pl_flag, u64 *gpu_addr);
283int vbox_bo_unpin(struct vbox_bo *bo);
284
285static inline int vbox_bo_reserve(struct vbox_bo *bo, bool no_wait)
286{
287 int ret;
288
289#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 7, 0)
290 ret = ttm_bo_reserve(&bo->bo, true, no_wait, NULL);
291#else
292 ret = ttm_bo_reserve(&bo->bo, true, no_wait, false, 0);
293#endif
294 if (ret)
295 {
296 if (ret != -ERESTARTSYS && ret != -EBUSY)
297 DRM_ERROR("reserve failed %p\n", bo);
298 return ret;
299 }
300 return 0;
301}
302
303static inline void vbox_bo_unreserve(struct vbox_bo *bo)
304{
305 ttm_bo_unreserve(&bo->bo);
306}
307
308void vbox_ttm_placement(struct vbox_bo *bo, int domain);
309int vbox_bo_push_sysram(struct vbox_bo *bo);
310int vbox_mmap(struct file *filp, struct vm_area_struct *vma);
311
312/* vbox_irq.c */
313int vbox_irq_init(struct vbox_private *vbox);
314void vbox_irq_fini(struct vbox_private *vbox);
315void vbox_report_hotplug(struct vbox_private *vbox);
316irqreturn_t vbox_irq_handler(int irq, void *arg);
317#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