summaryrefslogtreecommitdiffstats
path: root/src/gallium/winsys/radeon
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/winsys/radeon')
-rw-r--r--src/gallium/winsys/radeon/drm/Makefile.am2
-rw-r--r--src/gallium/winsys/radeon/drm/Makefile.sources4
-rw-r--r--src/gallium/winsys/radeon/drm/radeon_ctx.h205
-rw-r--r--src/gallium/winsys/radeon/drm/radeon_drm_cs.c13
-rw-r--r--src/gallium/winsys/radeon/drm/radeon_drm_cs.h5
-rw-r--r--src/gallium/winsys/radeon/drm/radeon_drm_cs_dump.c161
6 files changed, 2 insertions, 388 deletions
diff --git a/src/gallium/winsys/radeon/drm/Makefile.am b/src/gallium/winsys/radeon/drm/Makefile.am
index 0320aca01f9..b413b0b93a0 100644
--- a/src/gallium/winsys/radeon/drm/Makefile.am
+++ b/src/gallium/winsys/radeon/drm/Makefile.am
@@ -8,5 +8,3 @@ AM_CFLAGS = \
noinst_LTLIBRARIES = libradeonwinsys.la
libradeonwinsys_la_SOURCES = $(C_SOURCES)
-
-EXTRA_DIST = $(TOOLS_HDR)
diff --git a/src/gallium/winsys/radeon/drm/Makefile.sources b/src/gallium/winsys/radeon/drm/Makefile.sources
index a00c84d35b3..2762c91e216 100644
--- a/src/gallium/winsys/radeon/drm/Makefile.sources
+++ b/src/gallium/winsys/radeon/drm/Makefile.sources
@@ -2,12 +2,8 @@ C_SOURCES := \
radeon_drm_bo.c \
radeon_drm_bo.h \
radeon_drm_cs.c \
- radeon_drm_cs_dump.c \
radeon_drm_cs.h \
radeon_drm_public.h \
radeon_drm_surface.c \
radeon_drm_winsys.c \
radeon_drm_winsys.h
-
-TOOLS_HDR := \
- radeon_ctx.h
diff --git a/src/gallium/winsys/radeon/drm/radeon_ctx.h b/src/gallium/winsys/radeon/drm/radeon_ctx.h
deleted file mode 100644
index 5618b3a8d00..00000000000
--- a/src/gallium/winsys/radeon/drm/radeon_ctx.h
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Copyright 2011 Jerome Glisse <[email protected]>
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * on the rights to use, copy, modify, merge, publish, distribute, sub
- * license, and/or sell copies of the Software, and to permit persons to whom
- * the Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- * USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- * Jérôme Glisse
- */
-#ifndef RADEON_CTX_H
-#define RADEON_CTX_H
-
-#define _FILE_OFFSET_BITS 64
-#include <sys/mman.h>
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include "xf86drm.h"
-#include "radeon_drm.h"
-
-struct ctx {
- int fd;
-};
-
-struct bo {
- uint32_t handle;
- uint32_t alignment;
- uint64_t size;
- uint64_t va;
- void *ptr;
-};
-
-static void ctx_init(struct ctx *ctx)
-{
- ctx->fd = drmOpen("radeon", NULL);
- if (ctx->fd < 0) {
- fprintf(stderr, "failed to open radeon drm device file\n");
- exit(-1);
- }
-}
-
-static void bo_wait(struct ctx *ctx, struct bo *bo)
-{
- struct drm_radeon_gem_wait_idle args;
- void *ptr;
- int r;
-
- /* Zero out args to make valgrind happy */
- memset(&args, 0, sizeof(args));
- args.handle = bo->handle;
- do {
- r = drmCommandWrite(ctx->fd, DRM_RADEON_GEM_WAIT_IDLE, &args, sizeof(args));
- } while (r == -EBUSY);
-}
-
-
-static void ctx_cs(struct ctx *ctx, uint32_t *cs, uint32_t cs_flags[2], unsigned ndw,
- struct bo **bo, uint32_t *bo_relocs, unsigned nbo)
-{
- struct drm_radeon_cs args;
- struct drm_radeon_cs_chunk chunks[3];
- uint64_t chunk_array[3];
- unsigned i;
- int r;
-
- /* update handle */
- for (i = 0; i < nbo; i++) {
- bo_relocs[i*4+0] = bo[i]->handle;
- }
-
- args.num_chunks = 2;
- if (cs_flags[0] || cs_flags[1]) {
- /* enable RADEON_CHUNK_ID_FLAGS */
- args.num_chunks = 3;
- }
- args.chunks = (uint64_t)(uintptr_t)chunk_array;
- chunks[0].chunk_id = RADEON_CHUNK_ID_IB;
- chunks[0].length_dw = ndw;
- chunks[0].chunk_data = (uintptr_t)cs;
- chunks[1].chunk_id = RADEON_CHUNK_ID_RELOCS;
- chunks[1].length_dw = nbo * 4;
- chunks[1].chunk_data = (uintptr_t)bo_relocs;
- chunks[2].chunk_id = RADEON_CHUNK_ID_FLAGS;
- chunks[2].length_dw = 2;
- chunks[2].chunk_data = (uintptr_t)cs_flags;
- chunk_array[0] = (uintptr_t)&chunks[0];
- chunk_array[1] = (uintptr_t)&chunks[1];
- chunk_array[2] = (uintptr_t)&chunks[2];
-
- fprintf(stderr, "emiting cs %ddw with %d bo\n", ndw, nbo);
- r = drmCommandWriteRead(ctx->fd, DRM_RADEON_CS, &args, sizeof(args));
- if (r) {
- fprintf(stderr, "cs submission failed with %d\n", r);
- return;
- }
-}
-
-static void bo_map(struct ctx *ctx, struct bo *bo)
-{
- struct drm_radeon_gem_mmap args;
- void *ptr;
- int r;
-
- /* Zero out args to make valgrind happy */
- memset(&args, 0, sizeof(args));
- args.handle = bo->handle;
- args.offset = 0;
- args.size = (uint64_t)bo->size;
- r = drmCommandWriteRead(ctx->fd, DRM_RADEON_GEM_MMAP, &args, sizeof(args));
- if (r) {
- fprintf(stderr, "error mapping %p 0x%08X (error = %d)\n", bo, bo->handle, r);
- exit(-1);
- }
- ptr = mmap(0, args.size, PROT_READ|PROT_WRITE, MAP_SHARED, ctx->fd, args.addr_ptr);
- if (ptr == MAP_FAILED) {
- fprintf(stderr, "%s failed to map bo\n", __func__);
- exit(-1);
- }
- bo->ptr = ptr;
-}
-
-static void bo_va(struct ctx *ctx, struct bo *bo)
-{
- struct drm_radeon_gem_va args;
- int r;
-
- args.handle = bo->handle;
- args.vm_id = 0;
- args.operation = RADEON_VA_MAP;
- args.flags = RADEON_VM_PAGE_READABLE | RADEON_VM_PAGE_WRITEABLE | RADEON_VM_PAGE_SNOOPED;
- args.offset = bo->va;
- r = drmCommandWriteRead(ctx->fd, DRM_RADEON_GEM_VA, &args, sizeof(args));
- if (r && args.operation == RADEON_VA_RESULT_ERROR) {
- fprintf(stderr, "radeon: Failed to allocate virtual address for buffer:\n");
- fprintf(stderr, "radeon: size : %d bytes\n", bo->size);
- fprintf(stderr, "radeon: alignment : %d bytes\n", bo->alignment);
- fprintf(stderr, "radeon: va : 0x%016llx\n", (unsigned long long)bo->va);
- exit(-1);
- }
-}
-
-static struct bo *bo_new(struct ctx *ctx, unsigned ndw, uint32_t *data, uint64_t va, uint32_t alignment)
-{
- struct drm_radeon_gem_create args;
- struct bo *bo;
- int r;
-
- bo = calloc(1, sizeof(*bo));
- if (bo == NULL) {
- fprintf(stderr, "failed to malloc bo struct\n");
- exit(-1);
- }
- bo->size = ndw * 4ULL;
- bo->va = va;
- bo->alignment = alignment;
-
- args.size = bo->size;
- args.alignment = bo->alignment;
- args.initial_domain = RADEON_GEM_DOMAIN_GTT;
- args.flags = 0;
- args.handle = 0;
-
- r = drmCommandWriteRead(ctx->fd, DRM_RADEON_GEM_CREATE, &args, sizeof(args));
- bo->handle = args.handle;
- if (r) {
- fprintf(stderr, "Failed to allocate :\n");
- fprintf(stderr, " size : %d bytes\n", bo->size);
- fprintf(stderr, " alignment : %d bytes\n", bo->alignment);
- free(bo);
- exit(-1);
- }
-
- if (data) {
- bo_map(ctx, bo);
- memcpy(bo->ptr, data, bo->size);
- }
-
- if (va) {
- bo_va(ctx, bo);
- }
-
- return bo;
-}
-
-
-#endif
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
index 155a13008a4..b50e19c0381 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.c
@@ -168,8 +168,7 @@ radeon_drm_cs_create(struct radeon_winsys_ctx *ctx,
enum ring_type ring_type,
void (*flush)(void *ctx, unsigned flags,
struct pipe_fence_handle **fence),
- void *flush_ctx,
- struct pb_buffer *trace_buf)
+ void *flush_ctx)
{
struct radeon_drm_winsys *ws = (struct radeon_drm_winsys*)ctx;
struct radeon_drm_cs *cs;
@@ -183,7 +182,6 @@ radeon_drm_cs_create(struct radeon_winsys_ctx *ctx,
cs->ws = ws;
cs->flush_cs = flush;
cs->flush_data = flush_ctx;
- cs->trace_buf = (struct radeon_bo*)trace_buf;
if (!radeon_init_cs_context(&cs->csc1, cs->ws)) {
FREE(cs);
@@ -439,10 +437,6 @@ void radeon_drm_cs_emit_ioctl_oneshot(struct radeon_drm_cs *cs, struct radeon_cs
}
}
- if (cs->trace_buf) {
- radeon_dump_cs_on_lockup(cs, csc);
- }
-
for (i = 0; i < csc->crelocs; i++)
p_atomic_dec(&csc->relocs_bo[i].bo->num_active_ioctls);
@@ -467,8 +461,7 @@ DEBUG_GET_ONCE_BOOL_OPTION(noop, "RADEON_NOOP", FALSE)
static void radeon_drm_cs_flush(struct radeon_winsys_cs *rcs,
unsigned flags,
- struct pipe_fence_handle **fence,
- uint32_t cs_trace_id)
+ struct pipe_fence_handle **fence)
{
struct radeon_drm_cs *cs = radeon_drm_cs(rcs);
struct radeon_cs_context *tmp;
@@ -520,8 +513,6 @@ static void radeon_drm_cs_flush(struct radeon_winsys_cs *rcs,
cs->csc = cs->cst;
cs->cst = tmp;
- cs->cst->cs_trace_id = cs_trace_id;
-
/* If the CS is not empty or overflowed, emit it in a separate thread. */
if (cs->base.cdw && cs->base.cdw <= cs->base.max_dw && !debug_get_option_noop()) {
unsigned i, crelocs;
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs.h b/src/gallium/winsys/radeon/drm/radeon_drm_cs.h
index 81f66f56d99..4ffa91ae8b2 100644
--- a/src/gallium/winsys/radeon/drm/radeon_drm_cs.h
+++ b/src/gallium/winsys/radeon/drm/radeon_drm_cs.h
@@ -43,8 +43,6 @@ struct radeon_cs_context {
uint64_t chunk_array[3];
uint32_t flags[2];
- uint32_t cs_trace_id;
-
/* Buffers. */
unsigned nrelocs;
unsigned crelocs;
@@ -80,7 +78,6 @@ struct radeon_drm_cs {
void *flush_data;
pipe_semaphore flush_completed;
- struct radeon_bo *trace_buf;
};
int radeon_lookup_buffer(struct radeon_cs_context *csc, struct radeon_bo *bo);
@@ -126,6 +123,4 @@ void radeon_drm_cs_sync_flush(struct radeon_winsys_cs *rcs);
void radeon_drm_cs_init_functions(struct radeon_drm_winsys *ws);
void radeon_drm_cs_emit_ioctl_oneshot(struct radeon_drm_cs *cs, struct radeon_cs_context *csc);
-void radeon_dump_cs_on_lockup(struct radeon_drm_cs *cs, struct radeon_cs_context *csc);
-
#endif
diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_cs_dump.c b/src/gallium/winsys/radeon/drm/radeon_drm_cs_dump.c
deleted file mode 100644
index 99585956a49..00000000000
--- a/src/gallium/winsys/radeon/drm/radeon_drm_cs_dump.c
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright © 2013 Jérôme Glisse
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS
- * AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- * USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- */
-/*
- * Authors:
- * Jérôme Glisse <[email protected]>
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <inttypes.h>
-#include <xf86drm.h>
-#include "radeon_drm_cs.h"
-#include "radeon_drm_bo.h"
-
-#define RADEON_CS_DUMP_AFTER_MS_TIMEOUT 500
-
-void radeon_dump_cs_on_lockup(struct radeon_drm_cs *cs, struct radeon_cs_context *csc)
-{
- struct drm_radeon_gem_busy args;
- FILE *dump;
- unsigned i, lockup;
- uint32_t *ptr;
- char fname[32];
-
- /* only dump the first cs to cause a lockup */
- if (!csc->crelocs) {
- /* can not determine if there was a lockup if no bo were use by
- * the cs and most likely in such case no lockup occurs
- */
- return;
- }
-
- memset(&args, 0, sizeof(args));
- args.handle = csc->relocs_bo[0].bo->handle;
- for (i = 0; i < RADEON_CS_DUMP_AFTER_MS_TIMEOUT; i++) {
- usleep(1);
- lockup = drmCommandWriteRead(csc->fd, DRM_RADEON_GEM_BUSY, &args, sizeof(args));
- if (!lockup) {
- break;
- }
- }
- if (!lockup || i < RADEON_CS_DUMP_AFTER_MS_TIMEOUT) {
- return;
- }
-
- ptr = radeon_bo_do_map(cs->trace_buf);
- fprintf(stderr, "timeout on cs lockup likely happen at cs 0x%08x dw 0x%08x\n", ptr[1], ptr[0]);
-
- if (csc->cs_trace_id != ptr[1]) {
- return;
- }
-
- /* ok we are most likely facing a lockup write the standalone replay file */
- snprintf(fname, sizeof(fname), "rlockup_0x%08x.c", csc->cs_trace_id);
- dump = fopen(fname, "w");
- if (dump == NULL) {
- return;
- }
- fprintf(dump, "/* To build this file you will need to copy radeon_ctx.h\n");
- fprintf(dump, " * in same directory. You can find radeon_ctx.h in mesa tree :\n");
- fprintf(dump, " * mesa/src/gallium/winsys/radeon/drm/radeon_ctx.h\n");
- fprintf(dump, " * Build with :\n");
- fprintf(dump, " * gcc -O0 -g `pkg-config --cflags --libs libdrm` %s -o rlockup_0x%08x \n", fname, csc->cs_trace_id);
- fprintf(dump, " */\n");
- fprintf(dump, " /* timeout on cs lockup likely happen at cs 0x%08x dw 0x%08x*/\n", ptr[1], ptr[0]);
- fprintf(dump, "#include <stdio.h>\n");
- fprintf(dump, "#include <stdint.h>\n");
- fprintf(dump, "#include \"radeon_ctx.h\"\n");
- fprintf(dump, "\n");
- fprintf(dump, "#define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))\n");
- fprintf(dump, "\n");
-
- for (i = 0; i < csc->crelocs; i++) {
- unsigned j, ndw = (csc->relocs_bo[i].bo->base.size + 3) >> 2;
-
- ptr = radeon_bo_do_map(csc->relocs_bo[i].bo);
- if (ptr) {
- fprintf(dump, "static uint32_t bo_%04d_data[%d] = {\n ", i, ndw);
- for (j = 0; j < ndw; j++) {
- if (j && !(j % 8)) {
- uint32_t offset = (j - 8) << 2;
- fprintf(dump, " /* [0x%08x] va[0x%016"PRIx64"] */\n ", offset, offset + csc->relocs_bo[i].bo->va);
- }
- fprintf(dump, " 0x%08x,", ptr[j]);
- }
- fprintf(dump, "};\n\n");
- }
- }
-
- fprintf(dump, "static uint32_t bo_relocs[%d] = {\n", csc->crelocs * 4);
- for (i = 0; i < csc->crelocs; i++) {
- fprintf(dump, " 0x%08x, 0x%08x, 0x%08x, 0x%08x,\n",
- 0, csc->relocs[i].read_domains, csc->relocs[i].write_domain, csc->relocs[i].flags);
- }
- fprintf(dump, "};\n\n");
-
- fprintf(dump, "/* cs %d dw */\n", csc->chunks[0].length_dw);
- fprintf(dump, "static uint32_t cs[] = {\n");
- ptr = csc->buf;
- for (i = 0; i < csc->chunks[0].length_dw; i++) {
- fprintf(dump, " 0x%08x,\n", ptr[i]);
- }
- fprintf(dump, "};\n\n");
-
- fprintf(dump, "static uint32_t cs_flags[2] = {\n");
- fprintf(dump, " 0x%08x,\n", csc->flags[0]);
- fprintf(dump, " 0x%08x,\n", csc->flags[1]);
- fprintf(dump, "};\n\n");
-
- fprintf(dump, "int main(int argc, char *argv[])\n");
- fprintf(dump, "{\n");
- fprintf(dump, " struct bo *bo[%d];\n", csc->crelocs);
- fprintf(dump, " struct ctx ctx;\n");
- fprintf(dump, "\n");
- fprintf(dump, " ctx_init(&ctx);\n");
- fprintf(dump, "\n");
-
- for (i = 0; i < csc->crelocs; i++) {
- unsigned ndw = (csc->relocs_bo[i].bo->base.size + 3) >> 2;
- uint32_t *ptr;
-
- ptr = radeon_bo_do_map(csc->relocs_bo[i].bo);
- if (ptr) {
- fprintf(dump, " bo[%d] = bo_new(&ctx, %d, bo_%04d_data, 0x%016"PRIx64", 0x%08x);\n",
- i, ndw, i, csc->relocs_bo[i].bo->va, csc->relocs_bo[i].bo->base.alignment);
- } else {
- fprintf(dump, " bo[%d] = bo_new(&ctx, %d, NULL, 0x%016"PRIx64", 0x%08x);\n",
- i, ndw, csc->relocs_bo[i].bo->va, csc->relocs_bo[i].bo->base.alignment);
- }
- }
- fprintf(dump, "\n");
- fprintf(dump, " ctx_cs(&ctx, cs, cs_flags, ARRAY_SIZE(cs), bo, bo_relocs, %d);\n", csc->crelocs);
- fprintf(dump, "\n");
- fprintf(dump, " fprintf(stderr, \"waiting for cs execution to end ....\\n\");\n");
- fprintf(dump, " bo_wait(&ctx, bo[0]);\n");
- fprintf(dump, "}\n");
- fclose(dump);
-}