1706f2543Smrg 2706f2543Smrg/* 3706f2543Smrg * XFree86 vbe module 4706f2543Smrg * Copyright 2000 Egbert Eich 5706f2543Smrg * 6706f2543Smrg * The mode query/save/set/restore functions from the vesa driver 7706f2543Smrg * have been moved here. 8706f2543Smrg * Copyright (c) 2000 by Conectiva S.A. (http://www.conectiva.com) 9706f2543Smrg * Authors: Paulo César Pereira de Andrade <pcpa@conectiva.com.br> 10706f2543Smrg */ 11706f2543Smrg 12706f2543Smrg#ifndef _VBE_H 13706f2543Smrg#define _VBE_H 14706f2543Smrg#include "xf86int10.h" 15706f2543Smrg#include "xf86DDC.h" 16706f2543Smrg 17706f2543Smrgtypedef enum { 18706f2543Smrg DDC_UNCHECKED, 19706f2543Smrg DDC_NONE, 20706f2543Smrg DDC_1, 21706f2543Smrg DDC_2, 22706f2543Smrg DDC_1_2 23706f2543Smrg} 24706f2543Smrgddc_lvl; 25706f2543Smrg 26706f2543Smrgtypedef struct { 27706f2543Smrg xf86Int10InfoPtr pInt10; 28706f2543Smrg int version; 29706f2543Smrg pointer memory; 30706f2543Smrg int real_mode_base; 31706f2543Smrg int num_pages; 32706f2543Smrg Bool init_int10; 33706f2543Smrg ddc_lvl ddc; 34706f2543Smrg Bool ddc_blank; 35706f2543Smrg} vbeInfoRec, *vbeInfoPtr; 36706f2543Smrg 37706f2543Smrg#define VBE_VERSION_MAJOR(x) *((CARD8*)(&x) + 1) 38706f2543Smrg#define VBE_VERSION_MINOR(x) (CARD8)(x) 39706f2543Smrg 40706f2543Smrgextern _X_EXPORT vbeInfoPtr VBEInit(xf86Int10InfoPtr pInt, int entityIndex); 41706f2543Smrgextern _X_EXPORT vbeInfoPtr VBEExtendedInit(xf86Int10InfoPtr pInt, int entityIndex, int Flags); 42706f2543Smrgextern _X_EXPORT void vbeFree(vbeInfoPtr pVbe); 43706f2543Smrgextern _X_EXPORT xf86MonPtr vbeDoEDID(vbeInfoPtr pVbe, pointer pDDCModule); 44706f2543Smrg 45706f2543Smrg#pragma pack(1) 46706f2543Smrg 47706f2543Smrgtypedef struct vbeControllerInfoBlock { 48706f2543Smrg CARD8 VbeSignature[4]; 49706f2543Smrg CARD16 VbeVersion; 50706f2543Smrg CARD32 OemStringPtr; 51706f2543Smrg CARD8 Capabilities[4]; 52706f2543Smrg CARD32 VideoModePtr; 53706f2543Smrg CARD16 TotalMem; 54706f2543Smrg CARD16 OemSoftwareRev; 55706f2543Smrg CARD32 OemVendorNamePtr; 56706f2543Smrg CARD32 OemProductNamePtr; 57706f2543Smrg CARD32 OemProductRevPtr; 58706f2543Smrg CARD8 Scratch[222]; 59706f2543Smrg CARD8 OemData[256]; 60706f2543Smrg} vbeControllerInfoRec, *vbeControllerInfoPtr; 61706f2543Smrg 62706f2543Smrg#if defined(__GNUC__) || defined(__USLC__) || defined(__SUNPRO_C) 63706f2543Smrg#pragma pack() /* All GCC versions recognise this syntax */ 64706f2543Smrg#else 65706f2543Smrg#pragma pack(0) 66706f2543Smrg#endif 67706f2543Smrg 68706f2543Smrg#if !( defined(__GNUC__) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590)) ) 69706f2543Smrg#define __attribute__(a) 70706f2543Smrg#endif 71706f2543Smrg 72706f2543Smrgtypedef struct _VbeInfoBlock VbeInfoBlock; 73706f2543Smrgtypedef struct _VbeModeInfoBlock VbeModeInfoBlock; 74706f2543Smrgtypedef struct _VbeCRTCInfoBlock VbeCRTCInfoBlock; 75706f2543Smrg 76706f2543Smrg/* 77706f2543Smrg * INT 0 78706f2543Smrg */ 79706f2543Smrg 80706f2543Smrgstruct _VbeInfoBlock { 81706f2543Smrg /* VESA 1.2 fields */ 82706f2543Smrg CARD8 VESASignature[4]; /* VESA */ 83706f2543Smrg CARD16 VESAVersion; /* Higher byte major, lower byte minor */ 84706f2543Smrg /*CARD32*/char *OEMStringPtr; /* Pointer to OEM string */ 85706f2543Smrg CARD8 Capabilities[4]; /* Capabilities of the video environment */ 86706f2543Smrg 87706f2543Smrg /*CARD32*/CARD16 *VideoModePtr; /* pointer to supported Super VGA modes */ 88706f2543Smrg 89706f2543Smrg CARD16 TotalMemory; /* Number of 64kb memory blocks on board */ 90706f2543Smrg /* if not VESA 2, 236 scratch bytes follow (256 bytes total size) */ 91706f2543Smrg 92706f2543Smrg /* VESA 2 fields */ 93706f2543Smrg CARD16 OemSoftwareRev; /* VBE implementation Software revision */ 94706f2543Smrg /*CARD32*/char *OemVendorNamePtr; /* Pointer to Vendor Name String */ 95706f2543Smrg /*CARD32*/char *OemProductNamePtr; /* Pointer to Product Name String */ 96706f2543Smrg /*CARD32*/char *OemProductRevPtr; /* Pointer to Product Revision String */ 97706f2543Smrg CARD8 Reserved[222]; /* Reserved for VBE implementation */ 98706f2543Smrg CARD8 OemData[256]; /* Data Area for OEM Strings */ 99706f2543Smrg} __attribute__((packed)); 100706f2543Smrg 101706f2543Smrg/* Return Super VGA Information */ 102706f2543Smrgextern _X_EXPORT VbeInfoBlock *VBEGetVBEInfo(vbeInfoPtr pVbe); 103706f2543Smrgextern _X_EXPORT void VBEFreeVBEInfo(VbeInfoBlock *block); 104706f2543Smrg 105706f2543Smrg/* 106706f2543Smrg * INT 1 107706f2543Smrg */ 108706f2543Smrg 109706f2543Smrgstruct _VbeModeInfoBlock { 110706f2543Smrg CARD16 ModeAttributes; /* mode attributes */ 111706f2543Smrg CARD8 WinAAttributes; /* window A attributes */ 112706f2543Smrg CARD8 WinBAttributes; /* window B attributes */ 113706f2543Smrg CARD16 WinGranularity; /* window granularity */ 114706f2543Smrg CARD16 WinSize; /* window size */ 115706f2543Smrg CARD16 WinASegment; /* window A start segment */ 116706f2543Smrg CARD16 WinBSegment; /* window B start segment */ 117706f2543Smrg CARD32 WinFuncPtr; /* real mode pointer to window function */ 118706f2543Smrg CARD16 BytesPerScanline; /* bytes per scanline */ 119706f2543Smrg 120706f2543Smrg /* Mandatory information for VBE 1.2 and above */ 121706f2543Smrg CARD16 XResolution; /* horizontal resolution in pixels or characters */ 122706f2543Smrg CARD16 YResolution; /* vertical resolution in pixels or characters */ 123706f2543Smrg CARD8 XCharSize; /* character cell width in pixels */ 124706f2543Smrg CARD8 YCharSize; /* character cell height in pixels */ 125706f2543Smrg CARD8 NumberOfPlanes; /* number of memory planes */ 126706f2543Smrg CARD8 BitsPerPixel; /* bits per pixel */ 127706f2543Smrg CARD8 NumberOfBanks; /* number of banks */ 128706f2543Smrg CARD8 MemoryModel; /* memory model type */ 129706f2543Smrg CARD8 BankSize; /* bank size in KB */ 130706f2543Smrg CARD8 NumberOfImages; /* number of images */ 131706f2543Smrg CARD8 Reserved; /* 1 */ /* reserved for page function */ 132706f2543Smrg 133706f2543Smrg /* Direct color fields (required for direct/6 and YUV/7 memory models) */ 134706f2543Smrg CARD8 RedMaskSize; /* size of direct color red mask in bits */ 135706f2543Smrg CARD8 RedFieldPosition; /* bit position of lsb of red mask */ 136706f2543Smrg CARD8 GreenMaskSize; /* size of direct color green mask in bits */ 137706f2543Smrg CARD8 GreenFieldPosition; /* bit position of lsb of green mask */ 138706f2543Smrg CARD8 BlueMaskSize; /* size of direct color blue mask in bits */ 139706f2543Smrg CARD8 BlueFieldPosition; /* bit position of lsb of blue mask */ 140706f2543Smrg CARD8 RsvdMaskSize; /* size of direct color reserved mask in bits */ 141706f2543Smrg CARD8 RsvdFieldPosition; /* bit position of lsb of reserved mask */ 142706f2543Smrg CARD8 DirectColorModeInfo; /* direct color mode attributes */ 143706f2543Smrg 144706f2543Smrg /* Mandatory information for VBE 2.0 and above */ 145706f2543Smrg CARD32 PhysBasePtr; /* physical address for flat memory frame buffer */ 146706f2543Smrg CARD32 Reserved32; /* 0 */ /* Reserved - always set to 0 */ 147706f2543Smrg CARD16 Reserved16; /* 0 */ /* Reserved - always set to 0 */ 148706f2543Smrg 149706f2543Smrg /* Mandatory information for VBE 3.0 and above */ 150706f2543Smrg CARD16 LinBytesPerScanLine; /* bytes per scan line for linear modes */ 151706f2543Smrg CARD8 BnkNumberOfImagePages; /* number of images for banked modes */ 152706f2543Smrg CARD8 LinNumberOfImagePages; /* number of images for linear modes */ 153706f2543Smrg CARD8 LinRedMaskSize; /* size of direct color red mask (linear modes) */ 154706f2543Smrg CARD8 LinRedFieldPosition; /* bit position of lsb of red mask (linear modes) */ 155706f2543Smrg CARD8 LinGreenMaskSize; /* size of direct color green mask (linear modes) */ 156706f2543Smrg CARD8 LinGreenFieldPosition; /* bit position of lsb of green mask (linear modes) */ 157706f2543Smrg CARD8 LinBlueMaskSize; /* size of direct color blue mask (linear modes) */ 158706f2543Smrg CARD8 LinBlueFieldPosition; /* bit position of lsb of blue mask (linear modes) */ 159706f2543Smrg CARD8 LinRsvdMaskSize; /* size of direct color reserved mask (linear modes) */ 160706f2543Smrg CARD8 LinRsvdFieldPosition; /* bit position of lsb of reserved mask (linear modes) */ 161706f2543Smrg CARD32 MaxPixelClock; /* maximum pixel clock (in Hz) for graphics mode */ 162706f2543Smrg CARD8 Reserved2[189]; /* remainder of VbeModeInfoBlock */ 163706f2543Smrg} __attribute__((packed)); 164706f2543Smrg 165706f2543Smrg/* Return VBE Mode Information */ 166706f2543Smrgextern _X_EXPORT VbeModeInfoBlock *VBEGetModeInfo(vbeInfoPtr pVbe, int mode); 167706f2543Smrgextern _X_EXPORT void VBEFreeModeInfo(VbeModeInfoBlock *block); 168706f2543Smrg 169706f2543Smrg/* 170706f2543Smrg * INT2 171706f2543Smrg */ 172706f2543Smrg 173706f2543Smrg#define CRTC_DBLSCAN (1<<0) 174706f2543Smrg#define CRTC_INTERLACE (1<<1) 175706f2543Smrg#define CRTC_NHSYNC (1<<2) 176706f2543Smrg#define CRTC_NVSYNC (1<<3) 177706f2543Smrg 178706f2543Smrgstruct _VbeCRTCInfoBlock { 179706f2543Smrg CARD16 HorizontalTotal; /* Horizontal total in pixels */ 180706f2543Smrg CARD16 HorizontalSyncStart; /* Horizontal sync start in pixels */ 181706f2543Smrg CARD16 HorizontalSyncEnd; /* Horizontal sync end in pixels */ 182706f2543Smrg CARD16 VerticalTotal; /* Vertical total in lines */ 183706f2543Smrg CARD16 VerticalSyncStart; /* Vertical sync start in lines */ 184706f2543Smrg CARD16 VerticalSyncEnd; /* Vertical sync end in lines */ 185706f2543Smrg CARD8 Flags; /* Flags (Interlaced, Double Scan etc) */ 186706f2543Smrg CARD32 PixelClock; /* Pixel clock in units of Hz */ 187706f2543Smrg CARD16 RefreshRate; /* Refresh rate in units of 0.01 Hz */ 188706f2543Smrg CARD8 Reserved[40]; /* remainder of ModeInfoBlock */ 189706f2543Smrg} __attribute__((packed)); 190706f2543Smrg/* VbeCRTCInfoBlock is in the VESA 3.0 specs */ 191706f2543Smrg 192706f2543Smrgextern _X_EXPORT Bool VBESetVBEMode(vbeInfoPtr pVbe, int mode, VbeCRTCInfoBlock *crtc); 193706f2543Smrg 194706f2543Smrg/* 195706f2543Smrg * INT 3 196706f2543Smrg */ 197706f2543Smrg 198706f2543Smrgextern _X_EXPORT Bool VBEGetVBEMode(vbeInfoPtr pVbe, int *mode); 199706f2543Smrg 200706f2543Smrg/* 201706f2543Smrg * INT 4 202706f2543Smrg */ 203706f2543Smrg 204706f2543Smrg/* Save/Restore Super VGA video state */ 205706f2543Smrg/* function values are (values stored in VESAPtr): 206706f2543Smrg * 0 := query & allocate amount of memory to save state 207706f2543Smrg * 1 := save state 208706f2543Smrg * 2 := restore state 209706f2543Smrg * 210706f2543Smrg * function 0 called automatically if function 1 called without 211706f2543Smrg * a previous call to function 0. 212706f2543Smrg */ 213706f2543Smrg 214706f2543Smrgtypedef enum { 215706f2543Smrg MODE_QUERY, 216706f2543Smrg MODE_SAVE, 217706f2543Smrg MODE_RESTORE 218706f2543Smrg} vbeSaveRestoreFunction; 219706f2543Smrg 220706f2543Smrgextern _X_EXPORT Bool 221706f2543SmrgVBESaveRestore(vbeInfoPtr pVbe, vbeSaveRestoreFunction fuction, 222706f2543Smrg pointer *memory, int *size, int *real_mode_pages); 223706f2543Smrg 224706f2543Smrg/* 225706f2543Smrg * INT 5 226706f2543Smrg */ 227706f2543Smrg 228706f2543Smrgextern _X_EXPORT Bool 229706f2543SmrgVBEBankSwitch(vbeInfoPtr pVbe, unsigned int iBank, int window); 230706f2543Smrg 231706f2543Smrg/* 232706f2543Smrg * INT 6 233706f2543Smrg */ 234706f2543Smrg 235706f2543Smrgtypedef enum { 236706f2543Smrg SCANWID_SET, 237706f2543Smrg SCANWID_GET, 238706f2543Smrg SCANWID_SET_BYTES, 239706f2543Smrg SCANWID_GET_MAX 240706f2543Smrg} vbeScanwidthCommand; 241706f2543Smrg 242706f2543Smrg#define VBESetLogicalScanline(pVbe, width) \ 243706f2543Smrg VBESetGetLogicalScanlineLength(pVbe, SCANWID_SET, width, \ 244706f2543Smrg NULL, NULL, NULL) 245706f2543Smrg#define VBESetLogicalScanlineBytes(pVbe, width) \ 246706f2543Smrg VBESetGetLogicalScanlineLength(pVbe, SCANWID_SET_BYTES, width, \ 247706f2543Smrg NULL, NULL, NULL) 248706f2543Smrg#define VBEGetLogicalScanline(pVbe, pixels, bytes, max) \ 249706f2543Smrg VBESetGetLogicalScanlineLength(pVbe, SCANWID_GET, 0, \ 250706f2543Smrg pixels, bytes, max) 251706f2543Smrg#define VBEGetMaxLogicalScanline(pVbe, pixels, bytes, max) \ 252706f2543Smrg VBESetGetLogicalScanlineLength(pVbe, SCANWID_GET_MAX, 0, \ 253706f2543Smrg pixels, bytes, max) 254706f2543Smrgextern _X_EXPORT Bool VBESetGetLogicalScanlineLength(vbeInfoPtr pVbe, 255706f2543Smrg vbeScanwidthCommand command, int width, 256706f2543Smrg int *pixels, int *bytes, int *max); 257706f2543Smrg 258706f2543Smrg/* 259706f2543Smrg * INT 7 260706f2543Smrg */ 261706f2543Smrg 262706f2543Smrg/* 16 bit code */ 263706f2543Smrgextern _X_EXPORT Bool VBESetDisplayStart(vbeInfoPtr pVbe, int x, int y, Bool wait_retrace); 264706f2543Smrgextern _X_EXPORT Bool VBEGetDisplayStart(vbeInfoPtr pVbe, int *x, int *y); 265706f2543Smrg 266706f2543Smrg/* 267706f2543Smrg * INT 8 268706f2543Smrg */ 269706f2543Smrg 270706f2543Smrg/* if bits is 0, then it is a GET */ 271706f2543Smrgextern _X_EXPORT int VBESetGetDACPaletteFormat(vbeInfoPtr pVbe, int bits); 272706f2543Smrg 273706f2543Smrg/* 274706f2543Smrg * INT 9 275706f2543Smrg */ 276706f2543Smrg 277706f2543Smrg/* 278706f2543Smrg * If getting a palette, the data argument is not used. It will return 279706f2543Smrg * the data. 280706f2543Smrg * If setting a palette, it will return the pointer received on success, 281706f2543Smrg * NULL on failure. 282706f2543Smrg */ 283706f2543Smrgextern _X_EXPORT CARD32 *VBESetGetPaletteData(vbeInfoPtr pVbe, Bool set, int first, int num, 284706f2543Smrg CARD32 *data, Bool secondary, Bool wait_retrace); 285706f2543Smrg#define VBEFreePaletteData(data) free(data) 286706f2543Smrg 287706f2543Smrg/* 288706f2543Smrg * INT A 289706f2543Smrg */ 290706f2543Smrg 291706f2543Smrgtypedef struct _VBEpmi { 292706f2543Smrg int seg_tbl; 293706f2543Smrg int tbl_off; 294706f2543Smrg int tbl_len; 295706f2543Smrg} VBEpmi; 296706f2543Smrg 297706f2543Smrgextern _X_EXPORT VBEpmi *VBEGetVBEpmi(vbeInfoPtr pVbe); 298706f2543Smrg#define VESAFreeVBEpmi(pmi) free(pmi) 299706f2543Smrg 300706f2543Smrg/* high level helper functions */ 301706f2543Smrg 302706f2543Smrgtypedef struct _vbeModeInfoRec { 303706f2543Smrg int width; 304706f2543Smrg int height; 305706f2543Smrg int bpp; 306706f2543Smrg int n; 307706f2543Smrg struct _vbeModeInfoRec *next; 308706f2543Smrg} vbeModeInfoRec, *vbeModeInfoPtr; 309706f2543Smrg 310706f2543Smrgtypedef struct { 311706f2543Smrg CARD8 *state; 312706f2543Smrg CARD8 *pstate; 313706f2543Smrg int statePage; 314706f2543Smrg int stateSize; 315706f2543Smrg int stateMode; 316706f2543Smrg} vbeSaveRestoreRec, *vbeSaveRestorePtr; 317706f2543Smrg 318706f2543Smrgextern _X_EXPORT void 319706f2543SmrgVBEVesaSaveRestore(vbeInfoPtr pVbe, vbeSaveRestorePtr vbe_sr, 320706f2543Smrg vbeSaveRestoreFunction function); 321706f2543Smrg 322706f2543Smrgextern _X_EXPORT int VBEGetPixelClock(vbeInfoPtr pVbe, int mode, int Clock); 323706f2543Smrgextern _X_EXPORT Bool VBEDPMSSet(vbeInfoPtr pVbe, int mode); 324706f2543Smrg 325706f2543Smrgstruct vbePanelID { 326706f2543Smrg short hsize; 327706f2543Smrg short vsize; 328706f2543Smrg short fptype; 329706f2543Smrg char redbpp; 330706f2543Smrg char greenbpp; 331706f2543Smrg char bluebpp; 332706f2543Smrg char reservedbpp; 333706f2543Smrg int reserved_offscreen_mem_size; 334706f2543Smrg int reserved_offscreen_mem_pointer; 335706f2543Smrg char reserved[14]; 336706f2543Smrg}; 337706f2543Smrg 338706f2543Smrgextern _X_EXPORT void VBEInterpretPanelID(int scrnIndex, struct vbePanelID *data); 339706f2543Smrgextern _X_EXPORT struct vbePanelID *VBEReadPanelID(vbeInfoPtr pVbe); 340706f2543Smrg 341706f2543Smrg#endif 342