diff options
| author | bjs <bjs@NetBSD.org> | 2008-06-01 12:28:09 +0000 |
|---|---|---|
| committer | bjs <bjs@NetBSD.org> | 2008-06-01 12:28:09 +0000 |
| commit | def465f1ec0db0a7574e4fbdec618bc6a9d1d335 (patch) | |
| tree | a7f99199d67264c1907d33b2e63584a6a9393e26 /sys/dev | |
| parent | 39f46f7a420477d950bfd3c19d75b527949438df (diff) | |
Use symbolic names for mem->phase, make error reporting more sensible.
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/drm/drm_netbsd.c | 26 | ||||
| -rw-r--r-- | sys/dev/drm/drm_netbsd.h | 6 |
2 files changed, 21 insertions, 11 deletions
diff --git a/sys/dev/drm/drm_netbsd.c b/sys/dev/drm/drm_netbsd.c index 1c2b3d25bf0..d4cf633f89c 100644 --- a/sys/dev/drm/drm_netbsd.c +++ b/sys/dev/drm/drm_netbsd.c @@ -1,4 +1,4 @@ -/* $NetBSD: drm_netbsd.c,v 1.1 2008/05/28 04:52:48 bjs Exp $ */ +/* $NetBSD: drm_netbsd.c,v 1.2 2008/06/01 12:28:09 bjs Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -32,6 +32,7 @@ #include <sys/cdefs.h> #include <dev/drm/drmP.h> +#include <sys/hash.h> /* XXX Most everything the DRM wants is expressed in pages. There are possible scenarios where e.g. the page size does not equal the page size of the GART, @@ -48,7 +49,7 @@ drm_dmamem_pgalloc(drm_device_t *dev, size_t pages) if (mem == NULL) return NULL; - mem->phase = 0; + mem->phase = DRM_DMAMEM_INIT; mem->dd_segs = malloc(sizeof(*mem->dd_segs) * pages, M_DRM, M_NOWAIT | M_ZERO); @@ -61,29 +62,29 @@ drm_dmamem_pgalloc(drm_device_t *dev, size_t pages) if (bus_dmamap_create(dev->pa.pa_dmat, size, pages, PAGE_SIZE, 0, BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW, &mem->dd_dmam) != 0) goto error; - mem->phase++; + mem->phase = DRM_DMAMAP_CREATE; if ((ret = bus_dmamem_alloc(dev->pa.pa_dmat, size, PAGE_SIZE, 0, mem->dd_segs, pages, &mem->dd_nsegs, BUS_DMA_NOWAIT)) != 0) { goto error; } - mem->phase++; + mem->phase = DRM_DMAMEM_ALLOC; if (bus_dmamem_map(dev->pa.pa_dmat, mem->dd_segs, mem->dd_nsegs, size, &mem->dd_kva, BUS_DMA_COHERENT|BUS_DMA_NOWAIT) != 0) goto error; - mem->phase++; + mem->phase = DRM_DMAMEM_MAP; if (bus_dmamap_load(dev->pa.pa_dmat, mem->dd_dmam, mem->dd_kva, size, NULL, BUS_DMA_NOWAIT) != 0) goto error; - mem->phase++; + mem->phase = DRM_DMAMAP_LOAD; memset(mem->dd_kva, 0, size); return mem; error: - DRM_DEBUG("allocation failed; teardown sequence follows:\n"); + mem->phase &= DRM_DMAMEM_FAIL; drm_dmamem_free(mem); return NULL; } @@ -91,10 +92,19 @@ error: void drm_dmamem_free(struct drm_dmamem *mem) { - if (mem == NULL) { + if (mem == NULL) return; + + if (mem->phase & DRM_DMAMEM_FAIL) { + DRM_DEBUG("attempted allocation failed; teardown sequence follows:\n"); + mem->phase &= ~DRM_DMAMEM_FAIL; + } else if (mem->phase & ~DRM_DMAMAP_LOAD) { + DRM_DEBUG("invoked by another function on unloaded map; teardown sequence follows:\n"); + } else { + DRM_DEBUG("freeing DMA memory; teardown sequence follows:\n"); } + switch (mem->phase) { case DRM_DMAMAP_LOAD: DRM_DEBUG("bus_dmamap_unload: tag (%p), map (%p)\n", diff --git a/sys/dev/drm/drm_netbsd.h b/sys/dev/drm/drm_netbsd.h index ed78203e835..f1d04987664 100644 --- a/sys/dev/drm/drm_netbsd.h +++ b/sys/dev/drm/drm_netbsd.h @@ -1,4 +1,4 @@ -/* $NetBSD: drm_netbsd.h,v 1.1 2008/05/28 04:52:48 bjs Exp $ */ +/* $NetBSD: drm_netbsd.h,v 1.2 2008/06/01 12:28:09 bjs Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -42,15 +42,15 @@ #define DRM_DMAMEM_ALLOC 0x002 #define DRM_DMAMEM_MAP 0x004 #define DRM_DMAMAP_LOAD 0x008 +#define DRM_DMAMEM_FAIL 0x800 #define DRM_DMAMEM_BUSADDR(__m) ((__m)->dd_dmam->dm_segs[0].ds_addr) #define DRM_DMAMEM_SEGADDR(__m, __s) ((__m)->dd_dmam->dm_segs[__s].ds_addr) #define DRM_DMAMEM_SEGSIZE(__m, __s) ((__m)->dd_dmam->dm_segs[__s].ds_len) #define DRM_DMAMEM_KERNADDR(__m) ((__m)->dd_kva) -#define RWLOCK_CONTENTION(rwlock) do { } while (!rw_tryupgrade(rwlock)) - /* for dma_lock */ +#define RWLOCK_CONTENTION(rwlock) do { } while (!rw_tryupgrade(rwlock)) struct drm_dmamem { bus_dma_tag_t dd_dmat; |
