a23fd118e437af0a7877dd313db8fdaa3537c675yl/*
a23fd118e437af0a7877dd313db8fdaa3537c675yl * CDDL HEADER START
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * The contents of this file are subject to the terms of the
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Common Development and Distribution License (the "License").
a23fd118e437af0a7877dd313db8fdaa3537c675yl * You may not use this file except in compliance with the License.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a23fd118e437af0a7877dd313db8fdaa3537c675yl * or http://www.opensolaris.org/os/licensing.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * See the License for the specific language governing permissions
a23fd118e437af0a7877dd313db8fdaa3537c675yl * and limitations under the License.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * When distributing Covered Code, include this CDDL HEADER in each
a23fd118e437af0a7877dd313db8fdaa3537c675yl * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * If applicable, add the following below this CDDL HEADER, with the
a23fd118e437af0a7877dd313db8fdaa3537c675yl * fields enclosed by brackets "[]" replaced with your own identifying
a23fd118e437af0a7877dd313db8fdaa3537c675yl * information: Portions Copyright [yyyy] [name of copyright owner]
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * CDDL HEADER END
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/*
7eced415e5dd557aef2d78483b5a7785f0e13670xw * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Use is subject to license terms.
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/*
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Copyright (c) 2002-2005 Neterion, Inc.
a23fd118e437af0a7877dd313db8fdaa3537c675yl * All right Reserved.
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * FileName : xge_osdep.h
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl * Description: OSPAL - Solaris
a23fd118e437af0a7877dd313db8fdaa3537c675yl *
a23fd118e437af0a7877dd313db8fdaa3537c675yl */
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#ifndef _SYS_XGE_OSDEP_H
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define _SYS_XGE_OSDEP_H
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include <sys/ddi.h>
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include <sys/sunddi.h>
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include <sys/varargs.h>
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include <sys/atomic.h>
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include <sys/policy.h>
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include <sys/int_fmtio.h>
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include <sys/thread.h>
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include <sys/cpuvar.h>
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include <inet/common.h>
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include <inet/ip.h>
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include <inet/mi.h>
a23fd118e437af0a7877dd313db8fdaa3537c675yl#include <inet/nd.h>
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#ifdef __cplusplus
a23fd118e437af0a7877dd313db8fdaa3537c675ylextern "C" {
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/* ------------------------- includes and defines ------------------------- */
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define XGE_HAL_TX_MULTI_POST_IRQ 1
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define XGE_HAL_TX_MULTI_RESERVE_IRQ 1
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define XGE_HAL_TX_MULTI_FREE_IRQ 1
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define XGE_HAL_DMA_DTR_CONSISTENT 1
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define XGE_HAL_DMA_STATS_STREAMING 1
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#if defined(__sparc)
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define XGE_OS_DMA_REQUIRES_SYNC 1
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif
a23fd118e437af0a7877dd313db8fdaa3537c675yl
8347601bcb0a439f6e50fc36b4039a73d08700e1yl#define XGE_HAL_ALIGN_XMIT 1
8347601bcb0a439f6e50fc36b4039a73d08700e1yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#ifdef _BIG_ENDIAN
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define XGE_OS_HOST_BIG_ENDIAN 1
a23fd118e437af0a7877dd313db8fdaa3537c675yl#else
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define XGE_OS_HOST_LITTLE_ENDIAN 1
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif
a23fd118e437af0a7877dd313db8fdaa3537c675yl
7eced415e5dd557aef2d78483b5a7785f0e13670xw#if defined(__sparc)
7eced415e5dd557aef2d78483b5a7785f0e13670xw#define XGE_OS_HOST_PAGE_SIZE 8192
7eced415e5dd557aef2d78483b5a7785f0e13670xw#else
7eced415e5dd557aef2d78483b5a7785f0e13670xw#define XGE_OS_HOST_PAGE_SIZE 4096
7eced415e5dd557aef2d78483b5a7785f0e13670xw#endif
7eced415e5dd557aef2d78483b5a7785f0e13670xw
a23fd118e437af0a7877dd313db8fdaa3537c675yl#if defined(_LP64)
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define XGE_OS_PLATFORM_64BIT 1
a23fd118e437af0a7877dd313db8fdaa3537c675yl#else
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define XGE_OS_PLATFORM_32BIT 1
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define XGE_OS_HAS_SNPRINTF 1
a23fd118e437af0a7877dd313db8fdaa3537c675yl
8347601bcb0a439f6e50fc36b4039a73d08700e1yl/* LRO defines */
8347601bcb0a439f6e50fc36b4039a73d08700e1yl#define XGE_LL_IP_FAST_CSUM(hdr, len) 0 /* ip_ocsum(hdr, len>>1, 0); */
8347601bcb0a439f6e50fc36b4039a73d08700e1yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/* ---------------------- fixed size primitive types ----------------------- */
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define u8 uint8_t
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define u16 uint16_t
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define u32 uint32_t
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define u64 uint64_t
a23fd118e437af0a7877dd313db8fdaa3537c675yltypedef u64 dma_addr_t;
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define ulong_t ulong_t
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define ptrdiff_t ptrdiff_t
a23fd118e437af0a7877dd313db8fdaa3537c675yltypedef kmutex_t spinlock_t;
a23fd118e437af0a7877dd313db8fdaa3537c675yltypedef dev_info_t *pci_dev_h;
a23fd118e437af0a7877dd313db8fdaa3537c675yltypedef ddi_acc_handle_t pci_reg_h;
a23fd118e437af0a7877dd313db8fdaa3537c675yltypedef ddi_acc_handle_t pci_cfg_h;
7eced415e5dd557aef2d78483b5a7785f0e13670xwtypedef uint_t pci_irq_h;
a23fd118e437af0a7877dd313db8fdaa3537c675yltypedef ddi_dma_handle_t pci_dma_h;
a23fd118e437af0a7877dd313db8fdaa3537c675yltypedef ddi_acc_handle_t pci_dma_acc_h;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
8347601bcb0a439f6e50fc36b4039a73d08700e1yl/* LRO types */
8347601bcb0a439f6e50fc36b4039a73d08700e1yl#define OS_NETSTACK_BUF mblk_t *
8347601bcb0a439f6e50fc36b4039a73d08700e1yl#define OS_LL_HEADER uint8_t *
8347601bcb0a439f6e50fc36b4039a73d08700e1yl#define OS_IP_HEADER uint8_t *
8347601bcb0a439f6e50fc36b4039a73d08700e1yl#define OS_TL_HEADER uint8_t *
8347601bcb0a439f6e50fc36b4039a73d08700e1yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/* -------------------------- "libc" functionality ------------------------- */
a23fd118e437af0a7877dd313db8fdaa3537c675yl
7eced415e5dd557aef2d78483b5a7785f0e13670xw#define xge_os_strlcpy (void) strlcpy
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_strlen strlen
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_snprintf snprintf
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_memzero(addr, size) bzero(addr, size)
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_memcpy(dst, src, size) bcopy(src, dst, size)
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_memcmp(src1, src2, size) bcmp(src1, src2, size)
8347601bcb0a439f6e50fc36b4039a73d08700e1yl#define xge_os_ntohl ntohl
8347601bcb0a439f6e50fc36b4039a73d08700e1yl#define xge_os_htons htons
8347601bcb0a439f6e50fc36b4039a73d08700e1yl#define xge_os_ntohs ntohs
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#ifdef __GNUC__
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_printf(fmt...) cmn_err(CE_CONT, fmt)
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_sprintf(buf, fmt...) strlen(sprintf(buf, fmt))
a23fd118e437af0a7877dd313db8fdaa3537c675yl#else
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_vaprintf(fmt) { \
a23fd118e437af0a7877dd313db8fdaa3537c675yl va_list va; \
a23fd118e437af0a7877dd313db8fdaa3537c675yl va_start(va, fmt); \
a23fd118e437af0a7877dd313db8fdaa3537c675yl vcmn_err(CE_CONT, fmt, va); \
a23fd118e437af0a7877dd313db8fdaa3537c675yl va_end(va); \
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675ylstatic inline void xge_os_printf(char *fmt, ...) {
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_os_vaprintf(fmt);
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_vasprintf(buf, fmt) { \
a23fd118e437af0a7877dd313db8fdaa3537c675yl va_list va; \
a23fd118e437af0a7877dd313db8fdaa3537c675yl va_start(va, fmt); \
a23fd118e437af0a7877dd313db8fdaa3537c675yl (void) vsprintf(buf, fmt, va); \
a23fd118e437af0a7877dd313db8fdaa3537c675yl va_end(va); \
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675ylstatic inline int xge_os_sprintf(char *buf, char *fmt, ...) {
a23fd118e437af0a7877dd313db8fdaa3537c675yl xge_os_vasprintf(buf, fmt);
a23fd118e437af0a7877dd313db8fdaa3537c675yl return (strlen(buf));
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_timestamp(buf) { \
a23fd118e437af0a7877dd313db8fdaa3537c675yl todinfo_t todinfo = utc_to_tod(ddi_get_time()); \
7eced415e5dd557aef2d78483b5a7785f0e13670xw (void) xge_os_sprintf(buf, "%02d/%02d/%02d.%02d:%02d:%02d: ", \
a23fd118e437af0a7877dd313db8fdaa3537c675yl todinfo.tod_day, todinfo.tod_month, \
a23fd118e437af0a7877dd313db8fdaa3537c675yl (1970 + todinfo.tod_year - 70), \
a23fd118e437af0a7877dd313db8fdaa3537c675yl todinfo.tod_hour, todinfo.tod_min, todinfo.tod_sec); \
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_println xge_os_printf
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/* -------------------- synchronization primitives ------------------------- */
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_spin_lock_init(lockp, ctxh) \
a23fd118e437af0a7877dd313db8fdaa3537c675yl mutex_init(lockp, NULL, MUTEX_DRIVER, NULL)
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_spin_lock_init_irq(lockp, irqh) \
7eced415e5dd557aef2d78483b5a7785f0e13670xw mutex_init(lockp, NULL, MUTEX_DRIVER, DDI_INTR_PRI(irqh))
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_spin_lock_destroy(lockp, cthx) \
a23fd118e437af0a7877dd313db8fdaa3537c675yl (cthx = cthx, mutex_destroy(lockp))
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_spin_lock_destroy_irq(lockp, cthx) \
a23fd118e437af0a7877dd313db8fdaa3537c675yl (cthx = cthx, mutex_destroy(lockp))
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_spin_lock(lockp) mutex_enter(lockp)
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_spin_unlock(lockp) mutex_exit(lockp)
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_spin_lock_irq(lockp, flags) (flags = flags, mutex_enter(lockp))
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_spin_unlock_irq(lockp, flags) mutex_exit(lockp)
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/* x86 arch will never re-order writes, Sparc can */
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_wmb() membar_producer()
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_udelay(us) drv_usecwait(us)
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_mdelay(ms) drv_usecwait(ms * 1000)
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_cmpxchg(targetp, cmp, newval) \
a23fd118e437af0a7877dd313db8fdaa3537c675yl sizeof (*(targetp)) == 4 ? \
75d94465dbafa487b716482dc36d5150a4ec9853Josef 'Jeff' Sipek atomic_cas_32((uint32_t *)targetp, cmp, newval) : \
75d94465dbafa487b716482dc36d5150a4ec9853Josef 'Jeff' Sipek atomic_cas_64((uint64_t *)targetp, cmp, newval)
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/* ------------------------- misc primitives ------------------------------- */
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_unlikely(x) (x)
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_prefetch(a) (a = a)
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_prefetchw
a23fd118e437af0a7877dd313db8fdaa3537c675yl#ifdef __GNUC__
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_bug(fmt...) cmn_err(CE_PANIC, fmt)
a23fd118e437af0a7877dd313db8fdaa3537c675yl#else
a23fd118e437af0a7877dd313db8fdaa3537c675ylstatic inline void xge_os_bug(char *fmt, ...) {
a23fd118e437af0a7877dd313db8fdaa3537c675yl va_list ap;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl va_start(ap, fmt);
a23fd118e437af0a7877dd313db8fdaa3537c675yl vcmn_err(CE_PANIC, fmt, ap);
a23fd118e437af0a7877dd313db8fdaa3537c675yl va_end(ap);
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/* -------------------------- compiler stuffs ------------------------------ */
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#if defined(__i386)
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define __xge_os_cacheline_size 64 /* L1-cache line size: x86_64 */
a23fd118e437af0a7877dd313db8fdaa3537c675yl#else
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define __xge_os_cacheline_size 64 /* L1-cache line size: sparcv9 */
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#ifdef __GNUC__
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define __xge_os_attr_cacheline_aligned \
a23fd118e437af0a7877dd313db8fdaa3537c675yl __attribute__((__aligned__(__xge_os_cacheline_size)))
a23fd118e437af0a7877dd313db8fdaa3537c675yl#else
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define __xge_os_attr_cacheline_aligned
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/* ---------------------- memory primitives -------------------------------- */
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675ylstatic inline void *__xge_os_malloc(pci_dev_h pdev, unsigned long size,
a23fd118e437af0a7877dd313db8fdaa3537c675yl char *file, int line)
a23fd118e437af0a7877dd313db8fdaa3537c675yl{
a23fd118e437af0a7877dd313db8fdaa3537c675yl void *vaddr = kmem_alloc(size, KM_SLEEP);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl XGE_OS_MEMORY_CHECK_MALLOC(vaddr, size, file, line);
a23fd118e437af0a7877dd313db8fdaa3537c675yl return (vaddr);
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675ylstatic inline void xge_os_free(pci_dev_h pdev, const void *vaddr,
a23fd118e437af0a7877dd313db8fdaa3537c675yl unsigned long size)
a23fd118e437af0a7877dd313db8fdaa3537c675yl{
a23fd118e437af0a7877dd313db8fdaa3537c675yl XGE_OS_MEMORY_CHECK_FREE(vaddr, size);
a23fd118e437af0a7877dd313db8fdaa3537c675yl kmem_free((void*)vaddr, size);
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_malloc(pdev, size) \
a23fd118e437af0a7877dd313db8fdaa3537c675yl __xge_os_malloc(pdev, size, __FILE__, __LINE__)
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675ylstatic inline void *__xge_os_dma_malloc(pci_dev_h pdev, unsigned long size,
a23fd118e437af0a7877dd313db8fdaa3537c675yl int dma_flags, pci_dma_h *p_dmah, pci_dma_acc_h *p_dma_acch, char *file,
a23fd118e437af0a7877dd313db8fdaa3537c675yl int line)
a23fd118e437af0a7877dd313db8fdaa3537c675yl{
a23fd118e437af0a7877dd313db8fdaa3537c675yl void *vaddr;
a23fd118e437af0a7877dd313db8fdaa3537c675yl int ret;
a23fd118e437af0a7877dd313db8fdaa3537c675yl size_t real_size;
a23fd118e437af0a7877dd313db8fdaa3537c675yl extern ddi_device_acc_attr_t *p_xge_dev_attr;
a23fd118e437af0a7877dd313db8fdaa3537c675yl extern struct ddi_dma_attr *p_hal_dma_attr;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
7eced415e5dd557aef2d78483b5a7785f0e13670xw ret = ddi_dma_alloc_handle(pdev, p_hal_dma_attr,
a23fd118e437af0a7877dd313db8fdaa3537c675yl DDI_DMA_DONTWAIT, 0, p_dmah);
a23fd118e437af0a7877dd313db8fdaa3537c675yl if (ret != DDI_SUCCESS) {
a23fd118e437af0a7877dd313db8fdaa3537c675yl return (NULL);
a23fd118e437af0a7877dd313db8fdaa3537c675yl }
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl ret = ddi_dma_mem_alloc(*p_dmah, size, p_xge_dev_attr,
a23fd118e437af0a7877dd313db8fdaa3537c675yl (dma_flags & XGE_OS_DMA_CONSISTENT ?
8347601bcb0a439f6e50fc36b4039a73d08700e1yl DDI_DMA_CONSISTENT : DDI_DMA_STREAMING), DDI_DMA_DONTWAIT, 0,
8347601bcb0a439f6e50fc36b4039a73d08700e1yl (caddr_t *)&vaddr, &real_size, p_dma_acch);
a23fd118e437af0a7877dd313db8fdaa3537c675yl if (ret != DDI_SUCCESS) {
a23fd118e437af0a7877dd313db8fdaa3537c675yl ddi_dma_free_handle(p_dmah);
a23fd118e437af0a7877dd313db8fdaa3537c675yl return (NULL);
a23fd118e437af0a7877dd313db8fdaa3537c675yl }
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl if (size > real_size) {
a23fd118e437af0a7877dd313db8fdaa3537c675yl ddi_dma_mem_free(p_dma_acch);
a23fd118e437af0a7877dd313db8fdaa3537c675yl ddi_dma_free_handle(p_dmah);
a23fd118e437af0a7877dd313db8fdaa3537c675yl return (NULL);
a23fd118e437af0a7877dd313db8fdaa3537c675yl }
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl XGE_OS_MEMORY_CHECK_MALLOC(vaddr, size, file, line);
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl return (vaddr);
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_dma_malloc(pdev, size, dma_flags, p_dmah, p_dma_acch) \
a23fd118e437af0a7877dd313db8fdaa3537c675yl __xge_os_dma_malloc(pdev, size, dma_flags, p_dmah, p_dma_acch, \
a23fd118e437af0a7877dd313db8fdaa3537c675yl __FILE__, __LINE__)
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675ylstatic inline void xge_os_dma_free(pci_dev_h pdev, const void *vaddr, int size,
a23fd118e437af0a7877dd313db8fdaa3537c675yl pci_dma_acc_h *p_dma_acch, pci_dma_h *p_dmah)
a23fd118e437af0a7877dd313db8fdaa3537c675yl{
a23fd118e437af0a7877dd313db8fdaa3537c675yl XGE_OS_MEMORY_CHECK_FREE(vaddr, 0);
a23fd118e437af0a7877dd313db8fdaa3537c675yl ddi_dma_mem_free(p_dma_acch);
a23fd118e437af0a7877dd313db8fdaa3537c675yl ddi_dma_free_handle(p_dmah);
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/* --------------------------- pci primitives ------------------------------ */
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_pci_read8(pdev, cfgh, where, val) \
a23fd118e437af0a7877dd313db8fdaa3537c675yl (*(val) = pci_config_get8(cfgh, where))
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_pci_write8(pdev, cfgh, where, val) \
a23fd118e437af0a7877dd313db8fdaa3537c675yl pci_config_put8(cfgh, where, val)
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_pci_read16(pdev, cfgh, where, val) \
a23fd118e437af0a7877dd313db8fdaa3537c675yl (*(val) = pci_config_get16(cfgh, where))
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_pci_write16(pdev, cfgh, where, val) \
a23fd118e437af0a7877dd313db8fdaa3537c675yl pci_config_put16(cfgh, where, val)
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_pci_read32(pdev, cfgh, where, val) \
a23fd118e437af0a7877dd313db8fdaa3537c675yl (*(val) = pci_config_get32(cfgh, where))
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_pci_write32(pdev, cfgh, where, val) \
a23fd118e437af0a7877dd313db8fdaa3537c675yl pci_config_put32(cfgh, where, val)
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/* --------------------------- io primitives ------------------------------- */
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_pio_mem_read8(pdev, regh, addr) \
a23fd118e437af0a7877dd313db8fdaa3537c675yl (ddi_get8(regh, (uint8_t *)(addr)))
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_pio_mem_write8(pdev, regh, val, addr) \
a23fd118e437af0a7877dd313db8fdaa3537c675yl (ddi_put8(regh, (uint8_t *)(addr), val))
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_pio_mem_read16(pdev, regh, addr) \
a23fd118e437af0a7877dd313db8fdaa3537c675yl (ddi_get16(regh, (uint16_t *)(addr)))
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_pio_mem_write16(pdev, regh, val, addr) \
a23fd118e437af0a7877dd313db8fdaa3537c675yl (ddi_put16(regh, (uint16_t *)(addr), val))
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_pio_mem_read32(pdev, regh, addr) \
a23fd118e437af0a7877dd313db8fdaa3537c675yl (ddi_get32(regh, (uint32_t *)(addr)))
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_pio_mem_write32(pdev, regh, val, addr) \
a23fd118e437af0a7877dd313db8fdaa3537c675yl (ddi_put32(regh, (uint32_t *)(addr), val))
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_pio_mem_read64(pdev, regh, addr) \
a23fd118e437af0a7877dd313db8fdaa3537c675yl (ddi_get64(regh, (uint64_t *)(addr)))
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_pio_mem_write64(pdev, regh, val, addr) \
a23fd118e437af0a7877dd313db8fdaa3537c675yl (ddi_put64(regh, (uint64_t *)(addr), val))
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define xge_os_flush_bridge xge_os_pio_mem_read64
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl/* --------------------------- dma primitives ----------------------------- */
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define XGE_OS_DMA_DIR_TODEVICE DDI_DMA_SYNC_FORDEV
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define XGE_OS_DMA_DIR_FROMDEVICE DDI_DMA_SYNC_FORKERNEL
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define XGE_OS_DMA_DIR_BIDIRECTIONAL -1
a23fd118e437af0a7877dd313db8fdaa3537c675yl#if defined(__x86)
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define XGE_OS_DMA_USES_IOMMU 0
a23fd118e437af0a7877dd313db8fdaa3537c675yl#else
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define XGE_OS_DMA_USES_IOMMU 1
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#define XGE_OS_INVALID_DMA_ADDR ((dma_addr_t)0)
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675ylstatic inline dma_addr_t xge_os_dma_map(pci_dev_h pdev, pci_dma_h dmah,
a23fd118e437af0a7877dd313db8fdaa3537c675yl void *vaddr, size_t size, int dir, int dma_flags) {
a23fd118e437af0a7877dd313db8fdaa3537c675yl int ret;
a23fd118e437af0a7877dd313db8fdaa3537c675yl uint_t flags;
a23fd118e437af0a7877dd313db8fdaa3537c675yl uint_t ncookies;
a23fd118e437af0a7877dd313db8fdaa3537c675yl ddi_dma_cookie_t dma_cookie;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl switch (dir) {
a23fd118e437af0a7877dd313db8fdaa3537c675yl case XGE_OS_DMA_DIR_TODEVICE:
a23fd118e437af0a7877dd313db8fdaa3537c675yl flags = DDI_DMA_WRITE;
a23fd118e437af0a7877dd313db8fdaa3537c675yl break;
a23fd118e437af0a7877dd313db8fdaa3537c675yl case XGE_OS_DMA_DIR_FROMDEVICE:
a23fd118e437af0a7877dd313db8fdaa3537c675yl flags = DDI_DMA_READ;
a23fd118e437af0a7877dd313db8fdaa3537c675yl break;
a23fd118e437af0a7877dd313db8fdaa3537c675yl case XGE_OS_DMA_DIR_BIDIRECTIONAL:
a23fd118e437af0a7877dd313db8fdaa3537c675yl flags = DDI_DMA_RDWR;
a23fd118e437af0a7877dd313db8fdaa3537c675yl break;
a23fd118e437af0a7877dd313db8fdaa3537c675yl default:
a23fd118e437af0a7877dd313db8fdaa3537c675yl return (0);
a23fd118e437af0a7877dd313db8fdaa3537c675yl }
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl flags |= (dma_flags & XGE_OS_DMA_CONSISTENT) ?
a23fd118e437af0a7877dd313db8fdaa3537c675yl DDI_DMA_CONSISTENT : DDI_DMA_STREAMING;
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl ret = ddi_dma_addr_bind_handle(dmah, NULL, vaddr, size, flags,
a23fd118e437af0a7877dd313db8fdaa3537c675yl DDI_DMA_SLEEP, 0, &dma_cookie, &ncookies);
a23fd118e437af0a7877dd313db8fdaa3537c675yl if (ret != DDI_SUCCESS) {
a23fd118e437af0a7877dd313db8fdaa3537c675yl return (0);
a23fd118e437af0a7877dd313db8fdaa3537c675yl }
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl if (ncookies != 1 || dma_cookie.dmac_size < size) {
a23fd118e437af0a7877dd313db8fdaa3537c675yl (void) ddi_dma_unbind_handle(dmah);
a23fd118e437af0a7877dd313db8fdaa3537c675yl return (0);
a23fd118e437af0a7877dd313db8fdaa3537c675yl }
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl return (dma_cookie.dmac_laddress);
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675ylstatic inline void xge_os_dma_unmap(pci_dev_h pdev, pci_dma_h dmah,
a23fd118e437af0a7877dd313db8fdaa3537c675yl dma_addr_t dma_addr, size_t size, int dir)
a23fd118e437af0a7877dd313db8fdaa3537c675yl{
a23fd118e437af0a7877dd313db8fdaa3537c675yl (void) ddi_dma_unbind_handle(dmah);
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675ylstatic inline void xge_os_dma_sync(pci_dev_h pdev, pci_dma_h dmah,
a23fd118e437af0a7877dd313db8fdaa3537c675yl dma_addr_t dma_addr, u64 dma_offset, size_t length, int dir)
a23fd118e437af0a7877dd313db8fdaa3537c675yl{
a23fd118e437af0a7877dd313db8fdaa3537c675yl (void) ddi_dma_sync(dmah, dma_offset, length, dir);
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#ifdef __cplusplus
a23fd118e437af0a7877dd313db8fdaa3537c675yl}
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif
a23fd118e437af0a7877dd313db8fdaa3537c675yl
a23fd118e437af0a7877dd313db8fdaa3537c675yl#endif /* _SYS_XGE_OSDEP_H */