drm/radeon: Save and restore bios scratch regs during S/R
authorYang Zhao <yang@yangman.ca>
Tue, 15 Sep 2009 02:21:01 +0000 (12:21 +1000)
committerDave Airlie <airlied@linux.ie>
Wed, 16 Sep 2009 00:21:35 +0000 (10:21 +1000)
[airlied:- adapted slightly in naming]

Signed-off-by: Yang Zhao <yang@yangman.ca>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/radeon/radeon.h
drivers/gpu/drm/radeon/radeon_atombios.c
drivers/gpu/drm/radeon/radeon_device.c
drivers/gpu/drm/radeon/radeon_mode.h

index ff9e417..5bfc056 100644 (file)
@@ -75,6 +75,7 @@ extern int radeon_tv;
 #define RADEON_IB_POOL_SIZE            16
 #define RADEON_DEBUGFS_MAX_NUM_FILES   32
 #define RADEONFB_CONN_LIMIT            4
+#define RADEON_BIOS_NUM_SCRATCH                8
 
 enum radeon_family {
        CHIP_R100,
@@ -783,6 +784,7 @@ struct radeon_device {
        struct radeon_asic              *asic;
        struct radeon_gem               gem;
        struct radeon_pm                pm;
+       uint32_t                        bios_scratch[RADEON_BIOS_NUM_SCRATCH];
        struct mutex                    cs_mutex;
        struct radeon_wb                wb;
        struct radeon_dummy_page        dummy_page;
index aa756de..cb5efca 100644 (file)
@@ -1045,6 +1045,34 @@ void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev)
 
 }
 
+void radeon_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_BIOS_NUM_SCRATCH; i++)
+               rdev->bios_scratch[i] = RREG32(scratch_reg + (i * 4));
+}
+
+void radeon_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_BIOS_NUM_SCRATCH; i++)
+               WREG32(scratch_reg + (i * 4), rdev->bios_scratch[i]);
+}
+
 void radeon_atom_output_lock(struct drm_encoder *encoder, bool lock)
 {
        struct drm_device *dev = encoder->dev;
index cc8e005..db5ae73 100644 (file)
@@ -755,6 +755,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_save_bios_scratch_regs(rdev);
+
        if (!rdev->new_init_path) {
                radeon_cp_disable(rdev);
                radeon_gart_disable(rdev);
@@ -828,6 +830,7 @@ int radeon_resume_kms(struct drm_device *dev)
                radeon_resume(rdev);
        }
 out:
+       radeon_restore_bios_scratch_regs(rdev);
        fb_set_suspend(rdev->fbdev_info, 0);
        release_console_sem();
 
index 523d6cb..dde1381 100644 (file)
@@ -383,6 +383,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_save_bios_scratch_regs(struct radeon_device *rdev);
+extern void radeon_restore_bios_scratch_regs(struct radeon_device *rdev);
 extern void
 radeon_atombios_encoder_crtc_scratch_regs(struct drm_encoder *encoder, int crtc);
 extern void