Add VBE PanelID support.
Originally found only in the i810 driver.
This commit is contained in:
parent
d73835efda
commit
bf1ad1aa42
|
@ -1074,3 +1074,73 @@ VBEDPMSSet(vbeInfoPtr pVbe, int mode)
|
|||
return (R16(pVbe->pInt10->ax) == 0x4f);
|
||||
}
|
||||
|
||||
void
|
||||
VBEInterpretPanelID(int scrnIndex, struct vbePanelID *data)
|
||||
{
|
||||
ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
|
||||
DisplayModePtr mode;
|
||||
const float PANEL_HZ = 60.0;
|
||||
|
||||
if (!data)
|
||||
return;
|
||||
|
||||
xf86DrvMsg(scrnIndex, X_INFO, "PanelID returned panel resolution %dx%d\n",
|
||||
data->hsize, data->vsize);
|
||||
|
||||
if (pScrn->monitor->nHsync || pScrn->monitor->nVrefresh)
|
||||
return;
|
||||
|
||||
mode = xf86CVTMode(data->hsize, data->vsize, PANEL_HZ, 1, 0);
|
||||
|
||||
pScrn->monitor->nHsync = 1;
|
||||
pScrn->monitor->hsync[0].lo = 31.5;
|
||||
pScrn->monitor->hsync[0].hi = (float)mode->Clock / (float)mode->HTotal;
|
||||
pScrn->monitor->nVrefresh = 1;
|
||||
pScrn->monitor->vrefresh[0].lo = 56.0;
|
||||
pScrn->monitor->vrefresh[0].hi =
|
||||
(float)mode->Clock*1000.0 / (float)mode->HTotal / (float)mode->VTotal;
|
||||
|
||||
xfree(mode);
|
||||
}
|
||||
|
||||
struct vbePanelID *
|
||||
VBEReadPanelID(vbeInfoPtr pVbe)
|
||||
{
|
||||
int RealOff = pVbe->real_mode_base;
|
||||
pointer page = pVbe->memory;
|
||||
unsigned char *tmp = NULL;
|
||||
int screen = pVbe->pInt10->scrnIndex;
|
||||
|
||||
pVbe->pInt10->ax = 0x4F11;
|
||||
pVbe->pInt10->bx = 0x01;
|
||||
pVbe->pInt10->cx = 0;
|
||||
pVbe->pInt10->dx = 0;
|
||||
pVbe->pInt10->es = SEG_ADDR(RealOff);
|
||||
pVbe->pInt10->di = SEG_OFF(RealOff);
|
||||
pVbe->pInt10->num = 0x10;
|
||||
|
||||
xf86ExecX86int10(pVbe->pInt10);
|
||||
|
||||
if ((pVbe->pInt10->ax & 0xff) != 0x4f) {
|
||||
xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE PanelID invalid\n");
|
||||
goto error;
|
||||
}
|
||||
|
||||
switch (pVbe->pInt10->ax & 0xff00) {
|
||||
case 0x0:
|
||||
xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE PanelID read successfully\n");
|
||||
tmp = (unsigned char *)xnfalloc(32);
|
||||
memcpy(tmp,page,32);
|
||||
break;
|
||||
case 0x100:
|
||||
xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE PanelID read failed\n");
|
||||
break;
|
||||
default:
|
||||
xf86DrvMsgVerb(screen,X_INFO,3,"VESA VBE PanelID unknown failure %i\n",
|
||||
pVbe->pInt10->ax & 0xff00);
|
||||
break;
|
||||
}
|
||||
|
||||
error:
|
||||
return tmp;
|
||||
}
|
||||
|
|
|
@ -328,4 +328,20 @@ VBEVesaSaveRestore(vbeInfoPtr pVbe, vbeSaveRestorePtr vbe_sr,
|
|||
int VBEGetPixelClock(vbeInfoPtr pVbe, int mode, int Clock);
|
||||
Bool VBEDPMSSet(vbeInfoPtr pVbe, int mode);
|
||||
|
||||
struct vbePanelID {
|
||||
short hsize;
|
||||
short vsize;
|
||||
short fptype;
|
||||
char redbpp;
|
||||
char greenbpp;
|
||||
char bluebpp;
|
||||
char reservedbpp;
|
||||
int reserved_offscreen_mem_size;
|
||||
int reserved_offscreen_mem_pointer;
|
||||
char reserved[14];
|
||||
};
|
||||
|
||||
void VBEInterpretPanelID(int scrnIndex, struct vbePanelID *data);
|
||||
struct vbePanelID *VBEReadPanelID(vbeInfoPtr pVbe);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue
Block a user