drivers/gpu/drm/via/via_crtc.c |  171 ++++++++++++++++++-----------------------
 1 file changed, 76 insertions(+), 95 deletions(-)

New commits:
commit 345fa71bfc4e5daf54ca8c6ae6d40fb1dc2795fd
Author: James Simmons <jsimm...@infradead.org>
Date:   Sat Aug 31 17:21:11 2013 -0400

    Since a drm_framebuffer is static in nature for its life cycle we can move 
the testing of the change of state in the set_base_atomic code to the set_base 
function were we just test to see if the framebuffer is a different object.

diff --git a/drivers/gpu/drm/via/via_crtc.c b/drivers/gpu/drm/via/via_crtc.c
index fbf0cd0..f7c8a7e 100644
--- a/drivers/gpu/drm/via/via_crtc.c
+++ b/drivers/gpu/drm/via/via_crtc.c
@@ -1143,7 +1143,6 @@ static int
 via_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
                        struct drm_framebuffer *fb)
 {
-       enum mode_set_atomic state = fb ? ENTER_ATOMIC_MODE_SET : 
LEAVE_ATOMIC_MODE_SET;
        struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
        struct drm_framebuffer *new_fb = crtc->fb;
        struct ttm_buffer_object *bo;
@@ -1156,6 +1155,10 @@ via_crtc_mode_set_base(struct drm_crtc *crtc, int x, int 
y,
                return ret;
        }
 
+       /* No reason to reset the display surface again */
+       if (new_fb == fb)
+               return ret;
+
        obj = new_fb->helper_private;
        bo = obj->driver_private;
 
@@ -1165,7 +1168,8 @@ via_crtc_mode_set_base(struct drm_crtc *crtc, int x, int 
y,
                return ret;
        }
 
-       ret = crtc_funcs->mode_set_base_atomic(crtc, new_fb, x, y, state);
+       ret = crtc_funcs->mode_set_base_atomic(crtc, new_fb, x, y,
+                                               ENTER_ATOMIC_MODE_SET);
        if (unlikely(ret)) {
                DRM_DEBUG("failed to set new framebuffer\n");
                ttm_bo_unpin(bo, NULL);
@@ -1188,68 +1192,57 @@ static int
 via_iga1_mode_set_base_atomic(struct drm_crtc *crtc, struct drm_framebuffer 
*fb,
                                int x, int y, enum mode_set_atomic state)
 {
+       u32 pitch = y * fb->pitches[0] + ((x * fb->bits_per_pixel) >> 3), addr;
        struct via_crtc *iga = container_of(crtc, struct via_crtc, base);
        struct drm_via_private *dev_priv = crtc->dev->dev_private;
-       struct drm_gem_object *crtc_obj = crtc->fb->helper_private;
-       struct ttm_buffer_object *crtc_bo = crtc_obj->driver_private;
        struct drm_gem_object *obj = fb->helper_private;
        struct ttm_buffer_object *bo = obj->driver_private;
-       u32 pitch = (x * fb->bits_per_pixel) >> 3, addr;
+       u8 value;
 
        /* Set the framebuffer offset */
-       pitch += y * fb->pitches[0];
        addr = round_up(bo->offset + pitch, 16) >> 1;
-
-       if ((state == ENTER_ATOMIC_MODE_SET) ||
-            crtc_bo->offset != bo->offset) {
-               vga_wcrt(VGABASE, 0x0D, addr & 0xFF);
-               vga_wcrt(VGABASE, 0x0C, (addr >> 8) & 0xFF);
-               /* Yes order of setting these registers matters on some 
hardware */
-               svga_wcrt_mask(VGABASE, 0x48, ((addr >> 24) & 0x1F), 0x1F);
-               vga_wcrt(VGABASE, 0x34, (addr >> 16) & 0xFF);
-       }
+       vga_wcrt(VGABASE, 0x0D, addr & 0xFF);
+       vga_wcrt(VGABASE, 0x0C, (addr >> 8) & 0xFF);
+       /* Yes order of setting these registers matters on some hardware */
+       svga_wcrt_mask(VGABASE, 0x48, ((addr >> 24) & 0x1F), 0x1F);
+       vga_wcrt(VGABASE, 0x34, (addr >> 16) & 0xFF);
 
        /* Load fetch count registers */
-       pitch = ALIGN(crtc->mode.hdisplay * fb->bits_per_pixel >> 3, 16) >> 4;
-       load_value_to_registers(VGABASE, &iga->fetch, pitch + 1);
-
-       if ((state == ENTER_ATOMIC_MODE_SET) ||
-            crtc->fb->pitches[0] != fb->pitches[0]) {
-               /* Spec does not say that first adapter skips 3 bits but old
-                * code did it and seems to be reasonable in analogy to
-                * second adapter */
-               load_value_to_registers(VGABASE, &iga->offset,
-                                       ALIGN(fb->pitches[0], 16) >> 3);
-       }
+       pitch = ALIGN(crtc->mode.hdisplay * fb->bits_per_pixel >> 3, 16);
+       load_value_to_registers(VGABASE, &iga->fetch, (pitch >> 4) + 1);
 
-       /* Load color depth registers */
-       if ((state == ENTER_ATOMIC_MODE_SET) || crtc->fb->depth != fb->depth) {
-               /* Bit 7 set LUT bit size to 8 bit. Bit 5 enables wrap around
-                * and bit 1 enables extended display mode */
-               u8 value = BIT(7) | BIT(5) | BIT(1);
+       /* Set the primary pitch */
+       pitch = ALIGN(fb->pitches[0], 16);
+       /* Spec does not say that first adapter skips 3 bits but old
+        * code did it and seems to be reasonable in analogy to
+        * second adapter */
+       load_value_to_registers(VGABASE, &iga->offset, pitch >> 3);
 
-               switch (fb->depth) {
-               case 8:
-                       break;
-               case 15:
-                       value |= BIT(2);
-                       break;
-               case 16:
-                       /* Bit 4 is for 555/565 selection */
-                       value |= BIT(4) | BIT(2);
-                       break;
-               case 24:
-                       value |= BIT(3) | BIT(2);
-                       break;
-               case 32:
-                       value |= BIT(3);
-                       break;
-               default:
-                       DRM_ERROR("Unsupported depth: %d\n", fb->depth);
-                       return -EINVAL;
-               }
-               svga_wseq_mask(VGABASE, 0x15, value, 0xFE);
+       /* Load color depth registers */
+       /* Bit 7 set LUT bit size to 8 bit. Bit 5 enables wrap around
+        * and bit 1 enables extended display mode */
+       value = BIT(7) | BIT(5) | BIT(1);
+       switch (fb->depth) {
+       case 8:
+               break;
+       case 15:
+               value |= BIT(2);
+               break;
+       case 16:
+               /* Bit 4 is for 555/565 selection */
+               value |= BIT(4) | BIT(2);
+               break;
+       case 24:
+               value |= BIT(3) | BIT(2);
+               break;
+       case 32:
+               value |= BIT(3);
+               break;
+       default:
+               DRM_ERROR("Unsupported depth: %d\n", fb->depth);
+               return -EINVAL;
        }
+       svga_wseq_mask(VGABASE, 0x15, value, 0xFE);
        return 0;
 }
 
@@ -1257,62 +1250,50 @@ static int
 via_iga2_mode_set_base_atomic(struct drm_crtc *crtc, struct drm_framebuffer 
*fb,
                                int x, int y, enum mode_set_atomic state)
 {
+       u32 pitch = y * fb->pitches[0] + ((x * fb->bits_per_pixel) >> 3), addr;
        struct via_crtc *iga = container_of(crtc, struct via_crtc, base);
        struct drm_via_private *dev_priv = crtc->dev->dev_private;
-       struct drm_gem_object *crtc_obj = crtc->fb->helper_private;
-       struct ttm_buffer_object *crtc_bo = crtc_obj->driver_private;
        struct drm_gem_object *obj = fb->helper_private;
        struct ttm_buffer_object *bo = obj->driver_private;
-       u32 pitch = (x * fb->bits_per_pixel) >> 3, addr;
        u8 value;
 
        /* Set the framebuffer offset */
-       pitch += y * fb->pitches[0];
        addr = round_up(bo->offset + pitch, 16);
-
-       if ((state == ENTER_ATOMIC_MODE_SET) ||
-            crtc_bo->offset != bo->offset) {
-               /* Bits 9 to 3 of the frame buffer go into bits 7 to 1
-                * of the register. Bit 0 is for setting tile mode or
-                * linear mode. A value of zero sets it to linear mode */
-               vga_wcrt(VGABASE, 0x62, ((addr >> 3) & 0x7F) << 1);
-               vga_wcrt(VGABASE, 0x63, (addr >> 10) & 0xFF);
-               vga_wcrt(VGABASE, 0x64, (addr >> 18) & 0xFF);
-               svga_wcrt_mask(VGABASE, 0xA3, ((addr >> 26) & 0x07), 0x07);
-       }
+       /* Bits 9 to 3 of the frame buffer go into bits 7 to 1
+        * of the register. Bit 0 is for setting tile mode or
+        * linear mode. A value of zero sets it to linear mode */
+       vga_wcrt(VGABASE, 0x62, ((addr >> 3) & 0x7F) << 1);
+       vga_wcrt(VGABASE, 0x63, (addr >> 10) & 0xFF);
+       vga_wcrt(VGABASE, 0x64, (addr >> 18) & 0xFF);
+       svga_wcrt_mask(VGABASE, 0xA3, ((addr >> 26) & 0x07), 0x07);
 
        /* Load fetch count registers */
-       pitch = ALIGN(crtc->mode.hdisplay * fb->bits_per_pixel >> 3, 16) >> 4;
-       load_value_to_registers(VGABASE, &iga->fetch, pitch + 1);
-
-       if ((state == ENTER_ATOMIC_MODE_SET) ||
-            crtc->fb->pitches[0] != fb->pitches[0]) {
-               /* Set secondary pitch */
-               load_value_to_registers(VGABASE, &iga->offset,
-                                       ALIGN(fb->pitches[0], 16) >> 3);
-       }
+       pitch = ALIGN(crtc->mode.hdisplay * fb->bits_per_pixel >> 3, 16);
+       load_value_to_registers(VGABASE, &iga->fetch, (pitch >> 4) + 1);
+
+       /* Set secondary pitch */
+       pitch = ALIGN(fb->pitches[0], 16);
+       load_value_to_registers(VGABASE, &iga->offset, pitch >> 3);
 
        /* Load color depth registers */
-       if ((state == ENTER_ATOMIC_MODE_SET) || crtc->fb->depth != fb->depth) {
-               switch (fb->depth) {
-               case 8:
-                       value = 0x00;
-                       break;
-               case 16:
-                       value = BIT(6);
-                       break;
-               case 24:
-                       value = BIT(7) | BIT(6);
-                       break;
-               case 32:
-                       value = BIT(7);
-                       break;
-               default:
-                       DRM_ERROR("Unsupported depth: %d\n", fb->depth);
-                       return -EINVAL;
-               }
-               svga_wcrt_mask(VGABASE, 0x67, value, BIT(7) | BIT(6));
+       switch (fb->depth) {
+       case 8:
+               value = 0x00;
+               break;
+       case 16:
+               value = BIT(6);
+               break;
+       case 24:
+               value = BIT(7) | BIT(6);
+               break;
+       case 32:
+               value = BIT(7);
+               break;
+       default:
+               DRM_ERROR("Unsupported depth: %d\n", fb->depth);
+               return -EINVAL;
        }
+       svga_wcrt_mask(VGABASE, 0x67, value, BIT(7) | BIT(6));
        return 0;
 }
 
_______________________________________________
Openchrome-devel mailing list
Openchrome-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/openchrome-devel

Reply via email to