]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - sys/dev/vxge/vxgehal/vxgehal-swapper.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / sys / dev / vxge / vxgehal / vxgehal-swapper.c
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$*/
32
33 #include <dev/vxge/vxgehal/vxgehal.h>
34
35 /*
36  * _hal_legacy_swapper_set - Set the swapper bits for the legacy secion.
37  * @pdev: PCI device object.
38  * @regh: BAR0 mapped memory handle (Solaris), or simply PCI device @pdev
39  *      (Linux and the rest.)
40  * @legacy_reg: Address of the legacy register space.
41  *
42  * Set the swapper bits appropriately for the lagacy section.
43  *
44  * Returns:  VXGE_HAL_OK - success.
45  * VXGE_HAL_ERR_SWAPPER_CTRL - failed.
46  *
47  * See also: vxge_hal_status_e {}.
48  */
49 vxge_hal_status_e
50 __hal_legacy_swapper_set(
51     pci_dev_h pdev,
52     pci_reg_h regh,
53     vxge_hal_legacy_reg_t *legacy_reg)
54 {
55         u64 val64;
56         vxge_hal_status_e status;
57
58         vxge_assert(legacy_reg != NULL);
59
60         vxge_hal_trace_log_driver("==> %s:%s:%d",
61             __FILE__, __func__, __LINE__);
62
63         vxge_hal_trace_log_driver(
64             "pdev = 0x"VXGE_OS_STXFMT", regh = 0x"VXGE_OS_STXFMT", "
65             "legacy_reg = 0x"VXGE_OS_STXFMT, (ptr_t) pdev, (ptr_t) regh,
66             (ptr_t) legacy_reg);
67
68         val64 = vxge_os_pio_mem_read64(pdev, regh, &legacy_reg->toc_swapper_fb);
69
70         vxge_hal_info_log_driver("TOC Swapper Fb: 0x"VXGE_OS_LLXFMT, val64);
71
72         vxge_os_wmb();
73
74         switch (val64) {
75
76         case VXGE_HAL_SWAPPER_INITIAL_VALUE:
77                 return (VXGE_HAL_OK);
78
79         case VXGE_HAL_SWAPPER_BYTE_SWAPPED_BIT_FLIPPED:
80                 vxge_os_pio_mem_write64(pdev, regh,
81                     VXGE_HAL_SWAPPER_READ_BYTE_SWAP_ENABLE,
82                     &legacy_reg->pifm_rd_swap_en);
83                 vxge_os_pio_mem_write64(pdev, regh,
84                     VXGE_HAL_SWAPPER_READ_BIT_FLAP_ENABLE,
85                     &legacy_reg->pifm_rd_flip_en);
86                 vxge_os_pio_mem_write64(pdev, regh,
87                     VXGE_HAL_SWAPPER_WRITE_BYTE_SWAP_ENABLE,
88                     &legacy_reg->pifm_wr_swap_en);
89                 vxge_os_pio_mem_write64(pdev, regh,
90                     VXGE_HAL_SWAPPER_WRITE_BIT_FLAP_ENABLE,
91                     &legacy_reg->pifm_wr_flip_en);
92                 break;
93
94         case VXGE_HAL_SWAPPER_BYTE_SWAPPED:
95                 vxge_os_pio_mem_write64(pdev, regh,
96                     VXGE_HAL_SWAPPER_READ_BYTE_SWAP_ENABLE,
97                     &legacy_reg->pifm_rd_swap_en);
98                 vxge_os_pio_mem_write64(pdev, regh,
99                     VXGE_HAL_SWAPPER_WRITE_BYTE_SWAP_ENABLE,
100                     &legacy_reg->pifm_wr_swap_en);
101                 break;
102
103         case VXGE_HAL_SWAPPER_BIT_FLIPPED:
104                 vxge_os_pio_mem_write64(pdev, regh,
105                     VXGE_HAL_SWAPPER_READ_BIT_FLAP_ENABLE,
106                     &legacy_reg->pifm_rd_flip_en);
107                 vxge_os_pio_mem_write64(pdev, regh,
108                     VXGE_HAL_SWAPPER_WRITE_BIT_FLAP_ENABLE,
109                     &legacy_reg->pifm_wr_flip_en);
110                 break;
111
112         }
113
114         vxge_os_wmb();
115
116         val64 = vxge_os_pio_mem_read64(pdev, regh, &legacy_reg->toc_swapper_fb);
117
118         if (val64 == VXGE_HAL_SWAPPER_INITIAL_VALUE) {
119                 status = VXGE_HAL_OK;
120         } else {
121                 vxge_hal_err_log_driver("%s:TOC Swapper setting failed",
122                     __func__);
123                 status = VXGE_HAL_ERR_SWAPPER_CTRL;
124         }
125
126         vxge_hal_info_log_driver("TOC Swapper Fb: 0x"VXGE_OS_LLXFMT, val64);
127
128         vxge_hal_trace_log_driver("<== %s:%s:%d  Result: %d",
129             __FILE__, __func__, __LINE__, status);
130
131         return (status);
132 }
133
134 /*
135  * __hal_vpath_swapper_set - Set the swapper bits for the vpath.
136  * @hldev: HAL device object.
137  * @vp_id: Vpath Id
138  *
139  * Set the swapper bits appropriately for the vpath.
140  *
141  * Returns:  VXGE_HAL_OK - success.
142  * VXGE_HAL_ERR_SWAPPER_CTRL - failed.
143  *
144  * See also: vxge_hal_status_e {}.
145  */
146 vxge_hal_status_e
147 __hal_vpath_swapper_set(
148     vxge_hal_device_t *hldev,
149     u32 vp_id)
150 {
151 #if !defined(VXGE_OS_HOST_BIG_ENDIAN)
152         u64 val64;
153         vxge_hal_vpath_reg_t *vpath_reg;
154
155         vxge_assert(hldev != NULL);
156
157         vxge_hal_trace_log_vpath("==> %s:%s:%d",
158             __FILE__, __func__, __LINE__);
159
160         vxge_hal_trace_log_vpath(
161             "hldev = 0x"VXGE_OS_STXFMT", vp_id = %d",
162             (ptr_t) hldev, vp_id);
163
164         vpath_reg = ((__hal_device_t *) hldev)->vpath_reg[vp_id];
165
166         val64 = vxge_os_pio_mem_read64(hldev->pdev, hldev->regh0,
167             &vpath_reg->vpath_general_cfg1);
168
169         vxge_os_wmb();
170
171         val64 |= VXGE_HAL_VPATH_GENERAL_CFG1_CTL_BYTE_SWAPEN;
172
173         vxge_os_pio_mem_write64(hldev->pdev, hldev->regh0,
174             val64,
175             &vpath_reg->vpath_general_cfg1);
176         vxge_os_wmb();
177
178
179         vxge_hal_trace_log_vpath("<== %s:%s:%d  Result: 0",
180             __FILE__, __func__, __LINE__);
181 #endif
182         return (VXGE_HAL_OK);
183 }
184
185
186 /*
187  * __hal_kdfc_swapper_set - Set the swapper bits for the kdfc.
188  * @hldev: HAL device object.
189  * @vp_id: Vpath Id
190  *
191  * Set the swapper bits appropriately for the vpath.
192  *
193  * Returns:  VXGE_HAL_OK - success.
194  * VXGE_HAL_ERR_SWAPPER_CTRL - failed.
195  *
196  * See also: vxge_hal_status_e {}.
197  */
198 vxge_hal_status_e
199 __hal_kdfc_swapper_set(
200     vxge_hal_device_t *hldev,
201     u32 vp_id)
202 {
203         u64 val64;
204         vxge_hal_vpath_reg_t *vpath_reg;
205         vxge_hal_legacy_reg_t *legacy_reg;
206
207         vxge_assert(hldev != NULL);
208
209         vxge_hal_trace_log_vpath("==> %s:%s:%d",
210             __FILE__, __func__, __LINE__);
211
212         vxge_hal_trace_log_vpath("hldev = 0x"VXGE_OS_STXFMT", vp_id = %d",
213             (ptr_t) hldev, vp_id);
214
215         vpath_reg = ((__hal_device_t *) hldev)->vpath_reg[vp_id];
216         legacy_reg = ((__hal_device_t *) hldev)->legacy_reg;
217
218         val64 = vxge_os_pio_mem_read64(hldev->pdev, hldev->regh0,
219             &legacy_reg->pifm_wr_swap_en);
220
221         if (val64 == VXGE_HAL_SWAPPER_WRITE_BYTE_SWAP_ENABLE) {
222
223                 val64 = vxge_os_pio_mem_read64(hldev->pdev, hldev->regh0,
224                     &vpath_reg->kdfcctl_cfg0);
225
226                 vxge_os_wmb();
227
228                 val64 |= VXGE_HAL_KDFCCTL_CFG0_BYTE_SWAPEN_FIFO0 |
229                     VXGE_HAL_KDFCCTL_CFG0_BYTE_SWAPEN_FIFO1 |
230                     VXGE_HAL_KDFCCTL_CFG0_BYTE_SWAPEN_FIFO2;
231
232                 vxge_os_pio_mem_write64(hldev->pdev, hldev->regh0,
233                     val64,
234                     &vpath_reg->kdfcctl_cfg0);
235                 vxge_os_wmb();
236
237         }
238
239         vxge_hal_trace_log_vpath("<== %s:%s:%d  Result: 0",
240             __FILE__, __func__, __LINE__);
241
242         return (VXGE_HAL_OK);
243 }