added timeouts for all retrace-sync waiting loops in accelerant to prevent software from hanging if trying to use a card that isnt' coldstarted.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15924 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
/* CTRC functionality */
|
/* CTRC functionality */
|
||||||
/* Author:
|
/* Author:
|
||||||
Rudolf Cornelissen 11/2002-11/2005
|
Rudolf Cornelissen 11/2002-1/2006
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define MODULE_BIT 0x00040000
|
#define MODULE_BIT 0x00040000
|
||||||
@@ -917,6 +917,7 @@ status_t nv_crtc_cursor_position(uint16 x, uint16 y)
|
|||||||
if (si->ps.card_arch < NV10A)
|
if (si->ps.card_arch < NV10A)
|
||||||
{
|
{
|
||||||
uint16 yhigh;
|
uint16 yhigh;
|
||||||
|
uint32 timeout = 0;
|
||||||
|
|
||||||
/* make sure we are beyond the first line of the cursorbitmap being drawn during
|
/* make sure we are beyond the first line of the cursorbitmap being drawn during
|
||||||
* updating the position to prevent distortions: no double buffering feature */
|
* updating the position to prevent distortions: no double buffering feature */
|
||||||
@@ -933,18 +934,25 @@ status_t nv_crtc_cursor_position(uint16 x, uint16 y)
|
|||||||
{
|
{
|
||||||
/* we have vertical lines below old and new cursorposition to spare. So we
|
/* we have vertical lines below old and new cursorposition to spare. So we
|
||||||
* update the cursor postion 'mid-screen', but below that area. */
|
* update the cursor postion 'mid-screen', but below that area. */
|
||||||
while (((uint16)(NV_REG32(NV32_RASTER) & 0x000007ff)) < (yhigh + 16))
|
/* wait 25mS max. (refresh > 40Hz) */
|
||||||
|
while ((((uint16)(NV_REG32(NV32_RASTER) & 0x000007ff)) < (yhigh + 16)) &&
|
||||||
|
(timeout < (25000/10)))
|
||||||
{
|
{
|
||||||
snooze(10);
|
snooze(10);
|
||||||
|
timeout++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
timeout = 0;
|
||||||
/* no room to spare, just wait for retrace (is relatively slow) */
|
/* no room to spare, just wait for retrace (is relatively slow) */
|
||||||
while ((NV_REG32(NV32_RASTER) & 0x000007ff) < si->dm.timing.v_display)
|
/* wait 25mS max. (refresh > 40Hz) */
|
||||||
|
while (((NV_REG32(NV32_RASTER) & 0x000007ff) < si->dm.timing.v_display) &&
|
||||||
|
(timeout < (25000/10)))
|
||||||
{
|
{
|
||||||
/* don't snooze much longer or retrace might get missed! */
|
/* don't snooze much longer or retrace might get missed! */
|
||||||
snooze(10);
|
snooze(10);
|
||||||
|
timeout++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -957,6 +965,8 @@ status_t nv_crtc_cursor_position(uint16 x, uint16 y)
|
|||||||
|
|
||||||
status_t nv_crtc_stop_tvout(void)
|
status_t nv_crtc_stop_tvout(void)
|
||||||
{
|
{
|
||||||
|
uint16 cnt;
|
||||||
|
|
||||||
LOG(4,("CRTC: stopping TV output\n"));
|
LOG(4,("CRTC: stopping TV output\n"));
|
||||||
|
|
||||||
/* enable access to primary head */
|
/* enable access to primary head */
|
||||||
@@ -973,13 +983,27 @@ status_t nv_crtc_stop_tvout(void)
|
|||||||
* programming in the driver makes sure this is the case.
|
* programming in the driver makes sure this is the case.
|
||||||
* (except for driver startup: see nv_general.c.) */
|
* (except for driver startup: see nv_general.c.) */
|
||||||
|
|
||||||
/* make sure we are 'in' active VGA picture */
|
/* make sure we are 'in' active VGA picture: wait with timeout! */
|
||||||
while (NV_REG8(NV8_INSTAT1) & 0x08) snooze(1);
|
cnt = 1;
|
||||||
/* wait for next vertical retrace start on VGA */
|
while ((NV_REG8(NV8_INSTAT1) & 0x08) && cnt)
|
||||||
while (!(NV_REG8(NV8_INSTAT1) & 0x08)) snooze(1);
|
{
|
||||||
/* now wait until we are 'in' active VGA picture again */
|
snooze(1);
|
||||||
while (NV_REG8(NV8_INSTAT1) & 0x08) snooze(1);
|
cnt++;
|
||||||
|
}
|
||||||
|
/* wait for next vertical retrace start on VGA: wait with timeout! */
|
||||||
|
cnt = 1;
|
||||||
|
while ((!(NV_REG8(NV8_INSTAT1) & 0x08)) && cnt)
|
||||||
|
{
|
||||||
|
snooze(1);
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
/* now wait until we are 'in' active VGA picture again: wait with timeout! */
|
||||||
|
cnt = 1;
|
||||||
|
while ((NV_REG8(NV8_INSTAT1) & 0x08) && cnt)
|
||||||
|
{
|
||||||
|
snooze(1);
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
|
||||||
/* set CRTC to master mode (b7 = 0) if it wasn't slaved for a panel before */
|
/* set CRTC to master mode (b7 = 0) if it wasn't slaved for a panel before */
|
||||||
if (!(si->ps.slaved_tmds1)) CRTCW(PIXEL, (CRTCR(PIXEL) & 0x03));
|
if (!(si->ps.slaved_tmds1)) CRTCW(PIXEL, (CRTCR(PIXEL) & 0x03));
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/* second CTRC functionality for GeForce cards */
|
/* second CTRC functionality for GeForce cards */
|
||||||
/* Author:
|
/* Author:
|
||||||
Rudolf Cornelissen 11/2002-11/2005
|
Rudolf Cornelissen 11/2002-1/2006
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define MODULE_BIT 0x00020000
|
#define MODULE_BIT 0x00020000
|
||||||
@@ -880,6 +880,8 @@ status_t nv_crtc2_cursor_position(uint16 x, uint16 y)
|
|||||||
|
|
||||||
status_t nv_crtc2_stop_tvout(void)
|
status_t nv_crtc2_stop_tvout(void)
|
||||||
{
|
{
|
||||||
|
uint16 cnt;
|
||||||
|
|
||||||
LOG(4,("CRTC2: stopping TV output\n"));
|
LOG(4,("CRTC2: stopping TV output\n"));
|
||||||
|
|
||||||
/* enable access to secondary head */
|
/* enable access to secondary head */
|
||||||
@@ -896,13 +898,27 @@ status_t nv_crtc2_stop_tvout(void)
|
|||||||
* programming in the driver makes sure this is the case.
|
* programming in the driver makes sure this is the case.
|
||||||
* (except for driver startup: see nv_general.c.) */
|
* (except for driver startup: see nv_general.c.) */
|
||||||
|
|
||||||
/* make sure we are 'in' active VGA picture */
|
/* make sure we are 'in' active VGA picture: wait with timeout! */
|
||||||
while (NV_REG8(NV8_INSTAT1) & 0x08) snooze(1);
|
cnt = 1;
|
||||||
/* wait for next vertical retrace start on VGA */
|
while ((NV_REG8(NV8_INSTAT1) & 0x08) && cnt)
|
||||||
while (!(NV_REG8(NV8_INSTAT1) & 0x08)) snooze(1);
|
{
|
||||||
/* now wait until we are 'in' active VGA picture again */
|
snooze(1);
|
||||||
while (NV_REG8(NV8_INSTAT1) & 0x08) snooze(1);
|
cnt++;
|
||||||
|
}
|
||||||
|
/* wait for next vertical retrace start on VGA: wait with timeout! */
|
||||||
|
cnt = 1;
|
||||||
|
while ((!(NV_REG8(NV8_INSTAT1) & 0x08)) && cnt)
|
||||||
|
{
|
||||||
|
snooze(1);
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
/* now wait until we are 'in' active VGA picture again: wait with timeout! */
|
||||||
|
cnt = 1;
|
||||||
|
while ((NV_REG8(NV8_INSTAT1) & 0x08) && cnt)
|
||||||
|
{
|
||||||
|
snooze(1);
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
|
||||||
/* set CRTC to master mode (b7 = 0) if it wasn't slaved for a panel before */
|
/* set CRTC to master mode (b7 = 0) if it wasn't slaved for a panel before */
|
||||||
if (!(si->ps.slaved_tmds2)) CRTC2W(PIXEL, (CRTC2R(PIXEL) & 0x03));
|
if (!(si->ps.slaved_tmds2)) CRTC2W(PIXEL, (CRTC2R(PIXEL) & 0x03));
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ void setup_virtualized_heads(bool);
|
|||||||
void set_crtc_owner(bool);
|
void set_crtc_owner(bool);
|
||||||
status_t nv_general_output_select(bool);
|
status_t nv_general_output_select(bool);
|
||||||
status_t nv_general_head_select(bool);
|
status_t nv_general_head_select(bool);
|
||||||
status_t nv_general_wait_retrace(void);
|
|
||||||
status_t nv_general_validate_pic_size (display_mode *target, uint32 *bytes_per_row, bool *acc_mode);
|
status_t nv_general_validate_pic_size (display_mode *target, uint32 *bytes_per_row, bool *acc_mode);
|
||||||
|
|
||||||
/* AGP functions */
|
/* AGP functions */
|
||||||
|
|||||||
Reference in New Issue
Block a user