1ed6184dfSmrg 2ed6184dfSmrg/* 3ed6184dfSmrg * XFree86 vbe module 4ed6184dfSmrg * Copyright 2000 Egbert Eich 5ed6184dfSmrg * 6ed6184dfSmrg * The mode query/save/set/restore functions from the vesa driver 7ed6184dfSmrg * have been moved here. 8ed6184dfSmrg * Copyright (c) 2000 by Conectiva S.A. (http://www.conectiva.com) 9ed6184dfSmrg * Authors: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> 10ed6184dfSmrg */ 11ed6184dfSmrg 12ed6184dfSmrg#ifndef _VBE_H 13ed6184dfSmrg#define _VBE_H 14ed6184dfSmrg#include "xf86int10.h" 15ed6184dfSmrg#include "xf86DDC.h" 16ed6184dfSmrg 17ed6184dfSmrgtypedef enum { 18ed6184dfSmrg DDC_UNCHECKED, 19ed6184dfSmrg DDC_NONE, 20ed6184dfSmrg DDC_1, 21ed6184dfSmrg DDC_2, 22ed6184dfSmrg DDC_1_2 23ed6184dfSmrg} ddc_lvl; 24ed6184dfSmrg 25ed6184dfSmrgtypedef struct { 26ed6184dfSmrg xf86Int10InfoPtr pInt10; 27ed6184dfSmrg int version; 28ed6184dfSmrg void *memory; 29ed6184dfSmrg int real_mode_base; 30ed6184dfSmrg int num_pages; 31ed6184dfSmrg Bool init_int10; 32ed6184dfSmrg ddc_lvl ddc; 33ed6184dfSmrg Bool ddc_blank; 34ed6184dfSmrg} vbeInfoRec, *vbeInfoPtr; 35ed6184dfSmrg 36ed6184dfSmrg#define VBE_VERSION_MAJOR(x) *((CARD8*)(&x) + 1) 37ed6184dfSmrg#define VBE_VERSION_MINOR(x) (CARD8)(x) 38ed6184dfSmrg 39ed6184dfSmrgextern _X_EXPORT vbeInfoPtr VBEInit(xf86Int10InfoPtr pInt, int entityIndex); 40ed6184dfSmrgextern _X_EXPORT vbeInfoPtr VBEExtendedInit(xf86Int10InfoPtr pInt, 41ed6184dfSmrg int entityIndex, int Flags); 42ed6184dfSmrgextern _X_EXPORT void vbeFree(vbeInfoPtr pVbe); 43ed6184dfSmrgextern _X_EXPORT xf86MonPtr vbeDoEDID(vbeInfoPtr pVbe, void *pDDCModule); 44ed6184dfSmrg 45ed6184dfSmrg#pragma pack(1) 46ed6184dfSmrg 47ed6184dfSmrgtypedef struct vbeControllerInfoBlock { 48ed6184dfSmrg CARD8 VbeSignature[4]; 49ed6184dfSmrg CARD16 VbeVersion; 50ed6184dfSmrg CARD32 OemStringPtr; 51ed6184dfSmrg CARD8 Capabilities[4]; 52ed6184dfSmrg CARD32 VideoModePtr; 53ed6184dfSmrg CARD16 TotalMem; 54ed6184dfSmrg CARD16 OemSoftwareRev; 55ed6184dfSmrg CARD32 OemVendorNamePtr; 56ed6184dfSmrg CARD32 OemProductNamePtr; 57ed6184dfSmrg CARD32 OemProductRevPtr; 58ed6184dfSmrg CARD8 Scratch[222]; 59ed6184dfSmrg CARD8 OemData[256]; 60ed6184dfSmrg} vbeControllerInfoRec, *vbeControllerInfoPtr; 61ed6184dfSmrg 62ed6184dfSmrg#if defined(__GNUC__) || defined(__USLC__) || defined(__SUNPRO_C) 63ed6184dfSmrg#pragma pack() /* All GCC versions recognise this syntax */ 64ed6184dfSmrg#else 65ed6184dfSmrg#pragma pack(0) 66ed6184dfSmrg#endif 67ed6184dfSmrg 68ed6184dfSmrg#if !( defined(__GNUC__) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)) ) 69ed6184dfSmrg#define __attribute__(a) 70ed6184dfSmrg#endif 71ed6184dfSmrg 72ed6184dfSmrgtypedef struct _VbeInfoBlock VbeInfoBlock; 73ed6184dfSmrgtypedef struct _VbeModeInfoBlock VbeModeInfoBlock; 74ed6184dfSmrgtypedef struct _VbeCRTCInfoBlock VbeCRTCInfoBlock; 75ed6184dfSmrg 76ed6184dfSmrg/* 77ed6184dfSmrg * INT 0 78ed6184dfSmrg */ 79ed6184dfSmrg 80ed6184dfSmrgstruct _VbeInfoBlock { 81ed6184dfSmrg /* VESA 1.2 fields */ 82ed6184dfSmrg CARD8 VESASignature[4]; /* VESA */ 83ed6184dfSmrg CARD16 VESAVersion; /* Higher byte major, lower byte minor */ 84ed6184dfSmrg /*CARD32 */ char *OEMStringPtr; 85ed6184dfSmrg /* Pointer to OEM string */ 86ed6184dfSmrg CARD8 Capabilities[4]; /* Capabilities of the video environment */ 87ed6184dfSmrg 88ed6184dfSmrg /*CARD32 */ CARD16 *VideoModePtr; 89ed6184dfSmrg /* pointer to supported Super VGA modes */ 90ed6184dfSmrg 91ed6184dfSmrg CARD16 TotalMemory; /* Number of 64kb memory blocks on board */ 92ed6184dfSmrg /* if not VESA 2, 236 scratch bytes follow (256 bytes total size) */ 93ed6184dfSmrg 94ed6184dfSmrg /* VESA 2 fields */ 95ed6184dfSmrg CARD16 OemSoftwareRev; /* VBE implementation Software revision */ 96ed6184dfSmrg /*CARD32 */ char *OemVendorNamePtr; 97ed6184dfSmrg /* Pointer to Vendor Name String */ 98ed6184dfSmrg /*CARD32 */ char *OemProductNamePtr; 99ed6184dfSmrg /* Pointer to Product Name String */ 100ed6184dfSmrg /*CARD32 */ char *OemProductRevPtr; 101ed6184dfSmrg /* Pointer to Product Revision String */ 102ed6184dfSmrg CARD8 Reserved[222]; /* Reserved for VBE implementation */ 103ed6184dfSmrg CARD8 OemData[256]; /* Data Area for OEM Strings */ 104ed6184dfSmrg} __attribute__ ((packed)); 105ed6184dfSmrg 106ed6184dfSmrg/* Return Super VGA Information */ 107ed6184dfSmrgextern _X_EXPORT VbeInfoBlock *VBEGetVBEInfo(vbeInfoPtr pVbe); 108ed6184dfSmrgextern _X_EXPORT void VBEFreeVBEInfo(VbeInfoBlock * block); 109ed6184dfSmrg 110ed6184dfSmrg/* 111ed6184dfSmrg * INT 1 112ed6184dfSmrg */ 113ed6184dfSmrg 114ed6184dfSmrgstruct _VbeModeInfoBlock { 115ed6184dfSmrg CARD16 ModeAttributes; /* mode attributes */ 116ed6184dfSmrg CARD8 WinAAttributes; /* window A attributes */ 117ed6184dfSmrg CARD8 WinBAttributes; /* window B attributes */ 118ed6184dfSmrg CARD16 WinGranularity; /* window granularity */ 119ed6184dfSmrg CARD16 WinSize; /* window size */ 120ed6184dfSmrg CARD16 WinASegment; /* window A start segment */ 121ed6184dfSmrg CARD16 WinBSegment; /* window B start segment */ 122ed6184dfSmrg CARD32 WinFuncPtr; /* real mode pointer to window function */ 123ed6184dfSmrg CARD16 BytesPerScanline; /* bytes per scanline */ 124ed6184dfSmrg 125ed6184dfSmrg /* Mandatory information for VBE 1.2 and above */ 126ed6184dfSmrg CARD16 XResolution; /* horizontal resolution in pixels or characters */ 127ed6184dfSmrg CARD16 YResolution; /* vertical resolution in pixels or characters */ 128ed6184dfSmrg CARD8 XCharSize; /* character cell width in pixels */ 129ed6184dfSmrg CARD8 YCharSize; /* character cell height in pixels */ 130ed6184dfSmrg CARD8 NumberOfPlanes; /* number of memory planes */ 131ed6184dfSmrg CARD8 BitsPerPixel; /* bits per pixel */ 132ed6184dfSmrg CARD8 NumberOfBanks; /* number of banks */ 133ed6184dfSmrg CARD8 MemoryModel; /* memory model type */ 134ed6184dfSmrg CARD8 BankSize; /* bank size in KB */ 135ed6184dfSmrg CARD8 NumberOfImages; /* number of images */ 136ed6184dfSmrg CARD8 Reserved; /* 1 *//* reserved for page function */ 137ed6184dfSmrg 138ed6184dfSmrg /* Direct color fields (required for direct/6 and YUV/7 memory models) */ 139ed6184dfSmrg CARD8 RedMaskSize; /* size of direct color red mask in bits */ 140ed6184dfSmrg CARD8 RedFieldPosition; /* bit position of lsb of red mask */ 141ed6184dfSmrg CARD8 GreenMaskSize; /* size of direct color green mask in bits */ 142ed6184dfSmrg CARD8 GreenFieldPosition; /* bit position of lsb of green mask */ 143ed6184dfSmrg CARD8 BlueMaskSize; /* size of direct color blue mask in bits */ 144ed6184dfSmrg CARD8 BlueFieldPosition; /* bit position of lsb of blue mask */ 145ed6184dfSmrg CARD8 RsvdMaskSize; /* size of direct color reserved mask in bits */ 146ed6184dfSmrg CARD8 RsvdFieldPosition; /* bit position of lsb of reserved mask */ 147ed6184dfSmrg CARD8 DirectColorModeInfo; /* direct color mode attributes */ 148ed6184dfSmrg 149ed6184dfSmrg /* Mandatory information for VBE 2.0 and above */ 150ed6184dfSmrg CARD32 PhysBasePtr; /* physical address for flat memory frame buffer */ 151ed6184dfSmrg CARD32 Reserved32; /* 0 *//* Reserved - always set to 0 */ 152ed6184dfSmrg CARD16 Reserved16; /* 0 *//* Reserved - always set to 0 */ 153ed6184dfSmrg 154ed6184dfSmrg /* Mandatory information for VBE 3.0 and above */ 155ed6184dfSmrg CARD16 LinBytesPerScanLine; /* bytes per scan line for linear modes */ 156ed6184dfSmrg CARD8 BnkNumberOfImagePages; /* number of images for banked modes */ 157ed6184dfSmrg CARD8 LinNumberOfImagePages; /* number of images for linear modes */ 158ed6184dfSmrg CARD8 LinRedMaskSize; /* size of direct color red mask (linear modes) */ 159ed6184dfSmrg CARD8 LinRedFieldPosition; /* bit position of lsb of red mask (linear modes) */ 160ed6184dfSmrg CARD8 LinGreenMaskSize; /* size of direct color green mask (linear modes) */ 161ed6184dfSmrg CARD8 LinGreenFieldPosition; /* bit position of lsb of green mask (linear modes) */ 162ed6184dfSmrg CARD8 LinBlueMaskSize; /* size of direct color blue mask (linear modes) */ 163ed6184dfSmrg CARD8 LinBlueFieldPosition; /* bit position of lsb of blue mask (linear modes) */ 164ed6184dfSmrg CARD8 LinRsvdMaskSize; /* size of direct color reserved mask (linear modes) */ 165ed6184dfSmrg CARD8 LinRsvdFieldPosition; /* bit position of lsb of reserved mask (linear modes) */ 166ed6184dfSmrg CARD32 MaxPixelClock; /* maximum pixel clock (in Hz) for graphics mode */ 167ed6184dfSmrg CARD8 Reserved2[189]; /* remainder of VbeModeInfoBlock */ 168ed6184dfSmrg} __attribute__ ((packed)); 169ed6184dfSmrg 170ed6184dfSmrg/* Return VBE Mode Information */ 171ed6184dfSmrgextern _X_EXPORT VbeModeInfoBlock *VBEGetModeInfo(vbeInfoPtr pVbe, int mode); 172ed6184dfSmrgextern _X_EXPORT void VBEFreeModeInfo(VbeModeInfoBlock * block); 173ed6184dfSmrg 174ed6184dfSmrg/* 175ed6184dfSmrg * INT2 176ed6184dfSmrg */ 177ed6184dfSmrg 178ed6184dfSmrg#define CRTC_DBLSCAN (1<<0) 179ed6184dfSmrg#define CRTC_INTERLACE (1<<1) 180ed6184dfSmrg#define CRTC_NHSYNC (1<<2) 181ed6184dfSmrg#define CRTC_NVSYNC (1<<3) 182ed6184dfSmrg 183ed6184dfSmrgstruct _VbeCRTCInfoBlock { 184ed6184dfSmrg CARD16 HorizontalTotal; /* Horizontal total in pixels */ 185ed6184dfSmrg CARD16 HorizontalSyncStart; /* Horizontal sync start in pixels */ 186ed6184dfSmrg CARD16 HorizontalSyncEnd; /* Horizontal sync end in pixels */ 187ed6184dfSmrg CARD16 VerticalTotal; /* Vertical total in lines */ 188ed6184dfSmrg CARD16 VerticalSyncStart; /* Vertical sync start in lines */ 189ed6184dfSmrg CARD16 VerticalSyncEnd; /* Vertical sync end in lines */ 190ed6184dfSmrg CARD8 Flags; /* Flags (Interlaced, Double Scan etc) */ 191ed6184dfSmrg CARD32 PixelClock; /* Pixel clock in units of Hz */ 192ed6184dfSmrg CARD16 RefreshRate; /* Refresh rate in units of 0.01 Hz */ 193ed6184dfSmrg CARD8 Reserved[40]; /* remainder of ModeInfoBlock */ 194ed6184dfSmrg} __attribute__ ((packed)); 195ed6184dfSmrg 196ed6184dfSmrg/* VbeCRTCInfoBlock is in the VESA 3.0 specs */ 197ed6184dfSmrg 198ed6184dfSmrgextern _X_EXPORT Bool VBESetVBEMode(vbeInfoPtr pVbe, int mode, 199ed6184dfSmrg VbeCRTCInfoBlock * crtc); 200ed6184dfSmrg 201ed6184dfSmrg/* 202ed6184dfSmrg * INT 3 203ed6184dfSmrg */ 204ed6184dfSmrg 205ed6184dfSmrgextern _X_EXPORT Bool VBEGetVBEMode(vbeInfoPtr pVbe, int *mode); 206ed6184dfSmrg 207ed6184dfSmrg/* 208ed6184dfSmrg * INT 4 209ed6184dfSmrg */ 210ed6184dfSmrg 211ed6184dfSmrg/* Save/Restore Super VGA video state */ 212ed6184dfSmrg/* function values are (values stored in VESAPtr): 213ed6184dfSmrg * 0 := query & allocate amount of memory to save state 214ed6184dfSmrg * 1 := save state 215ed6184dfSmrg * 2 := restore state 216ed6184dfSmrg * 217ed6184dfSmrg * function 0 called automatically if function 1 called without 218ed6184dfSmrg * a previous call to function 0. 219ed6184dfSmrg */ 220ed6184dfSmrg 221ed6184dfSmrgtypedef enum { 222ed6184dfSmrg MODE_QUERY, 223ed6184dfSmrg MODE_SAVE, 224ed6184dfSmrg MODE_RESTORE 225ed6184dfSmrg} vbeSaveRestoreFunction; 226ed6184dfSmrg 227ed6184dfSmrgextern _X_EXPORT Bool 228ed6184dfSmrgVBESaveRestore(vbeInfoPtr pVbe, vbeSaveRestoreFunction function, 229ed6184dfSmrg void **memory, int *size, int *real_mode_pages); 230ed6184dfSmrg 231ed6184dfSmrg/* 232ed6184dfSmrg * INT 5 233ed6184dfSmrg */ 234ed6184dfSmrg 235ed6184dfSmrgextern _X_EXPORT Bool 236ed6184dfSmrg VBEBankSwitch(vbeInfoPtr pVbe, unsigned int iBank, int window); 237ed6184dfSmrg 238ed6184dfSmrg/* 239ed6184dfSmrg * INT 6 240ed6184dfSmrg */ 241ed6184dfSmrg 242ed6184dfSmrgtypedef enum { 243ed6184dfSmrg SCANWID_SET, 244ed6184dfSmrg SCANWID_GET, 245ed6184dfSmrg SCANWID_SET_BYTES, 246ed6184dfSmrg SCANWID_GET_MAX 247ed6184dfSmrg} vbeScanwidthCommand; 248ed6184dfSmrg 249ed6184dfSmrg#define VBESetLogicalScanline(pVbe, width) \ 250ed6184dfSmrg VBESetGetLogicalScanlineLength(pVbe, SCANWID_SET, width, \ 251ed6184dfSmrg NULL, NULL, NULL) 252ed6184dfSmrg#define VBESetLogicalScanlineBytes(pVbe, width) \ 253ed6184dfSmrg VBESetGetLogicalScanlineLength(pVbe, SCANWID_SET_BYTES, width, \ 254ed6184dfSmrg NULL, NULL, NULL) 255ed6184dfSmrg#define VBEGetLogicalScanline(pVbe, pixels, bytes, max) \ 256ed6184dfSmrg VBESetGetLogicalScanlineLength(pVbe, SCANWID_GET, 0, \ 257ed6184dfSmrg pixels, bytes, max) 258ed6184dfSmrg#define VBEGetMaxLogicalScanline(pVbe, pixels, bytes, max) \ 259ed6184dfSmrg VBESetGetLogicalScanlineLength(pVbe, SCANWID_GET_MAX, 0, \ 260ed6184dfSmrg pixels, bytes, max) 261ed6184dfSmrgextern _X_EXPORT Bool VBESetGetLogicalScanlineLength(vbeInfoPtr pVbe, 262ed6184dfSmrg vbeScanwidthCommand 263ed6184dfSmrg command, int width, 264ed6184dfSmrg int *pixels, int *bytes, 265ed6184dfSmrg int *max); 266ed6184dfSmrg 267ed6184dfSmrg/* 268ed6184dfSmrg * INT 7 269ed6184dfSmrg */ 270ed6184dfSmrg 271ed6184dfSmrg/* 16 bit code */ 272ed6184dfSmrgextern _X_EXPORT Bool VBESetDisplayStart(vbeInfoPtr pVbe, int x, int y, 273ed6184dfSmrg Bool wait_retrace); 274ed6184dfSmrgextern _X_EXPORT Bool VBEGetDisplayStart(vbeInfoPtr pVbe, int *x, int *y); 275ed6184dfSmrg 276ed6184dfSmrg/* 277ed6184dfSmrg * INT 8 278ed6184dfSmrg */ 279ed6184dfSmrg 280ed6184dfSmrg/* if bits is 0, then it is a GET */ 281ed6184dfSmrgextern _X_EXPORT int VBESetGetDACPaletteFormat(vbeInfoPtr pVbe, int bits); 282ed6184dfSmrg 283ed6184dfSmrg/* 284ed6184dfSmrg * INT 9 285ed6184dfSmrg */ 286ed6184dfSmrg 287ed6184dfSmrg/* 288ed6184dfSmrg * If getting a palette, the data argument is not used. It will return 289ed6184dfSmrg * the data. 290ed6184dfSmrg * If setting a palette, it will return the pointer received on success, 291ed6184dfSmrg * NULL on failure. 292ed6184dfSmrg */ 293ed6184dfSmrgextern _X_EXPORT CARD32 *VBESetGetPaletteData(vbeInfoPtr pVbe, Bool set, 294ed6184dfSmrg int first, int num, CARD32 *data, 295ed6184dfSmrg Bool secondary, 296ed6184dfSmrg Bool wait_retrace); 297ed6184dfSmrg#define VBEFreePaletteData(data) free(data) 298ed6184dfSmrg 299ed6184dfSmrg/* 300ed6184dfSmrg * INT A 301ed6184dfSmrg */ 302ed6184dfSmrg 303ed6184dfSmrgtypedef struct _VBEpmi { 304ed6184dfSmrg int seg_tbl; 305ed6184dfSmrg int tbl_off; 306ed6184dfSmrg int tbl_len; 307ed6184dfSmrg} VBEpmi; 308ed6184dfSmrg 309ed6184dfSmrgextern _X_EXPORT VBEpmi *VBEGetVBEpmi(vbeInfoPtr pVbe); 310ed6184dfSmrg 311ed6184dfSmrg#define VESAFreeVBEpmi(pmi) free(pmi) 312ed6184dfSmrg 313ed6184dfSmrg/* high level helper functions */ 314ed6184dfSmrg 315ed6184dfSmrgtypedef struct _vbeModeInfoRec { 316ed6184dfSmrg int width; 317ed6184dfSmrg int height; 318ed6184dfSmrg int bpp; 319ed6184dfSmrg int n; 320ed6184dfSmrg struct _vbeModeInfoRec *next; 321ed6184dfSmrg} vbeModeInfoRec, *vbeModeInfoPtr; 322ed6184dfSmrg 323ed6184dfSmrgtypedef struct { 324ed6184dfSmrg CARD8 *state; 325ed6184dfSmrg CARD8 *pstate; 326ed6184dfSmrg int statePage; 327ed6184dfSmrg int stateSize; 328ed6184dfSmrg int stateMode; 329ed6184dfSmrg} vbeSaveRestoreRec, *vbeSaveRestorePtr; 330ed6184dfSmrg 331ed6184dfSmrgextern _X_EXPORT void 332ed6184dfSmrg 333ed6184dfSmrgVBEVesaSaveRestore(vbeInfoPtr pVbe, vbeSaveRestorePtr vbe_sr, 334ed6184dfSmrg vbeSaveRestoreFunction function); 335ed6184dfSmrg 336ed6184dfSmrgextern _X_EXPORT int VBEGetPixelClock(vbeInfoPtr pVbe, int mode, int Clock); 337ed6184dfSmrgextern _X_EXPORT Bool VBEDPMSSet(vbeInfoPtr pVbe, int mode); 338ed6184dfSmrg 339ed6184dfSmrgstruct vbePanelID { 340ed6184dfSmrg short hsize; 341ed6184dfSmrg short vsize; 342ed6184dfSmrg short fptype; 343ed6184dfSmrg char redbpp; 344ed6184dfSmrg char greenbpp; 345ed6184dfSmrg char bluebpp; 346ed6184dfSmrg char reservedbpp; 347ed6184dfSmrg int reserved_offscreen_mem_size; 348ed6184dfSmrg int reserved_offscreen_mem_pointer; 349ed6184dfSmrg char reserved[14]; 350ed6184dfSmrg}; 351ed6184dfSmrg 352ed6184dfSmrgextern _X_EXPORT void VBEInterpretPanelID(ScrnInfoPtr pScrn, 353ed6184dfSmrg struct vbePanelID *data); 354ed6184dfSmrgextern _X_EXPORT struct vbePanelID *VBEReadPanelID(vbeInfoPtr pVbe); 355ed6184dfSmrg 356ed6184dfSmrg#endif 357