PERFORCE change 36433 for review
Sam Leffler
sam at FreeBSD.org
Tue Aug 19 10:39:38 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=36433
Change 36433 by sam at 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 at shidahara1.planet.sci.kobe-u.ac.jp>
+ * Copyright (c) 1999 Takanori Watanabe <takawata at jp.freebsd.org>
* Copyright (c) 1999 Mitsuru IWASAKI <iwasaki at 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 at 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 at 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 at valinux.com>
* Gareth Hughes <gareth at 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 at valinux.com>
* Gareth Hughes <gareth at 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 at valinux.com>
* Gareth Hughes <gareth at 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 at valinux.com>
* Gareth Hughes <gareth at 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 at valinux.com>
* Gareth Hughes <gareth at 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 at valinux.com>
* Gareth Hughes <gareth at 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 at valinux.com>
* Gareth Hughes <gareth at 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 at valinux.com>
* Gareth Hughes <gareth at 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 at valinux.com>
* Gareth Hughes <gareth at 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 at valinux.com>
* Gareth Hughes <gareth at 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 at valinux.com>
* Gareth Hughes <gareth at 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 at valinux.com>
* Gareth Hughes <gareth at 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) <<<
More information about the p4-projects
mailing list