]> git.karo-electronics.de Git - mv-sheeva.git/commitdiff
Merge branch 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 5 Feb 2010 15:24:01 +0000 (07:24 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 5 Feb 2010 15:24:01 +0000 (07:24 -0800)
* 'drm-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6:
  drm/radeon/kms: fix r300 vram width calculations
  drm/radeon/kms: rs400/480 MC setup is different than r300.
  drm/radeon/kms: make initial state of load detect property correct.
  drm/radeon/kms: disable HDMI audio for now on rv710/rv730
  drm/radeon/kms: don't call suspend path before cleaning up GPU
  drivers/gpu/drm/radeon/radeon_combios.c: fix warning
  ati_pcigart: fix printk format warning
  drm/r100/kms: Emit cache flush to the end of command buffer. (v2)
  drm/radeon/kms: fix regression rendering issue on R6XX/R7XX
  drm/radeon/kms: move blit initialization after we disabled VGA

1  2 
drivers/gpu/drm/radeon/r600.c
drivers/gpu/drm/radeon/rv770.c

index 1b6d0001b20e86fad42fa10bd2b6483200088397,9661a469f3bd846033719147e07dce8a804a30ea..a1198d99cdf97ac7f99ea26f6a73a583e3859eb0
@@@ -674,11 -674,11 +674,11 @@@ int r600_mc_init(struct radeon_device *
                 * AGP so that GPU can catch out of VRAM/AGP access
                 */
                if (rdev->mc.gtt_location > rdev->mc.mc_vram_size) {
 -                      /* Enought place before */
 +                      /* Enough place before */
                        rdev->mc.vram_location = rdev->mc.gtt_location -
                                                        rdev->mc.mc_vram_size;
                } else if (tmp > rdev->mc.mc_vram_size) {
 -                      /* Enought place after */
 +                      /* Enough place after */
                        rdev->mc.vram_location = rdev->mc.gtt_location +
                                                        rdev->mc.gtt_size;
                } else {
@@@ -1654,6 -1654,12 +1654,12 @@@ void r600_ring_init(struct radeon_devic
        rdev->cp.align_mask = 16 - 1;
  }
  
+ void r600_cp_fini(struct radeon_device *rdev)
+ {
+       r600_cp_stop(rdev);
+       radeon_ring_fini(rdev);
+ }
  
  /*
   * GPU scratch registers helpers function.
@@@ -1861,6 -1867,12 +1867,12 @@@ int r600_startup(struct radeon_device *
                        return r;
        }
        r600_gpu_init(rdev);
+       r = r600_blit_init(rdev);
+       if (r) {
+               r600_blit_fini(rdev);
+               rdev->asic->copy = NULL;
+               dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
+       }
        /* pin copy shader into vram */
        if (rdev->r600_blit.shader_obj) {
                r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false);
@@@ -2045,19 -2057,15 +2057,15 @@@ int r600_init(struct radeon_device *rde
        r = r600_pcie_gart_init(rdev);
        if (r)
                return r;
-       r = r600_blit_init(rdev);
-       if (r) {
-               r600_blit_fini(rdev);
-               rdev->asic->copy = NULL;
-               dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
-       }
  
        rdev->accel_working = true;
        r = r600_startup(rdev);
        if (r) {
-               r600_suspend(rdev);
+               dev_err(rdev->dev, "disabling GPU acceleration\n");
+               r600_cp_fini(rdev);
                r600_wb_fini(rdev);
-               radeon_ring_fini(rdev);
+               r600_irq_fini(rdev);
+               radeon_irq_kms_fini(rdev);
                r600_pcie_gart_fini(rdev);
                rdev->accel_working = false;
        }
  
  void r600_fini(struct radeon_device *rdev)
  {
-       /* Suspend operations */
-       r600_suspend(rdev);
        r600_audio_fini(rdev);
        r600_blit_fini(rdev);
+       r600_cp_fini(rdev);
+       r600_wb_fini(rdev);
        r600_irq_fini(rdev);
        radeon_irq_kms_fini(rdev);
-       radeon_ring_fini(rdev);
-       r600_wb_fini(rdev);
        r600_pcie_gart_fini(rdev);
+       radeon_agp_fini(rdev);
        radeon_gem_fini(rdev);
        radeon_fence_driver_fini(rdev);
        radeon_clocks_fini(rdev);
-       radeon_agp_fini(rdev);
        radeon_bo_fini(rdev);
        radeon_atombios_fini(rdev);
        kfree(rdev->bios);
@@@ -2900,3 -2905,18 +2905,18 @@@ int r600_debugfs_mc_info_init(struct ra
        return 0;
  #endif
  }
+ /**
+  * r600_ioctl_wait_idle - flush host path cache on wait idle ioctl
+  * rdev: radeon device structure
+  * bo: buffer object struct which userspace is waiting for idle
+  *
+  * Some R6XX/R7XX doesn't seems to take into account HDP flush performed
+  * through ring buffer, this leads to corruption in rendering, see
+  * http://bugzilla.kernel.org/show_bug.cgi?id=15186 to avoid this we
+  * directly perform HDP flush by writing register through MMIO.
+  */
+ void r600_ioctl_wait_idle(struct radeon_device *rdev, struct radeon_bo *bo)
+ {
+       WREG32(R_005480_HDP_MEM_COHERENCY_FLUSH_CNTL, 0x1);
+ }
index afd9e8213c297adbe1ba5467bbf3b1e58b794708,c9320e7279863af35fbeb89cda96159d3f821de6..5943d561fd1e2685803175c176c0624912ff9b99
@@@ -829,11 -829,11 +829,11 @@@ int rv770_mc_init(struct radeon_device 
                 * AGP so that GPU can catch out of VRAM/AGP access
                 */
                if (rdev->mc.gtt_location > rdev->mc.mc_vram_size) {
 -                      /* Enought place before */
 +                      /* Enough place before */
                        rdev->mc.vram_location = rdev->mc.gtt_location -
                                                        rdev->mc.mc_vram_size;
                } else if (tmp > rdev->mc.mc_vram_size) {
 -                      /* Enought place after */
 +                      /* Enough place after */
                        rdev->mc.vram_location = rdev->mc.gtt_location +
                                                        rdev->mc.gtt_size;
                } else {
@@@ -887,6 -887,12 +887,12 @@@ static int rv770_startup(struct radeon_
                        return r;
        }
        rv770_gpu_init(rdev);
+       r = r600_blit_init(rdev);
+       if (r) {
+               r600_blit_fini(rdev);
+               rdev->asic->copy = NULL;
+               dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
+       }
        /* pin copy shader into vram */
        if (rdev->r600_blit.shader_obj) {
                r = radeon_bo_reserve(rdev->r600_blit.shader_obj, false);
@@@ -1055,19 -1061,15 +1061,15 @@@ int rv770_init(struct radeon_device *rd
        r = r600_pcie_gart_init(rdev);
        if (r)
                return r;
-       r = r600_blit_init(rdev);
-       if (r) {
-               r600_blit_fini(rdev);
-               rdev->asic->copy = NULL;
-               dev_warn(rdev->dev, "failed blitter (%d) falling back to memcpy\n", r);
-       }
  
        rdev->accel_working = true;
        r = rv770_startup(rdev);
        if (r) {
-               rv770_suspend(rdev);
+               dev_err(rdev->dev, "disabling GPU acceleration\n");
+               r600_cp_fini(rdev);
                r600_wb_fini(rdev);
-               radeon_ring_fini(rdev);
+               r600_irq_fini(rdev);
+               radeon_irq_kms_fini(rdev);
                rv770_pcie_gart_fini(rdev);
                rdev->accel_working = false;
        }
  
  void rv770_fini(struct radeon_device *rdev)
  {
-       rv770_suspend(rdev);
        r600_blit_fini(rdev);
+       r600_cp_fini(rdev);
+       r600_wb_fini(rdev);
        r600_irq_fini(rdev);
        radeon_irq_kms_fini(rdev);
-       radeon_ring_fini(rdev);
-       r600_wb_fini(rdev);
        rv770_pcie_gart_fini(rdev);
        radeon_gem_fini(rdev);
        radeon_fence_driver_fini(rdev);