[Intel-gfx] [PATCH] correct FIFO entry count on 945, make sure overlay plane has some

Jesse Barnes jbarnes at virtuousgeek.org
Wed Jan 28 22:06:51 CET 2009


Here's a patch I put together for 18651.  Looks like we had the wrong FIFO
entry count for 945, which led to underruns in many cases.  It also makes
sure there are some overlay entries available, since the overlay also uses
the FIFO.

Comments?

diff --git a/src/i830_display.c b/src/i830_display.c
index 50fbc4d..1d1ad18 100644
--- a/src/i830_display.c
+++ b/src/i830_display.c
@@ -1123,7 +1123,8 @@ i830_update_dsparb(ScrnInfoPtr pScrn)
    xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
    I830Ptr pI830 = I830PTR(pScrn);
    int total_hdisplay = 0, planea_hdisplay = 0, planeb_hdisplay = 0;
-   int fifo_entries = 0, planea_entries = 0, planeb_entries = 0, i;
+   int fifo_entries = 0, planea_entries = 0, planeb_entries = 0,
+       planec_entries = 0, i;
 
    if ((INREG(DSPACNTR) & DISPLAY_PLANE_ENABLE) &&
        (INREG(DSPBCNTR) & DISPLAY_PLANE_ENABLE))
@@ -1133,18 +1134,22 @@ i830_update_dsparb(ScrnInfoPtr pScrn)
   /*
     * FIFO entries will be split based on programmed modes
     */
-   if (IS_I965GM(pI830))
+   if (IS_I965GM(pI830) || IS_I945GM(pI830)) {
        fifo_entries = 127;
-   else if (IS_I9XX(pI830))
+       planec_entries = 40;
+   } else if (IS_I9XX(pI830)) {
        fifo_entries = 95;
-   else if (IS_MOBILE(pI830)) {
+       planec_entries = 30;
+   } else if (IS_MOBILE(pI830)) {
        fifo_entries = 255;
+       planec_entries = 96;
    } else {
-	/* The 845/865 only have a AEND field.  Though the field size would
+       /* The 845/865 only have a AEND field.  Though the field size would
 	* allow 128 entries, the 865 rendered the cursor wrong then.
 	* The BIOS set it up for 96.
 	*/
-	fifo_entries = 95;
+       fifo_entries = 95;
+       planec_entries = 30;
    }
 
    for (i = 0; i < xf86_config->num_crtc; i++) {
@@ -1159,6 +1164,7 @@ i830_update_dsparb(ScrnInfoPtr pScrn)
       }
    }
 
+   fifo_entries -= planec_entries;
    planea_entries = fifo_entries * planea_hdisplay / total_hdisplay;
    planeb_entries = fifo_entries * planeb_hdisplay / total_hdisplay;
 



More information about the Intel-gfx mailing list