Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 19 Aug 2003 10:39:34 -0700 (PDT)
From:      Sam Leffler <sam@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 36433 for review
Message-ID:  <200308191739.h7JHdYTN027544@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=36433

Change 36433 by sam@sam_ebb on 2003/08/19 10:38:35

	IFC

Affected files ...

.. //depot/projects/netperf/sys/dev/acpica/acpiio.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/ati_pcigart.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/drm.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/drmP.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/drm_agpsupport.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/drm_auth.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/drm_bufs.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/drm_context.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/drm_dma.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/drm_drawable.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/drm_drv.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/drm_fops.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/drm_ioctl.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/drm_lock.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/drm_memory.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/drm_memory_debug.h#1 branch
.. //depot/projects/netperf/sys/dev/drm/drm_os_freebsd.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/drm_pci.h#1 branch
.. //depot/projects/netperf/sys/dev/drm/drm_sarea.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/drm_scatter.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/drm_sysctl.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/drm_vm.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/mga.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/mga_dma.c#2 integrate
.. //depot/projects/netperf/sys/dev/drm/mga_drv.c#2 integrate
.. //depot/projects/netperf/sys/dev/drm/mga_drv.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/mga_irq.c#2 integrate
.. //depot/projects/netperf/sys/dev/drm/mga_warp.c#2 integrate
.. //depot/projects/netperf/sys/dev/drm/r128.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/r128_cce.c#2 integrate
.. //depot/projects/netperf/sys/dev/drm/r128_drm.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/r128_drv.c#2 integrate
.. //depot/projects/netperf/sys/dev/drm/r128_drv.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/r128_irq.c#2 integrate
.. //depot/projects/netperf/sys/dev/drm/r128_state.c#2 integrate
.. //depot/projects/netperf/sys/dev/drm/radeon.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/radeon_cp.c#2 integrate
.. //depot/projects/netperf/sys/dev/drm/radeon_drm.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/radeon_drv.c#2 integrate
.. //depot/projects/netperf/sys/dev/drm/radeon_drv.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/radeon_irq.c#2 integrate
.. //depot/projects/netperf/sys/dev/drm/radeon_state.c#2 integrate
.. //depot/projects/netperf/sys/dev/drm/tdfx.h#2 integrate
.. //depot/projects/netperf/sys/dev/drm/tdfx_drv.c#2 integrate
.. //depot/projects/netperf/sys/dev/ep/if_ep.c#2 integrate
.. //depot/projects/netperf/sys/dev/firewire/firewire.h#3 integrate
.. //depot/projects/netperf/sys/dev/firewire/fwohci.c#4 integrate
.. //depot/projects/netperf/sys/dev/firewire/if_fwe.c#3 integrate
.. //depot/projects/netperf/sys/dev/pccbb/pccbb.c#4 integrate
.. //depot/projects/netperf/sys/dev/sound/pcm/channel.c#2 integrate
.. //depot/projects/netperf/sys/dev/sound/pcm/sound.c#2 integrate
.. //depot/projects/netperf/sys/dev/sound/pcm/sound.h#2 integrate
.. //depot/projects/netperf/sys/dev/twe/twe.c#4 integrate
.. //depot/projects/netperf/sys/fs/pseudofs/pseudofs_vnops.c#3 integrate
.. //depot/projects/netperf/sys/i386/i386/busdma_machdep.c#5 integrate
.. //depot/projects/netperf/sys/net/if_ethersubr.c#3 integrate
.. //depot/projects/netperf/sys/net/radix.h#3 integrate
.. //depot/projects/netperf/sys/netinet/ip_mroute.c#4 integrate
.. //depot/projects/netperf/sys/netinet/udp_usrreq.c#3 integrate
.. //depot/projects/netperf/sys/pci/if_sis.c#7 integrate
.. //depot/projects/netperf/sys/sys/malloc.h#3 integrate
.. //depot/projects/netperf/sys/vm/vnode_pager.c#4 integrate

Differences ...

==== //depot/projects/netperf/sys/dev/acpica/acpiio.h#2 (text+ko) ====

@@ -1,5 +1,5 @@
 /*-
- * Copyright (c) 1999 Takanori Watanabe <takawata@shidahara1.planet.sci.kobe-u.ac.jp>
+ * Copyright (c) 1999 Takanori Watanabe <takawata@jp.freebsd.org>
  * Copyright (c) 1999 Mitsuru IWASAKI <iwasaki@FreeBSD.org>
  * All rights reserved.
  *
@@ -24,7 +24,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *	$FreeBSD: src/sys/dev/acpica/acpiio.h,v 1.6 2002/08/09 07:08:53 iwasaki Exp $
+ *	$FreeBSD: src/sys/dev/acpica/acpiio.h,v 1.7 2003/08/19 01:54:34 takawata Exp $
  */
 
 /*

==== //depot/projects/netperf/sys/dev/drm/ati_pcigart.h#2 (text+ko) ====

@@ -26,7 +26,7 @@
  * Authors:
  *   Gareth Hughes <gareth@valinux.com>
  *
- * $FreeBSD: src/sys/dev/drm/ati_pcigart.h,v 1.1 2003/03/09 02:08:28 anholt Exp $
+ * $FreeBSD: src/sys/dev/drm/ati_pcigart.h,v 1.2 2003/08/19 02:57:31 anholt Exp $
  */
 
 #include "dev/drm/drmP.h"
@@ -86,6 +86,8 @@
 		}
 	}
 
+	DRM_MEMORYBARRIER();
+
 	ret = 1;
 
 done:

==== //depot/projects/netperf/sys/dev/drm/drm.h#2 (text+ko) ====

@@ -30,7 +30,7 @@
  * Acknowledgements:
  * Dec 1999, Richard Henderson <rth@twiddle.net>, move to generic cmpxchg.
  *
- * $FreeBSD: src/sys/dev/drm/drm.h,v 1.3 2003/03/09 02:08:28 anholt Exp $
+ * $FreeBSD: src/sys/dev/drm/drm.h,v 1.4 2003/08/19 02:57:31 anholt Exp $
  */
 
 #ifndef _DRM_H_
@@ -45,7 +45,7 @@
 #define DRM_IOC_WRITE		_IOC_WRITE
 #define DRM_IOC_READWRITE	_IOC_READ|_IOC_WRITE
 #define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size)
-#elif defined(__FreeBSD__) || defined(__NetBSD__)
+#elif defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
 #if defined(__FreeBSD__) && defined(XFree86Server)
 /* Prevent name collision when including sys/ioccom.h */
 #undef ioctl

==== //depot/projects/netperf/sys/dev/drm/drmP.h#2 (text+ko) ====

@@ -27,7 +27,8 @@
  * Authors:
  *    Rickard E. (Rik) Faith <faith@valinux.com>
  *    Gareth Hughes <gareth@valinux.com>
- * $FreeBSD: src/sys/dev/drm/drmP.h,v 1.4 2003/04/25 01:18:46 anholt Exp $
+ *
+ * $FreeBSD: src/sys/dev/drm/drmP.h,v 1.5 2003/08/19 02:57:31 anholt Exp $
  */
 
 #ifndef _DRM_P_H_
@@ -101,13 +102,13 @@
 #define DRM_MAX_CTXBITMAP (PAGE_SIZE * 8)
 
 				/* Mapping helper macros */
-#define DRM_IOREMAP(map)						\
+#define DRM_IOREMAP(map, dev)						\
 	(map)->handle = DRM(ioremap)( dev, map )
 
-#define DRM_IOREMAP_NOCACHE(map)					\
+#define DRM_IOREMAP_NOCACHE(map, dev)					\
 	(map)->handle = DRM(ioremap_nocache)( dev, map )
 
-#define DRM_IOREMAPFREE(map)						\
+#define DRM_IOREMAPFREE(map, dev)						\
 	do {								\
 		if ( (map)->handle && (map)->size )			\
 			DRM(ioremapfree)( map );			\
@@ -196,7 +197,8 @@
 	drm_buf_t	  *buflist;
 	int		  seg_count;
 	int		  page_order;
-	unsigned long	  *seglist;
+	vm_offset_t	  *seglist;
+	dma_addr_t	  *seglist_bus;
 
 	drm_freelist_t	  freelist;
 } drm_buf_entry_t;
@@ -402,11 +404,8 @@
 extern void	     *DRM(alloc)(size_t size, int area);
 extern void	     *DRM(realloc)(void *oldpt, size_t oldsize, size_t size,
 				   int area);
-extern char	     *DRM(strdup)(const char *s, int area);
-extern void	     DRM(strfree)(char *s, int area);
 extern void	     DRM(free)(void *pt, size_t size, int area);
 extern void	     *DRM(ioremap)(drm_device_t *dev, drm_local_map_t *map);
-extern void	     *DRM(ioremap_nocache)(drm_device_t *dev, drm_local_map_t *map);
 extern void	     DRM(ioremapfree)(drm_local_map_t *map);
 
 #if __REALLY_HAVE_AGP
@@ -448,7 +447,7 @@
 #if __HAVE_DMA_IRQ
 extern int           DRM(irq_install)( drm_device_t *dev, int irq );
 extern int           DRM(irq_uninstall)( drm_device_t *dev );
-extern void          DRM(dma_service)( DRM_IRQ_ARGS );
+extern irqreturn_t   DRM(dma_service)( DRM_IRQ_ARGS );
 extern void          DRM(driver_irq_preinstall)( drm_device_t *dev );
 extern void          DRM(driver_irq_postinstall)( drm_device_t *dev );
 extern void          DRM(driver_irq_uninstall)( drm_device_t *dev );
@@ -565,6 +564,12 @@
 extern int		DRM(sg_free)(DRM_IOCTL_ARGS);
 #endif
 
+/* consistent PCI memory functions (drm_pci.h) */
+extern void		*DRM(pci_alloc)(drm_device_t *dev, size_t size, 
+					size_t align, dma_addr_t maxaddr,
+					dma_addr_t *busaddr);
+extern void		DRM(pci_free)(drm_device_t *dev, size_t size, 
+				      void *vaddr, dma_addr_t busaddr);
 
 #endif /* __KERNEL__ */
 #endif /* _DRM_P_H_ */

==== //depot/projects/netperf/sys/dev/drm/drm_agpsupport.h#2 (text+ko) ====

@@ -27,7 +27,8 @@
  * Author:
  *    Rickard E. (Rik) Faith <faith@valinux.com>
  *    Gareth Hughes <gareth@valinux.com>
- * $FreeBSD: src/sys/dev/drm/drm_agpsupport.h,v 1.2 2003/03/09 02:08:28 anholt Exp $
+ *
+ * $FreeBSD: src/sys/dev/drm/drm_agpsupport.h,v 1.3 2003/08/19 02:57:31 anholt Exp $
  */
 
 #include "dev/drm/drmP.h"
@@ -255,25 +256,6 @@
 		head->agpdev = agpdev;
 		agp_get_info(agpdev, &head->info);
 		head->memory = NULL;
-#if 0				/* bogus */
-		switch (head->agp_info.chipset) {
-		case INTEL_GENERIC:  head->chipset = "Intel";          break;
-		case INTEL_LX:       head->chipset = "Intel 440LX";    break;
-		case INTEL_BX:       head->chipset = "Intel 440BX";    break;
-		case INTEL_GX:       head->chipset = "Intel 440GX";    break;
-		case INTEL_I810:     head->chipset = "Intel i810";     break;
-		case VIA_GENERIC:    head->chipset = "VIA";            break;
-		case VIA_VP3:        head->chipset = "VIA VP3";        break;
-		case VIA_MVP3:       head->chipset = "VIA MVP3";       break;
-		case VIA_APOLLO_PRO: head->chipset = "VIA Apollo Pro"; break;
-		case SIS_GENERIC:    head->chipset = "SiS";            break;
-		case AMD_GENERIC:    head->chipset = "AMD";            break;
-		case AMD_IRONGATE:   head->chipset = "AMD Irongate";   break;
-		case ALI_GENERIC:    head->chipset = "ALi";            break;
-		case ALI_M1541:      head->chipset = "ALi M1541";      break;
-		default:
-		}
-#endif
 		DRM_INFO("AGP at 0x%08lx %dMB\n",
 			 (long)head->info.ai_aperture_base,
 			 (int)(head->info.ai_aperture_size >> 20));

==== //depot/projects/netperf/sys/dev/drm/drm_auth.h#2 (text+ko) ====

@@ -27,7 +27,8 @@
  * Authors:
  *    Rickard E. (Rik) Faith <faith@valinux.com>
  *    Gareth Hughes <gareth@valinux.com>
- * $FreeBSD: src/sys/dev/drm/drm_auth.h,v 1.3 2003/03/09 02:08:28 anholt Exp $
+ *
+ * $FreeBSD: src/sys/dev/drm/drm_auth.h,v 1.4 2003/08/19 02:57:31 anholt Exp $
  */
 
 #include "dev/drm/drmP.h"

==== //depot/projects/netperf/sys/dev/drm/drm_bufs.h#2 (text+ko) ====

@@ -27,7 +27,8 @@
  * Authors:
  *    Rickard E. (Rik) Faith <faith@valinux.com>
  *    Gareth Hughes <gareth@valinux.com>
- * $FreeBSD: src/sys/dev/drm/drm_bufs.h,v 1.5 2003/04/25 01:18:46 anholt Exp $
+ *
+ * $FreeBSD: src/sys/dev/drm/drm_bufs.h,v 1.6 2003/08/19 02:57:31 anholt Exp $
  */
 
 #include "dev/drm/drmP.h"
@@ -136,12 +137,12 @@
 #endif
 		}
 #endif /* __REALLY_HAVE_MTRR */
-		DRM_IOREMAP(map);
+		DRM_IOREMAP(map, dev);
 		break;
 
 	case _DRM_SHM:
 		map->handle = (void *)DRM(alloc)(map->size, DRM_MEM_SAREA);
-		DRM_DEBUG( "%ld %d %p\n",
+		DRM_DEBUG( "%lu %d %p\n",
 			   map->size, DRM(order)( map->size ), map->handle );
 		if ( !map->handle ) {
 			DRM(free)( map, sizeof(*map), DRM_MEM_MAPS );
@@ -279,31 +280,33 @@
 #if __HAVE_DMA
 
 
-static void DRM(cleanup_buf_error)(drm_buf_entry_t *entry)
+static void DRM(cleanup_buf_error)(drm_device_t *dev, drm_buf_entry_t *entry)
 {
 	int i;
 
+#if __HAVE_PCI_DMA
 	if (entry->seg_count) {
 		for (i = 0; i < entry->seg_count; i++) {
-			DRM(free)((void *)entry->seglist[i],
-					entry->buf_size,
-					DRM_MEM_DMA);
+			if (entry->seglist[i] != NULL)
+				DRM(pci_free)(dev, entry->buf_size,
+				    (void *)entry->seglist[i],
+				    entry->seglist_bus[i]);
 		}
 		DRM(free)(entry->seglist,
 			  entry->seg_count *
 			  sizeof(*entry->seglist),
 			  DRM_MEM_SEGS);
+		DRM(free)(entry->seglist_bus, entry->seg_count *
+			  sizeof(*entry->seglist_bus), DRM_MEM_SEGS);
 
 		entry->seg_count = 0;
 	}
+#endif /* __HAVE_PCI_DMA */
 
-   	if(entry->buf_count) {
-	   	for(i = 0; i < entry->buf_count; i++) {
-			if(entry->buflist[i].dev_private) {
-				DRM(free)(entry->buflist[i].dev_private,
-					  entry->buflist[i].dev_priv_size,
-					  DRM_MEM_BUFS);
-			}
+   	if (entry->buf_count) {
+	   	for (i = 0; i < entry->buf_count; i++) {
+			DRM(free)(entry->buflist[i].dev_private,
+			    entry->buflist[i].dev_priv_size, DRM_MEM_BUFS);
 		}
 		DRM(free)(entry->buflist,
 			  entry->buf_count *
@@ -395,7 +398,9 @@
 		if(!buf->dev_private) {
 			/* Set count correctly so we free the proper amount. */
 			entry->buf_count = count;
-			DRM(cleanup_buf_error)(entry);
+			DRM(cleanup_buf_error)(dev, entry);
+			DRM_UNLOCK;
+			return DRM_ERR(ENOMEM);
 		}
 		memset( buf->dev_private, 0, buf->dev_priv_size );
 
@@ -413,7 +418,7 @@
 				     DRM_MEM_BUFS );
 	if(!temp_buflist) {
 		/* Free the entry because it isn't valid */
-		DRM(cleanup_buf_error)(entry);
+		DRM(cleanup_buf_error)(dev, entry);
 		DRM_UNLOCK;
 		return DRM_ERR(ENOMEM);
 	}
@@ -450,7 +455,7 @@
 	int total;
 	int page_order;
 	drm_buf_entry_t *entry;
-	unsigned long page;
+	vm_offset_t vaddr;
 	drm_buf_t *buf;
 	int alignment;
 	unsigned long offset;
@@ -459,6 +464,7 @@
 	int page_count;
 	unsigned long *temp_pagelist;
 	drm_buf_t **temp_buflist;
+	dma_addr_t bus_addr;
 
 	count = request->count;
 	order = DRM(order)(request->size);
@@ -482,42 +488,37 @@
 		return DRM_ERR(ENOMEM);	/* May only call once for each order */
 	}
 
-	entry->buflist = DRM(alloc)( count * sizeof(*entry->buflist),
-				    DRM_MEM_BUFS );
-	if ( !entry->buflist ) {
-		DRM_UNLOCK;
-		return DRM_ERR(ENOMEM);
-	}
-	memset( entry->buflist, 0, count * sizeof(*entry->buflist) );
+	entry->buflist = DRM(alloc)(count * sizeof(*entry->buflist),
+	    DRM_MEM_BUFS);
+	entry->seglist = DRM(alloc)(count * sizeof(*entry->seglist),
+	    DRM_MEM_SEGS);
+	entry->seglist_bus = DRM(alloc)(count * sizeof(*entry->seglist_bus),
+	    DRM_MEM_SEGS);
+
+	/* Keep the original pagelist until we know all the allocations
+	 * have succeeded
+	 */
+	temp_pagelist = DRM(alloc)((dma->page_count + (count << page_order)) *
+	    sizeof(*dma->pagelist), DRM_MEM_PAGES);
 
-	entry->seglist = DRM(alloc)( count * sizeof(*entry->seglist),
-				    DRM_MEM_SEGS );
-	if ( !entry->seglist ) {
-		DRM(free)( entry->buflist,
-			  count * sizeof(*entry->buflist),
-			  DRM_MEM_BUFS );
+	if (entry->buflist == NULL || entry->seglist == NULL || 
+	    temp_pagelist == NULL) {
+		DRM(free)(entry->buflist, count * sizeof(*entry->buflist),
+		    DRM_MEM_BUFS);
+		DRM(free)(entry->seglist, count * sizeof(*entry->seglist),
+		    DRM_MEM_SEGS);
+		DRM(free)(entry->seglist_bus, count *
+		    sizeof(*entry->seglist_bus), DRM_MEM_SEGS);
 		DRM_UNLOCK;
 		return DRM_ERR(ENOMEM);
 	}
-	memset( entry->seglist, 0, count * sizeof(*entry->seglist) );
 
-	temp_pagelist = DRM(realloc)( dma->pagelist,
-				      dma->page_count * sizeof(*dma->pagelist),
-				      (dma->page_count + (count << page_order))
-				      * sizeof(*dma->pagelist),
-				      DRM_MEM_PAGES );
-	if(!temp_pagelist) {
-		DRM(free)( entry->buflist,
-			   count * sizeof(*entry->buflist),
-			   DRM_MEM_BUFS );
-		DRM(free)( entry->seglist,
-			   count * sizeof(*entry->seglist),
-			   DRM_MEM_SEGS );
-		DRM_UNLOCK;
-		return DRM_ERR(ENOMEM);
-	}
+	bzero(entry->buflist, count * sizeof(*entry->buflist));
+	bzero(entry->seglist, count * sizeof(*entry->seglist));
+	
+	memcpy(temp_pagelist, dma->pagelist, dma->page_count * 
+	    sizeof(*dma->pagelist));
 
-	dma->pagelist = temp_pagelist;
 	DRM_DEBUG( "pagelist: %d entries\n",
 		   dma->page_count + (count << page_order) );
 
@@ -527,15 +528,28 @@
 	page_count = 0;
 
 	while ( entry->buf_count < count ) {
-		page = (unsigned long)DRM(alloc)( size, DRM_MEM_DMA );
-		if ( !page ) break;
-		entry->seglist[entry->seg_count++] = page;
+		vaddr = (vm_offset_t) DRM(pci_alloc)(dev, size, alignment,
+		    0xfffffffful, &bus_addr);
+		if (vaddr == NULL) {
+			/* Set count correctly so we free the proper amount. */
+			entry->buf_count = count;
+			entry->seg_count = count;
+			DRM(cleanup_buf_error)(dev, entry);
+			DRM(free)(temp_pagelist, (dma->page_count +
+			    (count << page_order)) * sizeof(*dma->pagelist),
+			    DRM_MEM_PAGES);
+			DRM_UNLOCK;
+			return DRM_ERR(ENOMEM);
+		}
+	
+		entry->seglist_bus[entry->seg_count] = bus_addr;
+		entry->seglist[entry->seg_count++] = vaddr;
 		for ( i = 0 ; i < (1 << page_order) ; i++ ) {
 			DRM_DEBUG( "page %d @ 0x%08lx\n",
 				   dma->page_count + page_count,
-				   page + PAGE_SIZE * i );
-			dma->pagelist[dma->page_count + page_count++]
-				= page + PAGE_SIZE * i;
+				   (long)vaddr + PAGE_SIZE * i );
+			temp_pagelist[dma->page_count + page_count++] = 
+			    vaddr + PAGE_SIZE * i;
 		}
 		for ( offset = 0 ;
 		      offset + size <= total && entry->buf_count < count ;
@@ -546,10 +560,28 @@
 			buf->order   = order;
 			buf->used    = 0;
 			buf->offset  = (dma->byte_count + byte_count + offset);
-			buf->address = (void *)(page + offset);
+			buf->address = (void *)(vaddr + offset);
+			buf->bus_address = bus_addr + offset;
 			buf->next    = NULL;
 			buf->pending = 0;
 			buf->filp    = NULL;
+
+			buf->dev_priv_size = sizeof(DRIVER_BUF_PRIV_T);
+			buf->dev_private = DRM(alloc)(sizeof(DRIVER_BUF_PRIV_T),
+			    DRM_MEM_BUFS);
+			if (buf->dev_private == NULL) {
+				/* Set count correctly so we free the proper amount. */
+				entry->buf_count = count;
+				entry->seg_count = count;
+				DRM(cleanup_buf_error)(dev, entry);
+				DRM(free)(temp_pagelist, (dma->page_count + 
+				    (count << page_order)) *
+				    sizeof(*dma->pagelist), DRM_MEM_PAGES );
+				DRM_UNLOCK;
+				return DRM_ERR(ENOMEM);
+			}
+			bzero(buf->dev_private, buf->dev_priv_size);
+
 			DRM_DEBUG( "buffer %d @ %p\n",
 				   entry->buf_count, buf->address );
 		}
@@ -561,9 +593,12 @@
 				     (dma->buf_count + entry->buf_count)
 				     * sizeof(*dma->buflist),
 				     DRM_MEM_BUFS );
-	if(!temp_buflist) {
+	if (temp_buflist == NULL) {
 		/* Free the entry because it isn't valid */
-		DRM(cleanup_buf_error)(entry);
+		DRM(cleanup_buf_error)(dev, entry);
+		DRM(free)(temp_pagelist, (dma->page_count + 
+		    (count << page_order)) * sizeof(*dma->pagelist),
+		    DRM_MEM_PAGES);
 		DRM_UNLOCK;
 		return DRM_ERR(ENOMEM);
 	}
@@ -573,6 +608,13 @@
 		dma->buflist[i + dma->buf_count] = &entry->buflist[i];
 	}
 
+	/* No allocations failed, so now we can replace the orginal pagelist
+	 * with the new one.
+	 */
+	DRM(free)(dma->pagelist, dma->page_count * sizeof(*dma->pagelist),
+	    DRM_MEM_PAGES);
+	dma->pagelist = temp_pagelist;
+
 	dma->buf_count += entry->buf_count;
 	dma->seg_count += entry->seg_count;
 	dma->page_count += entry->seg_count << page_order;
@@ -669,7 +711,7 @@
 		if(!buf->dev_private) {
 			/* Set count correctly so we free the proper amount. */
 			entry->buf_count = count;
-			DRM(cleanup_buf_error)(entry);
+			DRM(cleanup_buf_error)(dev, entry);
 			DRM_UNLOCK;
 			return DRM_ERR(ENOMEM);
 		}
@@ -693,7 +735,7 @@
 				     DRM_MEM_BUFS );
 	if(!temp_buflist) {
 		/* Free the entry because it isn't valid */
-		DRM(cleanup_buf_error)(entry);
+		DRM(cleanup_buf_error)(dev, entry);
 		DRM_UNLOCK;
 		return DRM_ERR(ENOMEM);
 	}

==== //depot/projects/netperf/sys/dev/drm/drm_context.h#2 (text+ko) ====

@@ -27,7 +27,8 @@
  * Authors:
  *    Rickard E. (Rik) Faith <faith@valinux.com>
  *    Gareth Hughes <gareth@valinux.com>
- * $FreeBSD: src/sys/dev/drm/drm_context.h,v 1.4 2003/04/25 01:18:46 anholt Exp $
+ *
+ * $FreeBSD: src/sys/dev/drm/drm_context.h,v 1.5 2003/08/19 02:57:31 anholt Exp $
  */
 
 #include "dev/drm/drmP.h"

==== //depot/projects/netperf/sys/dev/drm/drm_dma.h#2 (text+ko) ====

@@ -28,7 +28,7 @@
  *    Rickard E. (Rik) Faith <faith@valinux.com>
  *    Gareth Hughes <gareth@valinux.com>
  *
- * $FreeBSD: src/sys/dev/drm/drm_dma.h,v 1.5 2003/04/25 01:18:46 anholt Exp $
+ * $FreeBSD: src/sys/dev/drm/drm_dma.h,v 1.6 2003/08/19 02:57:31 anholt Exp $
  */
 
 #include "dev/drm/drmP.h"
@@ -70,6 +70,7 @@
 
 				/* Clear dma buffers */
 	for (i = 0; i <= DRM_MAX_ORDER; i++) {
+#if __HAVE_PCI_DMA
 		if (dma->bufs[i].seg_count) {
 			DRM_DEBUG("order %d: buf_count = %d,"
 				  " seg_count = %d\n",
@@ -77,22 +78,27 @@
 				  dma->bufs[i].buf_count,
 				  dma->bufs[i].seg_count);
 			for (j = 0; j < dma->bufs[i].seg_count; j++) {
-				DRM(free)((void *)dma->bufs[i].seglist[j],
-						dma->bufs[i].buf_size,
-						DRM_MEM_DMA);
+				if (dma->bufs[i].seglist[j] != NULL)
+					DRM(pci_free)(dev, dma->bufs[i].buf_size,
+					    (void *)dma->bufs[i].seglist[j],
+					    dma->bufs[i].seglist_bus[j]);
 			}
 			DRM(free)(dma->bufs[i].seglist,
 				  dma->bufs[i].seg_count
 				  * sizeof(*dma->bufs[0].seglist),
 				  DRM_MEM_SEGS);
+			DRM(free)(dma->bufs[i].seglist_bus,
+				  dma->bufs[i].seg_count
+				  * sizeof(*dma->bufs[0].seglist_bus),
+				  DRM_MEM_SEGS);
 		}
-	   	if(dma->bufs[i].buf_count) {
-		   	for(j = 0; j < dma->bufs[i].buf_count; j++) {
-			   if(dma->bufs[i].buflist[j].dev_private) {
-			      DRM(free)(dma->bufs[i].buflist[j].dev_private,
+#endif /* __HAVE_PCI_DMA */
+
+	   	if (dma->bufs[i].buf_count) {
+		   	for (j = 0; j < dma->bufs[i].buf_count; j++) {
+				DRM(free)(dma->bufs[i].buflist[j].dev_private,
 					dma->bufs[i].buflist[j].dev_priv_size,
 					DRM_MEM_BUFS);
-			   }
 			}
 		   	DRM(free)(dma->bufs[i].buflist,
 				  dma->bufs[i].buf_count *
@@ -101,17 +107,10 @@
 		}
 	}
 
-	if (dma->buflist) {
-		DRM(free)(dma->buflist,
-			  dma->buf_count * sizeof(*dma->buflist),
-			  DRM_MEM_BUFS);
-	}
-
-	if (dma->pagelist) {
-		DRM(free)(dma->pagelist,
-			  dma->page_count * sizeof(*dma->pagelist),
-			  DRM_MEM_PAGES);
-	}
+	DRM(free)(dma->buflist, dma->buf_count * sizeof(*dma->buflist),
+	    DRM_MEM_BUFS);
+	DRM(free)(dma->pagelist, dma->page_count * sizeof(*dma->pagelist),
+	    DRM_MEM_PAGES);
 	DRM(free)(dev->dma, sizeof(*dev->dma), DRM_MEM_DRIVER);
 	dev->dma = NULL;
 }
@@ -161,6 +160,9 @@
 	if ( !irq )
 		return DRM_ERR(EINVAL);
 
+	if (dev->dev_private == NULL)
+		return DRM_ERR(EINVAL);
+
 	DRM_LOCK;
 	if ( dev->irq ) {
 		DRM_UNLOCK;
@@ -215,7 +217,7 @@
 	if ( retcode ) {
 #elif defined(__NetBSD__)
 	dev->irqh = pci_intr_establish(&dev->pa.pa_pc, dev->ih, IPL_TTY,
-				      (int (*)(DRM_IRQ_ARGS))DRM(dma_service), dev);
+				      (irqreturn_t (*)(DRM_IRQ_ARGS))DRM(dma_service), dev);
 	if ( !dev->irqh ) {
 #endif
 		DRM_LOCK;

==== //depot/projects/netperf/sys/dev/drm/drm_drawable.h#2 (text+ko) ====

@@ -28,7 +28,7 @@
  *    Rickard E. (Rik) Faith <faith@valinux.com>
  *    Gareth Hughes <gareth@valinux.com>
  *
- * $FreeBSD: src/sys/dev/drm/drm_drawable.h,v 1.2 2003/03/09 02:08:28 anholt Exp $
+ * $FreeBSD: src/sys/dev/drm/drm_drawable.h,v 1.3 2003/08/19 02:57:31 anholt Exp $
  */
 
 #include "dev/drm/drmP.h"

==== //depot/projects/netperf/sys/dev/drm/drm_drv.h#2 (text+ko) ====

@@ -28,7 +28,7 @@
  *    Rickard E. (Rik) Faith <faith@valinux.com>
  *    Gareth Hughes <gareth@valinux.com>
  *
- * $FreeBSD: src/sys/dev/drm/drm_drv.h,v 1.13 2003/04/25 01:18:46 anholt Exp $
+ * $FreeBSD: src/sys/dev/drm/drm_drv.h,v 1.14 2003/08/19 02:57:31 anholt Exp $
  */
 
 /*
@@ -567,7 +567,7 @@
 					mrdesc.mr_base = map->offset;
 					mrdesc.mr_len = map->size;
 					mrdesc.mr_flags = MDF_WRITECOMBINE;
-					act = MEMRANGE_SET_UPDATE;
+					act = MEMRANGE_SET_REMOVE;
 					bcopy(DRIVER_NAME, &mrdesc.mr_owner, strlen(DRIVER_NAME));
 					retcode = mem_range_attr_set(&mrdesc, &act);
 					map->mtrr=1;

==== //depot/projects/netperf/sys/dev/drm/drm_fops.h#2 (text+ko) ====

@@ -29,7 +29,7 @@
  *    Daryll Strauss <daryll@valinux.com>
  *    Gareth Hughes <gareth@valinux.com>
  *
- * $FreeBSD: src/sys/dev/drm/drm_fops.h,v 1.7 2003/04/25 01:18:46 anholt Exp $
+ * $FreeBSD: src/sys/dev/drm/drm_fops.h,v 1.8 2003/08/19 02:57:31 anholt Exp $
  */
 
 #include "dev/drm/drmP.h"

==== //depot/projects/netperf/sys/dev/drm/drm_ioctl.h#2 (text+ko) ====

@@ -28,7 +28,7 @@
  *    Rickard E. (Rik) Faith <faith@valinux.com>
  *    Gareth Hughes <gareth@valinux.com>
  *
- * $FreeBSD: src/sys/dev/drm/drm_ioctl.h,v 1.4 2003/04/25 01:18:46 anholt Exp $
+ * $FreeBSD: src/sys/dev/drm/drm_ioctl.h,v 1.5 2003/08/19 02:57:31 anholt Exp $
  */
 
 #include "dev/drm/drmP.h"

==== //depot/projects/netperf/sys/dev/drm/drm_lock.h#2 (text+ko) ====

@@ -28,7 +28,7 @@
  *    Rickard E. (Rik) Faith <faith@valinux.com>
  *    Gareth Hughes <gareth@valinux.com>
  *
- * $FreeBSD: src/sys/dev/drm/drm_lock.h,v 1.3 2003/04/25 01:18:46 anholt Exp $
+ * $FreeBSD: src/sys/dev/drm/drm_lock.h,v 1.4 2003/08/19 02:57:31 anholt Exp $
  */
 
 #include "dev/drm/drmP.h"

==== //depot/projects/netperf/sys/dev/drm/drm_memory.h#2 (text+ko) ====

@@ -28,7 +28,7 @@
  *    Rickard E. (Rik) Faith <faith@valinux.com>
  *    Gareth Hughes <gareth@valinux.com>
  *
- * $FreeBSD: src/sys/dev/drm/drm_memory.h,v 1.8 2003/04/25 01:18:46 anholt Exp $
+ * $FreeBSD: src/sys/dev/drm/drm_memory.h,v 1.9 2003/08/19 02:57:31 anholt Exp $
  */
 
 #include "dev/drm/drmP.h"
@@ -36,408 +36,89 @@
 #if defined(__FreeBSD__) || defined(__NetBSD__)
 #define malloctype DRM(M_DRM)
 /* The macros conflicted in the MALLOC_DEFINE */
-
 MALLOC_DEFINE(malloctype, "drm", "DRM Data Structures");
-
 #undef malloctype
 #endif
 
-typedef struct drm_mem_stats {
-	const char	  *name;
-	int		  succeed_count;
-	int		  free_count;
-	int		  fail_count;
-	unsigned long	  bytes_allocated;
-	unsigned long	  bytes_freed;
-} drm_mem_stats_t;
-
-static DRM_SPINTYPE	  DRM(mem_lock);
-static unsigned long	  DRM(ram_available) = 0; /* In pages */
-static unsigned long	  DRM(ram_used)      = 0;
-static drm_mem_stats_t	  DRM(mem_stats)[]   = {
-	[DRM_MEM_DMA]	    = { "dmabufs"  },
-	[DRM_MEM_SAREA]	    = { "sareas"   },
-	[DRM_MEM_DRIVER]    = { "driver"   },
-	[DRM_MEM_MAGIC]	    = { "magic"	   },
-	[DRM_MEM_IOCTLS]    = { "ioctltab" },
-	[DRM_MEM_MAPS]	    = { "maplist"  },
-	[DRM_MEM_BUFS]	    = { "buflist"  },
-	[DRM_MEM_SEGS]	    = { "seglist"  },
-	[DRM_MEM_PAGES]	    = { "pagelist" },
-	[DRM_MEM_FILES]	    = { "files"	   },
-	[DRM_MEM_QUEUES]    = { "queues"   },
-	[DRM_MEM_CMDS]	    = { "commands" },
-	[DRM_MEM_MAPPINGS]  = { "mappings" },
-	[DRM_MEM_BUFLISTS]  = { "buflists" },
-	[DRM_MEM_AGPLISTS]  = { "agplist"  },
-	[DRM_MEM_SGLISTS]   = { "sglist"   },
-	[DRM_MEM_TOTALAGP]  = { "totalagp" },
-	[DRM_MEM_BOUNDAGP]  = { "boundagp" },
-	[DRM_MEM_CTXBITMAP] = { "ctxbitmap"},
-	[DRM_MEM_STUB]      = { "stub"     },
-	{ NULL, 0, }		/* Last entry must be null */
-};
-
+#ifdef DEBUG_MEMORY
+#include "drm_memory_debug.h"
+#else
 void DRM(mem_init)(void)
 {
-	drm_mem_stats_t *mem;
-
 #ifdef __NetBSD__
 	malloc_type_attach(DRM(M_DRM));
 #endif
-
-	DRM_SPININIT(DRM(mem_lock), "drm memory");
-
-	for (mem = DRM(mem_stats); mem->name; ++mem) {
-		mem->succeed_count   = 0;
-		mem->free_count	     = 0;
-		mem->fail_count	     = 0;
-		mem->bytes_allocated = 0;
-		mem->bytes_freed     = 0;
-	}
-
-	DRM(ram_available) = 0; /* si.totalram */
-	DRM(ram_used)	   = 0;
 }
 
 void DRM(mem_uninit)(void)
 {
-	DRM_SPINUNINIT(DRM(mem_lock));
-}
-
-#ifdef __FreeBSD__
-/* drm_mem_info is called whenever a process reads /dev/drm/mem. */
-static int
-DRM(_mem_info)(drm_mem_stats_t *stats, struct sysctl_oid *oidp, void *arg1, 
-    int arg2, struct sysctl_req *req)
-{
-	drm_mem_stats_t *pt;
-	char buf[128];
-	int error;
-
-	DRM_SYSCTL_PRINT("		  total counts			"
-		       " |    outstanding  \n");
-	DRM_SYSCTL_PRINT("type	   alloc freed fail	bytes	   freed"
-		       " | allocs      bytes\n\n");
-	DRM_SYSCTL_PRINT("%-9.9s %5d %5d %4d %10lu	    |\n",
-		       "system", 0, 0, 0, DRM(ram_available));
-	DRM_SYSCTL_PRINT("%-9.9s %5d %5d %4d %10lu	    |\n",
-		       "locked", 0, 0, 0, DRM(ram_used));
-	DRM_SYSCTL_PRINT("\n");
-	for (pt = stats; pt->name; pt++) {
-		DRM_SYSCTL_PRINT("%-9.9s %5d %5d %4d %10lu %10lu | %6d %10ld\n",
-			       pt->name,
-			       pt->succeed_count,
-			       pt->free_count,
-			       pt->fail_count,
-			       pt->bytes_allocated,
-			       pt->bytes_freed,
-			       pt->succeed_count - pt->free_count,
-			       (long)pt->bytes_allocated
-			       - (long)pt->bytes_freed);
-	}
-	SYSCTL_OUT(req, "", 1);
-	
-	return 0;
-}
-
-int DRM(mem_info) DRM_SYSCTL_HANDLER_ARGS
-{
-	int ret;
-	drm_mem_stats_t *stats;
-	
-	stats = malloc(sizeof(DRM(mem_stats)), DRM(M_DRM), M_NOWAIT);
-	if (stats == NULL)
-		return ENOMEM;
-	
-	DRM_SPINLOCK(&DRM(mem_lock));
-	bcopy(DRM(mem_stats), stats, sizeof(DRM(mem_stats)));
-	DRM_SPINUNLOCK(&DRM(mem_lock));
-	
-	ret = DRM(_mem_info)(stats, oidp, arg1, arg2, req);
-	
-	free(stats, DRM(M_DRM));
-	return ret;
 }
-#endif /* __FreeBSD__ */
 
 void *DRM(alloc)(size_t size, int area)
 {
-	void *pt;
-
-	if (!size) {
-		DRM_MEM_ERROR(area, "Allocating 0 bytes\n");
-		return NULL;
-	}
-
-	if (!(pt = malloc(size, DRM(M_DRM), M_NOWAIT))) {
-		DRM_SPINLOCK(&DRM(mem_lock));
-		++DRM(mem_stats)[area].fail_count;
-		DRM_SPINUNLOCK(&DRM(mem_lock));
-		return NULL;
-	}
-	DRM_SPINLOCK(&DRM(mem_lock));
-	++DRM(mem_stats)[area].succeed_count;
-	DRM(mem_stats)[area].bytes_allocated += size;
-	DRM_SPINUNLOCK(&DRM(mem_lock));
-	return pt;
+	return malloc(size, DRM(M_DRM), M_NOWAIT);
 }
 
 void *DRM(realloc)(void *oldpt, size_t oldsize, size_t size, int area)
 {
 	void *pt;
 
-	if (!(pt = DRM(alloc)(size, area))) return NULL;
+	pt = malloc(size, DRM(M_DRM), M_NOWAIT);
+	if (pt == NULL)
+		return NULL;
 	if (oldpt && oldsize) {
 		memcpy(pt, oldpt, oldsize);
-		DRM(free)(oldpt, oldsize, area);
+		free(oldpt, DRM(M_DRM));
 	}
 	return pt;
 }
 
-char *DRM(strdup)(const char *s, int area)
-{
-	char *pt;
-	int	 length = s ? strlen(s) : 0;
-
-	if (!(pt = DRM(alloc)(length+1, area))) return NULL;
-	strcpy(pt, s);
-	return pt;
-}
-
-void DRM(strfree)(char *s, int area)
-{
-	unsigned int size;
-
-	if (!s) return;
-
-	size = 1 + strlen(s);
-	DRM(free)((void *)s, size, area);
-}
-
 void DRM(free)(void *pt, size_t size, int area)
 {
-	int alloc_count;
-	int free_count;
-
-	if (!pt)
-		DRM_MEM_ERROR(area, "Attempt to free NULL pointer\n");
-	else
-		free(pt, DRM(M_DRM));
-	DRM_SPINLOCK(&DRM(mem_lock));
-	DRM(mem_stats)[area].bytes_freed += size;
-	free_count  = ++DRM(mem_stats)[area].free_count;
-	alloc_count =	DRM(mem_stats)[area].succeed_count;
-	DRM_SPINUNLOCK(&DRM(mem_lock));
-	if (free_count > alloc_count) {
-		DRM_MEM_ERROR(area, "Excess frees: %d frees, %d allocs\n",
-			      free_count, alloc_count);
-	}
+	free(pt, DRM(M_DRM));
 }
 
 void *DRM(ioremap)( drm_device_t *dev, drm_local_map_t *map )
 {
-	void *pt;
-
-	if (!map->size) {
-		DRM_MEM_ERROR(DRM_MEM_MAPPINGS,
-			      "Mapping 0 bytes at 0x%08lx\n", map->offset);
-		return NULL;
-	}
-#ifdef __NetBSD__
-	map->iot = dev->pa.pa_memt;
-#endif
-
 #ifdef __FreeBSD__
-	if (!(pt = pmap_mapdev(map->offset, map->size))) {
+	return pmap_mapdev(map->offset, map->size);
 #elif defined(__NetBSD__)
+	map->iot = dev->pa.pa_memt;
 	if (bus_space_map(map->iot, map->offset, map->size, 
-		BUS_SPACE_MAP_LINEAR, &map->ioh)) {
-#endif
-		DRM_SPINLOCK(&DRM(mem_lock));
-		++DRM(mem_stats)[DRM_MEM_MAPPINGS].fail_count;
-		DRM_SPINUNLOCK(&DRM(mem_lock));
+	    BUS_SPACE_MAP_LINEAR, &map->ioh))
 		return NULL;
-	}
-#ifdef __NetBSD__
-	pt = bus_space_vaddr(map->iot, map->ioh);
+	return bus_space_vaddr(map->iot, map->ioh);
 #endif
-	DRM_SPINLOCK(&DRM(mem_lock));
-	++DRM(mem_stats)[DRM_MEM_MAPPINGS].succeed_count;
-	DRM(mem_stats)[DRM_MEM_MAPPINGS].bytes_allocated += map->size;
-	DRM_SPINUNLOCK(&DRM(mem_lock));
-	return pt;
 }
 
-/* unused so far */
-#if 0
-void *DRM(ioremap_nocache)(unsigned long offset, unsigned long size)
-{
-	void *pt;
-
-	if (!size) {
-		DRM_MEM_ERROR(DRM_MEM_MAPPINGS,
-			      "Mapping 0 bytes at 0x%08lx\n", offset);
-		return NULL;
-	}
-

>>> TRUNCATED FOR MAIL (1000 lines) <<<



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200308191739.h7JHdYTN027544>