intelfb -- uses stride alignment of 64 on the 9xx chipsets.
[safe/jmp/linux-2.6] / drivers / video / intelfb / intelfbdrv.c
index 9e83664..b92bc90 100644 (file)
@@ -1141,7 +1141,10 @@ update_dinfo(struct intelfb_info *dinfo, struct fb_var_screeninfo *var)
        }
 
        /* Make sure the line length is a aligned correctly. */
-       dinfo->pitch = ROUND_UP_TO(dinfo->pitch, STRIDE_ALIGNMENT);
+       if (IS_I9XX(dinfo))
+               dinfo->pitch = ROUND_UP_TO(dinfo->pitch, STRIDE_ALIGNMENT_I9XX);
+       else
+               dinfo->pitch = ROUND_UP_TO(dinfo->pitch, STRIDE_ALIGNMENT);
 
        if (FIXED_MODE(dinfo))
                dinfo->pitch = dinfo->initial_pitch;
@@ -1164,16 +1167,33 @@ intelfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
        struct fb_var_screeninfo v;
        struct intelfb_info *dinfo;
        static int first = 1;
+       int i;
+       /* Good pitches to allow tiling.  Don't care about pitches < 1024. */
+       static const int pitches[] = {
+               128 * 8,
+               128 * 16,
+               128 * 32,
+               128 * 64,
+               0
+       };
 
        DBG_MSG("intelfb_check_var: accel_flags is %d\n", var->accel_flags);
 
        dinfo = GET_DINFO(info);
 
+       /* update the pitch */
        if (intelfbhw_validate_mode(dinfo, var) != 0)
                return -EINVAL;
 
        v = *var;
 
+       for (i = 0; pitches[i] != 0; i++) {
+               if (pitches[i] >= v.xres_virtual) {
+                       v.xres_virtual = pitches[i];
+                       break;
+               }
+       }
+
        /* Check for a supported bpp. */
        if (v.bits_per_pixel <= 8) {
                v.bits_per_pixel = 8;