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