drivers/gpu/drm/via/via_analog.c  |    1 
 drivers/gpu/drm/via/via_crtc.c    |   51 ++++++++++++++++-------------
 drivers/gpu/drm/via/via_display.c |    7 ++++
 drivers/gpu/drm/via/via_display.h |    1 
 drivers/gpu/drm/via/via_hdmi.c    |    4 ++
 drivers/gpu/drm/via/via_lvds.c    |   65 +++++++++++++++++++++++---------------
 drivers/gpu/drm/via/via_tmds.c    |    2 +
 7 files changed, 83 insertions(+), 48 deletions(-)

New commits:
commit b7ae94866f18df75dc7ae0b66a29d8853714d7fb
Author: James Simmons <jsimm...@infradead.org>
Date:   Sat Aug 24 14:19:34 2013 -0400

    Only set the frame buffer offset if it actually changes. This helps with 
flickering when the screen scrolls

diff --git a/drivers/gpu/drm/via/via_crtc.c b/drivers/gpu/drm/via/via_crtc.c
index 9de64ea..fbf0cd0 100644
--- a/drivers/gpu/drm/via/via_crtc.c
+++ b/drivers/gpu/drm/via/via_crtc.c
@@ -987,7 +987,7 @@ via_crtc_mode_fixup(struct drm_crtc *crtc, const struct 
drm_display_mode *mode,
 static int
 via_crtc_mode_set(struct drm_crtc *crtc, struct drm_display_mode *mode,
                        struct drm_display_mode *adjusted_mode,
-                       int x, int y, struct drm_framebuffer *old_fb)
+                       int x, int y, struct drm_framebuffer *fb)
 {
        struct via_crtc *iga = container_of(crtc, struct via_crtc, base);
        struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private;
@@ -1136,14 +1136,14 @@ via_crtc_mode_set(struct drm_crtc *crtc, struct 
drm_display_mode *mode,
                pll_regs = via_get_clk_value(crtc->dev, clock);
                via_set_vclock(crtc, pll_regs);
        }
-       return crtc_funcs->mode_set_base(crtc, x, y, old_fb);
+       return crtc_funcs->mode_set_base(crtc, x, y, fb);
 }
 
 static int
 via_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
-                       struct drm_framebuffer *old_fb)
+                       struct drm_framebuffer *fb)
 {
-       enum mode_set_atomic state = old_fb ? LEAVE_ATOMIC_MODE_SET : 
ENTER_ATOMIC_MODE_SET;
+       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;
@@ -1173,8 +1173,8 @@ via_crtc_mode_set_base(struct drm_crtc *crtc, int x, int 
y,
        }
 
        /* Free the old framebuffer if it exist */
-       if (old_fb) {
-               obj = old_fb->helper_private;
+       if (fb) {
+               obj = fb->helper_private;
                bo = obj->driver_private;
 
                ret = ttm_bo_unpin(bo, NULL);
@@ -1190,24 +1190,24 @@ via_iga1_mode_set_base_atomic(struct drm_crtc *crtc, 
struct drm_framebuffer *fb,
 {
        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;
 
-       /*if ((state == ENTER_ATOMIC_MODE_SET) && (fb != crtc->fb))
-               disable_accel(dev);
-       else
-               restore_accel(dev);*/
-
        /* Set the framebuffer offset */
        pitch += y * fb->pitches[0];
        addr = round_up(bo->offset + pitch, 16) >> 1;
 
-       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);
+       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);
+       }
 
        /* Load fetch count registers */
        pitch = ALIGN(crtc->mode.hdisplay * fb->bits_per_pixel >> 3, 16) >> 4;
@@ -1259,6 +1259,8 @@ via_iga2_mode_set_base_atomic(struct drm_crtc *crtc, 
struct drm_framebuffer *fb,
 {
        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;
@@ -1268,13 +1270,16 @@ via_iga2_mode_set_base_atomic(struct drm_crtc *crtc, 
struct drm_framebuffer *fb,
        pitch += y * fb->pitches[0];
        addr = round_up(bo->offset + pitch, 16);
 
-       /* 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);
+       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);
+       }
 
        /* Load fetch count registers */
        pitch = ALIGN(crtc->mode.hdisplay * fb->bits_per_pixel >> 3, 16) >> 4;
commit 77d7c613e70826ea3c3221df1ee1f34089643f7b
Author: James Simmons <jsimm...@infradead.org>
Date:   Sat Aug 24 13:16:33 2013 -0400

    Dither will be removed out of the DRM core in the future so we make our 
LVDS use a private dither property

diff --git a/drivers/gpu/drm/via/via_lvds.c b/drivers/gpu/drm/via/via_lvds.c
index 3cfdcb2..f9a4802 100644
--- a/drivers/gpu/drm/via/via_lvds.c
+++ b/drivers/gpu/drm/via/via_lvds.c
@@ -367,36 +367,27 @@ via_lcd_detect(struct drm_connector *connector,  bool 
force)
        return ret;
 }
 
+static const struct drm_prop_enum_list dithering_enum_list[] =
+{
+       { DRM_MODE_DITHERING_OFF, "Off" },
+       { DRM_MODE_DITHERING_ON, "On" },
+       { DRM_MODE_DITHERING_AUTO, "Automatic" },
+};
+
 static int
 via_lcd_set_property(struct drm_connector *connector,
                        struct drm_property *property, uint64_t value)
 {
+       struct via_connector *con = container_of(connector, struct 
via_connector, base);
        struct drm_via_private *dev_priv = connector->dev->dev_private;
        struct drm_device *dev = connector->dev;
+       struct drm_property *prop;
        uint64_t orig;
        int ret;
 
        ret = drm_object_property_get_value(&connector->base, property, &orig);
        if (!ret && (orig != value)) {
-               if (property == dev->mode_config.dithering_mode_property) {
-                       u8 reg_value;
-
-                       switch (value) {
-                       case DRM_MODE_DITHERING_AUTO:
-                       case DRM_MODE_DITHERING_ON:
-                               reg_value = BIT(0);
-                               break;
-
-                       case DRM_MODE_DITHERING_OFF:
-                               reg_value = 0x00;
-                               break;
-
-                       default:
-                               return -EINVAL;
-                       }
-                       svga_wcrt_mask(VGABASE, 0x88, reg_value, BIT(0));
-
-               } else if (property == dev->mode_config.scaling_mode_property) {
+               if (property == dev->mode_config.scaling_mode_property) {
                        switch (value) {
                        case DRM_MODE_SCALE_NONE:
                                break;
@@ -414,6 +405,27 @@ via_lcd_set_property(struct drm_connector *connector,
                                return -EINVAL;
                        }
                }
+
+               list_for_each_entry(prop, &con->props, head) {
+                       if (property == prop) {
+                               u8 reg_value;
+
+                               switch (value) {
+                               case DRM_MODE_DITHERING_AUTO:
+                               case DRM_MODE_DITHERING_ON:
+                                       reg_value = BIT(0);
+                                       break;
+
+                               case DRM_MODE_DITHERING_OFF:
+                                       reg_value = 0x00;
+                                       break;
+
+                               default:
+                                       return -EINVAL;
+                               }
+                               svga_wcrt_mask(VGABASE, 0x88, reg_value, 
BIT(0));
+                       }
+               }
        }
        return 0;
 }
@@ -646,6 +658,7 @@ via_lvds_init(struct drm_device *dev)
        struct drm_via_private *dev_priv = dev->dev_private;
        bool dual_channel = false, is_msb = false;
        uint64_t dither = DRM_MODE_DITHERING_OFF;
+       struct drm_property *dithering;
        struct via_connector *con;
        struct via_encoder *enc;
        struct edid *edid;
@@ -727,12 +740,13 @@ via_lvds_init(struct drm_device *dev)
                                        dev->mode_config.scaling_mode_property,
                                        DRM_MODE_SCALE_CENTER);
 
-       drm_mode_create_dithering_property(dev);
-       drm_object_attach_property(&con->base.base,
-                                       
dev->mode_config.dithering_mode_property,
-                                       dither);
-       via_lcd_set_property(&con->base, 
dev->mode_config.dithering_mode_property,
-                               dither);
+       dithering = drm_property_create_enum(dev, 0, "dithering",
+                                            dithering_enum_list,
+                                            ARRAY_SIZE(dithering_enum_list));
+       list_add(&dithering->head, &con->props);
+
+       drm_object_attach_property(&con->base.base, dithering, dither);
+       via_lcd_set_property(&con->base, dithering, dither);
 
        /* Now setup the encoder */
        drm_encoder_init(dev, &enc->base, &via_lvds_enc_funcs,
commit ac7f86696a7968010b5c90fef9c467f9ddc9ce14
Author: James Simmons <jsimm...@infradead.org>
Date:   Sat Aug 24 12:15:25 2013 -0400

    Enable connectors to have a collection of properties

diff --git a/drivers/gpu/drm/via/via_analog.c b/drivers/gpu/drm/via/via_analog.c
index 84e7b95..5002349 100644
--- a/drivers/gpu/drm/via/via_analog.c
+++ b/drivers/gpu/drm/via/via_analog.c
@@ -123,6 +123,7 @@ via_analog_init(struct drm_device *dev)
                return;
        }
        con = &enc->cons[0];
+       INIT_LIST_HEAD(&con->props);
 
        /* Piece together our connector */
        drm_connector_init(dev, &con->base, &via_analog_connector_funcs,
diff --git a/drivers/gpu/drm/via/via_display.c 
b/drivers/gpu/drm/via/via_display.c
index 1880272..bdc2401 100644
--- a/drivers/gpu/drm/via/via_display.c
+++ b/drivers/gpu/drm/via/via_display.c
@@ -335,6 +335,13 @@ via_connector_set_property(struct drm_connector *connector,
 void
 via_connector_destroy(struct drm_connector *connector)
 {
+       struct via_connector *con = container_of(connector, struct 
via_connector, base);
+       struct drm_property *property, *tmp;
+
+       list_for_each_entry_safe(property, tmp, &con->props, head)
+               drm_property_destroy(connector->dev, property);
+       list_del(&con->props);
+
        drm_mode_connector_update_edid_property(connector, NULL);
        drm_sysfs_connector_remove(connector);
        drm_connector_cleanup(connector);
diff --git a/drivers/gpu/drm/via/via_display.h 
b/drivers/gpu/drm/via/via_display.h
index c914cd7..85d610a 100644
--- a/drivers/gpu/drm/via/via_display.h
+++ b/drivers/gpu/drm/via/via_display.h
@@ -74,6 +74,7 @@ struct via_crtc {
 struct via_connector {
        struct drm_connector base;
        struct i2c_adapter *ddc_bus;
+       struct list_head props;
        uint32_t flags;
 };
 
diff --git a/drivers/gpu/drm/via/via_hdmi.c b/drivers/gpu/drm/via/via_hdmi.c
index 8afe533..45ed77b 100644
--- a/drivers/gpu/drm/via/via_hdmi.c
+++ b/drivers/gpu/drm/via/via_hdmi.c
@@ -675,6 +675,8 @@ via_hdmi_init(struct drm_device *dev, int diport)
 
        hdmi->base.polled = DRM_CONNECTOR_POLL_HPD;
        hdmi->base.doublescan_allowed = false;
+       INIT_LIST_HEAD(&hdmi->props);
+
        switch (dev->pdev->device) {
        case PCI_DEVICE_ID_VIA_VT3157:
        case PCI_DEVICE_ID_VIA_VT1122:
@@ -694,6 +696,8 @@ via_hdmi_init(struct drm_device *dev, int diport)
 
        dvi->base.polled = DRM_CONNECTOR_POLL_HPD;
        dvi->base.doublescan_allowed = false;
+       INIT_LIST_HEAD(&dvi->props);
+
        switch (dev->pdev->device) {
        case PCI_DEVICE_ID_VIA_VT3157:
        case PCI_DEVICE_ID_VIA_VT3353:
diff --git a/drivers/gpu/drm/via/via_lvds.c b/drivers/gpu/drm/via/via_lvds.c
index 3b9e43f..3cfdcb2 100644
--- a/drivers/gpu/drm/via/via_lvds.c
+++ b/drivers/gpu/drm/via/via_lvds.c
@@ -657,6 +657,7 @@ via_lvds_init(struct drm_device *dev)
                return;
        }
        con = &enc->cons[0];
+       INIT_LIST_HEAD(&con->props);
 
        drm_connector_init(dev, &con->base, &via_lcd_connector_funcs,
                                DRM_MODE_CONNECTOR_LVDS);
diff --git a/drivers/gpu/drm/via/via_tmds.c b/drivers/gpu/drm/via/via_tmds.c
index b1e6148..86f0ef7 100644
--- a/drivers/gpu/drm/via/via_tmds.c
+++ b/drivers/gpu/drm/via/via_tmds.c
@@ -169,6 +169,7 @@ via_tmds_init(struct drm_device *dev)
        con->ddc_bus = via_find_ddc_bus(i2c_port);
        con->base.doublescan_allowed = false;
        con->base.interlace_allowed = true;
+       INIT_LIST_HEAD(&con->props);
 
        drm_mode_connector_attach_encoder(&con->base, &enc->base);
 
@@ -181,6 +182,7 @@ via_tmds_init(struct drm_device *dev)
        con->ddc_bus = via_find_ddc_bus(i2c_port);
        con->base.doublescan_allowed = false;
        con->base.interlace_allowed = true;
+       INIT_LIST_HEAD(&con->props);
 
        drm_mode_connector_attach_encoder(&con->base, &enc->base);
        return 0;
_______________________________________________
Openchrome-devel mailing list
Openchrome-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/openchrome-devel

Reply via email to