summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/rv770.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@linux.ie>2009-09-18 15:19:37 +1000
committerDave Airlie <airlied@redhat.com>2009-09-18 16:17:42 +1000
commitfc30b8efbe1b271eb64e0d4f6cb2a91bb57ee5f3 (patch)
tree87e0fb824b19667c2570bc99bc9ca918f4a25f6e /drivers/gpu/drm/radeon/rv770.c
parentbc1a631e5104317cc8b4ef7d14adc597f2844003 (diff)
downloadkernel-crypto-fc30b8efbe1b271eb64e0d4f6cb2a91bb57ee5f3.tar.gz
kernel-crypto-fc30b8efbe1b271eb64e0d4f6cb2a91bb57ee5f3.tar.xz
kernel-crypto-fc30b8efbe1b271eb64e0d4f6cb2a91bb57ee5f3.zip
drm/radeon/kms: move around new init path code to avoid posting at init
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 <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/rv770.c')
-rw-r--r--drivers/gpu/drm/radeon/rv770.c38
1 files changed, 36 insertions, 2 deletions
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
index 47427623a84..a6399662a84 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 */