Date: Mon, 7 Mar 2011 02:11:44 +0000 (UTC) From: Jeff Roberson <jeff@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r219358 - projects/ofed/head/sys/ofed/include/linux Message-ID: <201103070211.p272BiGg017971@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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 <linux/sysfs.h> #include <linux/mm.h> #include <linux/io.h> +#include <linux/vmalloc.h> #include <vm/vm_pager.h> @@ -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 <sys/vnode.h> #include <sys/conf.h> #include <sys/socket.h> +#include <sys/mbuf.h> +#include <net/bpf.h> #include <net/if.h> #include <net/if_types.h> 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 <asm/page.h> + +#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_ */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201103070211.p272BiGg017971>