xf86-video-intel: src/i810_reg.h src/reg_dumper/idle.c

Eric Anholt anholt at kemper.freedesktop.org
Wed Jan 30 23:09:54 PST 2008


 src/i810_reg.h        |   12 ++++++++
 src/reg_dumper/idle.c |   73 +++++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 72 insertions(+), 13 deletions(-)

New commits:
commit b1e1c7cd993ab4f1935d750eb8852e74be757e53
Author: Eric Anholt <eric at anholt.net>
Date:   Wed Jan 30 23:01:04 2008 -0800

    Add detail on different units to intel_idle.

diff --git a/src/i810_reg.h b/src/i810_reg.h
index 7902366..2893bc8 100644
--- a/src/i810_reg.h
+++ b/src/i810_reg.h
@@ -351,6 +351,18 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 #define IPEIR_I965                  0x2064 /* i965 */
 #define IPEHR_I965                  0x2068 /* i965 */
 #define INST_DONE_I965              0x206c
+# define I965_SF_DONE			(1 << 23)
+# define I965_SE_DONE			(1 << 22)
+# define I965_WM_DONE			(1 << 21)
+# define I965_TEXTURE_FETCH_DONE	(1 << 14)
+# define I965_SAMPLER_CACHE_DONE	(1 << 12)
+# define I965_FILTER_DONE		(1 << 11)
+# define I965_PS_DONE			(1 << 9)
+# define I965_CC_DONE			(1 << 8)
+# define I965_MAP_FILTER_DONE		(1 << 7)
+# define I965_MAP_L2_IDLE		(1 << 6)
+# define I965_CP_DONE			(1 << 1)
+# define I965_RING_0_ENABLE		(1 << 0)
 #define INST_PS_I965                0x2070
 
 /* Current active ring head address: 
diff --git a/src/reg_dumper/idle.c b/src/reg_dumper/idle.c
index ec083fd..0077bf4 100644
--- a/src/reg_dumper/idle.c
+++ b/src/reg_dumper/idle.c
@@ -36,13 +36,52 @@
 #include "reg_dumper.h"
 #include "../i810_reg.h"
 
+struct idle_flags {
+    uint32_t instdone_flag;
+    char *name;
+    unsigned int count;
+};
+
+struct idle_flags i965_idle_flags[] = {
+    {I965_SF_DONE, "SF"},
+    {I965_SE_DONE, "SE"},
+    {I965_WM_DONE, "WM"},
+    {I965_TEXTURE_FETCH_DONE, "texture fetch"},
+    {I965_SAMPLER_CACHE_DONE, "sampler cache"},
+    {I965_FILTER_DONE, "filter"},
+    {I965_PS_DONE, "PS"},
+    {I965_CC_DONE, "CC"},
+    {I965_MAP_FILTER_DONE, "map filter"},
+    {I965_MAP_L2_IDLE, "map L2"},
+    {I965_CP_DONE, "CP"},
+    {0, "other"},
+};
+
+/* Fills in the "other" field's idle flags */
+static void
+setup_other_flags(struct idle_flags *idle_flags, int idle_flag_count)
+{
+    uint32_t other_idle_flags;
+    int i;
+
+    other_idle_flags = ~(I965_RING_0_ENABLE);
+    for (i = 0; i < idle_flag_count - 1; i++) {
+	other_idle_flags &= ~idle_flags[i].instdone_flag;
+    }
+    idle_flags[i].instdone_flag = other_idle_flags;
+
+}
+
 int main(int argc, char **argv)
 {
     struct pci_device *dev;
     I830Rec i830;
+    I830Ptr pI830 = &i830;
     ScrnInfoRec scrn;
     int err, mmio_bar;
     void *mmio;
+    struct idle_flags *idle_flags;
+    int idle_flag_count;
 
     err = pci_system_init();
     if (err != 0) {
@@ -76,7 +115,7 @@ int main(int argc, char **argv)
 				dev->regions[mmio_bar].size, 
 				PCI_DEV_MAP_FLAG_WRITABLE,
 				&mmio);
-    
+
     if (err != 0) {
 	fprintf(stderr, "Couldn't map MMIO region: %s\n", strerror(err));
 	exit(1);
@@ -86,23 +125,31 @@ int main(int argc, char **argv)
     scrn.scrnIndex = 0;
     scrn.pI830 = &i830;
 
-    {
-        I830Ptr pI830 = I830PTR((&scrn));
+    /* if (IS_I965) { */
+    idle_flags = i965_idle_flags;
+    idle_flag_count = sizeof(i965_idle_flags) / sizeof(i965_idle_flags[0]);
+
+    setup_other_flags(idle_flags, idle_flag_count);
 
-	CARD32  idle_value = 0xffe5fafe;
+    for (;;) {
+	int i, j;
 
-	for (;;)
-	{
-	    CARD32	busy = 0;
-	    int		i;
+	for (i = 0; i < 100; i++) {
+	    uint32_t instdone = INREG(INST_DONE_I965);
 
-	    for (i = 0; i < 100; i++) {
-		if (INREG (INST_DONE_I965) != idle_value)
-		    busy++;
-		usleep (10000);
+	    for (j = 0; j < idle_flag_count; j++) {
+		if ((instdone & idle_flags[j].instdone_flag) == 0)
+		    idle_flags[j].count++;
 	    }
-	    printf ("load: %d\n", busy);
+
+	    usleep (10000);
+	}
+
+	for (j = 0; j < idle_flag_count; j++) {
+	    printf("%15s: %3d\n", idle_flags[j].name, idle_flags[j].count);
+	    idle_flags[j].count = 0;
 	}
+	printf("\n");
     }
 
     return 0;


More information about the xorg-commit mailing list