1221167Sgnn/*- 2221167Sgnn * Copyright(c) 2002-2011 Exar Corp. 3221167Sgnn * All rights reserved. 4221167Sgnn * 5221167Sgnn * Redistribution and use in source and binary forms, with or without 6221167Sgnn * modification are permitted provided the following conditions are met: 7221167Sgnn * 8221167Sgnn * 1. Redistributions of source code must retain the above copyright notice, 9221167Sgnn * this list of conditions and the following disclaimer. 10221167Sgnn * 11221167Sgnn * 2. Redistributions in binary form must reproduce the above copyright 12221167Sgnn * notice, this list of conditions and the following disclaimer in the 13221167Sgnn * documentation and/or other materials provided with the distribution. 14221167Sgnn * 15221167Sgnn * 3. Neither the name of the Exar Corporation nor the names of its 16221167Sgnn * contributors may be used to endorse or promote products derived from 17221167Sgnn * this software without specific prior written permission. 18221167Sgnn * 19221167Sgnn * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20221167Sgnn * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21221167Sgnn * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22221167Sgnn * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 23221167Sgnn * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24221167Sgnn * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25221167Sgnn * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26221167Sgnn * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27221167Sgnn * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28221167Sgnn * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29221167Sgnn * POSSIBILITY OF SUCH DAMAGE. 30221167Sgnn */ 31221167Sgnn/*$FreeBSD: releng/10.3/sys/dev/vxge/vxgehal/vxgehal-doorbells.c 221167 2011-04-28 14:33:15Z gnn $*/ 32221167Sgnn#include <dev/vxge/vxgehal/vxgehal.h> 33221167Sgnn 34221167Sgnn 35221167Sgnn/* 36221167Sgnn * __hal_non_offload_db_post - Post non offload doorbell 37221167Sgnn * 38221167Sgnn * @vpath_handle: vpath handle 39221167Sgnn * @txdl_ptr: The starting location of the TxDL in host memory 40221167Sgnn * @num_txds: The highest TxD in this TxDL (0 to 255 means 1 to 256) 41221167Sgnn * @no_snoop: No snoop flags 42221167Sgnn * 43221167Sgnn * This function posts a non-offload doorbell to doorbell FIFO 44221167Sgnn * 45221167Sgnn */ 46221167Sgnnvoid 47221167Sgnn__hal_non_offload_db_post(vxge_hal_vpath_h vpath_handle, 48221167Sgnn u64 txdl_ptr, 49221167Sgnn u32 num_txds, 50221167Sgnn u32 no_snoop) 51221167Sgnn{ 52221167Sgnn u64 *db_ptr; 53221167Sgnn __hal_device_t *hldev; 54221167Sgnn __hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle; 55221167Sgnn 56221167Sgnn vxge_assert((vpath_handle != NULL) && (txdl_ptr != 0)); 57221167Sgnn 58221167Sgnn hldev = (__hal_device_t *) vp->vpath->hldev; 59221167Sgnn 60221167Sgnn vxge_hal_trace_log_fifo("==> %s:%s:%d", 61221167Sgnn __FILE__, __func__, __LINE__); 62221167Sgnn 63221167Sgnn vxge_hal_trace_log_fifo( 64221167Sgnn "vpath_handle = 0x"VXGE_OS_STXFMT", txdl_ptr = 0x"VXGE_OS_STXFMT 65221167Sgnn ", num_txds = %d, no_snoop = %d", (ptr_t) vpath_handle, 66221167Sgnn (ptr_t) txdl_ptr, num_txds, no_snoop); 67221167Sgnn 68221167Sgnn db_ptr = &vp->vpath->nofl_db->control_0; 69221167Sgnn 70221167Sgnn vxge_os_pio_mem_write64(vp->vpath->hldev->header.pdev, 71221167Sgnn vp->vpath->hldev->header.regh0, 72221167Sgnn VXGE_HAL_NODBW_TYPE(VXGE_HAL_NODBW_TYPE_NODBW) | 73221167Sgnn VXGE_HAL_NODBW_LAST_TXD_NUMBER(num_txds) | 74221167Sgnn VXGE_HAL_NODBW_GET_NO_SNOOP(no_snoop), 75221167Sgnn db_ptr++); 76221167Sgnn 77221167Sgnn vxge_os_pio_mem_write64(vp->vpath->hldev->header.pdev, 78221167Sgnn vp->vpath->hldev->header.regh0, 79221167Sgnn txdl_ptr, 80221167Sgnn db_ptr); 81221167Sgnn 82221167Sgnn vxge_hal_trace_log_fifo("<== %s:%s:%d Result: 0", 83221167Sgnn __FILE__, __func__, __LINE__); 84221167Sgnn} 85221167Sgnn 86221167Sgnn/* 87221167Sgnn * __hal_non_offload_db_reset - Reset non offload doorbell fifo 88221167Sgnn * 89221167Sgnn * @vpath_handle: vpath handle 90221167Sgnn * 91221167Sgnn * This function resets non-offload doorbell FIFO 92221167Sgnn * 93221167Sgnn */ 94221167Sgnnvxge_hal_status_e 95221167Sgnn__hal_non_offload_db_reset(vxge_hal_vpath_h vpath_handle) 96221167Sgnn{ 97221167Sgnn vxge_hal_status_e status; 98221167Sgnn __hal_device_t *hldev; 99221167Sgnn __hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle; 100221167Sgnn 101221167Sgnn vxge_assert(vpath_handle != NULL); 102221167Sgnn 103221167Sgnn hldev = (__hal_device_t *) vp->vpath->hldev; 104221167Sgnn 105221167Sgnn vxge_hal_trace_log_fifo("==> %s:%s:%d", 106221167Sgnn __FILE__, __func__, __LINE__); 107221167Sgnn 108221167Sgnn vxge_hal_trace_log_fifo( 109221167Sgnn "vpath_handle = 0x"VXGE_OS_STXFMT, (ptr_t) vpath_handle); 110221167Sgnn 111221167Sgnn vxge_os_pio_mem_write64(vp->vpath->hldev->header.pdev, 112221167Sgnn vp->vpath->hldev->header.regh0, 113221167Sgnn VXGE_HAL_CMN_RSTHDLR_CFG2_SW_RESET_FIFO0( 114221167Sgnn 1 << (16 - vp->vpath->vp_id)), 115221167Sgnn &vp->vpath->hldev->common_reg->cmn_rsthdlr_cfg2); 116221167Sgnn 117221167Sgnn vxge_os_wmb(); 118221167Sgnn 119221167Sgnn status = vxge_hal_device_register_poll(vp->vpath->hldev->header.pdev, 120221167Sgnn vp->vpath->hldev->header.regh0, 121221167Sgnn &vp->vpath->hldev->common_reg->cmn_rsthdlr_cfg2, 0, 122221167Sgnn (u64) VXGE_HAL_CMN_RSTHDLR_CFG2_SW_RESET_FIFO0( 123221167Sgnn 1 << (16 - vp->vpath->vp_id)), 124221167Sgnn VXGE_HAL_DEF_DEVICE_POLL_MILLIS); 125221167Sgnn 126221167Sgnn vxge_hal_trace_log_fifo("<== %s:%s:%d Result: 0", 127221167Sgnn __FILE__, __func__, __LINE__); 128221167Sgnn 129221167Sgnn return (status); 130221167Sgnn} 131221167Sgnn 132221167Sgnn/* 133221167Sgnn * __hal_rxd_db_post - Post rxd doorbell 134221167Sgnn * 135221167Sgnn * @vpath_handle: vpath handle 136221167Sgnn * @num_bytes: The number of bytes 137221167Sgnn * 138221167Sgnn * This function posts a rxd doorbell 139221167Sgnn * 140221167Sgnn */ 141221167Sgnnvoid 142221167Sgnn__hal_rxd_db_post(vxge_hal_vpath_h vpath_handle, 143221167Sgnn u32 num_bytes) 144221167Sgnn{ 145221167Sgnn __hal_device_t *hldev; 146221167Sgnn __hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle; 147221167Sgnn 148221167Sgnn vxge_assert(vpath_handle != NULL); 149221167Sgnn 150221167Sgnn hldev = (__hal_device_t *) vp->vpath->hldev; 151221167Sgnn 152221167Sgnn vxge_hal_trace_log_ring("==> %s:%s:%d", 153221167Sgnn __FILE__, __func__, __LINE__); 154221167Sgnn 155221167Sgnn vxge_hal_trace_log_fifo( 156221167Sgnn "vpath_handle = 0x"VXGE_OS_STXFMT", num_bytes = %d", 157221167Sgnn (ptr_t) vpath_handle, num_bytes); 158221167Sgnn 159221167Sgnn vxge_os_pio_mem_write64(vp->vpath->hldev->header.pdev, 160221167Sgnn vp->vpath->hldev->header.regh0, 161221167Sgnn VXGE_HAL_PRC_RXD_DOORBELL_NEW_QW_CNT((num_bytes >> 3)), 162221167Sgnn &vp->vpath->vp_reg->prc_rxd_doorbell); 163221167Sgnn 164221167Sgnn vxge_hal_trace_log_ring("<== %s:%s:%d Result: 0", 165221167Sgnn __FILE__, __func__, __LINE__); 166221167Sgnn} 167221167Sgnn 168221167Sgnn 169221167Sgnn/* 170221167Sgnn * __hal_message_db_post - Post message doorbell 171221167Sgnn * 172221167Sgnn * @vpath_handle: VPATH handle 173221167Sgnn * @num_msg_bytes: The number of new message bytes made available 174221167Sgnn * by this doorbell entry. 175221167Sgnn * @immed_msg: Immediate message to be sent 176221167Sgnn * @immed_msg_len: Immediate message length 177221167Sgnn * 178221167Sgnn * This function posts a message doorbell to doorbell FIFO 179221167Sgnn * 180221167Sgnn */ 181221167Sgnnvoid 182221167Sgnn__hal_message_db_post(vxge_hal_vpath_h vpath_handle, 183221167Sgnn u32 num_msg_bytes, 184221167Sgnn u8 *immed_msg, 185221167Sgnn u32 immed_msg_len) 186221167Sgnn{ 187221167Sgnn u32 i; 188221167Sgnn u64 *db_ptr; 189221167Sgnn __hal_device_t *hldev; 190221167Sgnn __hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle; 191221167Sgnn 192221167Sgnn vxge_assert((vpath_handle != NULL) && (num_msg_bytes != 0)); 193221167Sgnn 194221167Sgnn hldev = (__hal_device_t *) vp->vpath->hldev; 195221167Sgnn 196221167Sgnn vxge_hal_trace_log_dmq("==> %s:%s:%d", 197221167Sgnn __FILE__, __func__, __LINE__); 198221167Sgnn 199221167Sgnn vxge_hal_trace_log_dmq("vpath_handle = 0x"VXGE_OS_STXFMT", " 200221167Sgnn "num_msg_bytes = %d, immed_msg = 0x"VXGE_OS_STXFMT", " 201221167Sgnn "immed_msg_len = %d", (ptr_t) vpath_handle, num_msg_bytes, 202221167Sgnn (ptr_t) immed_msg, immed_msg_len); 203221167Sgnn 204221167Sgnn db_ptr = &vp->vpath->msg_db->control_0; 205221167Sgnn 206221167Sgnn vxge_os_pio_mem_write64(vp->vpath->hldev->header.pdev, 207221167Sgnn vp->vpath->hldev->header.regh0, 208221167Sgnn VXGE_HAL_MDBW_TYPE(VXGE_HAL_MDBW_TYPE_MDBW) | 209221167Sgnn VXGE_HAL_MDBW_MESSAGE_BYTE_COUNT(num_msg_bytes), 210221167Sgnn db_ptr++); 211221167Sgnn 212221167Sgnn vxge_os_pio_mem_write64(vp->vpath->hldev->header.pdev, 213221167Sgnn vp->vpath->hldev->header.regh0, 214221167Sgnn VXGE_HAL_MDBW_IMMEDIATE_BYTE_COUNT(immed_msg_len), 215221167Sgnn db_ptr++); 216221167Sgnn 217221167Sgnn for (i = 0; i < immed_msg_len / 8; i++) { 218221167Sgnn vxge_os_pio_mem_write64(vp->vpath->hldev->header.pdev, 219221167Sgnn vp->vpath->hldev->header.regh0, 220221167Sgnn *((u64 *) ((void *)&immed_msg[i * 8])), 221221167Sgnn db_ptr++); 222221167Sgnn } 223221167Sgnn 224221167Sgnn vxge_hal_trace_log_dmq("<== %s:%s:%d Result: 0", 225221167Sgnn __FILE__, __func__, __LINE__); 226221167Sgnn} 227221167Sgnn 228221167Sgnn/* 229221167Sgnn * __hal_message_db_reset - Reset message doorbell fifo 230221167Sgnn * 231221167Sgnn * @vpath_handle: vpath handle 232221167Sgnn * 233221167Sgnn * This function resets message doorbell FIFO 234221167Sgnn * 235221167Sgnn */ 236221167Sgnnvxge_hal_status_e 237221167Sgnn__hal_message_db_reset(vxge_hal_vpath_h vpath_handle) 238221167Sgnn{ 239221167Sgnn vxge_hal_status_e status; 240221167Sgnn __hal_device_t *hldev; 241221167Sgnn __hal_vpath_handle_t *vp = (__hal_vpath_handle_t *) vpath_handle; 242221167Sgnn 243221167Sgnn vxge_assert(vpath_handle != NULL); 244221167Sgnn 245221167Sgnn hldev = (__hal_device_t *) vp->vpath->hldev; 246221167Sgnn 247221167Sgnn vxge_hal_trace_log_dmq("==> %s:%s:%d", 248221167Sgnn __FILE__, __func__, __LINE__); 249221167Sgnn 250221167Sgnn vxge_hal_trace_log_dmq("vpath_handle = 0x"VXGE_OS_STXFMT, 251221167Sgnn (ptr_t) vpath_handle); 252221167Sgnn 253221167Sgnn vxge_os_pio_mem_write64(vp->vpath->hldev->header.pdev, 254221167Sgnn vp->vpath->hldev->header.regh0, 255221167Sgnn VXGE_HAL_CMN_RSTHDLR_CFG3_SW_RESET_FIFO1( 256221167Sgnn 1 << (16 - vp->vpath->vp_id)), 257221167Sgnn &vp->vpath->hldev->common_reg->cmn_rsthdlr_cfg3); 258221167Sgnn 259221167Sgnn vxge_os_wmb(); 260221167Sgnn 261221167Sgnn status = vxge_hal_device_register_poll(vp->vpath->hldev->header.pdev, 262221167Sgnn vp->vpath->hldev->header.regh0, 263221167Sgnn &vp->vpath->hldev->common_reg->cmn_rsthdlr_cfg3, 0, 264221167Sgnn (u64) VXGE_HAL_CMN_RSTHDLR_CFG3_SW_RESET_FIFO1( 265221167Sgnn 1 << (16 - vp->vpath->vp_id)), 266221167Sgnn VXGE_HAL_DEF_DEVICE_POLL_MILLIS); 267221167Sgnn 268221167Sgnn vxge_hal_trace_log_dmq("<== %s:%s:%d Result: 0", 269221167Sgnn __FILE__, __func__, __LINE__); 270221167Sgnn 271221167Sgnn return (status); 272221167Sgnn} 273