aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2010-08-08 08:20:19 -0400
committerChris Wilson <chris@chris-wilson.co.uk>2010-09-07 06:14:10 -0400
commit4e6cfefc729be2aa20647415317577ed98d4f7bf (patch)
tree713999d68f48991086f925ed366b623153d0a6fb /drivers/gpu
parent52e68630d13f9668f8f4dd6978fa41039bacfaf6 (diff)
drm/i915: Re-use set_base_atomic to share setting of the display registers
Lets try to avoid repeating old bugs. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/intel_display.c80
1 files changed, 9 insertions, 71 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 334665cbe7df..cbb509383089 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -1502,7 +1502,7 @@ intel_pipe_set_base_atomic(struct drm_crtc *crtc, struct drm_framebuffer *fb,
1502 dspcntr &= ~DISPPLANE_TILED; 1502 dspcntr &= ~DISPPLANE_TILED;
1503 } 1503 }
1504 1504
1505 if (IS_IRONLAKE(dev)) 1505 if (HAS_PCH_SPLIT(dev))
1506 /* must disable */ 1506 /* must disable */
1507 dspcntr |= DISPPLANE_TRICKLE_FEED_DISABLE; 1507 dspcntr |= DISPPLANE_TRICKLE_FEED_DISABLE;
1508 1508
@@ -1511,20 +1511,19 @@ intel_pipe_set_base_atomic(struct drm_crtc *crtc, struct drm_framebuffer *fb,
1511 Start = obj_priv->gtt_offset; 1511 Start = obj_priv->gtt_offset;
1512 Offset = y * fb->pitch + x * (fb->bits_per_pixel / 8); 1512 Offset = y * fb->pitch + x * (fb->bits_per_pixel / 8);
1513 1513
1514 DRM_DEBUG("Writing base %08lX %08lX %d %d\n", Start, Offset, x, y); 1514 DRM_DEBUG_KMS("Writing base %08lX %08lX %d %d %d\n",
1515 Start, Offset, x, y, fb->pitch);
1515 I915_WRITE(dspstride, fb->pitch); 1516 I915_WRITE(dspstride, fb->pitch);
1516 if (IS_I965G(dev)) { 1517 if (IS_I965G(dev)) {
1517 I915_WRITE(dspbase, Offset);
1518 I915_READ(dspbase);
1519 I915_WRITE(dspsurf, Start); 1518 I915_WRITE(dspsurf, Start);
1520 I915_READ(dspsurf);
1521 I915_WRITE(dsptileoff, (y << 16) | x); 1519 I915_WRITE(dsptileoff, (y << 16) | x);
1520 I915_WRITE(dspbase, Offset);
1522 } else { 1521 } else {
1523 I915_WRITE(dspbase, Start + Offset); 1522 I915_WRITE(dspbase, Start + Offset);
1524 I915_READ(dspbase);
1525 } 1523 }
1524 POSTING_READ(dspbase);
1526 1525
1527 if ((IS_I965G(dev) || plane == 0)) 1526 if (IS_I965G(dev) || plane == 0)
1528 intel_update_fbc(crtc, &crtc->mode); 1527 intel_update_fbc(crtc, &crtc->mode);
1529 1528
1530 intel_wait_for_vblank(dev, intel_crtc->pipe); 1529 intel_wait_for_vblank(dev, intel_crtc->pipe);
@@ -1538,7 +1537,6 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
1538 struct drm_framebuffer *old_fb) 1537 struct drm_framebuffer *old_fb)
1539{ 1538{
1540 struct drm_device *dev = crtc->dev; 1539 struct drm_device *dev = crtc->dev;
1541 struct drm_i915_private *dev_priv = dev->dev_private;
1542 struct drm_i915_master_private *master_priv; 1540 struct drm_i915_master_private *master_priv;
1543 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 1541 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
1544 struct intel_framebuffer *intel_fb; 1542 struct intel_framebuffer *intel_fb;
@@ -1546,13 +1544,6 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
1546 struct drm_gem_object *obj; 1544 struct drm_gem_object *obj;
1547 int pipe = intel_crtc->pipe; 1545 int pipe = intel_crtc->pipe;
1548 int plane = intel_crtc->plane; 1546 int plane = intel_crtc->plane;
1549 unsigned long Start, Offset;
1550 int dspbase = (plane == 0 ? DSPAADDR : DSPBADDR);
1551 int dspsurf = (plane == 0 ? DSPASURF : DSPBSURF);
1552 int dspstride = (plane == 0) ? DSPASTRIDE : DSPBSTRIDE;
1553 int dsptileoff = (plane == 0 ? DSPATILEOFF : DSPBTILEOFF);
1554 int dspcntr_reg = (plane == 0) ? DSPACNTR : DSPBCNTR;
1555 u32 dspcntr;
1556 int ret; 1547 int ret;
1557 1548
1558 /* no fb bound */ 1549 /* no fb bound */
@@ -1588,71 +1579,18 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
1588 return ret; 1579 return ret;
1589 } 1580 }
1590 1581
1591 dspcntr = I915_READ(dspcntr_reg); 1582 ret = intel_pipe_set_base_atomic(crtc, crtc->fb, x, y);
1592 /* Mask out pixel format bits in case we change it */ 1583 if (ret) {
1593 dspcntr &= ~DISPPLANE_PIXFORMAT_MASK;
1594 switch (crtc->fb->bits_per_pixel) {
1595 case 8:
1596 dspcntr |= DISPPLANE_8BPP;
1597 break;
1598 case 16:
1599 if (crtc->fb->depth == 15)
1600 dspcntr |= DISPPLANE_15_16BPP;
1601 else
1602 dspcntr |= DISPPLANE_16BPP;
1603 break;
1604 case 24:
1605 case 32:
1606 if (crtc->fb->depth == 30)
1607 dspcntr |= DISPPLANE_32BPP_30BIT_NO_ALPHA;
1608 else
1609 dspcntr |= DISPPLANE_32BPP_NO_ALPHA;
1610 break;
1611 default:
1612 DRM_ERROR("Unknown color depth\n");
1613 i915_gem_object_unpin(obj); 1584 i915_gem_object_unpin(obj);
1614 mutex_unlock(&dev->struct_mutex); 1585 mutex_unlock(&dev->struct_mutex);
1615 return -EINVAL; 1586 return ret;
1616 }
1617 if (IS_I965G(dev)) {
1618 if (obj_priv->tiling_mode != I915_TILING_NONE)
1619 dspcntr |= DISPPLANE_TILED;
1620 else
1621 dspcntr &= ~DISPPLANE_TILED;
1622 }
1623
1624 if (HAS_PCH_SPLIT(dev))
1625 /* must disable */
1626 dspcntr |= DISPPLANE_TRICKLE_FEED_DISABLE;
1627
1628 I915_WRITE(dspcntr_reg, dspcntr);
1629
1630 Start = obj_priv->gtt_offset;
1631 Offset = y * crtc->fb->pitch + x * (crtc->fb->bits_per_pixel / 8);
1632
1633 DRM_DEBUG_KMS("Writing base %08lX %08lX %d %d %d\n",
1634 Start, Offset, x, y, crtc->fb->pitch);
1635 I915_WRITE(dspstride, crtc->fb->pitch);
1636 if (IS_I965G(dev)) {
1637 I915_WRITE(dspsurf, Start);
1638 I915_WRITE(dsptileoff, (y << 16) | x);
1639 I915_WRITE(dspbase, Offset);
1640 } else {
1641 I915_WRITE(dspbase, Start + Offset);
1642 } 1587 }
1643 POSTING_READ(dspbase);
1644
1645 if ((IS_I965G(dev) || plane == 0))
1646 intel_update_fbc(crtc, &crtc->mode);
1647
1648 intel_wait_for_vblank(dev, pipe);
1649 1588
1650 if (old_fb) { 1589 if (old_fb) {
1651 intel_fb = to_intel_framebuffer(old_fb); 1590 intel_fb = to_intel_framebuffer(old_fb);
1652 obj_priv = to_intel_bo(intel_fb->obj); 1591 obj_priv = to_intel_bo(intel_fb->obj);
1653 i915_gem_object_unpin(intel_fb->obj); 1592 i915_gem_object_unpin(intel_fb->obj);
1654 } 1593 }
1655 intel_increase_pllclock(crtc, true);
1656 1594
1657 mutex_unlock(&dev->struct_mutex); 1595 mutex_unlock(&dev->struct_mutex);
1658 1596