14da3402dSthorpej/* $Id: vboxvideo_drv.h,v 1.1 2020/10/22 20:47:23 thorpej Exp $ */
2e07dc26bSmrg/** @file
3e07dc26bSmrg * VirtualBox X11 Additions graphics driver
4e07dc26bSmrg */
5e07dc26bSmrg
6e07dc26bSmrg/*
7e07dc26bSmrg * Copyright (C) 2006-2017 Oracle Corporation
8e07dc26bSmrg *
9e07dc26bSmrg * This code is based on:
10e07dc26bSmrg *
11e07dc26bSmrg * X11 VESA driver
12e07dc26bSmrg *
13e07dc26bSmrg * Copyright (c) 2000 by Conectiva S.A. (http://www.conectiva.com)
14e07dc26bSmrg *
15e07dc26bSmrg * Permission is hereby granted, free of charge, to any person obtaining a
16e07dc26bSmrg * copy of this software and associated documentation files (the "Software"),
17e07dc26bSmrg * to deal in the Software without restriction, including without limitation
18e07dc26bSmrg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
19e07dc26bSmrg * and/or sell copies of the Software, and to permit persons to whom the
20e07dc26bSmrg * Software is furnished to do so, subject to the following conditions:
21e07dc26bSmrg *
22e07dc26bSmrg * The above copyright notice and this permission notice shall be included in
23e07dc26bSmrg * all copies or substantial portions of the Software.
24e07dc26bSmrg *
25e07dc26bSmrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
26e07dc26bSmrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
27e07dc26bSmrg * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
28e07dc26bSmrg * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
29e07dc26bSmrg * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
30e07dc26bSmrg * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
31e07dc26bSmrg * USE OR OTHER DEALINGS IN THE SOFTWARE.
32e07dc26bSmrg *
33e07dc26bSmrg * Except as contained in this notice, the name of Conectiva Linux shall
34e07dc26bSmrg * not be used in advertising or otherwise to promote the sale, use or other
35e07dc26bSmrg * dealings in this Software without prior written authorization from
36e07dc26bSmrg * Conectiva Linux.
37e07dc26bSmrg *
38e07dc26bSmrg * Authors: Paulo César Pereira de Andrade <pcpa@conectiva.com.br>
39e07dc26bSmrg *          Michael Thayer <michael.thayer@oracle.com>
40e07dc26bSmrg */
41e07dc26bSmrg
42e07dc26bSmrg#ifndef _VBOXVIDEO_H_
43e07dc26bSmrg#define _VBOXVIDEO_H_
44e07dc26bSmrg
45e07dc26bSmrg#include <VBoxVideoGuest.h>
46e07dc26bSmrg#include <VBoxVideo.h>
47e07dc26bSmrg#include "version-generated.h"
48e07dc26bSmrg
49e07dc26bSmrg#define VBOX_VENDORID 0x80EE
50e07dc26bSmrg#define VBOX_DEVICEID 0xBEEF
51e07dc26bSmrg
52e07dc26bSmrg#ifndef VBVA_SCREEN_F_BLANK
53e07dc26bSmrg# define VBVA_SCREEN_F_BLANK    0x0004
54e07dc26bSmrg#endif
55e07dc26bSmrg
56e07dc26bSmrg#include <VBoxVideoVBE.h>
57e07dc26bSmrg
58e07dc26bSmrg#include "xf86.h"
59e07dc26bSmrg#include "xf86str.h"
60e07dc26bSmrg#include "xf86Cursor.h"
61e07dc26bSmrg
62e07dc26bSmrg#ifdef DEBUG
63e07dc26bSmrg
64e07dc26bSmrg#define TRACE_ENTRY() do { xf86ErrorF("%s: entering\n", __func__); } while(0)
65e07dc26bSmrg#define TRACE_EXIT() do { xf86ErrorF("%s: leaving\n", __func__); } while(0)
66e07dc26bSmrg#define TRACE_LINE() \
67e07dc26bSmrg    do { xf86ErrorF("%s: line\n", __func__, __LINE__); } while(0)
68e07dc26bSmrg#define TRACE_LOG(...) \
69e07dc26bSmrgdo { \
70e07dc26bSmrg    xf86ErrorF("%s: ", __func__); \
71e07dc26bSmrg    xf86ErrorF(__VA_ARGS__); \
72e07dc26bSmrg} while(0)
73e07dc26bSmrg
74e07dc26bSmrg#else  /* !DEBUG */
75e07dc26bSmrg
76e07dc26bSmrg#define TRACE_ENTRY()         do { } while (0)
77e07dc26bSmrg#define TRACE_EXIT()          do { } while (0)
78e07dc26bSmrg#define TRACE_LOG(...)        do { } while (0)
79e07dc26bSmrg
80e07dc26bSmrg#endif  /* !DEBUG */
81e07dc26bSmrg
82e07dc26bSmrg#define VBOX_VERSION            VBOX_VERSION_MAJOR * 10000 \
83e07dc26bSmrg                              + VBOX_VERSION_MINOR * 100
84e07dc26bSmrg#define VBOX_NAME               "VBoxVideo"
85e07dc26bSmrg#define VBOX_DRIVER_NAME        "vboxvideo"
86e07dc26bSmrg
87e07dc26bSmrg#define VBOX_VIDEO_MAJOR  VBOX_VERSION_MAJOR
88e07dc26bSmrg#define VBOX_VIDEO_MINOR  VBOX_VERSION_MINOR
89e07dc26bSmrg
90e07dc26bSmrg#define VBOX_VIDEO_MIN_SIZE    64
91e07dc26bSmrg#define VBOX_VIDEO_MAX_VIRTUAL (INT16_MAX - 1)
92e07dc26bSmrg
93e07dc26bSmrg#define VBOXPTR(p) ((VBOXPtr)((p)->driverPrivate))
94e07dc26bSmrg
95e07dc26bSmrg/** Helper to work round different ways of getting the root window in different
96e07dc26bSmrg * server versions. */
97e07dc26bSmrg#if defined(XORG_VERSION_CURRENT) && XORG_VERSION_CURRENT < 70000000 \
98e07dc26bSmrg    && XORG_VERSION_CURRENT >= 10900000
99e07dc26bSmrg# define ROOT_WINDOW(pScrn) screenInfo.screens[(pScrn)->scrnIndex]->root
100e07dc26bSmrg#else
101e07dc26bSmrg# define ROOT_WINDOW(pScrn) WindowTable[(pScrn)->scrnIndex]
102e07dc26bSmrg#endif
103e07dc26bSmrg
104e07dc26bSmrg/** ChangeWindowProperty for X.Org Server 1.19 and later */
105e07dc26bSmrg#if defined(XORG_VERSION_CURRENT) && XORG_VERSION_CURRENT < 70000000 \
106e07dc26bSmrg    && XORG_VERSION_CURRENT >= 11900000
107e07dc26bSmrg# define ChangeWindowProperty(pWin, property, type, format, mode, \
108e07dc26bSmrg                              len, value, sendevent) \
109e07dc26bSmrg        dixChangeWindowProperty(serverClient, pWin, property, type, format, \
110e07dc26bSmrg                                mode, len, value, sendevent)
111e07dc26bSmrg#endif
112e07dc26bSmrg
113e07dc26bSmrg/** Structure containing all virtual monitor-specific information. */
114e07dc26bSmrgstruct VBoxScreen
115e07dc26bSmrg{
116e07dc26bSmrg    /** Position information for each virtual screen for the purposes of
117e07dc26bSmrg     * sending dirty rectangle information to the right one. */
118e07dc26bSmrg    RTRECT2 aScreenLocation;
119e07dc26bSmrg    /** Is this CRTC enabled or in DPMS off state? */
120e07dc26bSmrg    Bool fPowerOn;
121e07dc26bSmrg#ifdef VBOXVIDEO_13
122e07dc26bSmrg    /** The virtual crtcs. */
123e07dc26bSmrg    struct _xf86Crtc *paCrtcs;
124e07dc26bSmrg    /** The virtual outputs, logically not distinct from crtcs. */
125e07dc26bSmrg    struct _xf86Output *paOutputs;
126e07dc26bSmrg#endif
127e07dc26bSmrg    /** Offsets of VBVA buffers in video RAM */
128e07dc26bSmrg    uint32_t aoffVBVABuffer;
129e07dc26bSmrg    /** Context information about the VBVA buffers for each screen */
130e07dc26bSmrg    struct VBVABUFFERCONTEXT aVbvaCtx;
131e07dc26bSmrg    /** The current preferred resolution for the screen */
132e07dc26bSmrg    RTRECTSIZE aPreferredSize;
133e07dc26bSmrg    /** The current preferred location for the screen. */
134e07dc26bSmrg    RTPOINT aPreferredLocation;
135e07dc26bSmrg    /** Has this screen been enabled by the host? */
136e07dc26bSmrg    Bool afConnected;
137e07dc26bSmrg    /** Does this screen have a preferred location? */
138e07dc26bSmrg    Bool afHaveLocation;
139e07dc26bSmrg};
140e07dc26bSmrg
141e07dc26bSmrgtypedef struct VBOXRec
142e07dc26bSmrg{
143e07dc26bSmrg    EntityInfoPtr pEnt;
144e07dc26bSmrg#ifdef PCIACCESS
145e07dc26bSmrg    struct pci_device *pciInfo;
146e07dc26bSmrg#else
147e07dc26bSmrg    pciVideoPtr pciInfo;
148e07dc26bSmrg    PCITAG pciTag;
149e07dc26bSmrg#endif
150e07dc26bSmrg    void *base;
151e07dc26bSmrg    /** The amount of VRAM available for use as a framebuffer */
152e07dc26bSmrg    unsigned long cbFBMax;
153e07dc26bSmrg    /** The size of the framebuffer and the VBVA buffers at the end of it. */
154e07dc26bSmrg    unsigned long cbView;
155e07dc26bSmrg    /** Whether the pre-X-server mode was a VBE mode */
156e07dc26bSmrg    Bool fSavedVBEMode;
157e07dc26bSmrg    /** Paramters of the saved pre-X-server VBE mode, invalid if there is none
158e07dc26bSmrg     */
159e07dc26bSmrg    uint16_t cSavedWidth, cSavedHeight, cSavedPitch, cSavedBPP, fSavedFlags;
160e07dc26bSmrg    CloseScreenProcPtr CloseScreen;
161e07dc26bSmrg    /** Default X server procedure for enabling and disabling framebuffer access */
162e07dc26bSmrg    xf86EnableDisableFBAccessProc *EnableDisableFBAccess;
163e07dc26bSmrg    OptionInfoPtr Options;
164e07dc26bSmrg    /** @todo we never actually free this */
165e07dc26bSmrg    xf86CursorInfoPtr pCurs;
166e07dc26bSmrg    /** Do we currently want to use the host cursor? */
167e07dc26bSmrg    Bool fUseHardwareCursor;
168e07dc26bSmrg    /** Number of screens attached */
169e07dc26bSmrg    uint32_t cScreens;
170e07dc26bSmrg    /** Information about each virtual screen. */
171e07dc26bSmrg    struct VBoxScreen *pScreens;
172e07dc26bSmrg    /** Can we get mode hint and cursor integration information from HGSMI? */
173e07dc26bSmrg    Bool fHaveHGSMIModeHints;
174e07dc26bSmrg    /** Does the host support the screen blanking flag? */
175e07dc26bSmrg    Bool fHostHasScreenBlankingFlag;
176e07dc26bSmrg    /** Array of structures for receiving mode hints. */
177e07dc26bSmrg    VBVAMODEHINT *paVBVAModeHints;
178e07dc26bSmrg#ifdef VBOXVIDEO_13
179e07dc26bSmrg# ifdef RT_OS_LINUX
180e07dc26bSmrg    /** Input device file descriptor for getting ACPI hot-plug events. */
181e07dc26bSmrg    int fdACPIDevices;
182e07dc26bSmrg    /** Input handler handle for ACPI hot-plug listener. */
183e07dc26bSmrg    void *hACPIEventHandler;
184e07dc26bSmrg# endif
185e07dc26bSmrg#endif
186e07dc26bSmrg    /** HGSMI guest heap context */
187e07dc26bSmrg    HGSMIGUESTCOMMANDCONTEXT guestCtx;
188e07dc26bSmrg    /** Unrestricted horizontal resolution flag. */
189e07dc26bSmrg    Bool fAnyX;
190e07dc26bSmrg} VBOXRec, *VBOXPtr;
191e07dc26bSmrg
192e07dc26bSmrg#define VBOXGetRec(pScrn) ((VBOXPtr)(pScrn)->driverPrivate)
193e07dc26bSmrg
194e07dc26bSmrg/* setmode.c */
195e07dc26bSmrg
196e07dc26bSmrg/** Structure describing the virtual frame buffer.  It starts at the beginning
197e07dc26bSmrg * of the video RAM. */
198e07dc26bSmrgstruct vbvxFrameBuffer {
199e07dc26bSmrg    /** X offset of first screen in frame buffer. */
200e07dc26bSmrg    int x0;
201e07dc26bSmrg    /** Y offset of first screen in frame buffer. */
202e07dc26bSmrg    int y0;
203e07dc26bSmrg    /** Frame buffer virtual width. */
204e07dc26bSmrg    unsigned cWidth;
205e07dc26bSmrg    /** Frame buffer virtual height. */
206e07dc26bSmrg    unsigned cHeight;
207e07dc26bSmrg    /** Bits per pixel. */
208e07dc26bSmrg    unsigned cBPP;
209e07dc26bSmrg};
210e07dc26bSmrg
211e07dc26bSmrgextern void vbvxClearVRAM(ScrnInfoPtr pScrn, size_t cbOldSize, size_t cbNewSize);
212e07dc26bSmrgextern void vbvxSetMode(ScrnInfoPtr pScrn, unsigned cDisplay, unsigned cWidth, unsigned cHeight, int x, int y, Bool fEnabled,
213e07dc26bSmrg                        Bool fConnected, struct vbvxFrameBuffer *pFrameBuffer);
214e07dc26bSmrgextern void vbvxSetSolarisMouseRange(int width, int height);
215e07dc26bSmrg
216e07dc26bSmrg/* pointer.h */
217e07dc26bSmrgextern Bool vbvxCursorInit(ScreenPtr pScreen);
218e07dc26bSmrgextern void vbvxCursorTerm(VBOXPtr pVBox);
219e07dc26bSmrg
220e07dc26bSmrg/* vbva.c */
221e07dc26bSmrgextern void vbvxHandleDirtyRect(ScrnInfoPtr pScrn, int iRects, BoxPtr aRects);
222e07dc26bSmrgextern void vbvxSetUpHGSMIHeapInGuest(VBOXPtr pVBox, uint32_t cbVRAM);
223e07dc26bSmrgextern Bool vboxEnableVbva(ScrnInfoPtr pScrn);
224e07dc26bSmrgextern void vboxDisableVbva(ScrnInfoPtr pScrn);
225e07dc26bSmrg
226e07dc26bSmrg/* getmode.c */
227e07dc26bSmrgextern void vboxAddModes(ScrnInfoPtr pScrn);
228e07dc26bSmrgextern void VBoxInitialiseSizeHints(ScrnInfoPtr pScrn);
229e07dc26bSmrgextern void vbvxReadSizesAndCursorIntegrationFromProperties(ScrnInfoPtr pScrn, Bool *pfNeedUpdate);
230e07dc26bSmrgextern void vbvxReadSizesAndCursorIntegrationFromHGSMI(ScrnInfoPtr pScrn, Bool *pfNeedUpdate);
231e07dc26bSmrgextern void vbvxSetUpLinuxACPI(ScreenPtr pScreen);
232e07dc26bSmrgextern void vbvxCleanUpLinuxACPI(ScreenPtr pScreen);
233e07dc26bSmrg
234e07dc26bSmrg/* EDID generation */
235e07dc26bSmrg#ifdef VBOXVIDEO_13
236e07dc26bSmrgextern Bool VBOXEDIDSet(struct _xf86Output *output, DisplayModePtr pmode);
237e07dc26bSmrg#endif
238e07dc26bSmrg
239e07dc26bSmrg#endif /* _VBOXVIDEO_H_ */
240e07dc26bSmrg
241