drm/radeon: Save and restore bios scratch regs during S/R
[airlied:- adapted slightly in naming] Signed-off-by: Yang Zhao <yang@yangman.ca> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Родитель
ecb114a128
Коммит
f657c2a731
|
@ -75,6 +75,7 @@ extern int radeon_tv;
|
||||||
#define RADEON_IB_POOL_SIZE 16
|
#define RADEON_IB_POOL_SIZE 16
|
||||||
#define RADEON_DEBUGFS_MAX_NUM_FILES 32
|
#define RADEON_DEBUGFS_MAX_NUM_FILES 32
|
||||||
#define RADEONFB_CONN_LIMIT 4
|
#define RADEONFB_CONN_LIMIT 4
|
||||||
|
#define RADEON_BIOS_NUM_SCRATCH 8
|
||||||
|
|
||||||
enum radeon_family {
|
enum radeon_family {
|
||||||
CHIP_R100,
|
CHIP_R100,
|
||||||
|
@ -783,6 +784,7 @@ struct radeon_device {
|
||||||
struct radeon_asic *asic;
|
struct radeon_asic *asic;
|
||||||
struct radeon_gem gem;
|
struct radeon_gem gem;
|
||||||
struct radeon_pm pm;
|
struct radeon_pm pm;
|
||||||
|
uint32_t bios_scratch[RADEON_BIOS_NUM_SCRATCH];
|
||||||
struct mutex cs_mutex;
|
struct mutex cs_mutex;
|
||||||
struct radeon_wb wb;
|
struct radeon_wb wb;
|
||||||
struct radeon_dummy_page dummy_page;
|
struct radeon_dummy_page dummy_page;
|
||||||
|
|
|
@ -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)
|
void radeon_atom_output_lock(struct drm_encoder *encoder, bool lock)
|
||||||
{
|
{
|
||||||
struct drm_device *dev = encoder->dev;
|
struct drm_device *dev = encoder->dev;
|
||||||
|
|
|
@ -755,6 +755,8 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state)
|
||||||
/* wait for gpu to finish processing current batch */
|
/* wait for gpu to finish processing current batch */
|
||||||
radeon_fence_wait_last(rdev);
|
radeon_fence_wait_last(rdev);
|
||||||
|
|
||||||
|
radeon_save_bios_scratch_regs(rdev);
|
||||||
|
|
||||||
if (!rdev->new_init_path) {
|
if (!rdev->new_init_path) {
|
||||||
radeon_cp_disable(rdev);
|
radeon_cp_disable(rdev);
|
||||||
radeon_gart_disable(rdev);
|
radeon_gart_disable(rdev);
|
||||||
|
@ -828,6 +830,7 @@ int radeon_resume_kms(struct drm_device *dev)
|
||||||
radeon_resume(rdev);
|
radeon_resume(rdev);
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
|
radeon_restore_bios_scratch_regs(rdev);
|
||||||
fb_set_suspend(rdev->fbdev_info, 0);
|
fb_set_suspend(rdev->fbdev_info, 0);
|
||||||
release_console_sem();
|
release_console_sem();
|
||||||
|
|
||||||
|
|
|
@ -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_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_output_lock(struct drm_encoder *encoder, bool lock);
|
||||||
extern void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev);
|
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
|
extern void
|
||||||
radeon_atombios_encoder_crtc_scratch_regs(struct drm_encoder *encoder, int crtc);
|
radeon_atombios_encoder_crtc_scratch_regs(struct drm_encoder *encoder, int crtc);
|
||||||
extern void
|
extern void
|
||||||
|
|
Загрузка…
Ссылка в новой задаче