1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
3  *
4  * This file is provided under a dual BSD/GPLv2 license.  When using or
5  * redistributing this file, you may do so under either license.
6  *
7  * GPL LICENSE SUMMARY
8  *
9  * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of version 2 of the GNU General Public License as
13  * published by the Free Software Foundation.
14  *
15  * This program is distributed in the hope that it will be useful, but
16  * WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
23  * The full GNU General Public License is included in this distribution
24  * in the file called LICENSE.GPL.
25  *
26  * BSD LICENSE
27  *
28  * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
29  * All rights reserved.
30  *
31  * Redistribution and use in source and binary forms, with or without
32  * modification, are permitted provided that the following conditions
33  * are met:
34  *
35  *   * Redistributions of source code must retain the above copyright
36  *     notice, this list of conditions and the following disclaimer.
37  *   * Redistributions in binary form must reproduce the above copyright
38  *     notice, this list of conditions and the following disclaimer in
39  *     the documentation and/or other materials provided with the
40  *     distribution.
41  *
42  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
43  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
44  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
45  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
46  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
47  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
48  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
49  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
50  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
51  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
52  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
53  *
54  * $FreeBSD$
55  */
56 #ifndef _SCIC_SDS_USER_PARAMETERS_H_
57 #define _SCIC_SDS_USER_PARAMETERS_H_
58 
59 /**
60  * @file
61  *
62  * @brief This file contains all of the structure definitions and interface
63  *        methods that can be called by a SCIC user on the SCU Driver
64  *        Standard (SCIC_SDS_USER_PARAMETERS_T) user parameter block.
65  */
66 
67 #ifdef __cplusplus
68 extern "C" {
69 #endif // __cplusplus
70 
71 #include <dev/isci/scil/sci_types.h>
72 #include <dev/isci/scil/sci_status.h>
73 #include <dev/isci/scil/intel_sas.h>
74 #include <dev/isci/scil/sci_controller_constants.h>
75 #include <dev/isci/scil/scu_bios_definitions.h>
76 
77 /**
78  * @name SCIC_SDS_PARM_PHY_SPEED
79  *
80  * These constants define the speeds utilized for a phy/port.
81  */
82 /*@{*/
83 #define SCIC_SDS_PARM_NO_SPEED   0
84 
85 /**
86  * This value of 1 indicates generation 1 (i.e. 1.5 Gb/s).
87  */
88 #define SCIC_SDS_PARM_GEN1_SPEED 1
89 
90 /**
91  * This value of 2 indicates generation 2 (i.e. 3.0 Gb/s).
92  */
93 #define SCIC_SDS_PARM_GEN2_SPEED 2
94 
95 /**
96  * This value of 3 indicates generation 3 (i.e. 6.0 Gb/s).
97  */
98 #define SCIC_SDS_PARM_GEN3_SPEED 3
99 
100 /**
101  * For range checks, the max speed generation
102  */
103 #define SCIC_SDS_PARM_MAX_SPEED SCIC_SDS_PARM_GEN3_SPEED
104 /*@}*/
105 
106 /**
107  * @struct SCIC_SDS_USER_PARAMETERS
108  *
109  * @brief This structure delineates the various user parameters that can be
110  *        changed by the core user.
111  */
112 typedef struct SCIC_SDS_USER_PARAMETERS
113 {
114    struct
115    {
116       /**
117        * This field specifies the NOTIFY (ENABLE SPIN UP) primitive
118        * insertion frequency for this phy index.
119        */
120       U32  notify_enable_spin_up_insertion_frequency;
121 
122       /**
123        * This method specifies the number of transmitted DWORDs within which
124        * to transmit a single ALIGN primitive.  This value applies regardless
125        * of what type of device is attached or connection state.  A value of
126        * 0 indicates that no ALIGN primitives will be inserted.
127        */
128       U16  align_insertion_frequency;
129 
130       /**
131        * This method specifies the number of transmitted DWORDs within which
132        * to transmit 2 ALIGN primitives.  This applies for SAS connections
133        * only.  A minimum value of 3 is required for this field.
134        */
135       U16  in_connection_align_insertion_frequency;
136 
137       /**
138        * This field indicates the maximum speed generation to be utilized
139        * by phys in the supplied port.
140        * - A value of 1 indicates generation 1 (i.e. 1.5 Gb/s).
141        * - A value of 2 indicates generation 2 (i.e. 3.0 Gb/s).
142        * - A value of 3 indicates generation 3 (i.e. 6.0 Gb/s).
143        */
144       U8 max_speed_generation;
145 
146    } phys[SCI_MAX_PHYS];
147 
148 
149    /**
150     * This field specifies the number of seconds to allow a phy to consume
151     * power before yielding to another phy.
152     *
153     */
154    U8  phy_spin_up_delay_interval;
155 
156    /**
157    * These timer values specifies how long a link will remain open with no
158    * activity in increments of a microsecond, it can be in increments of
159    * 100 microseconds if the upper most bit is set.
160    *
161    */
162    U16 stp_inactivity_timeout;
163    U16 ssp_inactivity_timeout;
164 
165    /**
166    * These timer values specifies how long a link will remain open in increments
167    * of 100 microseconds.
168    *
169    */
170    U16 stp_max_occupancy_timeout;
171    U16 ssp_max_occupancy_timeout;
172 
173    /**
174    * This timer value specifies how long a link will remain open with no
175    * outbound traffic in increments of a microsecond.
176    *
177    */
178    U8 no_outbound_task_timeout;
179 
180 } SCIC_SDS_USER_PARAMETERS_T;
181 
182 /**
183  * @union SCIC_USER_PARAMETERS
184  * @brief This structure/union specifies the various different user
185  *        parameter sets available.  Each type is specific to a hardware
186  *        controller version.
187  */
188 typedef union SCIC_USER_PARAMETERS
189 {
190    /**
191     * This field specifies the user parameters specific to the
192     * Storage Controller Unit (SCU) Driver Standard (SDS) version
193     * 1.
194     */
195    SCIC_SDS_USER_PARAMETERS_T sds1;
196 
197 } SCIC_USER_PARAMETERS_T;
198 
199 
200 /**
201  * @name SCIC_SDS_OEM_PHY_MASK
202  *
203  * These constants define the valid values for phy_mask
204  */
205 /*@{*/
206 
207 /**
208  * This is the min value assignable to a port's phy mask
209  */
210 #define SCIC_SDS_PARM_PHY_MASK_MIN 0x0
211 
212 /**
213  * This is the max value assignable to a port's phy mask
214  */
215 #define SCIC_SDS_PARM_PHY_MASK_MAX 0xF
216 /*@}*/
217 
218 #define MAX_CONCURRENT_DEVICE_SPIN_UP_COUNT 4
219 
220 typedef SCI_BIOS_OEM_PARAM_ELEMENT_v_1_3_T SCIC_SDS_OEM_PARAMETERS_T;
221 
222 /**
223  * @union SCIC_OEM_PARAMETERS
224  *
225  * @brief This structure/union specifies the various different OEM
226  *        parameter sets available.  Each type is specific to a hardware
227  *        controller version.
228  */
229 typedef union SCIC_OEM_PARAMETERS
230 {
231    /**
232     * This field specifies the OEM parameters specific to the
233     * Storage Controller Unit (SCU) Driver Standard (SDS) version
234     * 1.
235     */
236    SCIC_SDS_OEM_PARAMETERS_T sds1;
237 
238 } SCIC_OEM_PARAMETERS_T;
239 
240 /**
241  * @union OEM_SSC_DATA
242  *
243  * @brief This typedef provides a means to convert from the original
244  *        1.0 version of the OEM PARAMETER do_enable_ssc to the more
245  *        comprehensive 1.1 version of enabling SSC parameters.
246  *        For the definition of the field members see scu_bios_definitions.h
247  *        header file or refer to the SCU BIOS Writers Guide.
248  */
249 typedef union OEM_SSC_PARAMETERS
250 {
251    struct
252    {
253       U8 ssc_sata_tx_spread_level : 4;
254       U8 ssc_sas_tx_spread_level : 3;
255       U8 ssc_sas_tx_type : 1;
256    } bf;
257 
258    U8 do_enable_ssc;
259 
260 } OEM_SSC_PARAMETERS_T;
261 
262 /**
263  * @brief This method allows the user to attempt to change the user
264  *        parameters utilized by the controller.
265  *
266  * @param[in] controller This parameter specifies the controller on which
267  *            to set the user parameters.
268  * @param[in] user_parameters This parameter specifies the USER_PARAMETERS
269  *            object containing the potential new values.
270  *
271  * @return Indicate if the update of the user parameters was successful.
272  * @retval SCI_SUCCESS This value is returned if the operation succeeded.
273  * @retval SCI_FAILURE_INVALID_STATE This value is returned if the attempt
274  *         to change the user parameter failed, because changing one of
275  *         the parameters is not currently allowed.
276  * @retval SCI_FAILURE_INVALID_PARAMETER_VALUE This value is returned if the
277  *         user supplied an invalid interrupt coalescence time, spin up
278  *         delay interval, etc.
279  */
280 SCI_STATUS scic_user_parameters_set(
281    SCI_CONTROLLER_HANDLE_T   controller,
282    SCIC_USER_PARAMETERS_T  * user_parameters
283 );
284 
285 /**
286  * @brief This method allows the user to retrieve the user parameters
287  *        utilized by the controller.
288  *
289  * @param[in] controller This parameter specifies the controller on which
290  *            to set the user parameters.
291  * @param[in] user_parameters This parameter specifies the USER_PARAMETERS
292  *            object into which the framework shall save it's parameters.
293  *
294  * @return none
295  */
296 void scic_user_parameters_get(
297    SCI_CONTROLLER_HANDLE_T   controller,
298    SCIC_USER_PARAMETERS_T  * user_parameters
299 );
300 
301 /**
302  * @brief This method allows the user to attempt to change the OEM
303  *        parameters utilized by the controller.
304  *
305  * @param[in] controller This parameter specifies the controller on which
306  *            to set the user parameters.
307  * @param[in] oem_parameters This parameter specifies the OEM parameters
308  *            object containing the potential new values.
309  * @param[in] oem_parameters_version This parameter is the OEM block version
310  *            value indicating the format of the data associated with
311  *            oem_parameters.
312  *
313  * @return Indicate if the update of the user parameters was successful.
314  * @retval SCI_SUCCESS This value is returned if the operation succeeded.
315  * @retval SCI_FAILURE_INVALID_STATE This value is returned if the attempt
316  *         to change the user parameter failed, because changing one of
317  *         the parameters is not currently allowed.
318  * @retval SCI_FAILURE_INVALID_PARAMETER_VALUE This value is returned if the
319  *         user supplied an unsupported value for one of the OEM parameters.
320  */
321 SCI_STATUS scic_oem_parameters_set(
322    SCI_CONTROLLER_HANDLE_T   controller,
323    SCIC_OEM_PARAMETERS_T   * oem_parameters,
324    U8 oem_parameters_version
325 );
326 
327 /**
328  * @brief This method allows the user to retrieve the OEM
329  *        parameters utilized by the controller.
330  *
331  * @param[in]  controller This parameter specifies the controller on which
332  *             to set the user parameters.
333  * @param[out] oem_parameters This parameter specifies the OEM parameters
334  *             object in which to write the core's OEM parameters.
335  *
336  * @return none
337  */
338 void scic_oem_parameters_get(
339    SCI_CONTROLLER_HANDLE_T   controller,
340    SCIC_OEM_PARAMETERS_T   * oem_parameters
341 );
342 
343 #ifdef __cplusplus
344 }
345 #endif // __cplusplus
346 
347 #endif // _SCIC_SDS_USER_PARAMETERS_H_
348 
349