diff options
author | Thomas Hilber <sparkie@lowbyte.de> | 2009-05-25 20:28:51 +0200 |
---|---|---|
committer | Paul Menzel <paulepanter@users.sourceforge.net> | 2009-06-02 16:49:30 +0200 |
commit | 2f19cf305166b5bf6051a4294a191e7aa2c90143 (patch) | |
tree | 8da6959a5f6d44e294972a1fe5715c00d76a6e69 | |
parent | 42f17b803e31bbb94bc2a9fe34b0672eaa649697 (diff) | |
download | xf86-video-intel-frc-2f19cf305166b5bf6051a4294a191e7aa2c90143.tar.gz xf86-video-intel-frc-2f19cf305166b5bf6051a4294a191e7aa2c90143.tar.bz2 |
fast processors require additional delay of 32usecs
- fast processors require additional delay of 32usecs where we wait for even field to pass
- white space fixes/indentation
Signed-off-by: Thomas Hilber <sparkie@lowbyte.de>
Signed-off-by: Paul Menzel <paulepanter@users.sourceforge.net>
-rw-r--r-- | src/i830_video.c | 117 |
1 files changed, 59 insertions, 58 deletions
diff --git a/src/i830_video.c b/src/i830_video.c index 4a6024a8..474647c7 100644 --- a/src/i830_video.c +++ b/src/i830_video.c @@ -3095,11 +3095,11 @@ i830_crtc_dpms_video(xf86CrtcPtr crtc, Bool on) #define VSF_SUB(a, b, c) \ if ((a).tv_usec < (b).tv_usec) { \ - (c).tv_sec = (a).tv_sec - (b).tv_sec - 1; \ - (c).tv_usec = (a).tv_usec - (b).tv_usec + 1000000; \ + (c).tv_sec = (a).tv_sec - (b).tv_sec - 1; \ + (c).tv_usec = (a).tv_usec - (b).tv_usec + 1000000; \ } else { \ - (c).tv_sec = (a).tv_sec - (b).tv_sec; \ - (c).tv_usec = (a).tv_usec - (b).tv_usec; \ + (c).tv_sec = (a).tv_sec - (b).tv_sec; \ + (c).tv_usec = (a).tv_usec - (b).tv_usec; \ } #define VSF_TV2USEC(a, b) \ @@ -3137,7 +3137,7 @@ log_graph(val, symb) static char meter[sizeof(headr)]; if (!symb || symb == 1) { - if (!symb) ErrorF("%s", headr); + if (!symb) ErrorF("%s", headr); if (symb == 1) ErrorF("%s", meter); memset(meter, '-', sizeof(headr) - 1); return; @@ -3146,13 +3146,13 @@ log_graph(val, symb) val = min(val, (int)sizeof(headr) - 2); val = max(val, 0); if (symb == ':') { - meter[val] = meter[val] == '%' ? '#' : symb; + meter[val] = meter[val] == '%' ? '#' : symb; } else if (symb == '*') { - meter[val] = meter[val] == '%' ? '1' : - meter[val] == ':' ? '2' : - meter[val] == '#' ? '3' : symb; + meter[val] = meter[val] == '%' ? '1' : + meter[val] == ':' ? '2' : + meter[val] == '#' ? '3' : symb; } else { - meter[val] = symb; + meter[val] = symb; } } /* --- 8< --- */ @@ -3167,16 +3167,16 @@ vga_sync_fields(pI830) int dovsta, dovsta_1, pipea_dsl, pipea_dsl_1, trim, vbl_usec; /* --- 8< --- */ - if (!htotal_a) { + if (!htotal_a) { htotal_a = INREG(HTOTAL_A); hsync_a = INREG(HSYNC_A); - } + } trim = (INREG(HTOTAL_A) >> 16) - (htotal_a >> 16); /* * the chip does not provide current field status directly. * but we can derive that from xor'ed dovsta and pipea_dsl contents. - * + * * DOVSTA 0x80104000 PIPEA_DSL 0x00000000 0 0 0 * [...] * DOVSTA 0x00104000 PIPEA_DSL 0x0000011e 286 286 18304 @@ -3202,23 +3202,24 @@ vga_sync_fields(pI830) #define LFIELD 313 #define DEADLN 287 +#define DYZONE 32 #define SHIFTV (LFIELD - DEADLN) #define LFRAME (LFIELD << 1) - /* - * the next few lines implement a simple glitch detection/correction - */ - dovsta = INREG(DOVSTA); - pipea_dsl = INREG(PIPEA_DSL); - dovsta_1 = INREG(DOVSTA); - pipea_dsl_1 = INREG(PIPEA_DSL); + /* + * the next few lines implement a simple glitch detection/correction + */ + dovsta = INREG(DOVSTA); + pipea_dsl = INREG(PIPEA_DSL); + dovsta_1 = INREG(DOVSTA); + pipea_dsl_1 = INREG(PIPEA_DSL); - if ((dovsta ^ dovsta_1) & OC_FIELD && pipea_dsl == pipea_dsl_1) { - dovsta = ~dovsta; - } + if ((dovsta ^ dovsta_1) & OC_FIELD && pipea_dsl == pipea_dsl_1) { + dovsta = ~dovsta; + } - /* 287 + 26 (+ 313) == 313 (626) */ - vbl_usec = ((pipea_dsl < DEADLN ^ !(dovsta & OC_FIELD)) * LFIELD + pipea_dsl + SHIFTV) % LFRAME << 6; + /* 287 + 26 (+ 313) == 313 (626) */ + vbl_usec = ((pipea_dsl < DEADLN ^ !(dovsta & OC_FIELD)) * LFIELD + pipea_dsl + SHIFTV) % LFRAME << 6; if (vbl_usec_prev == ~0) { vbl_usec_prev = vbl_usec; @@ -3230,14 +3231,14 @@ vga_sync_fields(pI830) return; #endif } - if (pI830->SYF_debug) { - if (abs(vbl_usec - vbl_usec_prev) > SYF_WARN_RANGE) { - log_graph(vbl_usec - vbl_usec_prev, '%'); - } - if (abs(vbl_usec - SYF_PAL_FIELD_CYCLE) > SYF_WARN_RANGE) { - log_graph(vbl_usec - SYF_SYNC_POINT, ':'); - } - } + if (pI830->SYF_debug) { + if (abs(vbl_usec - vbl_usec_prev) > SYF_WARN_RANGE) { + log_graph(vbl_usec - vbl_usec_prev, '%'); + } + if (abs(vbl_usec - SYF_PAL_FIELD_CYCLE) > SYF_WARN_RANGE) { + log_graph(vbl_usec - SYF_SYNC_POINT, ':'); + } + } #ifndef STANDALONE @@ -3254,29 +3255,29 @@ vga_sync_fields(pI830) * ...---sleep--->| * 18368 */ - if (vbl_usec - SHIFTV < SYF_PAL_FIELD_CYCLE) { - usleep(SYF_PAL_FIELD_CYCLE - (vbl_usec - SHIFTV)); + if (SYF_PAL_FIELD_CYCLE - vbl_usec > 0) { + usleep(SYF_PAL_FIELD_CYCLE - vbl_usec + DYZONE); } #endif - syf.spoint += vbl_usec - SYF_SYNC_POINT; - syf.drift += vbl_usec - vbl_usec_prev; - vbl_usec_prev = vbl_usec; - ++syf.cnt; - if (!(syf.cnt % SYF_PLL_DIVIDER)) { - syf.spoint /= SYF_PLL_DIVIDER; - syf.trim = (syf.drift + syf.spoint / SYF_DISP_DRIFT_FACTOR) / SYF_MIN_STEP_USEC; - syf.trim = max(syf.trim, -SYF_MAX_TRIM_REL); - syf.trim = min(syf.trim, SYF_MAX_TRIM_REL); - if (pI830->SYF_debug) { - log_graph(0, '+'); - log_graph(syf.spoint, '|'); - log_graph(syf.drift, '*'); - log_graph(0, 1); - ErrorF("%7d %7d [%3d%+4d]\n", syf.drift, syf.spoint, (char)(trim & 0xff), syf.trim); - } - syf.spoint = 0; - syf.drift = 0; - } + syf.spoint += vbl_usec - SYF_SYNC_POINT; + syf.drift += vbl_usec - vbl_usec_prev; + vbl_usec_prev = vbl_usec; + ++syf.cnt; + if (!(syf.cnt % SYF_PLL_DIVIDER)) { + syf.spoint /= SYF_PLL_DIVIDER; + syf.trim = (syf.drift + syf.spoint / SYF_DISP_DRIFT_FACTOR) / SYF_MIN_STEP_USEC; + syf.trim = max(syf.trim, -SYF_MAX_TRIM_REL); + syf.trim = min(syf.trim, SYF_MAX_TRIM_REL); + if (pI830->SYF_debug) { + log_graph(0, '+'); + log_graph(syf.spoint, '|'); + log_graph(syf.drift, '*'); + log_graph(0, 1); + ErrorF("%7d %7d [%3d%+4d]\n", syf.drift, syf.spoint, (char)(trim & 0xff), syf.trim); + } + syf.spoint = 0; + syf.drift = 0; + } if (B(1) && syf.trim) { int t = (char)(trim & 0xff); @@ -3287,14 +3288,14 @@ vga_sync_fields(pI830) t = max(t - 1, -SYF_MAX_TRIM_ABS); ++syf.trim; } - if (trim != t) { - t <<= 16; + if (trim != t) { + t <<= 16; OUTREG(HTOTAL_A, htotal_a + t); OUTREG(HBLANK_A, htotal_a + t); OUTREG(HSYNC_A, hsync_a + (t << 1)); OUTREG(PIPEACONF, INREG(PIPEACONF)); - } - } + } + } /* --- 8< --- */ } |