intel_gpu_top: Wake the GT power well to read gen6 ring registers

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
This commit is contained in:
Chris Wilson 2011-01-07 19:42:29 +00:00
parent 4f20844247
commit 5503ac9e19

View File

@ -33,6 +33,9 @@
#include "intel_gpu_tools.h" #include "intel_gpu_tools.h"
#include "instdone.h" #include "instdone.h"
#define FORCEWAKE 0xA18C
#define FORCEWAKE_ACK 0x130090
#define SAMPLES_PER_SEC 10000 #define SAMPLES_PER_SEC 10000
#define SAMPLES_TO_PERCENT_RATIO (SAMPLES_PER_SEC / 100) #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]; struct top_bit *top_bits_sorted[MAX_NUM_TOP_BITS];
static uint32_t instdone, instdone1; static uint32_t instdone, instdone1;
static uint32_t devid;
static const char *bars[] = { static const char *bars[] = {
" ", " ",
@ -293,9 +297,43 @@ struct ring {
int idle; 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) 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) static void ring_reset(struct ring *ring)
@ -310,8 +348,10 @@ static void ring_sample(struct ring *ring)
if (!ring->size) if (!ring->size)
return; return;
ring->head = INREG(ring->mmio + RING_HEAD) & HEAD_ADDR; gen6_force_wake_get();
ring->tail = INREG(ring->mmio + RING_TAIL) & TAIL_ADDR; 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) if (ring->tail == ring->head)
ring->idle++; ring->idle++;
@ -352,7 +392,6 @@ int main(int argc, char **argv)
.name = "bitstream", .name = "bitstream",
.mmio = 0x12030, .mmio = 0x12030,
}; };
uint32_t devid;
int i; int i;
pci_dev = intel_get_pci_device(); pci_dev = intel_get_pci_device();