On Fri, Aug 14, 2009 at 5:09 PM, Yang Zhao<y...@yangman.ca> wrote:
> 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   |    5 +++++
>  drivers/gpu/drm/radeon/radeon_mode.h     |    2 ++
>  4 files changed, 37 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..4d9baff 100644
> --- a/drivers/gpu/drm/radeon/radeon_device.c
> +++ b/drivers/gpu/drm/radeon/radeon_device.c
> @@ -715,6 +715,9 @@ 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);
>
> +       if (rdev->is_atom_bios)
> +               radeon_atom_save_bios_scratch_regs(rdev);
> +
>        radeon_cp_disable(rdev);
>        radeon_gart_disable(rdev);
>
> @@ -782,6 +785,8 @@ int radeon_resume_kms(struct drm_device *dev)
>                goto out;
>        }
>  out:
> +       if (rdev->is_atom_bios)
> +               radeon_atom_restore_bios_scratch_regs(rdev);
>        fb_set_suspend(rdev->fbdev_info, 0);
>        release_console_sem();
>

We need to save/restore the scratch regs on atom and pre-atom cards.
Other than that, looks good.  We should also probably re-probe on
resume in case the user has changed monitors during suspend.

Alex


> 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
>

------------------------------------------------------------------------------
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