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>