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$*/ 32221167Sgnn 33221167Sgnn#include <dev/vxge/vxgehal/vxgehal.h> 34221167Sgnn 35221167Sgnn/* 36221167Sgnn * _hal_legacy_swapper_set - Set the swapper bits for the legacy secion. 37221167Sgnn * @pdev: PCI device object. 38221167Sgnn * @regh: BAR0 mapped memory handle (Solaris), or simply PCI device @pdev 39221167Sgnn * (Linux and the rest.) 40221167Sgnn * @legacy_reg: Address of the legacy register space. 41221167Sgnn * 42221167Sgnn * Set the swapper bits appropriately for the lagacy section. 43221167Sgnn * 44221167Sgnn * Returns: VXGE_HAL_OK - success. 45221167Sgnn * VXGE_HAL_ERR_SWAPPER_CTRL - failed. 46221167Sgnn * 47221167Sgnn * See also: vxge_hal_status_e {}. 48221167Sgnn */ 49221167Sgnnvxge_hal_status_e 50221167Sgnn__hal_legacy_swapper_set( 51221167Sgnn pci_dev_h pdev, 52221167Sgnn pci_reg_h regh, 53221167Sgnn vxge_hal_legacy_reg_t *legacy_reg) 54221167Sgnn{ 55221167Sgnn u64 val64; 56221167Sgnn vxge_hal_status_e status; 57221167Sgnn 58221167Sgnn vxge_assert(legacy_reg != NULL); 59221167Sgnn 60221167Sgnn vxge_hal_trace_log_driver("==> %s:%s:%d", 61221167Sgnn __FILE__, __func__, __LINE__); 62221167Sgnn 63221167Sgnn vxge_hal_trace_log_driver( 64221167Sgnn "pdev = 0x"VXGE_OS_STXFMT", regh = 0x"VXGE_OS_STXFMT", " 65221167Sgnn "legacy_reg = 0x"VXGE_OS_STXFMT, (ptr_t) pdev, (ptr_t) regh, 66221167Sgnn (ptr_t) legacy_reg); 67221167Sgnn 68221167Sgnn val64 = vxge_os_pio_mem_read64(pdev, regh, &legacy_reg->toc_swapper_fb); 69221167Sgnn 70221167Sgnn vxge_hal_info_log_driver("TOC Swapper Fb: 0x"VXGE_OS_LLXFMT, val64); 71221167Sgnn 72221167Sgnn vxge_os_wmb(); 73221167Sgnn 74221167Sgnn switch (val64) { 75221167Sgnn 76221167Sgnn case VXGE_HAL_SWAPPER_INITIAL_VALUE: 77221167Sgnn return (VXGE_HAL_OK); 78221167Sgnn 79221167Sgnn case VXGE_HAL_SWAPPER_BYTE_SWAPPED_BIT_FLIPPED: 80221167Sgnn vxge_os_pio_mem_write64(pdev, regh, 81221167Sgnn VXGE_HAL_SWAPPER_READ_BYTE_SWAP_ENABLE, 82221167Sgnn &legacy_reg->pifm_rd_swap_en); 83221167Sgnn vxge_os_pio_mem_write64(pdev, regh, 84221167Sgnn VXGE_HAL_SWAPPER_READ_BIT_FLAP_ENABLE, 85221167Sgnn &legacy_reg->pifm_rd_flip_en); 86221167Sgnn vxge_os_pio_mem_write64(pdev, regh, 87221167Sgnn VXGE_HAL_SWAPPER_WRITE_BYTE_SWAP_ENABLE, 88221167Sgnn &legacy_reg->pifm_wr_swap_en); 89221167Sgnn vxge_os_pio_mem_write64(pdev, regh, 90221167Sgnn VXGE_HAL_SWAPPER_WRITE_BIT_FLAP_ENABLE, 91221167Sgnn &legacy_reg->pifm_wr_flip_en); 92221167Sgnn break; 93221167Sgnn 94221167Sgnn case VXGE_HAL_SWAPPER_BYTE_SWAPPED: 95221167Sgnn vxge_os_pio_mem_write64(pdev, regh, 96221167Sgnn VXGE_HAL_SWAPPER_READ_BYTE_SWAP_ENABLE, 97221167Sgnn &legacy_reg->pifm_rd_swap_en); 98221167Sgnn vxge_os_pio_mem_write64(pdev, regh, 99221167Sgnn VXGE_HAL_SWAPPER_WRITE_BYTE_SWAP_ENABLE, 100221167Sgnn &legacy_reg->pifm_wr_swap_en); 101221167Sgnn break; 102221167Sgnn 103221167Sgnn case VXGE_HAL_SWAPPER_BIT_FLIPPED: 104221167Sgnn vxge_os_pio_mem_write64(pdev, regh, 105221167Sgnn VXGE_HAL_SWAPPER_READ_BIT_FLAP_ENABLE, 106221167Sgnn &legacy_reg->pifm_rd_flip_en); 107221167Sgnn vxge_os_pio_mem_write64(pdev, regh, 108221167Sgnn VXGE_HAL_SWAPPER_WRITE_BIT_FLAP_ENABLE, 109221167Sgnn &legacy_reg->pifm_wr_flip_en); 110221167Sgnn break; 111221167Sgnn 112221167Sgnn } 113221167Sgnn 114221167Sgnn vxge_os_wmb(); 115221167Sgnn 116221167Sgnn val64 = vxge_os_pio_mem_read64(pdev, regh, &legacy_reg->toc_swapper_fb); 117221167Sgnn 118221167Sgnn if (val64 == VXGE_HAL_SWAPPER_INITIAL_VALUE) { 119221167Sgnn status = VXGE_HAL_OK; 120221167Sgnn } else { 121221167Sgnn vxge_hal_err_log_driver("%s:TOC Swapper setting failed", 122221167Sgnn __func__); 123221167Sgnn status = VXGE_HAL_ERR_SWAPPER_CTRL; 124221167Sgnn } 125221167Sgnn 126221167Sgnn vxge_hal_info_log_driver("TOC Swapper Fb: 0x"VXGE_OS_LLXFMT, val64); 127221167Sgnn 128221167Sgnn vxge_hal_trace_log_driver("<== %s:%s:%d Result: %d", 129221167Sgnn __FILE__, __func__, __LINE__, status); 130221167Sgnn 131221167Sgnn return (status); 132221167Sgnn} 133221167Sgnn 134221167Sgnn/* 135221167Sgnn * __hal_vpath_swapper_set - Set the swapper bits for the vpath. 136221167Sgnn * @hldev: HAL device object. 137221167Sgnn * @vp_id: Vpath Id 138221167Sgnn * 139221167Sgnn * Set the swapper bits appropriately for the vpath. 140221167Sgnn * 141221167Sgnn * Returns: VXGE_HAL_OK - success. 142221167Sgnn * VXGE_HAL_ERR_SWAPPER_CTRL - failed. 143221167Sgnn * 144221167Sgnn * See also: vxge_hal_status_e {}. 145221167Sgnn */ 146221167Sgnnvxge_hal_status_e 147221167Sgnn__hal_vpath_swapper_set( 148221167Sgnn vxge_hal_device_t *hldev, 149221167Sgnn u32 vp_id) 150221167Sgnn{ 151221167Sgnn#if !defined(VXGE_OS_HOST_BIG_ENDIAN) 152221167Sgnn u64 val64; 153221167Sgnn vxge_hal_vpath_reg_t *vpath_reg; 154221167Sgnn 155221167Sgnn vxge_assert(hldev != NULL); 156221167Sgnn 157221167Sgnn vxge_hal_trace_log_vpath("==> %s:%s:%d", 158221167Sgnn __FILE__, __func__, __LINE__); 159221167Sgnn 160221167Sgnn vxge_hal_trace_log_vpath( 161221167Sgnn "hldev = 0x"VXGE_OS_STXFMT", vp_id = %d", 162221167Sgnn (ptr_t) hldev, vp_id); 163221167Sgnn 164221167Sgnn vpath_reg = ((__hal_device_t *) hldev)->vpath_reg[vp_id]; 165221167Sgnn 166221167Sgnn val64 = vxge_os_pio_mem_read64(hldev->pdev, hldev->regh0, 167221167Sgnn &vpath_reg->vpath_general_cfg1); 168221167Sgnn 169221167Sgnn vxge_os_wmb(); 170221167Sgnn 171221167Sgnn val64 |= VXGE_HAL_VPATH_GENERAL_CFG1_CTL_BYTE_SWAPEN; 172221167Sgnn 173221167Sgnn vxge_os_pio_mem_write64(hldev->pdev, hldev->regh0, 174221167Sgnn val64, 175221167Sgnn &vpath_reg->vpath_general_cfg1); 176221167Sgnn vxge_os_wmb(); 177221167Sgnn 178221167Sgnn 179221167Sgnn vxge_hal_trace_log_vpath("<== %s:%s:%d Result: 0", 180221167Sgnn __FILE__, __func__, __LINE__); 181221167Sgnn#endif 182221167Sgnn return (VXGE_HAL_OK); 183221167Sgnn} 184221167Sgnn 185221167Sgnn 186221167Sgnn/* 187221167Sgnn * __hal_kdfc_swapper_set - Set the swapper bits for the kdfc. 188221167Sgnn * @hldev: HAL device object. 189221167Sgnn * @vp_id: Vpath Id 190221167Sgnn * 191221167Sgnn * Set the swapper bits appropriately for the vpath. 192221167Sgnn * 193221167Sgnn * Returns: VXGE_HAL_OK - success. 194221167Sgnn * VXGE_HAL_ERR_SWAPPER_CTRL - failed. 195221167Sgnn * 196221167Sgnn * See also: vxge_hal_status_e {}. 197221167Sgnn */ 198221167Sgnnvxge_hal_status_e 199221167Sgnn__hal_kdfc_swapper_set( 200221167Sgnn vxge_hal_device_t *hldev, 201221167Sgnn u32 vp_id) 202221167Sgnn{ 203221167Sgnn u64 val64; 204221167Sgnn vxge_hal_vpath_reg_t *vpath_reg; 205221167Sgnn vxge_hal_legacy_reg_t *legacy_reg; 206221167Sgnn 207221167Sgnn vxge_assert(hldev != NULL); 208221167Sgnn 209221167Sgnn vxge_hal_trace_log_vpath("==> %s:%s:%d", 210221167Sgnn __FILE__, __func__, __LINE__); 211221167Sgnn 212221167Sgnn vxge_hal_trace_log_vpath("hldev = 0x"VXGE_OS_STXFMT", vp_id = %d", 213221167Sgnn (ptr_t) hldev, vp_id); 214221167Sgnn 215221167Sgnn vpath_reg = ((__hal_device_t *) hldev)->vpath_reg[vp_id]; 216221167Sgnn legacy_reg = ((__hal_device_t *) hldev)->legacy_reg; 217221167Sgnn 218221167Sgnn val64 = vxge_os_pio_mem_read64(hldev->pdev, hldev->regh0, 219221167Sgnn &legacy_reg->pifm_wr_swap_en); 220221167Sgnn 221221167Sgnn if (val64 == VXGE_HAL_SWAPPER_WRITE_BYTE_SWAP_ENABLE) { 222221167Sgnn 223221167Sgnn val64 = vxge_os_pio_mem_read64(hldev->pdev, hldev->regh0, 224221167Sgnn &vpath_reg->kdfcctl_cfg0); 225221167Sgnn 226221167Sgnn vxge_os_wmb(); 227221167Sgnn 228221167Sgnn val64 |= VXGE_HAL_KDFCCTL_CFG0_BYTE_SWAPEN_FIFO0 | 229221167Sgnn VXGE_HAL_KDFCCTL_CFG0_BYTE_SWAPEN_FIFO1 | 230221167Sgnn VXGE_HAL_KDFCCTL_CFG0_BYTE_SWAPEN_FIFO2; 231221167Sgnn 232221167Sgnn vxge_os_pio_mem_write64(hldev->pdev, hldev->regh0, 233221167Sgnn val64, 234221167Sgnn &vpath_reg->kdfcctl_cfg0); 235221167Sgnn vxge_os_wmb(); 236221167Sgnn 237221167Sgnn } 238221167Sgnn 239221167Sgnn vxge_hal_trace_log_vpath("<== %s:%s:%d Result: 0", 240221167Sgnn __FILE__, __func__, __LINE__); 241221167Sgnn 242221167Sgnn return (VXGE_HAL_OK); 243221167Sgnn} 244