From patchwork Wed Mar 3 22:33:39 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?b?UmFmYcWCIE1pxYJlY2tp?= X-Patchwork-Id: 83474 Received: from lists.sourceforge.net (lists.sourceforge.net [216.34.181.88]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o23MYxCr019884 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Wed, 3 Mar 2010 22:35:35 GMT Received: from localhost ([127.0.0.1] helo=sfs-ml-2.v29.ch3.sourceforge.com) by sfs-ml-2.v29.ch3.sourceforge.com with esmtp (Exim 4.69) (envelope-from ) id 1Nmx8a-0000JF-LY; Wed, 03 Mar 2010 22:33:52 +0000 Received: from sfi-mx-1.v28.ch3.sourceforge.com ([172.29.28.121] helo=mx.sourceforge.net) by sfs-ml-2.v29.ch3.sourceforge.com with esmtp (Exim 4.69) (envelope-from ) id 1Nmx8Z-0000JA-Bv for dri-devel@lists.sourceforge.net; Wed, 03 Mar 2010 22:33:51 +0000 Received-SPF: pass (sfi-mx-1.v28.ch3.sourceforge.com: domain of gmail.com designates 74.125.82.47 as permitted sender) client-ip=74.125.82.47; envelope-from=zajec5@gmail.com; helo=mail-ww0-f47.google.com; Received: from mail-ww0-f47.google.com ([74.125.82.47]) by sfi-mx-1.v28.ch3.sourceforge.com with esmtp (Exim 4.69) id 1Nmx8Y-0003cV-BH for dri-devel@lists.sourceforge.net; Wed, 03 Mar 2010 22:33:51 +0000 Received: by wwb31 with SMTP id 31so301397wwb.34 for ; Wed, 03 Mar 2010 14:33:44 -0800 (PST) Received: by 10.216.88.14 with SMTP id z14mr767826wee.129.1267655624432; Wed, 03 Mar 2010 14:33:44 -0800 (PST) Received: from localhost.localdomain (c3-107.icpnet.pl [62.21.3.107]) by mx.google.com with ESMTPS id 5sm742693eyh.3.2010.03.03.14.33.35 (version=TLSv1/SSLv3 cipher=RC4-MD5); Wed, 03 Mar 2010 14:33:36 -0800 (PST) From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= To: dri-devel@lists.sourceforge.net, Dave Airlie Subject: [RFT][PATCH] drm/radeon/kms: check for being in VBLANK on VBLANK interrupt Date: Wed, 3 Mar 2010 23:33:39 +0100 Message-Id: <1267655619-3849-1-git-send-email-zajec5@gmail.com> X-Mailer: git-send-email 1.6.4.2 X-Spam-Score: -1.5 (-) X-Spam-Report: Spam Filtering performed by mx.sourceforge.net. See http://spamassassin.org/tag/ for more details. -1.5 SPF_CHECK_PASS SPF reports sender host as permitted sender for sender-domain -0.0 SPF_PASS SPF: sender matches SPF record -0.0 DKIM_VERIFIED Domain Keys Identified Mail: signature passes verification 0.0 DKIM_SIGNED Domain Keys Identified Mail: message has a signature X-Headers-End: 1Nmx8Y-0003cV-BH Cc: Jaime Velasco Juan X-BeenThere: dri-devel@lists.sourceforge.net X-Mailman-Version: 2.1.9 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.sourceforge.net X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Wed, 03 Mar 2010 22:35:35 +0000 (UTC) diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 73f9a79..0ac1651 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c @@ -311,11 +311,15 @@ int r100_irq_process(struct radeon_device *rdev) } /* Vertical blank interrupts */ if (status & RADEON_CRTC_VBLANK_STAT) { + if (!rdev->pm.vblank_sync) + radeon_pm_debug_check_in_vbl(rdev, false); drm_handle_vblank(rdev->ddev, 0); rdev->pm.vblank_sync = true; wake_up(&rdev->irq.vblank_queue); } if (status & RADEON_CRTC2_VBLANK_STAT) { + if (!rdev->pm.vblank_sync) + radeon_pm_debug_check_in_vbl(rdev, false); drm_handle_vblank(rdev->ddev, 1); rdev->pm.vblank_sync = true; wake_up(&rdev->irq.vblank_queue); diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 5b56a1b..a98fb4e 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c @@ -2764,6 +2764,8 @@ restart_ih: switch (src_data) { case 0: /* D1 vblank */ if (disp_int & LB_D1_VBLANK_INTERRUPT) { + if (!rdev->pm.vblank_sync) + radeon_pm_debug_check_in_vbl(rdev, false); drm_handle_vblank(rdev->ddev, 0); rdev->pm.vblank_sync = true; wake_up(&rdev->irq.vblank_queue); @@ -2786,6 +2788,8 @@ restart_ih: switch (src_data) { case 0: /* D2 vblank */ if (disp_int & LB_D2_VBLANK_INTERRUPT) { + if (!rdev->pm.vblank_sync) + radeon_pm_debug_check_in_vbl(rdev, false); drm_handle_vblank(rdev->ddev, 1); rdev->pm.vblank_sync = true; wake_up(&rdev->irq.vblank_queue); diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 0d7caee..9e103ec 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h @@ -74,6 +74,8 @@ #include "radeon_mode.h" #include "radeon_reg.h" +bool radeon_pm_debug_check_in_vbl(struct radeon_device *rdev, bool finish); + /* * Modules parameters. */ diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 4f37b52..6b65f15 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c @@ -28,7 +28,6 @@ #define RADEON_RECLOCK_DELAY_MS 200 #define RADEON_WAIT_VBLANK_TIMEOUT 200 -static bool radeon_pm_debug_check_in_vbl(struct radeon_device *rdev, bool finish); static void radeon_pm_set_clocks_locked(struct radeon_device *rdev); static void radeon_pm_set_clocks(struct radeon_device *rdev); static void radeon_pm_idle_work_handler(struct work_struct *work); @@ -209,9 +208,7 @@ static void radeon_set_power_state(struct radeon_device *rdev) /* set engine clock */ radeon_sync_with_vblank(rdev); - radeon_pm_debug_check_in_vbl(rdev, false); radeon_set_engine_clock(rdev, rdev->pm.requested_clock_mode->sclk); - radeon_pm_debug_check_in_vbl(rdev, true); #if 0 /* set memory clock */ @@ -322,7 +319,7 @@ void radeon_pm_compute_clocks(struct radeon_device *rdev) mutex_unlock(&rdev->pm.mutex); } -static bool radeon_pm_debug_check_in_vbl(struct radeon_device *rdev, bool finish) +bool radeon_pm_debug_check_in_vbl(struct radeon_device *rdev, bool finish) { u32 stat_crtc1 = 0, stat_crtc2 = 0; bool in_vbl = true; diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index ac7c27a..e1935bb 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c @@ -391,11 +391,15 @@ int rs600_irq_process(struct radeon_device *rdev) radeon_fence_process(rdev); /* Vertical blank interrupts */ if (G_007EDC_LB_D1_VBLANK_INTERRUPT(r500_disp_int)) { + if (!rdev->pm.vblank_sync) + radeon_pm_debug_check_in_vbl(rdev, false); drm_handle_vblank(rdev->ddev, 0); rdev->pm.vblank_sync = true; wake_up(&rdev->irq.vblank_queue); } if (G_007EDC_LB_D2_VBLANK_INTERRUPT(r500_disp_int)) { + if (!rdev->pm.vblank_sync) + radeon_pm_debug_check_in_vbl(rdev, false); drm_handle_vblank(rdev->ddev, 1); rdev->pm.vblank_sync = true; wake_up(&rdev->irq.vblank_queue);