[Intel-gfx] [PATCH] Don't touch the pipestat regs for detecting FIFO underrun. The kernel owns them.

Jesse Barnes jbarnes at virtuousgeek.org
Mon Dec 29 23:07:27 CET 2008


On Monday, December 29, 2008 1:45 pm Eric Anholt wrote:
> Since we don't perform any synchronization with the kernel on these regs,
> we could race with the kernel to write stale values and end up not having
> vblank interrupts enabled when somebody was waiting on one.
> ---
>  src/i830_display.c |    4 ----
>  src/i830_driver.c  |   26 --------------------------
>  2 files changed, 0 insertions(+), 30 deletions(-)
>
> diff --git a/src/i830_display.c b/src/i830_display.c
> index 2e5d55a..7a9999a 100644
> --- a/src/i830_display.c
> +++ b/src/i830_display.c
> @@ -1202,7 +1202,6 @@ i830_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr
> mode, int dspstride_reg = (plane == 0) ? DSPASTRIDE : DSPBSTRIDE;
>      int dsppos_reg = (plane == 0) ? DSPAPOS : DSPBPOS;
>      int dspsize_reg = (plane == 0) ? DSPASIZE : DSPBSIZE;
> -    int pipestat_reg = (pipe == 0) ? PIPEASTAT : PIPEBSTAT;
>      int i, num_outputs = 0;
>      int refclk;
>      intel_clock_t clock;
> @@ -1514,9 +1513,6 @@ i830_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr
> mode, #endif
>
>      i830WaitForVblank(pScrn);
> -
> -    /* Clear any FIFO underrun status that may have occurred normally */
> -    OUTREG(pipestat_reg, INREG(pipestat_reg) | FIFO_UNDERRUN);
>  }
>
>
> diff --git a/src/i830_driver.c b/src/i830_driver.c
> index 16ddc41..27d8694 100644
> --- a/src/i830_driver.c
> +++ b/src/i830_driver.c
> @@ -2495,10 +2495,6 @@ RestoreHWState(ScrnInfoPtr pScrn)
>         OUTREG(FBC_CONTROL, pI830->saveFBC_CONTROL);
>     }
>
> -   /* Clear any FIFO underrun status that may have occurred normally */
> -   OUTREG(PIPEASTAT, INREG(PIPEASTAT) | FIFO_UNDERRUN);
> -   OUTREG(PIPEBSTAT, INREG(PIPEBSTAT) | FIFO_UNDERRUN);
> -
>     vgaHWRestore(pScrn, vgaReg, VGA_SR_FONTS);
>     vgaHWLock(hwp);
>
> @@ -2583,7 +2579,6 @@ void
>  IntelEmitInvarientState(ScrnInfoPtr pScrn)
>  {
>     I830Ptr pI830 = I830PTR(pScrn);
> -   uint32_t ctx_addr;
>
>     if (pI830->accel == ACCEL_NONE)
>        return;
> @@ -2620,7 +2615,6 @@ I830BlockHandler(int i,
>      ScreenPtr pScreen = screenInfo.screens[i];
>      ScrnInfoPtr pScrn = xf86Screens[i];
>      I830Ptr pI830 = I830PTR(pScrn);
> -    xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
>
>      pScreen->BlockHandler = pI830->BlockHandler;
>
> @@ -2657,26 +2651,6 @@ I830BlockHandler(int i,
>      if (pI830->accel == ACCEL_UXA)
>  	i830_uxa_block_handler (pScreen);
>  #endif
> -    /*
> -     * Check for FIFO underruns at block time (which amounts to just
> -     * periodically).  If this happens, it means our DSPARB or some other
> -     * memory arbitration setting is wrong for the current configuration
> -     * (except for mode setting, where it may occur naturally).
> -     * Check & ack the condition.
> -     */
> -    if (!pI830->use_drm_mode && pScrn->vtSema && !DSPARB_HWCONTROL(pI830))
> { -	if (xf86_config->crtc[0]->enabled &&
> -		(INREG(PIPEASTAT) & FIFO_UNDERRUN)) {
> -	    xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "underrun on pipe A!\n");
> -	    OUTREG(PIPEASTAT, INREG(PIPEASTAT) | FIFO_UNDERRUN);
> -	}
> -	if (xf86_config->num_crtc > 1 &&
> -		xf86_config->crtc[1]->enabled &&
> -		(INREG(PIPEBSTAT) & FIFO_UNDERRUN)) {
> -	    xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "underrun on pipe B!\n");
> -	    OUTREG(PIPEBSTAT, INREG(PIPEBSTAT) | FIFO_UNDERRUN);
> -	}
> -    }
>
>      I830VideoBlockHandler(i, blockData, pTimeout, pReadmask);
>  }

If we do this (patch seems fine) we should check for it in the kernel instead, 
maybe by enabling the corresponding error interrupt.

-- 
Jesse Barnes, Intel Open Source Technology Center




More information about the Intel-gfx mailing list