From: Dave Airlie <airl...@linux.ie>

We really don't want to post the card at init, it takes a relatively
long time and isn't required, so split the resume path into
a startup path called by both init/resume and separate resume
entry point to do posting.

Signed-off-by: Dave Airlie <airl...@redhat.com>
---
 drivers/gpu/drm/radeon/r420.c  |   52 ++++++++++++++++++++++-----------------
 drivers/gpu/drm/radeon/r600.c  |   38 +++++++++++++++++++++++++++-
 drivers/gpu/drm/radeon/rv770.c |   38 +++++++++++++++++++++++++++-
 3 files changed, 101 insertions(+), 27 deletions(-)

diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c
index 2142a47..9b38956 100644
--- a/drivers/gpu/drm/radeon/r420.c
+++ b/drivers/gpu/drm/radeon/r420.c
@@ -157,31 +157,10 @@ static void r420_clock_resume(struct radeon_device *rdev)
        WREG32_PLL(R_00000D_SCLK_CNTL, sclk_cntl);
 }
 
-int r420_resume(struct radeon_device *rdev)
+static int r420_startup(struct radeon_device *rdev)
 {
        int r;
 
-       /* Make sur GART are not working */
-       if (rdev->flags & RADEON_IS_PCIE)
-               rv370_pcie_gart_disable(rdev);
-       if (rdev->flags & RADEON_IS_PCI)
-               r100_pci_gart_disable(rdev);
-       /* Resume clock before doing reset */
-       r420_clock_resume(rdev);
-       /* Reset gpu before posting otherwise ATOM will enter infinite loop */
-       if (radeon_gpu_reset(rdev)) {
-               dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 
0x7C0=0x%08X)\n",
-                       RREG32(R_000E40_RBBM_STATUS),
-                       RREG32(R_0007C0_CP_STAT));
-       }
-       /* check if cards are posted or not */
-       if (rdev->is_atom_bios) {
-               atom_asic_init(rdev->mode_info.atom_context);
-       } else {
-               radeon_combios_asic_init(rdev->ddev);
-       }
-       /* Resume clock after posting */
-       r420_clock_resume(rdev);
        r300_mc_program(rdev);
        /* Initialize GART (initialize after TTM so we can allocate
         * memory through TTM but finalize after TTM) */
@@ -217,6 +196,33 @@ int r420_resume(struct radeon_device *rdev)
        return 0;
 }
 
+int r420_resume(struct radeon_device *rdev)
+{
+       /* Make sur GART are not working */
+       if (rdev->flags & RADEON_IS_PCIE)
+               rv370_pcie_gart_disable(rdev);
+       if (rdev->flags & RADEON_IS_PCI)
+               r100_pci_gart_disable(rdev);
+       /* Resume clock before doing reset */
+       r420_clock_resume(rdev);
+       /* Reset gpu before posting otherwise ATOM will enter infinite loop */
+       if (radeon_gpu_reset(rdev)) {
+               dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 
0x7C0=0x%08X)\n",
+                       RREG32(R_000E40_RBBM_STATUS),
+                       RREG32(R_0007C0_CP_STAT));
+       }
+       /* check if cards are posted or not */
+       if (rdev->is_atom_bios) {
+               atom_asic_init(rdev->mode_info.atom_context);
+       } else {
+               radeon_combios_asic_init(rdev->ddev);
+       }
+       /* Resume clock after posting */
+       r420_clock_resume(rdev);
+
+       return r420_startup(rdev);
+}
+
 int r420_suspend(struct radeon_device *rdev)
 {
        r100_cp_disable(rdev);
@@ -330,7 +336,7 @@ int r420_init(struct radeon_device *rdev)
        }
        r300_set_reg_safe(rdev);
        rdev->accel_working = true;
-       r = r420_resume(rdev);
+       r = r420_startup(rdev);
        if (r) {
                /* Somethings want wront with the accel init stop accel */
                dev_err(rdev->dev, "Disabling GPU acceleration\n");
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index 15c2d68..d4076a1 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -1466,7 +1466,7 @@ bool r600_card_posted(struct radeon_device *rdev)
        return false;
 }
 
-int r600_resume(struct radeon_device *rdev)
+int r600_startup(struct radeon_device *rdev)
 {
        int r;
 
@@ -1499,6 +1499,40 @@ int r600_resume(struct radeon_device *rdev)
        return 0;
 }
 
+int r600_resume(struct radeon_device *rdev)
+{
+       int r;
+
+       if (radeon_gpu_reset(rdev)) {
+               /* FIXME: what do we want to do here ? */
+       }
+       /* post card */
+       if (rdev->is_atom_bios) {
+               atom_asic_init(rdev->mode_info.atom_context);
+       } else {
+               radeon_combios_asic_init(rdev->ddev);
+       }
+       /* Initialize clocks */
+       r = radeon_clocks_init(rdev);
+       if (r) {
+               return r;
+       }
+
+       r = r600_startup(rdev);
+       if (r) {
+               DRM_ERROR("r600 startup failed on resume\n");
+               return r;
+       }
+
+       r = radeon_ib_test(rdev);
+       if (r) {
+               DRM_ERROR("radeon: failled testing IB (%d).\n", r);
+               return r;
+       }
+       return r;
+}
+
+
 int r600_suspend(struct radeon_device *rdev)
 {
        /* FIXME: we should wait for ring to be empty */
@@ -1596,7 +1630,7 @@ int r600_init(struct radeon_device *rdev)
                return r;
        }
 
-       r = r600_resume(rdev);
+       r = r600_startup(rdev);
        if (r) {
                if (rdev->flags & RADEON_IS_AGP) {
                        /* Retry with disabling AGP */
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
index 4742762..057922c 100644
--- a/drivers/gpu/drm/radeon/rv770.c
+++ b/drivers/gpu/drm/radeon/rv770.c
@@ -851,7 +851,7 @@ int rv770_gpu_reset(struct radeon_device *rdev)
        return 0;
 }
 
-int rv770_resume(struct radeon_device *rdev)
+static int rv770_startup(struct radeon_device *rdev)
 {
        int r;
 
@@ -875,6 +875,40 @@ int rv770_resume(struct radeon_device *rdev)
        return 0;
 }
 
+int rv770_resume(struct radeon_device *rdev)
+{
+       int r;
+
+       if (radeon_gpu_reset(rdev)) {
+               /* FIXME: what do we want to do here ? */
+       }
+       /* post card */
+       if (rdev->is_atom_bios) {
+               atom_asic_init(rdev->mode_info.atom_context);
+       } else {
+               radeon_combios_asic_init(rdev->ddev);
+       }
+       /* Initialize clocks */
+       r = radeon_clocks_init(rdev);
+       if (r) {
+               return r;
+       }
+
+       r = rv770_startup(rdev);
+       if (r) {
+               DRM_ERROR("r600 startup failed on resume\n");
+               return r;
+       }
+
+       r = radeon_ib_test(rdev);
+       if (r) {
+               DRM_ERROR("radeon: failled testing IB (%d).\n", r);
+               return r;
+       }
+       return r;
+
+}
+
 int rv770_suspend(struct radeon_device *rdev)
 {
        /* FIXME: we should wait for ring to be empty */
@@ -959,7 +993,7 @@ int rv770_init(struct radeon_device *rdev)
                return r;
 
        rdev->accel_working = true;
-       r = rv770_resume(rdev);
+       r = rv770_startup(rdev);
        if (r) {
                if (rdev->flags & RADEON_IS_AGP) {
                        /* Retry with disabling AGP */
-- 
1.6.4.2


------------------------------------------------------------------------------
Come build with us! The BlackBerry&reg; Developer Conference in SF, CA
is the only developer event you need to attend this year. Jumpstart your
developing skills, take BlackBerry mobile applications to market and stay 
ahead of the curve. Join us from November 9&#45;12, 2009. Register now&#33;
http://p.sf.net/sfu/devconf
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to