diff options
Diffstat (limited to 'overlay/gpu-top.c')
-rw-r--r-- | overlay/gpu-top.c | 167 |
1 files changed, 1 insertions, 166 deletions
diff --git a/overlay/gpu-top.c b/overlay/gpu-top.c index 61b8f62f..6cec2e94 100644 --- a/overlay/gpu-top.c +++ b/overlay/gpu-top.c @@ -33,7 +33,6 @@ #include "igt_perf.h" -#include "igfx.h" #include "gpu-top.h" #define RING_TAIL 0x00 @@ -99,176 +98,12 @@ static int perf_init(struct gpu_top *gt) return 0; } -struct mmio_ring { - int id; - uint32_t base; - void *mmio; - int idle, wait, sema; -}; - -static uint32_t mmio_ring_read(struct mmio_ring *ring, uint32_t reg) -{ - return igfx_read(ring->mmio, ring->base + reg); -} - -static int has_execlists(void) -{ - int detected = 0; - FILE *file; - - file = fopen("/sys/module/i915/parameters/enable_execlists", "r"); - if (file) { - int value; - if (fscanf(file, "%d", &value) == 1) - detected = value != 0; - fclose(file); - } - - return detected; - -} - -static void mmio_ring_init(struct mmio_ring *ring, void *mmio) -{ - uint32_t ctl; - - ring->mmio = mmio; - - ctl = mmio_ring_read(ring, RING_CTL); - if ((ctl & 1) == 0 && !has_execlists()) - ring->id = -1; -} - -static void mmio_ring_reset(struct mmio_ring *ring) -{ - ring->idle = 0; - ring->wait = 0; - ring->sema = 0; -} - -static void mmio_ring_sample(struct mmio_ring *ring) -{ - uint32_t head, tail, ctl; - - if (ring->id == -1) - return; - - head = mmio_ring_read(ring, RING_HEAD) & ADDR_MASK; - tail = mmio_ring_read(ring, RING_TAIL) & ADDR_MASK; - ring->idle += head == tail; - - ctl = mmio_ring_read(ring, RING_CTL); - ring->wait += !!(ctl & RING_WAIT); - ring->sema += !!(ctl & RING_WAIT_SEMAPHORE); -} - -static void mmio_ring_emit(struct mmio_ring *ring, int samples, union gpu_top_payload *payload) -{ - if (ring->id == -1) - return; - - payload[ring->id].u.busy = 100 - 100 * ring->idle / samples; - payload[ring->id].u.wait = 100 * ring->wait / samples; - payload[ring->id].u.sema = 100 * ring->sema / samples; -} - -static void mmio_init(struct gpu_top *gt) -{ - struct mmio_ring render_ring = { - .base = 0x2030, - .id = 0, - }, bsd_ring = { - .base = 0x4030, - .id = 1, - }, bsd6_ring = { - .base = 0x12030, - .id = 1, - }, blt_ring = { - .base = 0x22030, - .id = 2, - }; - const struct igfx_info *info; - struct pci_device *igfx; - void *mmio; - int fd[2], i; - - igfx = igfx_get(); - if (!igfx) - return; - - if (pipe(fd) < 0) - return; - - info = igfx_get_info(igfx); - - switch (fork()) { - case -1: return; - default: - fcntl(fd[0], F_SETFL, fcntl(fd[0], F_GETFL) | O_NONBLOCK); - gt->fd = fd[0]; - gt->type = MMIO; - gt->ring[0].name = "render"; - gt->num_rings = 1; - if (info->gen >= 040) { - gt->ring[1].name = "bitstream"; - gt->num_rings++; - } - if (info->gen >= 060) { - gt->ring[2].name = "blt"; - gt->num_rings++; - } - close(fd[1]); - return; - case 0: - close(fd[0]); - break; - } - - mmio = igfx_get_mmio(igfx); - if (mmio == NULL) - exit(127); - - mmio_ring_init(&render_ring, mmio); - if (info->gen >= 060) { - bsd_ring = bsd6_ring; - mmio_ring_init(&blt_ring, mmio); - } - if (info->gen >= 040) { - mmio_ring_init(&bsd_ring, mmio); - } - - for (;;) { - union gpu_top_payload payload[MAX_RINGS]; - - mmio_ring_reset(&render_ring); - mmio_ring_reset(&bsd_ring); - mmio_ring_reset(&blt_ring); - - for (i = 0; i < 1000; i++) { - mmio_ring_sample(&render_ring); - mmio_ring_sample(&bsd_ring); - mmio_ring_sample(&blt_ring); - usleep(1000); - } - - memset(payload, 0, sizeof(payload)); - mmio_ring_emit(&render_ring, 1000, payload); - mmio_ring_emit(&bsd_ring, 1000, payload); - mmio_ring_emit(&blt_ring, 1000, payload); - assert(write(fd[1], payload, sizeof(payload)) - == sizeof(payload)); - } -} - void gpu_top_init(struct gpu_top *gt) { memset(gt, 0, sizeof(*gt)); gt->fd = -1; - if (perf_init(gt) == 0) - return; - - mmio_init(gt); + perf_init(gt); } int gpu_top_update(struct gpu_top *gt) |