diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2010-08-08 08:20:19 -0400 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2010-09-07 06:14:10 -0400 |
commit | 4e6cfefc729be2aa20647415317577ed98d4f7bf (patch) | |
tree | 713999d68f48991086f925ed366b623153d0a6fb /drivers/gpu | |
parent | 52e68630d13f9668f8f4dd6978fa41039bacfaf6 (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.c | 80 |
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 | ||