On Mon, Dec 28, 2009 at 01:32:24PM -0500, Alex Deucher wrote:
> 2009/12/28 Luca Tettamanti <[email protected]>:
> > 2009/12/28 Alex Deucher <[email protected]>:
> >> On Mon, Dec 28, 2009 at 5:53 AM, Luca Tettamanti <[email protected]> 
> >> wrote:
> >>> On Sun, Dec 27, 2009 at 1:55 AM, Rafał Miłecki <[email protected]> wrote:
> >>>> W dniu 26 grudnia 2009 20:08 użytkownik Alex Deucher
> >>>> <[email protected]> napisał:
> >>>>> It may be that the engine doesn't like to be reclocked while it's
> >>>>> running.  Perhaps we should use the GUI idle interrupt rather than
> >>>>> vblanks to reclock the engine.
> >>>>
> >>>> Could you say something more about GUI idle interrupt, please?
> >>>
> >>> It's mentioned in the documentation of the IH (see r600.c); I guess
> >>> it's enabled by GUI_IDLE_INT_ENABLE.
> >>>
> >>>> What is this, do we already have code for that?
> >>>
> >>> Unless there are more subtleties all is needed it to enabled the
> >>> interrupt and catch it in r600_irq_process.
> >>
> >> That's pretty much it.  Pre-r6xx asics have a GUI interrupt as well.
> >> I can look up the details for that if they are not already documented.
> >
> > I can't find a way to ack the interrupt; I see
> > RADEON_GUI_IDLE_INT_TEST_ACK but I think it's for pre-r6xx cards,
> > right?
> 
> You don't have to ACK it as the CP generates the interrupt in
> software; similar to the sw interrupts used for fences.

Ok, good: I've got the stub running on my M76. r100 and rs600 parts are
untested. Comments?

--- linux-2.6.git.orig/drivers/gpu/drm/radeon/r600.c    2009-12-28 
16:38:38.388825742 +0100
+++ linux-2.6.git/drivers/gpu/drm/radeon/r600.c 2009-12-28 22:03:12.936157804 
+0100
@@ -2458,6 +2458,7 @@
 int r600_irq_set(struct radeon_device *rdev)
 {
        u32 cp_int_cntl = CNTX_BUSY_INT_ENABLE | CNTX_EMPTY_INT_ENABLE;
+       u32 grbm_int_cntl;
        u32 mode_int = 0;
        u32 hpd1, hpd2, hpd3, hpd4 = 0, hpd5 = 0, hpd6 = 0;
 
@@ -2465,6 +2466,8 @@
        if (!rdev->ih.enabled)
                return 0;
 
+       grbm_int_cntl = RREG32(GRBM_INT_CNTL) & ~GUI_IDLE_INT_ENABLE;
+
        if (ASIC_IS_DCE3(rdev)) {
                hpd1 = RREG32(DC_HPD1_INT_CONTROL) & ~DC_HPDx_INT_EN;
                hpd2 = RREG32(DC_HPD2_INT_CONTROL) & ~DC_HPDx_INT_EN;
@@ -2484,6 +2487,10 @@
                DRM_DEBUG("r600_irq_set: sw int\n");
                cp_int_cntl |= RB_INT_ENABLE;
        }
+       if (rdev->irq.idle_int) {
+               DRM_DEBUG("r600_irq_set: GUI idle int\n");
+               grbm_int_cntl |= GUI_IDLE_INT_ENABLE;
+       }
        if (rdev->irq.crtc_vblank_int[0]) {
                DRM_DEBUG("r600_irq_set: vblank 0\n");
                mode_int |= D1MODE_VBLANK_INT_MASK;
@@ -2518,6 +2525,7 @@
        }
 
        WREG32(CP_INT_CNTL, cp_int_cntl);
+       WREG32(GRBM_INT_CNTL, grbm_int_cntl);
        WREG32(DxMODE_INT_MASK, mode_int);
        if (ASIC_IS_DCE3(rdev)) {
                WREG32(DC_HPD1_INT_CONTROL, hpd1);
@@ -2806,6 +2814,9 @@
                case 181: /* CP EOP event */
                        DRM_DEBUG("IH: CP EOP\n");
                        break;
+               case 233: /* GUI idle event */
+                       DRM_DEBUG("IH: GUI idle\n");
+                       break;
                default:
                        DRM_ERROR("Unhandled interrupt: %d %d\n", src_id, 
src_data);
                        break;
--- linux-2.6.git.orig/drivers/gpu/drm/radeon/radeon.h  2009-12-28 
16:38:13.945836481 +0100
+++ linux-2.6.git/drivers/gpu/drm/radeon/radeon.h       2009-12-28 
22:02:48.964001788 +0100
@@ -343,6 +343,7 @@
 struct radeon_irq {
        bool            installed;
        bool            sw_int;
+       bool            idle_int;
        /* FIXME: use a define max crtc rather than hardcode it */
        bool            crtc_vblank_int[2];
        /* FIXME: use defines for max hpd/dacs */
--- linux-2.6.git.orig/drivers/gpu/drm/radeon/radeon_irq_kms.c  2009-12-28 
16:37:10.669823739 +0100
+++ linux-2.6.git/drivers/gpu/drm/radeon/radeon_irq_kms.c       2009-12-28 
22:03:01.508077338 +0100
@@ -67,6 +67,7 @@
 
        /* Disable *all* interrupts */
        rdev->irq.sw_int = false;
+       rdev->irq.idle_int = false;
        for (i = 0; i < 2; i++) {
                rdev->irq.crtc_vblank_int[i] = false;
        }
@@ -81,6 +82,7 @@
 
        dev->max_vblank_count = 0x001fffff;
        rdev->irq.sw_int = true;
+       rdev->irq.idle_int = true;
        radeon_irq_set(rdev);
        return 0;
 }
@@ -95,6 +97,7 @@
        }
        /* Disable *all* interrupts */
        rdev->irq.sw_int = false;
+       rdev->irq.idle_int = false;
        for (i = 0; i < 2; i++) {
                rdev->irq.crtc_vblank_int[i] = false;
        }
--- linux-2.6.git.orig/drivers/gpu/drm/radeon/r100.c    2009-12-28 
22:30:59.079748392 +0100
+++ linux-2.6.git/drivers/gpu/drm/radeon/r100.c 2009-12-28 22:41:07.803741755 
+0100
@@ -246,6 +246,9 @@
        if (rdev->irq.sw_int) {
                tmp |= RADEON_SW_INT_ENABLE;
        }
+       if (rdev->irq.idle_int) {
+               tmp |= RADEON_GUI_IDLE_INT_ENABLE;
+       }
        if (rdev->irq.crtc_vblank_int[0]) {
                tmp |= RADEON_CRTC_VBLANK_MASK;
        }
@@ -278,7 +281,8 @@
        uint32_t irqs = RREG32(RADEON_GEN_INT_STATUS);
        uint32_t irq_mask = RADEON_SW_INT_TEST |
                RADEON_CRTC_VBLANK_STAT | RADEON_CRTC2_VBLANK_STAT |
-               RADEON_FP_DETECT_STAT | RADEON_FP2_DETECT_STAT;
+               RADEON_FP_DETECT_STAT | RADEON_FP2_DETECT_STAT |
+               RADEON_GUI_IDLE_INT_TEST_ACK;
 
        if (irqs) {
                WREG32(RADEON_GEN_INT_STATUS, irqs);
@@ -318,6 +322,9 @@
                        queue_hotplug = true;
                        DRM_DEBUG("HPD2\n");
                }
+               if (status & RADEON_GUI_IDLE_INT_TEST_ACK) {
+                       DRM_DEBUG("GUI idle\n");
+               }
                status = r100_irq_ack(rdev);
        }
        if (queue_hotplug)
--- linux-2.6.git.orig/drivers/gpu/drm/radeon/rs600.c   2009-12-28 
22:32:30.927884090 +0100
+++ linux-2.6.git/drivers/gpu/drm/radeon/rs600.c        2009-12-28 
22:46:23.211897501 +0100
@@ -318,6 +318,9 @@
        if (rdev->irq.sw_int) {
                tmp |= S_000040_SW_INT_EN(1);
        }
+       if (rdev->irq.idle_int) {
+               tmp |= S_000040_GUI_IDLE(1);
+       }
        if (rdev->irq.crtc_vblank_int[0]) {
                mode_int |= S_006540_D1MODE_VBLANK_INT_MASK(1);
        }
@@ -411,6 +414,9 @@
                        queue_hotplug = true;
                        DRM_DEBUG("HPD2\n");
                }
+               if (G_000044_GUI_IDLE_STAT(status)) {
+                       DRM_DEBUG("GUI idle\n");
+               }
                status = rs600_irq_ack(rdev, &r500_disp_int);
        }
        if (queue_hotplug)
--- linux-2.6.git.orig/drivers/gpu/drm/radeon/radeon_reg.h      2009-12-28 
22:44:44.080738247 +0100
+++ linux-2.6.git/drivers/gpu/drm/radeon/radeon_reg.h   2009-12-28 
22:45:50.579740220 +0100
@@ -994,6 +994,7 @@
 #      define RADEON_FP_DETECT_MASK            (1 << 4)
 #      define RADEON_CRTC2_VBLANK_MASK         (1 << 9)
 #      define RADEON_FP2_DETECT_MASK           (1 << 10)
+#      define RADEON_GUI_IDLE_INT_ENABLE       (1 << 19)
 #      define RADEON_SW_INT_ENABLE             (1 << 25)
 #define RADEON_GEN_INT_STATUS               0x0044
 #      define AVIVO_DISPLAY_INT_STATUS         (1 << 0)
@@ -1005,6 +1006,7 @@
 #      define RADEON_CRTC2_VBLANK_STAT_ACK     (1 << 9)
 #      define RADEON_FP2_DETECT_STAT           (1 << 10)
 #      define RADEON_FP2_DETECT_STAT_ACK       (1 << 10)
+#      define RADEON_GUI_IDLE_INT_TEST_ACK     (1 << 19)
 #      define RADEON_SW_INT_FIRE               (1 << 26)
 #      define RADEON_SW_INT_TEST               (1 << 25)
 #      define RADEON_SW_INT_TEST_ACK           (1 << 25)


Luca

------------------------------------------------------------------------------
This SF.Net email is sponsored by the Verizon Developer Community
Take advantage of Verizon's best-in-class app development support
A streamlined, 14 day to market process makes app distribution fast and easy
Join now and get one step closer to millions of Verizon customers
http://p.sf.net/sfu/verizon-dev2dev 
--
_______________________________________________
Dri-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to