essagerewrote DPMS code: simpler, cleaner and prevents visible 'trash' during driver-init.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15106 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Rudolf Cornelissen
2005-11-24 12:14:57 +00:00
parent 88489db7f9
commit db6ede836c
6 changed files with 51 additions and 120 deletions
@@ -4,7 +4,7 @@
Other authors: Other authors:
Mark Watson, Mark Watson,
Rudolf Cornelissen 10/2002-11/2004. Rudolf Cornelissen 10/2002-11/2005.
*/ */
#define MODULE_BIT 0x00800000 #define MODULE_BIT 0x00800000
@@ -187,6 +187,9 @@ status_t INIT_ACCELERANT(int the_fd) {
/* ensure cursor state */ /* ensure cursor state */
SHOW_CURSOR(false); SHOW_CURSOR(false);
/* ensure DPMS state */
si->dpms_flags = B_DPMS_ON;
/* a winner! */ /* a winner! */
result = B_OK; result = B_OK;
goto error0; goto error0;
+13 -27
View File
@@ -53,7 +53,6 @@ status_t SET_DISPLAY_MODE(display_mode *mode_to_set)
uint8 colour_depth1 = 32; uint8 colour_depth1 = 32;
status_t result; status_t result;
uint32 startadd,startadd_right; uint32 startadd,startadd_right;
bool display, h, v;
/* Adjust mode to valid one and fail if invalid */ /* Adjust mode to valid one and fail if invalid */
target /*= bounds*/ = *mode_to_set; target /*= bounds*/ = *mode_to_set;
@@ -73,8 +72,7 @@ status_t SET_DISPLAY_MODE(display_mode *mode_to_set)
/* disable interrupts using the kernel driver */ /* disable interrupts using the kernel driver */
interrupt_enable(false); interrupt_enable(false);
/* find current DPMS state, then turn off screen(s) */ /* then turn off screen(s) */
gx00_crtc_dpms_fetch(&display, &h, &v);
gx00_crtc_dpms(false, false, false); gx00_crtc_dpms(false, false, false);
if (si->ps.secondary_head) g400_crtc2_dpms(false, false, false); if (si->ps.secondary_head) g400_crtc2_dpms(false, false, false);
@@ -374,14 +372,12 @@ status_t SET_DISPLAY_MODE(display_mode *mode_to_set)
/* update driver's mode store */ /* update driver's mode store */
si->dm = target; si->dm = target;
/* turn screen one on */
gx00_crtc_dpms(display, h, v);
/* turn screen two on if a dualhead mode is active */
if (target.flags & DUALHEAD_BITS) g400_crtc2_dpms(display, h, v);
/* set up acceleration for this mode */ /* set up acceleration for this mode */
gx00_acc_init(); gx00_acc_init();
/* restore screen(s) output state(s) */
SET_DPMS_MODE(si->dpms_flags);
/* clear line at bottom of screen if dualhead mode: /* clear line at bottom of screen if dualhead mode:
* MAVEN hardware design fault 'fix'. */ * MAVEN hardware design fault 'fix'. */
if ((target.flags & DUALHEAD_BITS) && (si->ps.card_type <= G400MAX)) if ((target.flags & DUALHEAD_BITS) && (si->ps.card_type <= G400MAX))
@@ -538,11 +534,15 @@ void SET_INDEXED_COLORS(uint count, uint8 first, uint8 *color_data, uint32 flags
} }
/* Put the display into one of the Display Power Management modes. */ /* Put the display into one of the Display Power Management modes. */
status_t SET_DPMS_MODE(uint32 dpms_flags) { status_t SET_DPMS_MODE(uint32 dpms_flags)
{
interrupt_enable(false); interrupt_enable(false);
LOG(4,("SET_DPMS_MODE: 0x%08x\n", dpms_flags)); LOG(4,("SET_DPMS_MODE: 0x%08x\n", dpms_flags));
/* note current DPMS state for our reference */
si->dpms_flags = dpms_flags;
if (si->dm.flags & DUALHEAD_BITS) /* dualhead */ if (si->dm.flags & DUALHEAD_BITS) /* dualhead */
{ {
switch(dpms_flags) switch(dpms_flags)
@@ -690,21 +690,7 @@ uint32 DPMS_CAPABILITIES(void)
} }
/* Return the current DPMS mode. */ /* Return the current DPMS mode. */
uint32 DPMS_MODE(void) { uint32 DPMS_MODE(void)
bool display, h, v; {
return si->dpms_flags;
interrupt_enable(false);
gx00_crtc_dpms_fetch(&display, &h, &v);
interrupt_enable(true);
if (display && h && v)
return B_DPMS_ON;
else if (si->settings.greensync)
return B_DPMS_OFF;
else if (v)
return B_DPMS_STAND_BY;
else if (h)
return B_DPMS_SUSPEND;
else
return B_DPMS_OFF;
} }
@@ -2,7 +2,7 @@
/* Authors: /* Authors:
Mark Watson 2/2000, Mark Watson 2/2000,
Apsed, Apsed,
Rudolf Cornelissen 11/2002-11/2004 Rudolf Cornelissen 11/2002-11/2005
*/ */
#define MODULE_BIT 0x00040000 #define MODULE_BIT 0x00040000
@@ -284,39 +284,43 @@ status_t gx00_crtc_depth(int mode)
status_t gx00_crtc_dpms(bool display, bool h, bool v) // MIL2 status_t gx00_crtc_dpms(bool display, bool h, bool v) // MIL2
{ {
LOG(4,("CRTC: setting DPMS: ")); char msg[100];
sprintf(msg, "CRTC: setting DPMS: ");
if (display) if (display)
{ {
VGAW_I(SEQ,1, 0x00); VGAW_I(SEQ,1, 0x00);
LOG(4,("display on, ")); sprintf(msg, "%sdisplay on, ", msg);
} }
else else
{ {
VGAW_I(SEQ,1, 0x20); VGAW_I(SEQ,1, 0x20);
LOG(4,("display off, ")); sprintf(msg, "%sdisplay off, ", msg);
} }
if (h) if (h)
{ {
VGAW_I(CRTCEXT, 1, (VGAR_I(CRTCEXT, 1) & 0xef)); VGAW_I(CRTCEXT, 1, (VGAR_I(CRTCEXT, 1) & 0xef));
LOG(4,("hsync enabled, ")); sprintf(msg, "%shsync enabled, ", msg);
} }
else else
{ {
VGAW_I(CRTCEXT, 1, (VGAR_I(CRTCEXT, 1) | 0x10)); VGAW_I(CRTCEXT, 1, (VGAR_I(CRTCEXT, 1) | 0x10));
LOG(4,("hsync disabled, ")); sprintf(msg, "%shsync disabled, ", msg);
} }
if (v) if (v)
{ {
VGAW_I(CRTCEXT, 1, (VGAR_I(CRTCEXT, 1) & 0xdf)); VGAW_I(CRTCEXT, 1, (VGAR_I(CRTCEXT, 1) & 0xdf));
LOG(4,("vsync enabled\n")); sprintf(msg, "%svsync enabled\n", msg);
} }
else else
{ {
VGAW_I(CRTCEXT, 1, (VGAR_I(CRTCEXT, 1) | 0x20)); VGAW_I(CRTCEXT, 1, (VGAR_I(CRTCEXT, 1) | 0x20));
LOG(4,("vsync disabled\n")); sprintf(msg, "%svsync disabled\n", msg);
} }
LOG(4, (msg));
/* set some required fixed values for proper MGA mode initialisation */ /* set some required fixed values for proper MGA mode initialisation */
VGAW_I(CRTC,0x17,0xC3); VGAW_I(CRTC,0x17,0xC3);
VGAW_I(CRTC,0x14,0x00); VGAW_I(CRTC,0x14,0x00);
@@ -339,23 +343,6 @@ status_t gx00_crtc_dpms(bool display, bool h, bool v) // MIL2
return B_OK; return B_OK;
} }
status_t gx00_crtc_dpms_fetch(bool *display, bool *h, bool *v) // MIL2
{
*display=!(VGAR_I(SEQ, 1) & 0x20);
*h=!(VGAR_I(CRTCEXT, 1) & 0x10);
*v=!(VGAR_I(CRTCEXT, 1) & 0x20);
LOG(4,("CTRC: fetched DPMS state: "));
if (*display) LOG(4,("display on, "));
else LOG(4,("display off, "));
if (*h) LOG(4,("hsync enabled, "));
else LOG(4,("hsync disabled, "));
if (*v) LOG(4,("vsync enabled\n"));
else LOG(4,("vsync disabled\n"));
return B_OK;
}
status_t gx00_crtc_set_display_pitch() status_t gx00_crtc_set_display_pitch()
{ {
uint32 offset; uint32 offset;
@@ -590,7 +577,7 @@ status_t gx00_crtc_cursor_init()
} }
/* activate hardware cursor */ /* activate hardware cursor */
DXIW(CURCTRL,1); gx00_crtc_cursor_show();
return B_OK; return B_OK;
} }
@@ -2,7 +2,7 @@
Authors: Authors:
Mark Watson 6/2000, Mark Watson 6/2000,
Rudolf Cornelissen 12/2002 - 12/2003 Rudolf Cornelissen 12/2002 - 11/2005
*/ */
#define MODULE_BIT 0x00020000 #define MODULE_BIT 0x00020000
@@ -159,7 +159,9 @@ status_t g400_crtc2_depth(int mode)
status_t g400_crtc2_dpms(bool display, bool h, bool v) status_t g400_crtc2_dpms(bool display, bool h, bool v)
{ {
LOG(4,("CRTC2: setting DPMS: ")); char msg[100];
sprintf(msg, "CRTC2: setting DPMS: ");
if (si->ps.card_type <= G400MAX) if (si->ps.card_type <= G400MAX)
{ {
@@ -167,15 +169,17 @@ status_t g400_crtc2_dpms(bool display, bool h, bool v)
{ {
/* enable CRTC2 and don't touch the rest */ /* enable CRTC2 and don't touch the rest */
CR2W(CTL, ((CR2R(CTL) & 0xFFF0177E) | 0x01)); CR2W(CTL, ((CR2R(CTL) & 0xFFF0177E) | 0x01));
LOG(4,("display on, hsync enabled, vsync enabled\n")); sprintf(msg, "%sdisplay on, hsync enabled, vsync enabled\n", msg);
} }
else else
{ {
/* disable CRTC2 and don't touch the rest */ /* disable CRTC2 and don't touch the rest */
CR2W(CTL, (CR2R(CTL) & 0xFFF0177E)); CR2W(CTL, (CR2R(CTL) & 0xFFF0177E));
LOG(4,("display off, hsync disabled, vsync disabled\n")); sprintf(msg, "%sdisplay off, hsync disabled, vsync disabled\n", msg);
} }
LOG(4, (msg));
/* On <= G400MAX dualhead cards we always need to send a 'copy' to the MAVEN */ /* On <= G400MAX dualhead cards we always need to send a 'copy' to the MAVEN */
if (si->ps.secondary_head) gx00_maven_dpms(display, h, v); if (si->ps.secondary_head) gx00_maven_dpms(display, h, v);
} }
@@ -190,13 +194,13 @@ status_t g400_crtc2_dpms(bool display, bool h, bool v)
{ {
/* enable CRTC2 and don't touch the rest */ /* enable CRTC2 and don't touch the rest */
CR2W(CTL, ((CR2R(CTL) & 0xFFF0177E) | 0x01)); CR2W(CTL, ((CR2R(CTL) & 0xFFF0177E) | 0x01));
LOG(4,("display on, ")); sprintf(msg, "%sdisplay on, ", msg);
} }
else else
{ {
/* disable CRTC2 and don't touch the rest */ /* disable CRTC2 and don't touch the rest */
CR2W(CTL, (CR2R(CTL) & 0xFFF0177E)); CR2W(CTL, (CR2R(CTL) & 0xFFF0177E));
LOG(4,("display off, ")); sprintf(msg, "%sdisplay off, ", msg);
} }
if (si->crossed_conns) if (si->crossed_conns)
@@ -205,25 +209,25 @@ status_t g400_crtc2_dpms(bool display, bool h, bool v)
{ {
/* enable DVI-A hsync */ /* enable DVI-A hsync */
temp &= ~0x01; temp &= ~0x01;
LOG(4,("hsync enabled, ")); sprintf(msg, "%shsync enabled, ", msg);
} }
else else
{ {
/* disable DVI-A hsync */ /* disable DVI-A hsync */
temp |= 0x01; temp |= 0x01;
LOG(4,("hsync disabled, ")); sprintf(msg, "%shsync disabled, ", msg);
} }
if (v) if (v)
{ {
/* enable DVI-A vsync */ /* enable DVI-A vsync */
temp &= ~0x02; temp &= ~0x02;
LOG(4,("vsync enabled\n")); sprintf(msg, "%svsync enabled\n", msg);
} }
else else
{ {
/* disable DVI-A vsync */ /* disable DVI-A vsync */
temp |= 0x02; temp |= 0x02;
LOG(4,("vsync disabled\n")); sprintf(msg, "%svsync disabled\n", msg);
} }
} }
else else
@@ -232,27 +236,30 @@ status_t g400_crtc2_dpms(bool display, bool h, bool v)
{ {
/* enable HD15 hsync */ /* enable HD15 hsync */
temp &= ~0x10; temp &= ~0x10;
LOG(4,("hsync enabled, ")); sprintf(msg, "%shsync enabled, ", msg);
} }
else else
{ {
/* disable HD15 hsync */ /* disable HD15 hsync */
temp |= 0x10; temp |= 0x10;
LOG(4,("hsync disabled, ")); sprintf(msg, "%shsync disabled, ", msg);
} }
if (v) if (v)
{ {
/* enable HD15 vsync */ /* enable HD15 vsync */
temp &= ~0x20; temp &= ~0x20;
LOG(4,("vsync enabled\n")); sprintf(msg, "%svsync enabled\n", msg);
} }
else else
{ {
/* disable HD15 vsync */ /* disable HD15 vsync */
temp |= 0x20; temp |= 0x20;
LOG(4,("vsync disabled\n")); sprintf(msg, "%svsync disabled\n", msg);
} }
} }
LOG(4, (msg));
/* program new syncs */ /* program new syncs */
DXIW(SYNCCTRL, temp); DXIW(SYNCCTRL, temp);
} }
@@ -260,41 +267,6 @@ status_t g400_crtc2_dpms(bool display, bool h, bool v)
return B_OK; return B_OK;
} }
status_t g400_crtc2_dpms_fetch(bool *display, bool *h, bool *v)
{
*display = (CR2R(CTL) & 0x00000001);
if ((si->ps.card_type <= G400MAX))
{
/* no full DPMS support: display controls all signals */
*h = *v = *display;
}
else
{
/* G450 and G550 have full DPMS support on CRTC2 */
if (si->crossed_conns)
{
*h = !(DXIR(SYNCCTRL) & 0x01);
*v = !(DXIR(SYNCCTRL) & 0x02);
}
else
{
*h = !(DXIR(SYNCCTRL) & 0x10);
*v = !(DXIR(SYNCCTRL) & 0x20);
}
}
LOG(4,("CTRC2: fetched DPMS state: "));
if (*display) LOG(4,("display on, "));
else LOG(4,("display off, "));
if (*h) LOG(4,("hsync enabled, "));
else LOG(4,("hsync disabled, "));
if (*v) LOG(4,("vsync enabled\n"));
else LOG(4,("vsync disabled\n"));
return B_OK;
}
status_t g400_crtc2_set_display_pitch() status_t g400_crtc2_set_display_pitch()
{ {
uint32 offset; uint32 offset;
@@ -371,9 +371,6 @@ status_t g100_general_powerup()
/*enable writing to crtc registers*/ /*enable writing to crtc registers*/
VGAW_I(CRTC,0x11,0); VGAW_I(CRTC,0x11,0);
/*turn on display one*/
gx00_crtc_dpms(true, true, true);
return B_OK; return B_OK;
} }
@@ -471,9 +468,6 @@ status_t g200_general_powerup()
/*enable writing to crtc registers*/ /*enable writing to crtc registers*/
VGAW_I(CRTC,0x11,0); VGAW_I(CRTC,0x11,0);
/*turn on display one*/
gx00_crtc_dpms(true, true, true);
return B_OK; return B_OK;
} }
@@ -584,9 +578,6 @@ status_t g400_general_powerup()
CR2W(DATACTL,0x00000000); CR2W(DATACTL,0x00000000);
} }
/*turn on display one*/
gx00_crtc_dpms(true, true, true);
return B_OK; return B_OK;
} }
@@ -740,9 +731,6 @@ status_t g450_general_powerup()
/* enable primary analog output */ /* enable primary analog output */
gx50_general_output_select(); gx50_general_output_select();
/*turn on display one*/
gx00_crtc_dpms(true, true, true);
/* enable 'straight-through' sync outputs on both analog output connectors and /* enable 'straight-through' sync outputs on both analog output connectors and
* make sure CRTC1 sync outputs are patched through! */ * make sure CRTC1 sync outputs are patched through! */
DXIW(SYNCCTRL,0x00); DXIW(SYNCCTRL,0x00);
@@ -87,11 +87,8 @@ status_t gx00_crtc_set_timing(display_mode target);
status_t gx00_crtc_depth(int mode); status_t gx00_crtc_depth(int mode);
status_t gx00_crtc_set_display_start(uint32 startadd,uint8 bpp); status_t gx00_crtc_set_display_start(uint32 startadd,uint8 bpp);
status_t gx00_crtc_set_display_pitch(void); status_t gx00_crtc_set_display_pitch(void);
status_t gx00_crtc_dpms(bool display,bool h,bool v); status_t gx00_crtc_dpms(bool display,bool h,bool v);
status_t gx00_crtc_dpms_fetch(bool *display, bool *h, bool *v);
status_t gx00_crtc_mem_priority(uint8); status_t gx00_crtc_mem_priority(uint8);
status_t gx00_crtc_cursor_init(void); /*Yes, cursor follows CRTC1 - not the DAC!*/ status_t gx00_crtc_cursor_init(void); /*Yes, cursor follows CRTC1 - not the DAC!*/
status_t gx00_crtc_cursor_define(uint8*,uint8*); status_t gx00_crtc_cursor_define(uint8*,uint8*);
status_t gx00_crtc_cursor_position(uint16 x ,uint16 y); status_t gx00_crtc_cursor_position(uint16 x ,uint16 y);
@@ -104,9 +101,7 @@ status_t g400_crtc2_set_timing(display_mode target);
status_t g400_crtc2_depth(int mode); status_t g400_crtc2_depth(int mode);
status_t g400_crtc2_set_display_pitch(void); status_t g400_crtc2_set_display_pitch(void);
status_t g400_crtc2_set_display_start(uint32 startadd,uint8 bpp); status_t g400_crtc2_set_display_start(uint32 startadd,uint8 bpp);
status_t g400_crtc2_dpms(bool display, bool h, bool v); status_t g400_crtc2_dpms(bool display, bool h, bool v);
status_t g400_crtc2_dpms_fetch(bool *display, bool *h, bool *v);
/*acceleration functions*/ /*acceleration functions*/
status_t check_acc_capability(uint32 feature); status_t check_acc_capability(uint32 feature);