The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/vxge/vxge-osdep.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright(c) 2002-2011 Exar Corp.
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification are permitted provided the following conditions are met:
    7  *
    8  *    1. Redistributions of source code must retain the above copyright notice,
    9  *       this list of conditions and the following disclaimer.
   10  *
   11  *    2. Redistributions in binary form must reproduce the above copyright
   12  *       notice, this list of conditions and the following disclaimer in the
   13  *       documentation and/or other materials provided with the distribution.
   14  *
   15  *    3. Neither the name of the Exar Corporation nor the names of its
   16  *       contributors may be used to endorse or promote products derived from
   17  *       this software without specific prior written permission.
   18  *
   19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
   20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   22  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
   23  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
   24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
   25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
   26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
   27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
   28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   29  * POSSIBILITY OF SUCH DAMAGE.
   30  */
   31 /*$FreeBSD: releng/11.2/sys/dev/vxge/vxge-osdep.h 331722 2018-03-29 02:50:57Z eadler $*/
   32 
   33 /* LINTLIBRARY */
   34 
   35 #ifndef _VXGE_OSDEP_H_
   36 #define _VXGE_OSDEP_H_
   37 
   38 #include <sys/param.h>
   39 #include <sys/systm.h>
   40 
   41 #if __FreeBSD_version >= 800000
   42 #include <sys/buf_ring.h>
   43 #endif
   44 
   45 #include <sys/mbuf.h>
   46 #include <sys/protosw.h>
   47 #include <sys/socket.h>
   48 #include <sys/malloc.h>
   49 #include <sys/kernel.h>
   50 #include <sys/module.h>
   51 #include <sys/bus.h>
   52 #include <sys/sockio.h>
   53 #include <sys/lock.h>
   54 #include <sys/mutex.h>
   55 #include <sys/rman.h>
   56 #include <sys/stddef.h>
   57 #include <sys/proc.h>
   58 #include <sys/endian.h>
   59 #include <sys/sysctl.h>
   60 #include <sys/pcpu.h>
   61 #include <sys/smp.h>
   62 
   63 #include <net/if.h>
   64 #include <net/if_arp.h>
   65 #include <net/bpf.h>
   66 #include <net/ethernet.h>
   67 #include <net/if_dl.h>
   68 #include <net/if_media.h>
   69 #include <net/if_types.h>
   70 #include <net/if_var.h>
   71 #include <net/if_vlan_var.h>
   72 
   73 #include <netinet/in_systm.h>
   74 #include <netinet/in.h>
   75 #include <netinet/if_ether.h>
   76 #include <netinet/ip.h>
   77 #include <netinet/ip6.h>
   78 #include <netinet/tcp.h>
   79 #include <netinet/tcp_lro.h>
   80 #include <netinet/udp.h>
   81 
   82 #include <machine/bus.h>
   83 #include <machine/resource.h>
   84 #include <machine/clock.h>
   85 #include <machine/stdarg.h>
   86 #include <machine/in_cksum.h>
   87 
   88 #include <vm/vm.h>
   89 #include <vm/pmap.h>
   90 
   91 #include <dev/pci/pcivar.h>
   92 #include <dev/pci/pcireg.h>
   93 #include <dev/pci/pci_private.h>
   94 
   95 #include <dev/vxge/include/vxge-defs.h>
   96 
   97 /*
   98  * ------------------------- includes and defines -------------------------
   99  */
  100 
  101 #if BYTE_ORDER == BIG_ENDIAN
  102 #define VXGE_OS_HOST_BIG_ENDIAN
  103 #else
  104 #define VXGE_OS_HOST_LITTLE_ENDIAN
  105 #endif
  106 
  107 #if __LONG_BIT == 64
  108 #define VXGE_OS_PLATFORM_64BIT
  109 #else
  110 #define VXGE_OS_PLATFORM_32BIT
  111 #endif
  112 
  113 #define VXGE_OS_PCI_CONFIG_SIZE         256
  114 #define VXGE_OS_HOST_PAGE_SIZE          4096
  115 #define VXGE_LL_IP_FAST_CSUM(hdr, len)  0
  116 
  117 #ifndef __DECONST
  118 #define __DECONST(type, var)    ((type)(uintrptr_t)(const void *)(var))
  119 #endif
  120 
  121 typedef struct ifnet *ifnet_t;
  122 typedef struct mbuf *mbuf_t;
  123 typedef struct mbuf *OS_NETSTACK_BUF;
  124 
  125 typedef struct _vxge_bus_res_t {
  126 
  127         u_long                  bus_res_len;
  128         bus_space_tag_t         bus_space_tag;          /* DMA Tag */
  129         bus_space_handle_t      bus_space_handle;       /* Bus handle */
  130         struct resource         *bar_start_addr;        /* BAR address */
  131 
  132 } vxge_bus_res_t;
  133 
  134 typedef struct _vxge_dma_alloc_t {
  135 
  136         bus_addr_t              dma_paddr;              /* Physical Address */
  137         caddr_t                 dma_vaddr;              /* Virtual Address */
  138         bus_dma_tag_t           dma_tag;                /* DMA Tag */
  139         bus_dmamap_t            dma_map;                /* DMA Map */
  140         bus_dma_segment_t       dma_segment;            /* DMA Segment */
  141         bus_size_t              dma_size;               /* Size */
  142         int                     dma_nseg;               /* scatter-gather */
  143 
  144 } vxge_dma_alloc_t;
  145 
  146 typedef struct _vxge_pci_info {
  147 
  148         device_t        ndev;           /* Device */
  149         void            *reg_map[3];    /* BAR Resource */
  150         struct resource *bar_info[3];   /* BAR tag and handle */
  151 
  152 } vxge_pci_info_t;
  153 
  154 /*
  155  * ---------------------- fixed size primitive types -----------------------
  156  */
  157 typedef size_t                  ptr_t;
  158 typedef int8_t                  s8;
  159 typedef uint8_t                 u8;
  160 typedef uint16_t                u16;
  161 typedef int32_t                 s32;
  162 typedef uint32_t                u32;
  163 typedef unsigned long long int  u64;
  164 #ifndef __bool_true_false_are_defined
  165 typedef boolean_t               bool;
  166 #endif
  167 typedef bus_addr_t              dma_addr_t;
  168 typedef struct mtx              spinlock_t;
  169 typedef struct resource         *pci_irq_h;
  170 typedef vxge_pci_info_t         *pci_dev_h;
  171 typedef vxge_pci_info_t         *pci_cfg_h;
  172 typedef vxge_bus_res_t          *pci_reg_h;
  173 typedef vxge_dma_alloc_t        pci_dma_h;
  174 typedef vxge_dma_alloc_t        pci_dma_acc_h;
  175 
  176 /*
  177  * -------------------------- "libc" functionality -------------------------
  178  */
  179 #define vxge_os_curr_time               systime
  180 #define vxge_os_strcpy                  strcpy
  181 #define vxge_os_strlcpy                 strlcpy
  182 #define vxge_os_strlen                  strlen
  183 #define vxge_os_sprintf                 sprintf
  184 #define vxge_os_snprintf                snprintf
  185 #define vxge_os_println(buf)            printf("%s\n", buf)
  186 #define vxge_os_memzero                 bzero
  187 #define vxge_os_memcmp                  memcmp
  188 #define vxge_os_memcpy(dst, src, size)  bcopy(src, dst, size)
  189 
  190 #define vxge_os_timestamp(buff) {                       \
  191         struct timeval cur_time;                        \
  192         gettimeofday(&cur_time, 0);                     \
  193         snprintf(buff, sizeof(buff), "%08li.%08li: ",   \
  194                 cur_time.tv_sec, cur_time.tv_usec);     \
  195 }
  196 
  197 #define vxge_os_printf(fmt...) {                        \
  198         printf(fmt);                                    \
  199         printf("\n");                                   \
  200 }
  201 
  202 #define vxge_os_vaprintf(fmt...)                        \
  203         vxge_os_printf(fmt);
  204 
  205 #define vxge_os_vasprintf(fmt...) {                     \
  206         vxge_os_printf(fmt);                            \
  207 }
  208 
  209 #define vxge_trace(trace, fmt, args...)                 \
  210         vxge_debug_uld(VXGE_COMPONENT_ULD,              \
  211                 trace, hldev, vpid, fmt, ## args)
  212 
  213 /*
  214  * -------------------- synchronization primitives -------------------------
  215  */
  216 /* Initialize the spin lock */
  217 #define vxge_os_spin_lock_init(lockp, ctxh) {                   \
  218         if (mtx_initialized(lockp) == 0)                        \
  219                 mtx_init((lockp), "vxge", NULL, MTX_DEF);       \
  220 }
  221 
  222 /* Initialize the spin lock (IRQ version) */
  223 #define vxge_os_spin_lock_init_irq(lockp, ctxh) {               \
  224         if (mtx_initialized(lockp) == 0)                        \
  225                 mtx_init((lockp), "vxge", NULL, MTX_DEF);       \
  226 }
  227 
  228 /* Destroy the lock */
  229 #define vxge_os_spin_lock_destroy(lockp, ctxh) {                \
  230         if (mtx_initialized(lockp) != 0)                        \
  231                 mtx_destroy(lockp);                             \
  232 }
  233 
  234 /* Destroy the lock (IRQ version) */
  235 #define vxge_os_spin_lock_destroy_irq(lockp, ctxh) {            \
  236         if (mtx_initialized(lockp) != 0)                        \
  237                 mtx_destroy(lockp);                             \
  238 }
  239 
  240 /* Acquire the lock */
  241 #define vxge_os_spin_lock(lockp) {                              \
  242         if (mtx_owned(lockp) == 0)                              \
  243                 mtx_lock(lockp);                                \
  244 }
  245 
  246 /* Release the lock */
  247 #define vxge_os_spin_unlock(lockp)      mtx_unlock(lockp)
  248 
  249 /* Acquire the lock (IRQ version) */
  250 #define vxge_os_spin_lock_irq(lockp, flags) {                   \
  251         flags = MTX_QUIET;                                      \
  252         if (mtx_owned(lockp) == 0)                              \
  253                 mtx_lock_flags(lockp, flags);                   \
  254 }
  255 
  256 /* Release the lock (IRQ version) */
  257 #define vxge_os_spin_unlock_irq(lockp, flags) {                 \
  258         flags = MTX_QUIET;                                      \
  259         mtx_unlock_flags(lockp, flags);                         \
  260 }
  261 
  262 /* Write memory barrier */
  263 #if __FreeBSD_version < 800000
  264 #if defined(__i386__) || defined(__amd64__)
  265 #define mb()  __asm volatile("mfence" ::: "memory")
  266 #define wmb() __asm volatile("sfence" ::: "memory")
  267 #define rmb() __asm volatile("lfence" ::: "memory")
  268 #else
  269 #define mb()
  270 #define rmb()
  271 #define wmb()
  272 #endif
  273 #endif
  274 
  275 #define vxge_os_wmb()           wmb()
  276 #define vxge_os_udelay(x)       DELAY(x)
  277 #define vxge_os_stall(x)        DELAY(x)
  278 #define vxge_os_mdelay(x)       DELAY(x * 1000)
  279 #define vxge_os_xchg            (targetp, newval)
  280 
  281 /*
  282  * ------------------------- misc primitives -------------------------------
  283  */
  284 #define vxge_os_be32            u32
  285 #define vxge_os_unlikely(x)     (x)
  286 #define vxge_os_prefetch(x)     (x = x)
  287 #define vxge_os_prefetchw(x)    (x = x)
  288 #define vxge_os_bug             vxge_os_printf
  289 
  290 #define vxge_os_ntohs           ntohs
  291 #define vxge_os_ntohl           ntohl
  292 #define vxge_os_ntohll          be64toh
  293 
  294 #define vxge_os_htons           htons
  295 #define vxge_os_htonl           htonl
  296 #define vxge_os_htonll          htobe64
  297 
  298 #define vxge_os_in_multicast            IN_MULTICAST
  299 #define VXGE_OS_INADDR_BROADCAST        INADDR_BROADCAST
  300 /*
  301  * -------------------------- compiler stuff ------------------------------
  302  */
  303 #define __vxge_os_cacheline_size        CACHE_LINE_SIZE
  304 #define __vxge_os_attr_cacheline_aligned __aligned(__vxge_os_cacheline_size)
  305 
  306 /*
  307  * ---------------------- memory primitives --------------------------------
  308  */
  309 #if defined(VXGE_OS_MEMORY_CHECK)
  310 
  311 typedef struct _vxge_os_malloc_t {
  312 
  313         u_long          line;
  314         u_long          size;
  315         void            *ptr;
  316         const char      *file;
  317 
  318 } vxge_os_malloc_t;
  319 
  320 #define VXGE_OS_MALLOC_CNT_MAX  64*1024
  321 
  322 extern u32 g_malloc_cnt;
  323 extern vxge_os_malloc_t g_malloc_arr[VXGE_OS_MALLOC_CNT_MAX];
  324 
  325 #define VXGE_OS_MEMORY_CHECK_MALLOC(_vaddr, _size, _file, _line) {      \
  326         if (_vaddr) {                                                   \
  327                 u32 i;                                                  \
  328                 for (i = 0; i < g_malloc_cnt; i++) {                    \
  329                         if (g_malloc_arr[i].ptr == NULL)                \
  330                                 break;                                  \
  331                 }                                                       \
  332                 if (i == g_malloc_cnt) {                                \
  333                         g_malloc_cnt++;                                 \
  334                         if (g_malloc_cnt >= VXGE_OS_MALLOC_CNT_MAX) {   \
  335                                 vxge_os_bug("g_malloc_cnt exceed %d\n", \
  336                                     VXGE_OS_MALLOC_CNT_MAX);            \
  337                         } else {                                        \
  338                                 g_malloc_arr[i].ptr = _vaddr;           \
  339                                 g_malloc_arr[i].size = _size;           \
  340                                 g_malloc_arr[i].file = _file;           \
  341                                 g_malloc_arr[i].line = _line;           \
  342                         }                                               \
  343                 }                                                       \
  344         }                                                               \
  345 }
  346 
  347 #define VXGE_OS_MEMORY_CHECK_FREE(_vaddr, _size, _file, _line) {        \
  348         u32 i;                                                          \
  349         for (i = 0; i < VXGE_OS_MALLOC_CNT_MAX; i++) {                  \
  350                 if (g_malloc_arr[i].ptr == _vaddr) {                    \
  351                         g_malloc_arr[i].ptr = NULL;                     \
  352                         if (_size && g_malloc_arr[i].size !=  _size) {  \
  353                                 vxge_os_printf("freeing wrong size "    \
  354                                     "%lu allocated %s:%lu:"             \
  355                                     VXGE_OS_LLXFMT":%lu\n",             \
  356                                     _size,                              \
  357                                     g_malloc_arr[i].file,               \
  358                                     g_malloc_arr[i].line,               \
  359                                     (u64)(u_long) g_malloc_arr[i].ptr,  \
  360                                     g_malloc_arr[i].size);              \
  361                         }                                               \
  362                         break;                                          \
  363                 }                                                       \
  364         }                                                               \
  365 }
  366 
  367 #else
  368 #define VXGE_OS_MEMORY_CHECK_MALLOC(prt, size, file, line)
  369 #define VXGE_OS_MEMORY_CHECK_FREE(vaddr, size, file, line)
  370 #endif
  371 
  372 static inline void *
  373 vxge_mem_alloc_ex(u_long size, const char *file, int line)
  374 {
  375         void *vaddr = NULL;
  376         vaddr = malloc(size, M_DEVBUF, M_ZERO | M_NOWAIT);
  377         if (NULL != vaddr) {
  378                 VXGE_OS_MEMORY_CHECK_MALLOC((void *)vaddr, size, file, line)
  379                 vxge_os_memzero(vaddr, size);
  380         }
  381 
  382         return (vaddr);
  383 }
  384 
  385 static inline void
  386 vxge_mem_free_ex(const void *vaddr, u_long size, const char *file, int line)
  387 {
  388         if (NULL != vaddr) {
  389                 VXGE_OS_MEMORY_CHECK_FREE(vaddr, size, file, line)
  390                 free(__DECONST(void *, vaddr), M_DEVBUF);
  391         }
  392 }
  393 
  394 #define vxge_os_malloc(pdev, size)                      \
  395         vxge_mem_alloc_ex(size, __FILE__, __LINE__)
  396 
  397 #define vxge_os_free(pdev, vaddr, size)                 \
  398         vxge_mem_free_ex(vaddr, size, __FILE__, __LINE__)
  399 
  400 #define vxge_mem_alloc(size)                            \
  401         vxge_mem_alloc_ex(size, __FILE__, __LINE__)
  402 
  403 #define vxge_mem_free(vaddr, size)                      \
  404         vxge_mem_free_ex(vaddr, size, __FILE__, __LINE__)
  405 
  406 #define vxge_free_packet(x)                             \
  407         if (NULL != x) { m_freem(x); x = NULL; }
  408 
  409 /*
  410  * --------------------------- pci primitives ------------------------------
  411  */
  412 #define vxge_os_pci_read8(pdev, cfgh, where, val)       \
  413         (*(val) = pci_read_config(pdev->ndev, where, 1))
  414 
  415 #define vxge_os_pci_write8(pdev, cfgh, where, val)      \
  416         pci_write_config(pdev->ndev, where, val, 1)
  417 
  418 #define vxge_os_pci_read16(pdev, cfgh, where, val)      \
  419         (*(val) = pci_read_config(pdev->ndev, where, 2))
  420 
  421 #define vxge_os_pci_write16(pdev, cfgh, where, val)     \
  422         pci_write_config(pdev->ndev, where, val, 2)
  423 
  424 #define vxge_os_pci_read32(pdev, cfgh, where, val)      \
  425         (*(val) = pci_read_config(pdev->ndev, where, 4))
  426 
  427 #define vxge_os_pci_write32(pdev, cfgh, where, val)     \
  428         pci_write_config(pdev->ndev, where, val, 4)
  429 
  430 static inline u32
  431 vxge_os_pci_res_len(pci_dev_h pdev, pci_reg_h regh)
  432 {
  433         return (((vxge_bus_res_t *) regh)->bus_res_len);
  434 }
  435 
  436 static inline u8
  437 vxge_os_pio_mem_read8(pci_dev_h pdev, pci_reg_h regh, void *addr)
  438 {
  439         caddr_t vaddr =
  440             (caddr_t) (((vxge_bus_res_t *) (regh))->bar_start_addr);
  441 
  442         return bus_space_read_1(((vxge_bus_res_t *) regh)->bus_space_tag,
  443                                 ((vxge_bus_res_t *) regh)->bus_space_handle,
  444                                 (bus_size_t) ((caddr_t) (addr) - vaddr));
  445 }
  446 
  447 static inline u16
  448 vxge_os_pio_mem_read16(pci_dev_h pdev, pci_reg_h regh, void *addr)
  449 {
  450         caddr_t vaddr =
  451             (caddr_t) (((vxge_bus_res_t *) (regh))->bar_start_addr);
  452 
  453         return bus_space_read_2(((vxge_bus_res_t *) regh)->bus_space_tag,
  454                                 ((vxge_bus_res_t *) regh)->bus_space_handle,
  455                                 (bus_size_t) ((caddr_t) (addr) - vaddr));
  456 }
  457 
  458 static inline u32
  459 vxge_os_pio_mem_read32(pci_dev_h pdev, pci_reg_h regh, void *addr)
  460 {
  461         caddr_t vaddr =
  462             (caddr_t) (((vxge_bus_res_t *) (regh))->bar_start_addr);
  463 
  464         return bus_space_read_4(((vxge_bus_res_t *) regh)->bus_space_tag,
  465                                 ((vxge_bus_res_t *) regh)->bus_space_handle,
  466                                 (bus_size_t) ((caddr_t) (addr) - vaddr));
  467 }
  468 
  469 static inline u64
  470 vxge_os_pio_mem_read64(pci_dev_h pdev, pci_reg_h regh, void *addr)
  471 {
  472         u64 val, val_l, val_u;
  473 
  474         caddr_t vaddr =
  475             (caddr_t) (((vxge_bus_res_t *) (regh))->bar_start_addr);
  476 
  477         val_l = bus_space_read_4(((vxge_bus_res_t *) regh)->bus_space_tag,
  478                                 ((vxge_bus_res_t *) regh)->bus_space_handle,
  479                                 (bus_size_t) (((caddr_t) addr) + 4 - vaddr));
  480 
  481         val_u = bus_space_read_4(((vxge_bus_res_t *) regh)->bus_space_tag,
  482                                 ((vxge_bus_res_t *) regh)->bus_space_handle,
  483                                 (bus_size_t) ((caddr_t) (addr) - vaddr));
  484 
  485         val = ((val_l << 32) | val_u);
  486         return (val);
  487 }
  488 
  489 static inline void
  490 vxge_os_pio_mem_write8(pci_dev_h pdev, pci_reg_h regh, u8 val, void *addr)
  491 {
  492         caddr_t vaddr =
  493             (caddr_t) (((vxge_bus_res_t *) regh)->bar_start_addr);
  494 
  495         bus_space_write_1(((vxge_bus_res_t *) regh)->bus_space_tag,
  496                         ((vxge_bus_res_t *) regh)->bus_space_handle,
  497                         (bus_size_t) ((caddr_t) (addr) - vaddr), val);
  498 }
  499 
  500 static inline void
  501 vxge_os_pio_mem_write16(pci_dev_h pdev, pci_reg_h regh, u16 val, void *addr)
  502 {
  503         caddr_t vaddr =
  504             (caddr_t) (((vxge_bus_res_t *) (regh))->bar_start_addr);
  505 
  506         bus_space_write_2(((vxge_bus_res_t *) regh)->bus_space_tag,
  507                         ((vxge_bus_res_t *) regh)->bus_space_handle,
  508                         (bus_size_t) ((caddr_t) (addr) - vaddr), val);
  509 }
  510 
  511 static inline void
  512 vxge_os_pio_mem_write32(pci_dev_h pdev, pci_reg_h regh, u32 val, void *addr)
  513 {
  514         caddr_t vaddr =
  515             (caddr_t) (((vxge_bus_res_t *) (regh))->bar_start_addr);
  516 
  517         bus_space_write_4(((vxge_bus_res_t *) regh)->bus_space_tag,
  518                         ((vxge_bus_res_t *) regh)->bus_space_handle,
  519                         (bus_size_t) ((caddr_t) (addr) - vaddr), val);
  520 }
  521 
  522 static inline void
  523 vxge_os_pio_mem_write64(pci_dev_h pdev, pci_reg_h regh, u64 val, void *addr)
  524 {
  525         u32 val_l = (u32) (val & 0xffffffff);
  526         u32 val_u = (u32) (val >> 32);
  527 
  528         vxge_os_pio_mem_write32(pdev, regh, val_l, addr);
  529         vxge_os_pio_mem_write32(pdev, regh, val_u, (caddr_t) addr + 4);
  530 }
  531 
  532 #define vxge_os_flush_bridge    vxge_os_pio_mem_read64
  533 
  534 /*
  535  * --------------------------- dma primitives -----------------------------
  536  */
  537 #define VXGE_OS_DMA_DIR_TODEVICE        0
  538 #define VXGE_OS_DMA_DIR_FROMDEVICE      1
  539 #define VXGE_OS_DMA_DIR_BIDIRECTIONAL   2
  540 #define VXGE_OS_INVALID_DMA_ADDR        ((bus_addr_t)0)
  541 
  542 static void
  543 vxge_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nseg, int error)
  544 {
  545         if (error)
  546                 return;
  547 
  548         *(bus_addr_t *) arg = segs->ds_addr;
  549 }
  550 
  551 static inline void *
  552 vxge_os_dma_malloc(pci_dev_h pdev, u_long bytes, int dma_flags,
  553     pci_dma_h * p_dmah, pci_dma_acc_h * p_dma_acch)
  554 {
  555         int error = 0;
  556         bus_addr_t bus_addr = BUS_SPACE_MAXADDR;
  557         bus_size_t boundary, max_size, alignment = PAGE_SIZE;
  558 
  559         if (bytes > PAGE_SIZE) {
  560                 boundary = 0;
  561                 max_size = bytes;
  562         } else {
  563                 boundary = PAGE_SIZE;
  564                 max_size = PAGE_SIZE;
  565         }
  566 
  567         error = bus_dma_tag_create(
  568             bus_get_dma_tag(pdev->ndev),        /* Parent */
  569             alignment,                          /* Alignment */
  570             boundary,                           /* Bounds */
  571             bus_addr,                           /* Low Address */
  572             bus_addr,                           /* High Address */
  573             NULL,                               /* Filter Func */
  574             NULL,                               /* Filter Func Argument */
  575             bytes,                              /* Maximum Size */
  576             1,                                  /* Number of Segments */
  577             max_size,                           /* Maximum Segment Size */
  578             BUS_DMA_ALLOCNOW,                   /* Flags */
  579             NULL,                               /* Lock Func */
  580             NULL,                               /* Lock Func Arguments */
  581             &(p_dmah->dma_tag));                /* DMA Tag */
  582 
  583         if (error != 0) {
  584                 device_printf(pdev->ndev, "bus_dma_tag_create failed\n");
  585                 goto _exit0;
  586         }
  587 
  588         p_dmah->dma_size = bytes;
  589         error = bus_dmamem_alloc(p_dmah->dma_tag, (void **)&p_dmah->dma_vaddr,
  590             (BUS_DMA_NOWAIT | BUS_DMA_ZERO | BUS_DMA_COHERENT),
  591             &p_dmah->dma_map);
  592         if (error != 0) {
  593                 device_printf(pdev->ndev, "bus_dmamem_alloc failed\n");
  594                 goto _exit1;
  595         }
  596 
  597         VXGE_OS_MEMORY_CHECK_MALLOC(p_dmah->dma_vaddr, p_dmah->dma_size,
  598             __FILE__, __LINE__);
  599 
  600         return (p_dmah->dma_vaddr);
  601 
  602 _exit1:
  603         bus_dma_tag_destroy(p_dmah->dma_tag);
  604 _exit0:
  605         return (NULL);
  606 }
  607 
  608 static inline void
  609 vxge_dma_free(pci_dev_h pdev, const void *vaddr, u_long size,
  610     pci_dma_h *p_dmah, pci_dma_acc_h *p_dma_acch,
  611     const char *file, int line)
  612 {
  613         VXGE_OS_MEMORY_CHECK_FREE(p_dmah->dma_vaddr, size, file, line)
  614 
  615         bus_dmamem_free(p_dmah->dma_tag, p_dmah->dma_vaddr, p_dmah->dma_map);
  616         bus_dma_tag_destroy(p_dmah->dma_tag);
  617 
  618         p_dmah->dma_tag = NULL;
  619         p_dmah->dma_vaddr = NULL;
  620 }
  621 
  622 extern void
  623 vxge_hal_blockpool_block_add(void *, void *, u32, pci_dma_h *, pci_dma_acc_h *);
  624 
  625 static inline void
  626 vxge_os_dma_malloc_async(pci_dev_h pdev, void *devh,
  627     u_long size, int dma_flags)
  628 {
  629         pci_dma_h dma_h;
  630         pci_dma_acc_h acc_handle;
  631 
  632         void *block_addr = NULL;
  633 
  634         block_addr = vxge_os_dma_malloc(pdev, size, dma_flags,
  635             &dma_h, &acc_handle);
  636 
  637         vxge_hal_blockpool_block_add(devh, block_addr, size,
  638             &dma_h, &acc_handle);
  639 }
  640 
  641 static inline void
  642 vxge_os_dma_sync(pci_dev_h pdev, pci_dma_h dmah, dma_addr_t dma_paddr,
  643     u64 dma_offset, size_t length, int dir)
  644 {
  645         bus_dmasync_op_t dmasync_op;
  646 
  647         switch (dir) {
  648         case VXGE_OS_DMA_DIR_TODEVICE:
  649                 dmasync_op = BUS_DMASYNC_PREWRITE | BUS_DMASYNC_POSTWRITE;
  650                 break;
  651 
  652         case VXGE_OS_DMA_DIR_FROMDEVICE:
  653                 dmasync_op = BUS_DMASYNC_PREREAD | BUS_DMASYNC_POSTREAD;
  654                 break;
  655 
  656         default:
  657         case VXGE_OS_DMA_DIR_BIDIRECTIONAL:
  658                 dmasync_op = BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE;
  659                 break;
  660         }
  661 
  662         bus_dmamap_sync(dmah.dma_tag, dmah.dma_map, dmasync_op);
  663 }
  664 
  665 static inline dma_addr_t
  666 vxge_os_dma_map(pci_dev_h pdev, pci_dma_h dmah, void *vaddr, u_long size,
  667                 int dir, int dma_flags)
  668 {
  669         int error;
  670 
  671         error = bus_dmamap_load(dmah.dma_tag, dmah.dma_map, dmah.dma_vaddr,
  672             dmah.dma_size, vxge_dmamap_cb, &(dmah.dma_paddr), BUS_DMA_NOWAIT);
  673 
  674         if (error != 0)
  675                 return (VXGE_OS_INVALID_DMA_ADDR);
  676 
  677         dmah.dma_size = size;
  678         return (dmah.dma_paddr);
  679 }
  680 
  681 static inline void
  682 vxge_os_dma_unmap(pci_dev_h pdev, pci_dma_h dmah, dma_addr_t dma_paddr,
  683     u32 size, int dir)
  684 {
  685         bus_dmamap_unload(dmah.dma_tag, dmah.dma_map);
  686 }
  687 
  688 #define vxge_os_dma_free(pdev, vaddr, size, dma_flags, p_dma_acch, p_dmah)  \
  689         vxge_dma_free(pdev, vaddr, size, p_dma_acch, p_dmah,                \
  690                 __FILE__, __LINE__)
  691 
  692 static inline int
  693 vxge_os_is_my_packet(void *pdev, unsigned long addr)
  694 {
  695         return (0);
  696 }
  697 
  698 #endif /* _VXGE_OSDEP_H_ */

Cache object: b41ee90110e038d6595523051da840d1


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.