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