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