summaryrefslogtreecommitdiff
path: root/overlay/gpu-top.c
diff options
context:
space:
mode:
Diffstat (limited to 'overlay/gpu-top.c')
-rw-r--r--overlay/gpu-top.c167
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)