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 "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();