diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-01-07 19:42:29 +0000 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2011-01-07 19:58:55 +0000 |
commit | 5503ac9e1907ed905a29986d0db8beb468273827 (patch) | |
tree | 85475e834c6eb76fadb25c70c496fef0071f1040 /tools/intel_gpu_top.c | |
parent | 4f20844247e72811c2f3655e24cb45dc920340d6 (diff) |
intel_gpu_top: Wake the GT power well to read gen6 ring registers
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'tools/intel_gpu_top.c')
-rw-r--r-- | tools/intel_gpu_top.c | 47 |
1 files changed, 43 insertions, 4 deletions
diff --git a/tools/intel_gpu_top.c b/tools/intel_gpu_top.c index fb2cd4af..a70d7a03 100644 --- a/tools/intel_gpu_top.c +++ b/tools/intel_gpu_top.c @@ -33,6 +33,9 @@ #include "intel_gpu_tools.h" #include "instdone.h" +#define FORCEWAKE 0xA18C +#define FORCEWAKE_ACK 0x130090 + #define SAMPLES_PER_SEC 10000 #define SAMPLES_TO_PERCENT_RATIO (SAMPLES_PER_SEC / 100) @@ -47,6 +50,7 @@ struct top_bit { struct top_bit *top_bits_sorted[MAX_NUM_TOP_BITS]; static uint32_t instdone, instdone1; +static uint32_t devid; static const char *bars[] = { " ", @@ -293,9 +297,43 @@ struct ring { int idle; }; +static void gen6_force_wake_get(void) +{ + int count; + + if (!IS_GEN6(devid)) + return; + + /* This will probably have undesirable side-effects upon the system. */ + count = 0; + while (count++ < 50 && (INREG(FORCEWAKE_ACK) & 1)) + usleep(10); + + OUTREG(FORCEWAKE, 1); + + count = 0; + while (count++ < 50 && (INREG(FORCEWAKE_ACK) & 1) == 0) + usleep(10); +} + +static void gen6_force_wake_put(void) +{ + if (!IS_GEN6(devid)) + return; + + OUTREG(FORCEWAKE, 0); +} + +static uint32_t ring_read(struct ring *ring, uint32_t reg) +{ + return INREG(ring->mmio + reg); +} + static void ring_init(struct ring *ring) { - ring->size = ((INREG(ring->mmio + RING_LEN) & RING_NR_PAGES) >> 12) * 4096; + gen6_force_wake_get(); + ring->size = ((ring_read(ring, RING_LEN) & RING_NR_PAGES) >> 12) * 4096; + gen6_force_wake_put(); } static void ring_reset(struct ring *ring) @@ -310,8 +348,10 @@ static void ring_sample(struct ring *ring) if (!ring->size) return; - ring->head = INREG(ring->mmio + RING_HEAD) & HEAD_ADDR; - ring->tail = INREG(ring->mmio + RING_TAIL) & TAIL_ADDR; + gen6_force_wake_get(); + ring->head = ring_read(ring, RING_HEAD) & HEAD_ADDR; + ring->tail = ring_read(ring, RING_TAIL) & TAIL_ADDR; + gen6_force_wake_put(); if (ring->tail == ring->head) ring->idle++; @@ -352,7 +392,6 @@ int main(int argc, char **argv) .name = "bitstream", .mmio = 0x12030, }; - uint32_t devid; int i; pci_dev = intel_get_pci_device(); |