Signed-off-by: Yang Zhao <y...@yangman.ca>
---
 drivers/gpu/drm/radeon/radeon.h          |    2 ++
 drivers/gpu/drm/radeon/radeon_atombios.c |   28 ++++++++++++++++++++++++++++
 drivers/gpu/drm/radeon/radeon_device.c   |    3 +++
 drivers/gpu/drm/radeon/radeon_mode.h     |    2 ++
 4 files changed, 35 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index b1d945b..ab213d2 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -75,6 +75,7 @@ extern int radeon_connector_table;
 #define RADEON_IB_POOL_SIZE            16
 #define RADEON_DEBUGFS_MAX_NUM_FILES   32
 #define RADEONFB_CONN_LIMIT            4
+#define RADEON_ATOMBIOS_NUM_SCRATCH    8
 
 enum radeon_family {
        CHIP_R100,
@@ -689,6 +690,7 @@ struct radeon_device {
        struct radeon_asic              *asic;
        struct radeon_gem               gem;
        struct radeon_pm                pm;
+       uint32_t                        
atombios_scratch[RADEON_ATOMBIOS_NUM_SCRATCH];
        struct mutex                    cs_mutex;
        struct radeon_wb                wb;
        bool                            gpu_lockup;
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c 
b/drivers/gpu/drm/radeon/radeon_atombios.c
index fcfe5c0..2292443 100644
--- a/drivers/gpu/drm/radeon/radeon_atombios.c
+++ b/drivers/gpu/drm/radeon/radeon_atombios.c
@@ -971,6 +971,34 @@ void radeon_atom_initialize_bios_scratch_regs(struct 
drm_device *dev)
 
 }
 
+void radeon_atom_save_bios_scratch_regs(struct radeon_device *rdev)
+{
+       uint32_t scratch_reg;
+       int i;
+
+       if (rdev->family >= CHIP_R600)
+               scratch_reg = R600_BIOS_0_SCRATCH;
+       else
+               scratch_reg = RADEON_BIOS_0_SCRATCH;
+
+       for (i = 0; i < RADEON_ATOMBIOS_NUM_SCRATCH; i++)
+               rdev->atombios_scratch[i] = RREG32(scratch_reg + (i * 4));
+}
+
+void radeon_atom_restore_bios_scratch_regs(struct radeon_device *rdev)
+{
+       uint32_t scratch_reg;
+       int i;
+
+       if (rdev->family >= CHIP_R600)
+               scratch_reg = R600_BIOS_0_SCRATCH;
+       else
+               scratch_reg = RADEON_BIOS_0_SCRATCH;
+
+       for (i = 0; i < RADEON_ATOMBIOS_NUM_SCRATCH; i++)
+               WREG32(scratch_reg + (i * 4), rdev->atombios_scratch[i]);
+}
+
 void radeon_atom_output_lock(struct drm_encoder *encoder, bool lock)
 {
        struct drm_device *dev = encoder->dev;
diff --git a/drivers/gpu/drm/radeon/radeon_device.c 
b/drivers/gpu/drm/radeon/radeon_device.c
index 9ff6dcb..a43822e 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -715,6 +715,8 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t 
state)
        /* wait for gpu to finish processing current batch */
        radeon_fence_wait_last(rdev);
 
+       radeon_atom_save_bios_scratch_regs(rdev);
+
        radeon_cp_disable(rdev);
        radeon_gart_disable(rdev);
 
@@ -782,6 +784,7 @@ int radeon_resume_kms(struct drm_device *dev)
                goto out;
        }
 out:
+       radeon_atom_restore_bios_scratch_regs(rdev);
        fb_set_suspend(rdev->fbdev_info, 0);
        release_console_sem();
 
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h 
b/drivers/gpu/drm/radeon/radeon_mode.h
index 3b09a1f..9d469a8 100644
--- a/drivers/gpu/drm/radeon/radeon_mode.h
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
@@ -356,6 +356,8 @@ extern void radeon_combios_output_lock(struct drm_encoder 
*encoder, bool lock);
 extern void radeon_combios_initialize_bios_scratch_regs(struct drm_device 
*dev);
 extern void radeon_atom_output_lock(struct drm_encoder *encoder, bool lock);
 extern void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev);
+extern void radeon_atom_save_bios_scratch_regs(struct radeon_device *rdev);
+extern void radeon_atom_restore_bios_scratch_regs(struct radeon_device *rdev);
 extern void
 radeon_atombios_encoder_crtc_scratch_regs(struct drm_encoder *encoder, int 
crtc);
 extern void
-- 
1.6.3.3


------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to