VirtualBox

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

Last change on this file since 60307 was 60300, checked in by vboxsync, 9 years ago

bugref:8087: Additions/x11: support non-root X server: add heuristic code to the kernel driver to detect the cursor hot-spot in case we are running old user space code which does not tell us about it. In theory we could easily extend this to work with older kernel versions which did not have the hot-spot API at all, but since older versions of X.Org could not use kernel drivers by default it does not gain us much.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 9.2 KB
Line 
1/* $Id: vbox_drv.h 60300 2016-04-03 19:31:33Z vboxsync $ */
2/** @file
3 * VirtualBox Additions Linux kernel video driver
4 */
5
6/*
7 * Copyright (C) 2013 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 <airlied@redhat.com>
47 */
48#ifndef __VBOX_DRV_H__
49#define __VBOX_DRV_H__
50
51#define LOG_GROUP LOG_GROUP_DEV_VGA
52
53#include "the-linux-kernel.h"
54
55#include <VBox/VBoxVideoGuest.h>
56#include <VBox/log.h>
57
58#include <drm/drmP.h>
59#include <drm/drm_fb_helper.h>
60
61#include <drm/ttm/ttm_bo_api.h>
62#include <drm/ttm/ttm_bo_driver.h>
63#include <drm/ttm/ttm_placement.h>
64#include <drm/ttm/ttm_memory.h>
65#include <drm/ttm/ttm_module.h>
66
67#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 18, 0)
68# include <drm/drm_gem.h>
69#endif
70
71/* #include "vboxvideo.h" */
72
73#include "product-generated.h"
74
75#define DRIVER_AUTHOR VBOX_VENDOR
76
77#define DRIVER_NAME "vboxvideo"
78#define DRIVER_DESC VBOX_PRODUCT " Graphics Card"
79#define DRIVER_DATE "20130823"
80
81#define DRIVER_MAJOR 1
82#define DRIVER_MINOR 0
83#define DRIVER_PATCHLEVEL 0
84
85#define VBOX_MAX_CURSOR_WIDTH 64
86#define VBOX_MAX_CURSOR_HEIGHT 64
87#define CURSOR_PIXEL_COUNT VBOX_MAX_CURSOR_WIDTH * VBOX_MAX_CURSOR_HEIGHT
88#define CURSOR_DATA_SIZE CURSOR_PIXEL_COUNT * 4 + CURSOR_PIXEL_COUNT / 8
89
90struct vbox_fbdev;
91
92struct vbox_private {
93 struct drm_device *dev;
94
95 uint8_t __iomem *vram;
96 HGSMIGUESTCOMMANDCONTEXT submit_info;
97 struct VBVABUFFERCONTEXT *vbva_info;
98 bool any_pitch;
99 unsigned num_crtcs;
100 bool vga2_clone;
101 /** Amount of available VRAM, including space used for buffers. */
102 uint32_t full_vram_size;
103 /** Amount of available VRAM, not including space used for buffers. */
104 uint32_t vram_size;
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 /** Have we finished fbdev initialisation? We limit reported display
124 * modes to 800x600 until this point to get a sensible console size. */
125 bool fbdev_init;
126 struct work_struct hotplug_work;
127 uint32_t input_mapping_width;
128 uint32_t input_mapping_height;
129 uint32_t cursor_width;
130 uint32_t cursor_height;
131 uint32_t cursor_hot_x;
132 uint32_t cursor_hot_y;
133 size_t cursor_data_size;
134 uint8_t cursor_data[CURSOR_DATA_SIZE];
135};
136
137#undef CURSOR_PIXEL_COUNT
138#undef CURSOR_DATA_SIZE
139
140int vbox_driver_load(struct drm_device *dev, unsigned long flags);
141int vbox_driver_unload(struct drm_device *dev);
142void vbox_driver_lastclose(struct drm_device *dev);
143
144struct vbox_gem_object;
145
146#ifndef VGA_PORT_HGSMI_HOST
147# define VGA_PORT_HGSMI_HOST 0x3b0
148# define VGA_PORT_HGSMI_GUEST 0x3d0
149#endif
150
151struct vbox_connector {
152 struct drm_connector base;
153 char name[32];
154 struct vbox_crtc *vbox_crtc;
155 struct {
156 uint16_t width;
157 uint16_t height;
158 bool disconnected;
159 } mode_hint;
160};
161
162struct vbox_crtc {
163 struct drm_crtc base;
164 bool blanked;
165 bool disconnected;
166 unsigned crtc_id;
167 uint32_t fb_offset;
168 bool cursor_enabled;
169};
170
171struct vbox_encoder {
172 struct drm_encoder base;
173};
174
175struct vbox_framebuffer {
176 struct drm_framebuffer base;
177 struct drm_gem_object *obj;
178};
179
180struct vbox_fbdev {
181 struct drm_fb_helper helper;
182 struct vbox_framebuffer afb;
183 void *sysram;
184 int size;
185 struct ttm_bo_kmap_obj mapping;
186 int x1, y1, x2, y2; /* dirty rect */
187 spinlock_t dirty_lock;
188};
189
190#define to_vbox_crtc(x) container_of(x, struct vbox_crtc, base)
191#define to_vbox_connector(x) container_of(x, struct vbox_connector, base)
192#define to_vbox_encoder(x) container_of(x, struct vbox_encoder, base)
193#define to_vbox_framebuffer(x) container_of(x, struct vbox_framebuffer, base)
194
195extern int vbox_mode_init(struct drm_device *dev);
196extern void vbox_mode_fini(struct drm_device *dev);
197extern void vbox_refresh_modes(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_enable_caps(struct vbox_private *vbox);
214void vbox_disable_caps(struct vbox_private *vbox);
215
216void vbox_framebuffer_dirty_rectangles(struct drm_framebuffer *fb,
217 struct drm_clip_rect *rects,
218 unsigned num_rects);
219
220int vbox_framebuffer_init(struct drm_device *dev,
221 struct vbox_framebuffer *vbox_fb,
222#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 5, 0)
223 const
224#endif
225 struct DRM_MODE_FB_CMD *mode_cmd,
226 struct drm_gem_object *obj);
227
228int vbox_fbdev_init(struct drm_device *dev);
229void vbox_fbdev_fini(struct drm_device *dev);
230void vbox_fbdev_set_suspend(struct drm_device *dev, int state);
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 (0x100000000ULL >> 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 ret = ttm_bo_reserve(&bo->bo, true, no_wait, false, 0);
290 if (ret)
291 {
292 if (ret != -ERESTARTSYS && ret != -EBUSY)
293 DRM_ERROR("reserve failed %p\n", bo);
294 return ret;
295 }
296 return 0;
297}
298
299static inline void vbox_bo_unreserve(struct vbox_bo *bo)
300{
301 ttm_bo_unreserve(&bo->bo);
302}
303
304void vbox_ttm_placement(struct vbox_bo *bo, int domain);
305int vbox_bo_push_sysram(struct vbox_bo *bo);
306int vbox_mmap(struct file *filp, struct vm_area_struct *vma);
307
308/* vbox_irq.c */
309int vbox_irq_init(struct vbox_private *vbox);
310void vbox_irq_fini(struct vbox_private *vbox);
311irqreturn_t vbox_irq_handler(int irq, void *arg);
312#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