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