]> CyberLeo.Net >> Repos - FreeBSD/releng/8.2.git/blob - sys/contrib/octeon-sdk/cvmx-spi.h
Copy stable/8 to releng/8.2 in preparation for FreeBSD-8.2 release.
[FreeBSD/releng/8.2.git] / sys / contrib / octeon-sdk / cvmx-spi.h
1 /***********************license start***************
2  *  Copyright (c) 2003-2008 Cavium Networks (support@cavium.com). All rights
3  *  reserved.
4  *
5  *
6  *  Redistribution and use in source and binary forms, with or without
7  *  modification, are permitted provided that the following conditions are
8  *  met:
9  *
10  *      * Redistributions of source code must retain the above copyright
11  *        notice, this list of conditions and the following disclaimer.
12  *
13  *      * Redistributions in binary form must reproduce the above
14  *        copyright notice, this list of conditions and the following
15  *        disclaimer in the documentation and/or other materials provided
16  *        with the distribution.
17  *
18  *      * Neither the name of Cavium Networks nor the names of
19  *        its contributors may be used to endorse or promote products
20  *        derived from this software without specific prior written
21  *        permission.
22  *
23  *  TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
24  *  AND WITH ALL FAULTS AND CAVIUM NETWORKS MAKES NO PROMISES, REPRESENTATIONS
25  *  OR WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH
26  *  RESPECT TO THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY
27  *  REPRESENTATION OR DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT
28  *  DEFECTS, AND CAVIUM SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES
29  *  OF TITLE, MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR
30  *  PURPOSE, LACK OF VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET
31  *  POSSESSION OR CORRESPONDENCE TO DESCRIPTION.  THE ENTIRE RISK ARISING OUT
32  *  OF USE OR PERFORMANCE OF THE SOFTWARE LIES WITH YOU.
33  *
34  *
35  *  For any questions regarding licensing please contact marketing@caviumnetworks.com
36  *
37  ***********************license end**************************************/
38
39
40
41
42
43
44 /**
45  * @file
46  *
47  * This file contains defines for the SPI interface
48
49  * <hr>$Revision: 41586 $<hr>
50  *
51  *
52  */
53 #ifndef __CVMX_SPI_H__
54 #define __CVMX_SPI_H__
55
56 #ifdef  __cplusplus
57 extern "C" {
58 #endif
59
60 /* CSR typedefs have been moved to cvmx-csr-*.h */
61
62 typedef enum
63 {
64     CVMX_SPI_MODE_UNKNOWN = 0,
65     CVMX_SPI_MODE_TX_HALFPLEX = 1,
66     CVMX_SPI_MODE_RX_HALFPLEX = 2,
67     CVMX_SPI_MODE_DUPLEX = 3
68 } cvmx_spi_mode_t;
69
70 /** Callbacks structure to customize SPI4 initialization sequence */
71 typedef struct
72 {
73     /** Called to reset SPI4 DLL */
74     int (*reset_cb)(int interface, cvmx_spi_mode_t mode);
75
76     /** Called to setup calendar */
77     int (*calendar_setup_cb)(int interface, cvmx_spi_mode_t mode, int num_ports);
78
79     /** Called for Tx and Rx clock detection */
80     int (*clock_detect_cb)(int interface, cvmx_spi_mode_t mode, int timeout);
81
82     /** Called to perform link training */
83     int (*training_cb)(int interface, cvmx_spi_mode_t mode, int timeout);
84
85     /** Called for calendar data synchronization */
86     int (*calendar_sync_cb)(int interface, cvmx_spi_mode_t mode, int timeout);
87
88     /** Called when interface is up */
89     int (*interface_up_cb)(int interface, cvmx_spi_mode_t mode);
90
91 } cvmx_spi_callbacks_t;
92
93
94 /**
95  * Return true if the supplied interface is configured for SPI
96  *
97  * @param interface Interface to check
98  * @return True if interface is SPI
99  */
100 static inline int cvmx_spi_is_spi_interface(int interface)
101 {
102     uint64_t gmxState = cvmx_read_csr(CVMX_GMXX_INF_MODE(interface));
103     return ((gmxState & 0x2) && (gmxState & 0x1));
104 }
105
106 /**
107  * Initialize and start the SPI interface.
108  *
109  * @param interface The identifier of the packet interface to configure and
110  *                  use as a SPI interface.
111  * @param mode      The operating mode for the SPI interface. The interface
112  *                  can operate as a full duplex (both Tx and Rx data paths
113  *                  active) or as a halfplex (either the Tx data path is
114  *                  active or the Rx data path is active, but not both).
115  * @param timeout   Timeout to wait for clock synchronization in seconds
116  * @param num_ports Number of SPI ports to configure
117  *
118  * @return Zero on success, negative of failure.
119  */
120 extern int cvmx_spi_start_interface(int interface, cvmx_spi_mode_t mode, int timeout, int num_ports);
121
122 /**
123  * This routine restarts the SPI interface after it has lost synchronization
124  * with its corespondant system.
125  *
126  * @param interface The identifier of the packet interface to configure and
127  *                  use as a SPI interface.
128  * @param mode      The operating mode for the SPI interface. The interface
129  *                  can operate as a full duplex (both Tx and Rx data paths
130  *                  active) or as a halfplex (either the Tx data path is
131  *                  active or the Rx data path is active, but not both).
132  * @param timeout   Timeout to wait for clock synchronization in seconds
133  * @return Zero on success, negative of failure.
134  */
135 extern int cvmx_spi_restart_interface(int interface, cvmx_spi_mode_t mode, int timeout);
136
137 /**
138  * Return non-zero if the SPI interface has a SPI4000 attached
139  *
140  * @param interface SPI interface the SPI4000 is connected to
141  *
142  * @return
143  */
144 extern int cvmx_spi4000_is_present(int interface);
145
146 /**
147  * Initialize the SPI4000 for use
148  *
149  * @param interface SPI interface the SPI4000 is connected to
150  */
151 extern int cvmx_spi4000_initialize(int interface);
152
153 /**
154  * Poll all the SPI4000 port and check its speed
155  *
156  * @param interface Interface the SPI4000 is on
157  * @param port      Port to poll (0-9)
158  * @return Status of the port. 0=down. All other values the port is up.
159  */
160 extern cvmx_gmxx_rxx_rx_inbnd_t cvmx_spi4000_check_speed(int interface, int port);
161
162 /**
163  * Get current SPI4 initialization callbacks
164  *
165  * @param callbacks  Pointer to the callbacks structure.to fill
166  *
167  * @return Pointer to cvmx_spi_callbacks_t structure.
168  */
169 extern void cvmx_spi_get_callbacks(cvmx_spi_callbacks_t * callbacks);
170
171 /**
172  * Set new SPI4 initialization callbacks
173  *
174  * @param new_callbacks  Pointer to an updated callbacks structure.
175  */
176 extern void cvmx_spi_set_callbacks(cvmx_spi_callbacks_t * new_callbacks);
177
178 /**
179  * Callback to perform SPI4 reset
180  *
181  * @param interface The identifier of the packet interface to configure and
182  *                  use as a SPI interface.
183  * @param mode      The operating mode for the SPI interface. The interface
184  *                  can operate as a full duplex (both Tx and Rx data paths
185  *                  active) or as a halfplex (either the Tx data path is
186  *                  active or the Rx data path is active, but not both).
187  * @return Zero on success, non-zero error code on failure (will cause SPI initialization to abort)
188  */
189 extern int cvmx_spi_reset_cb(int interface, cvmx_spi_mode_t mode);
190
191 /**
192  * Callback to setup calendar and miscellaneous settings before clock detection
193  *
194  * @param interface The identifier of the packet interface to configure and
195  *                  use as a SPI interface.
196  * @param mode      The operating mode for the SPI interface. The interface
197  *                  can operate as a full duplex (both Tx and Rx data paths
198  *                  active) or as a halfplex (either the Tx data path is
199  *                  active or the Rx data path is active, but not both).
200  * @param num_ports Number of ports to configure on SPI
201  *
202  * @return Zero on success, non-zero error code on failure (will cause SPI initialization to abort)
203  */
204 extern int cvmx_spi_calendar_setup_cb(int interface, cvmx_spi_mode_t mode, int num_ports);
205
206 /**
207  * Callback to perform clock detection
208  *
209  * @param interface The identifier of the packet interface to configure and
210  *                  use as a SPI interface.
211  * @param mode      The operating mode for the SPI interface. The interface
212  *                  can operate as a full duplex (both Tx and Rx data paths
213  *                  active) or as a halfplex (either the Tx data path is
214  *                  active or the Rx data path is active, but not both).
215  * @param timeout   Timeout to wait for clock synchronization in seconds
216  * @return Zero on success, non-zero error code on failure (will cause SPI initialization to abort)
217  */
218 extern int cvmx_spi_clock_detect_cb(int interface, cvmx_spi_mode_t mode, int timeout);
219
220 /**
221  * Callback to perform link training
222  *
223  * @param interface The identifier of the packet interface to configure and
224  *                  use as a SPI interface.
225  * @param mode      The operating mode for the SPI interface. The interface
226  *                  can operate as a full duplex (both Tx and Rx data paths
227  *                  active) or as a halfplex (either the Tx data path is
228  *                  active or the Rx data path is active, but not both).
229  * @param timeout   Timeout to wait for link to be trained (in seconds)
230  * @return Zero on success, non-zero error code on failure (will cause SPI initialization to abort)
231  */
232 extern int cvmx_spi_training_cb(int interface, cvmx_spi_mode_t mode, int timeout);
233
234 /**
235  * Callback to perform calendar data synchronization
236  *
237  * @param interface The identifier of the packet interface to configure and
238  *                  use as a SPI interface.
239  * @param mode      The operating mode for the SPI interface. The interface
240  *                  can operate as a full duplex (both Tx and Rx data paths
241  *                  active) or as a halfplex (either the Tx data path is
242  *                  active or the Rx data path is active, but not both).
243  * @param timeout   Timeout to wait for calendar data in seconds
244  * @return Zero on success, non-zero error code on failure (will cause SPI initialization to abort)
245  */
246 extern int cvmx_spi_calendar_sync_cb(int interface, cvmx_spi_mode_t mode, int timeout);
247
248 /**
249  * Callback to handle interface up
250  *
251  * @param interface The identifier of the packet interface to configure and
252  *                  use as a SPI interface.
253  * @param mode      The operating mode for the SPI interface. The interface
254  *                  can operate as a full duplex (both Tx and Rx data paths
255  *                  active) or as a halfplex (either the Tx data path is
256  *                  active or the Rx data path is active, but not both).
257  * @return Zero on success, non-zero error code on failure (will cause SPI initialization to abort)
258  */
259 extern int cvmx_spi_interface_up_cb(int interface, cvmx_spi_mode_t mode);
260
261 #ifdef  __cplusplus
262 }
263 #endif
264
265 #endif  /* __CVMX_SPI_H__ */