summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorbjs <bjs@NetBSD.org>2008-06-01 12:28:09 +0000
committerbjs <bjs@NetBSD.org>2008-06-01 12:28:09 +0000
commitdef465f1ec0db0a7574e4fbdec618bc6a9d1d335 (patch)
treea7f99199d67264c1907d33b2e63584a6a9393e26 /sys/dev
parent39f46f7a420477d950bfd3c19d75b527949438df (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.c26
-rw-r--r--sys/dev/drm/drm_netbsd.h6
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;