El mar. 02 de mar. de 2010, a las 22:06:51 +0100, Rafał Miłecki escribió:
> We tried to implement interruptible waiting with timeout (it was broken
> anyway) which was not a good idea as explained by Andrew. It's possible
> to avoid using additional variable but actually it inroduces using more
> complex in-kernel tools. So simply add one variable for condition.
> 
> Signed-off-by: Rafał Miłecki <zaj...@gmail.com>
> ---

This seems to work now, although there are "not in vbl..." messages. It's
possible there are some corruptions still, but I haven't noticed any:

[  479.503327] [drm] Requested: e: 68000 m: 80000 p: 16
[  479.503339] [drm] Setting: e: 68000 m: 80000 p: 16
[  479.503383] [drm] not in vbl for pm change 00020002 00000000 at entry
[  479.503525] [drm] not in vbl for pm change 00020002 00000000 at exit
[  479.903366] [drm] Requested: e: 11000 m: 40500 p: 16
[  479.903376] [drm] Setting: e: 11000 m: 40500 p: 16
[  483.106679] [drm] Requested: e: 68000 m: 80000 p: 16
[  483.106689] [drm] Setting: e: 68000 m: 80000 p: 16
[  483.118542] [drm] not in vbl for pm change 00020002 00000000 at exit
[  483.616689] [drm] Requested: e: 11000 m: 40500 p: 16
[  483.616698] [drm] Setting: e: 11000 m: 40500 p: 16
[  483.617637] [drm] not in vbl for pm change 00020002 00000000 at exit

Tested-by: Jaime Velasco Juan <jsagarri...@gmail.com>

Thanks.

>  drivers/gpu/drm/radeon/r100.c      |    2 ++
>  drivers/gpu/drm/radeon/r600.c      |    2 ++
>  drivers/gpu/drm/radeon/radeon.h    |    1 +
>  drivers/gpu/drm/radeon/radeon_pm.c |    8 +++++---
>  drivers/gpu/drm/radeon/rs600.c     |    2 ++
>  5 files changed, 12 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
> index 91eb762..73f9a79 100644
> --- a/drivers/gpu/drm/radeon/r100.c
> +++ b/drivers/gpu/drm/radeon/r100.c
> @@ -312,10 +312,12 @@ int r100_irq_process(struct radeon_device *rdev)
>               /* Vertical blank interrupts */
>               if (status & RADEON_CRTC_VBLANK_STAT) {
>                       drm_handle_vblank(rdev->ddev, 0);
> +                     rdev->pm.vblank_sync = true;
>                       wake_up(&rdev->irq.vblank_queue);
>               }
>               if (status & RADEON_CRTC2_VBLANK_STAT) {
>                       drm_handle_vblank(rdev->ddev, 1);
> +                     rdev->pm.vblank_sync = true;
>                       wake_up(&rdev->irq.vblank_queue);
>               }
>               if (status & RADEON_FP_DETECT_STAT) {
> diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
> index c522901..5b56a1b 100644
> --- a/drivers/gpu/drm/radeon/r600.c
> +++ b/drivers/gpu/drm/radeon/r600.c
> @@ -2765,6 +2765,7 @@ restart_ih:
>                       case 0: /* D1 vblank */
>                               if (disp_int & LB_D1_VBLANK_INTERRUPT) {
>                                       drm_handle_vblank(rdev->ddev, 0);
> +                                     rdev->pm.vblank_sync = true;
>                                       wake_up(&rdev->irq.vblank_queue);
>                                       disp_int &= ~LB_D1_VBLANK_INTERRUPT;
>                                       DRM_DEBUG("IH: D1 vblank\n");
> @@ -2786,6 +2787,7 @@ restart_ih:
>                       case 0: /* D2 vblank */
>                               if (disp_int & LB_D2_VBLANK_INTERRUPT) {
>                                       drm_handle_vblank(rdev->ddev, 1);
> +                                     rdev->pm.vblank_sync = true;
>                                       wake_up(&rdev->irq.vblank_queue);
>                                       disp_int &= ~LB_D2_VBLANK_INTERRUPT;
>                                       DRM_DEBUG("IH: D2 vblank\n");
> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
> index 829e26e..0d7caee 100644
> --- a/drivers/gpu/drm/radeon/radeon.h
> +++ b/drivers/gpu/drm/radeon/radeon.h
> @@ -687,6 +687,7 @@ struct radeon_pm {
>       bool                    downclocked;
>       int                     active_crtcs;
>       int                     req_vblank;
> +     bool                    vblank_sync;
>       fixed20_12              max_bandwidth;
>       fixed20_12              igp_sideport_mclk;
>       fixed20_12              igp_system_mclk;
> diff --git a/drivers/gpu/drm/radeon/radeon_pm.c 
> b/drivers/gpu/drm/radeon/radeon_pm.c
> index d4d1c39..d800b86 100644
> --- a/drivers/gpu/drm/radeon/radeon_pm.c
> +++ b/drivers/gpu/drm/radeon/radeon_pm.c
> @@ -353,10 +353,12 @@ static void radeon_pm_set_clocks(struct radeon_device 
> *rdev)
>               rdev->pm.req_vblank |= (1 << 1);
>               drm_vblank_get(rdev->ddev, 1);
>       }
> -     if (rdev->pm.active_crtcs)
> -             wait_event_interruptible_timeout(
> -                     rdev->irq.vblank_queue, 0,
> +     if (rdev->pm.active_crtcs) {
> +             rdev->pm.vblank_sync = false;
> +             wait_event_timeout(
> +                     rdev->irq.vblank_queue, rdev->pm.vblank_sync,
>                       msecs_to_jiffies(RADEON_WAIT_VBLANK_TIMEOUT));
> +     }
>       if (rdev->pm.req_vblank & (1 << 0)) {
>               rdev->pm.req_vblank &= ~(1 << 0);
>               drm_vblank_put(rdev->ddev, 0);
> diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
> index 47f046b..ac7c27a 100644
> --- a/drivers/gpu/drm/radeon/rs600.c
> +++ b/drivers/gpu/drm/radeon/rs600.c
> @@ -392,10 +392,12 @@ int rs600_irq_process(struct radeon_device *rdev)
>               /* Vertical blank interrupts */
>               if (G_007EDC_LB_D1_VBLANK_INTERRUPT(r500_disp_int)) {
>                       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)) {
>                       drm_handle_vblank(rdev->ddev, 1);
> +                     rdev->pm.vblank_sync = true;
>                       wake_up(&rdev->irq.vblank_queue);
>               }
>               if (G_007EDC_DC_HOT_PLUG_DETECT1_INTERRUPT(r500_disp_int)) {
> -- 
> 1.6.4.2

------------------------------------------------------------------------------
Download Intel&#174; Parallel Studio Eval
Try the new software tools for yourself. Speed compiling, find bugs
proactively, and fine-tune applications for parallel performance.
See why Intel Parallel Studio got high marks during beta.
http://p.sf.net/sfu/intel-sw-dev
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to