From owner-svn-src-projects@FreeBSD.ORG Mon Mar 7 02:11:44 2011 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6E1CC106566B; Mon, 7 Mar 2011 02:11:44 +0000 (UTC) (envelope-from jeff@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 5ABBD8FC18; Mon, 7 Mar 2011 02:11:44 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p272Bils017981; Mon, 7 Mar 2011 02:11:44 GMT (envelope-from jeff@svn.freebsd.org) Received: (from jeff@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p272BiGg017971; Mon, 7 Mar 2011 02:11:44 GMT (envelope-from jeff@svn.freebsd.org) Message-Id: <201103070211.p272BiGg017971@svn.freebsd.org> From: Jeff Roberson Date: Mon, 7 Mar 2011 02:11:44 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r219358 - projects/ofed/head/sys/ofed/include/linux X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 07 Mar 2011 02:11:44 -0000 Author: jeff Date: Mon Mar 7 02:11:44 2011 New Revision: 219358 URL: http://svn.freebsd.org/changeset/base/219358 Log: - Implement netdev_priv(). - Implement timer_pendiong(). - Implement spin_trylock(). - Add defines for bools used in Linux code. - Redefine dma mapping pci macros to avoid namespace pollution and add two missing routines. Modified: projects/ofed/head/sys/ofed/include/linux/dma-mapping.h projects/ofed/head/sys/ofed/include/linux/linux_compat.c projects/ofed/head/sys/ofed/include/linux/list.h projects/ofed/head/sys/ofed/include/linux/netdevice.h projects/ofed/head/sys/ofed/include/linux/pci.h projects/ofed/head/sys/ofed/include/linux/spinlock.h projects/ofed/head/sys/ofed/include/linux/timer.h projects/ofed/head/sys/ofed/include/linux/types.h projects/ofed/head/sys/ofed/include/linux/vmalloc.h Modified: projects/ofed/head/sys/ofed/include/linux/dma-mapping.h ============================================================================== --- projects/ofed/head/sys/ofed/include/linux/dma-mapping.h Mon Mar 7 00:44:00 2011 (r219357) +++ projects/ofed/head/sys/ofed/include/linux/dma-mapping.h Mon Mar 7 02:11:44 2011 (r219358) @@ -226,6 +226,18 @@ dma_sync_sg_for_device(struct device *de { } +static inline void +dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle, + unsigned long offset, size_t size, int direction) +{ +} + +static inline void +dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle, + unsigned long offset, size_t size, int direction) +{ +} + static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr) { Modified: projects/ofed/head/sys/ofed/include/linux/linux_compat.c ============================================================================== --- projects/ofed/head/sys/ofed/include/linux/linux_compat.c Mon Mar 7 00:44:00 2011 (r219357) +++ projects/ofed/head/sys/ofed/include/linux/linux_compat.c Mon Mar 7 02:11:44 2011 (r219358) @@ -53,6 +53,7 @@ #include #include #include +#include #include @@ -562,38 +563,61 @@ struct fileops linuxfileops = { }; /* - * Hash of iomap addresses. This is infrequently accessed and does not + * Hash of vmmap addresses. This is infrequently accessed and does not * need to be particularly large. This is done because we must store the * caller's idea of the map size to properly unmap. */ -struct iomap { - LIST_ENTRY(iomap) im_next; - void *im_addr; - unsigned long im_size; +struct vmmap { + LIST_ENTRY(vmmap) vm_next; + void *vm_addr; + unsigned long vm_size; }; -LIST_HEAD(iomaphd, iomap); -#define IOMAP_HASH_SIZE 64 -#define IOMAP_HASH_MASK (IOMAP_HASH_SIZE - 1) -#define IO_HASH(addr) ((uintptr_t)(addr) >> PAGE_SHIFT) & IOMAP_HASH_MASK -static struct iomaphd iomaphead[IOMAP_HASH_SIZE]; -static struct mtx iomaplock; +LIST_HEAD(vmmaphd, vmmap); +#define VMMAP_HASH_SIZE 64 +#define VMMAP_HASH_MASK (VMMAP_HASH_SIZE - 1) +#define VM_HASH(addr) ((uintptr_t)(addr) >> PAGE_SHIFT) & VMMAP_HASH_MASK +static struct vmmaphd vmmaphead[VMMAP_HASH_SIZE]; +static struct mtx vmmaplock; + +static void +vmmap_add(void *addr, unsigned long size) +{ + struct vmmap *vmmap; + + vmmap = kmalloc(sizeof(*vmmap), GFP_KERNEL); + mtx_lock(&vmmaplock); + vmmap->vm_size = size; + vmmap->vm_addr = addr; + LIST_INSERT_HEAD(&vmmaphead[VM_HASH(addr)], vmmap, vm_next); + mtx_unlock(&vmmaplock); +} + +static struct vmmap * +vmmap_remove(void *addr) +{ + struct vmmap *vmmap; + + mtx_lock(&vmmaplock); + LIST_FOREACH(vmmap, &vmmaphead[VM_HASH(addr)], vm_next) + if (vmmap->vm_addr == addr) + break; + if (vmmap) + LIST_REMOVE(vmmap, vm_next); + mtx_unlock(&vmmaplock); + + return (vmmap); +} void * _ioremap_attr(vm_paddr_t phys_addr, unsigned long size, int attr) { - struct iomap *iomap; void *addr; addr = pmap_mapdev_attr(phys_addr, size, attr); if (addr == NULL) return (NULL); - iomap = kmalloc(sizeof(*iomap), GFP_KERNEL); - mtx_lock(&iomaplock); - iomap->im_size = size; - iomap->im_addr = addr; - LIST_INSERT_HEAD(&iomaphead[IO_HASH(addr)], iomap, im_next); - mtx_unlock(&iomaplock); + vmmap_add(addr, size); return (addr); } @@ -601,22 +625,45 @@ _ioremap_attr(vm_paddr_t phys_addr, unsi void iounmap(void *addr) { - struct iomap *iomap; + struct vmmap *vmmap; - mtx_lock(&iomaplock); - LIST_FOREACH(iomap, &iomaphead[IO_HASH(addr)], im_next) - if (iomap->im_addr == addr) - break; - if (iomap) - LIST_REMOVE(iomap, im_next); - mtx_unlock(&iomaplock); - if (iomap == NULL) + vmmap = vmmap_remove(addr); + if (vmmap == NULL) return; - pmap_unmapdev((vm_offset_t)addr, iomap->im_size); - kfree(iomap); + pmap_unmapdev((vm_offset_t)addr, vmmap->vm_size); + kfree(vmmap); } +void * +vmap(struct page **pages, unsigned int count, unsigned long flags, int prot) +{ + vm_offset_t off; + size_t size; + + size = count * PAGE_SIZE; + off = kmem_alloc_nofault(kernel_map, size); + if (off == 0) + return (NULL); + vmmap_add((void *)off, size); + pmap_qenter(off, pages, count); + + return ((void *)off); +} + +void +vunmap(void *addr) +{ + struct vmmap *vmmap; + + vmmap = vmmap_remove(addr); + if (vmmap == NULL) + return; + pmap_qremove((vm_offset_t)addr, vmmap->vm_size / PAGE_SIZE); + kmem_free(kernel_map, (vm_offset_t)addr, vmmap->vm_size); + kfree(vmmap); +} + static void linux_compat_init(void) { @@ -640,9 +687,9 @@ linux_compat_init(void) INIT_LIST_HEAD(&pci_drivers); INIT_LIST_HEAD(&pci_devices); spin_lock_init(&pci_lock); - mtx_init(&iomaplock, "IO Map lock", NULL, MTX_DEF); - for (i = 0; i < IOMAP_HASH_SIZE; i++) - LIST_INIT(&iomaphead[i]); + mtx_init(&vmmaplock, "IO Map lock", NULL, MTX_DEF); + for (i = 0; i < VMMAP_HASH_SIZE; i++) + LIST_INIT(&vmmaphead[i]); } SYSINIT(linux_compat, SI_SUB_DRIVERS, SI_ORDER_SECOND, linux_compat_init, NULL); Modified: projects/ofed/head/sys/ofed/include/linux/list.h ============================================================================== --- projects/ofed/head/sys/ofed/include/linux/list.h Mon Mar 7 00:44:00 2011 (r219357) +++ projects/ofed/head/sys/ofed/include/linux/list.h Mon Mar 7 02:11:44 2011 (r219358) @@ -44,7 +44,9 @@ #include #include #include +#include +#include #include #include Modified: projects/ofed/head/sys/ofed/include/linux/netdevice.h ============================================================================== --- projects/ofed/head/sys/ofed/include/linux/netdevice.h Mon Mar 7 00:44:00 2011 (r219357) +++ projects/ofed/head/sys/ofed/include/linux/netdevice.h Mon Mar 7 02:11:44 2011 (r219358) @@ -61,6 +61,12 @@ extern struct net init_net; #define netif_oper_up(dev) !!((dev)->if_flags & IFF_UP) #define netif_carrier_ok(dev) netif_running(dev) +static inline void * +netdev_priv(const struct net_device *dev) +{ + return (dev->if_softc); +} + static inline void _handle_ifnet_link_event(void *arg, struct ifnet *ifp, int linkstate) { Modified: projects/ofed/head/sys/ofed/include/linux/pci.h ============================================================================== --- projects/ofed/head/sys/ofed/include/linux/pci.h Mon Mar 7 00:44:00 2011 (r219357) +++ projects/ofed/head/sys/ofed/include/linux/pci.h Mon Mar 7 02:11:44 2011 (r219358) @@ -534,28 +534,34 @@ pci_enable_msix(struct pci_dev *pdev, st #define pci_pool_destroy dma_pool_destroy #define pci_pool_alloc dma_pool_alloc #define pci_pool_free dma_pool_free -#define pci_pool_create(name, pdev, size, align, allocation) \ - dma_pool_create(name, &(pdev)->dev, size, align, allocation) -#define pci_free_consistent(hwdev, size, vaddr, dma_handle) \ - dma_free_coherent((hwdev) == NULL ? NULL : &(hwdev)->dev, \ - size, vaddr, dma_handle) -#define pci_map_sg(hwdev, sg, nents, direction) \ - dma_map_sg((hwdev) == NULL ? NULL : &(hwdev->dev), \ - sg, nents, (enum dma_data_direction)direction) -#define pci_unmap_sg(hwdev, sg, nents, direction) \ - dma_unmap_sg((hwdev) == NULL ? NULL : &(hwdev)->dev, \ - sg, nents, (enum dma_data_direction)direction) -#define pci_map_page(hwdev, page, offset, size, direction) \ - dma_map_page((hwdev) == NULL ? NULL : &(hwdev)->dev, page, \ - offset, size, (enum dma_data_direction)direction) -#define pci_unmap_page(hwdev, dma_address, size, direction) \ - dma_unmap_page((hwdev) == NULL ? NULL : &(hwdev)->dev, \ - dma_address, size, (enum dma_data_direction)direction) -#define pci_set_dma_mask(pdev, mask) dma_set_mask(&(pdev)->dev, (mask)) -#define pci_dma_mapping_error(pdev, dma_addr) \ - dma_mapping_error(&(pdev)->dev, dma_addr) -#define pci_set_consistent_dma_mask(pdev, mask) \ - dma_set_coherent_mask(&(pdev)->dev, (mask)) +#define pci_pool_create(_name, _pdev, _size, _align, _alloc) \ + dma_pool_create(_name, &(_pdev)->dev, _size, _align, _alloc) +#define pci_free_consistent(_hwdev, _size, _vaddr, _dma_handle) \ + dma_free_coherent((_hwdev) == NULL ? NULL : &(_hwdev)->dev, \ + _size, _vaddr, _dma_handle) +#define pci_map_sg(_hwdev, _sg, _nents, _dir) \ + dma_map_sg((_hwdev) == NULL ? NULL : &(_hwdev->dev), \ + _sg, _nents, (enum dma_data_direction)_dir) +#define pci_map_single(_hwdev, _ptr, _size, _dir) \ + dma_map_single((_hwdev) == NULL ? NULL : &(_hwdev->dev), \ + (_ptr), (_size), (enum dma_data_direction)_dir) +#define pci_unmap_single(_hwdev, _addr, _size, _dir) \ + dma_unmap_single((_hwdev) == NULL ? NULL : &(_hwdev)->dev, \ + _addr, _size, (enum dma_data_direction)_dir) +#define pci_unmap_sg(_hwdev, _sg, _nents, _dir) \ + dma_unmap_sg((_hwdev) == NULL ? NULL : &(_hwdev)->dev, \ + _sg, _nents, (enum dma_data_direction)_dir) +#define pci_map_page(_hwdev, _page, _offset, _size, _dir) \ + dma_map_page((_hwdev) == NULL ? NULL : &(_hwdev)->dev, _page,\ + _offset, _size, (enum dma_data_direction)_dir) +#define pci_unmap_page(_hwdev, _dma_address, _size, _dir) \ + dma_unmap_page((_hwdev) == NULL ? NULL : &(_hwdev)->dev, \ + _dma_address, _size, (enum dma_data_direction)_dir) +#define pci_set_dma_mask(_pdev, mask) dma_set_mask(&(_pdev)->dev, (mask)) +#define pci_dma_mapping_error(_pdev, _dma_addr) \ + dma_mapping_error(&(_pdev)->dev, _dma_addr) +#define pci_set_consistent_dma_mask(_pdev, _mask) \ + dma_set_coherent_mask(&(_pdev)->dev, (_mask)) #define DECLARE_PCI_UNMAP_ADDR(x) DEFINE_DMA_UNMAP_ADDR(x); #define DECLARE_PCI_UNMAP_LEN(x) DEFINE_DMA_UNMAP_LEN(x); #define pci_unmap_addr dma_unmap_addr Modified: projects/ofed/head/sys/ofed/include/linux/spinlock.h ============================================================================== --- projects/ofed/head/sys/ofed/include/linux/spinlock.h Mon Mar 7 00:44:00 2011 (r219357) +++ projects/ofed/head/sys/ofed/include/linux/spinlock.h Mon Mar 7 02:11:44 2011 (r219358) @@ -44,6 +44,7 @@ typedef struct { #define spin_lock(_l) mtx_lock(&(_l)->m) #define spin_unlock(_l) mtx_unlock(&(_l)->m) +#define spin_trylock(_l) mtx_trylock(&(_l)->m) #define spin_lock_nested(_l, _n) mtx_lock_flags(&(_l)->m, MTX_DUPOK) #define spin_lock_irq(lock) spin_lock(lock) #define spin_unlock_irq(lock) spin_unlock(lock) Modified: projects/ofed/head/sys/ofed/include/linux/timer.h ============================================================================== --- projects/ofed/head/sys/ofed/include/linux/timer.h Mon Mar 7 00:44:00 2011 (r219357) +++ projects/ofed/head/sys/ofed/include/linux/timer.h Mon Mar 7 02:11:44 2011 (r219358) @@ -76,6 +76,8 @@ do { \ #define del_timer(timer) callout_stop(&(timer)->timer_callout) #define del_timer_sync(timer) callout_drain(&(timer)->timer_callout) +#define timer_pending(timer) callout_pending(&(timer)->timer_callout) + static inline unsigned long round_jiffies(unsigned long j) { Modified: projects/ofed/head/sys/ofed/include/linux/types.h ============================================================================== --- projects/ofed/head/sys/ofed/include/linux/types.h Mon Mar 7 00:44:00 2011 (r219357) +++ projects/ofed/head/sys/ofed/include/linux/types.h Mon Mar 7 02:11:44 2011 (r219358) @@ -39,6 +39,9 @@ typedef __u32 __le32; typedef __u32 __be32; typedef __u64 __le64; typedef __u64 __be64; +typedef _Bool bool; +#define true TRUE +#define false FALSE typedef unsigned long kernel_ulong_t; typedef unsigned int uint; Modified: projects/ofed/head/sys/ofed/include/linux/vmalloc.h ============================================================================== --- projects/ofed/head/sys/ofed/include/linux/vmalloc.h Mon Mar 7 00:44:00 2011 (r219357) +++ projects/ofed/head/sys/ofed/include/linux/vmalloc.h Mon Mar 7 02:11:44 2011 (r219358) @@ -29,4 +29,13 @@ #ifndef _LINUX_VMALLOC_H_ #define _LINUX_VMALLOC_H_ +#include + +#define VM_MAP 0x0000 +#define PAGE_KERNEL 0x0000 + +void *vmap(struct page **pages, unsigned int count, unsigned long flags, + int prot); +void vunmap(void *addr); + #endif /* _LINUX_VMALLOC_H_ */