xref: /freebsd/sys/dev/isci/scil/scu_bios_definitions.h (revision fe75646a0234a261c0013bf1840fdac4acaf0cec)
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 #ifndef _SCU_BIOS_DEFINITIONS_H_
55 #define _SCU_BIOS_DEFINITIONS_H_
56 
57 #ifdef __cplusplus
58 extern "C" {
59 #endif // __cplusplus
60 
61 /**
62  *  IMPORTANT NOTE:
63  *  This file can be used by an SCI Library based driver or
64  *  stand-alone where the library is excluded.  By excluding
65  *  the SCI Library, inclusion of OS specific header files can
66  *  be avoided.  For example, a BIOS utility probably does not
67  *  want to be bothered with inclusion of nested OS DDK include
68  *  files that are not necessary for its function.
69  *
70  *  To exclude the SCI Library, either uncomment the EXCLUDE_SCI_LIBRARY
71  *  #define statement in environment.h or define the statement as an input
72  *  to your compiler.
73  */
74 
75 #include <dev/isci/environment.h>
76 
77 #ifndef EXCLUDE_SCI_LIBRARY
78 #include <dev/isci/scil/sci_types.h>
79 #include <dev/isci/scil/intel_sas.h>
80 #include <dev/isci/scil/sci_controller_constants.h>
81 #endif /* EXCLUDE_SCI_LIBRARY */
82 
83 
84 
85 // For Intel Storage Controller Unit OEM Block
86 #define SCI_OEM_PARAM_SIGNATURE     "ISCUOEMB"
87 
88 #define SCI_PREBOOT_SOURCE_INIT     (0x00)
89 #define SCI_PREBOOT_SOURCE_OROM     (0x80)
90 #define SCI_PREBOOT_SOURCE_EFI      (0x81)
91 
92 #define SCI_OEM_PARAM_VER_1_0       (0x10)
93 #define SCI_OEM_PARAM_VER_1_1       (0x11)
94 #define SCI_OEM_PARAM_VER_1_2       (0x12)
95 #define SCI_OEM_PARAM_VER_1_3       (0x13)
96 
97 // current version
98 #define SCI_OEM_PARAM_VER_CUR       SCI_OEM_PARAM_VER_1_3
99 
100 // port configuration mode
101 #define SCI_BIOS_MODE_MPC   (0x00)
102 #define SCI_BIOS_MODE_APC   (0x01)
103 
104 
105 #ifndef SCI_MAX_PHYS
106 #define SCI_MAX_PHYS (4)
107 #endif
108 
109 #ifndef SCI_MAX_PORTS
110 #define SCI_MAX_PORTS (4)
111 #endif
112 
113 
114 /**
115  * @struct SCI_BIOS_OEM_PARAM_BLOCK_HDR
116  *
117  * @brief This structure defines the OEM Parameter block header.
118  */
119 typedef struct SCI_BIOS_OEM_PARAM_BLOCK_HDR
120 {
121     /**
122      * This field contains the OEM Parameter Block Signature which is
123      * used by BIOS and driver software to identify that the memory location
124      * contains valid OEM Parameter data.  The value must be set to
125      * SCI_OEM_PARAM_SIGNATURE which is the string "ISCUOEMB" which
126      * stands for Intel Storage Controller Unit OEM Block.
127      */
128     U8 signature[8];
129     /**
130      * This field contains the size in bytes of the complete OEM
131      * Parameter Block, both header and payload hdr_length +
132      * (num_elements * element_length).
133      */
134     U16 total_block_length;
135     /**
136      * This field contains the size in bytes of the
137      * SCI_BIOS_OEM_PARAM_BLOCK_HDR. It also indicates the offset from
138      * the beginning of this data structure to where the actual
139      * parameter data payload begins.
140      */
141     U8 hdr_length;
142     /**
143      * This field contains the version info defining the structure
144      * of the OEM Parameter block.
145      */
146     U8  version;
147     /**
148      * This field contains a value indicating the preboot initialization
149      * method (Option ROM or UEFI driver) so that after OS transition,
150      * the OS driver can know the preboot method. OEMs who build a single
151      * flash image where the preboot method is unknown at manufacturing
152      * time should set this field to SCI_PREBOOT_SOURCE_INIT.  Then
153      * after the block is retrieved into host memory and under preboot
154      * driver control, the OROM or UEFI driver can set this field
155      * appropriately (SCI_PREBOOT_SOURCE_OROM and SCI_PREBOOT_SOURCE_EFI,
156      * respectively).
157      */
158     U8 preboot_source;
159     /**
160      * This field contains the number of parameter descriptor elements
161      * (i.e. controller_elements) following this header.  The number of
162      * elements corresponds to the number of SCU controller units contained
163      * in the platform:
164      *  controller_element[0] = SCU0
165      *  controller_element[1] = SCU1
166      */
167     U8 num_elements;
168     /**
169      * This field contains the size in bytes of the descriptor element(s)
170      * in the block.
171      */
172     U16 element_length;
173     /**
174      * Reserve fields for future use.
175      */
176     U8 reserved[8];
177 
178 } SCI_BIOS_OEM_PARAM_BLOCK_HDR_T;
179 
180 
181 /**
182  * @struct SCIC_SDS_OEM_PARAMETERS VER 1.0
183  *
184  * @brief This structure delineates the various OEM parameters that must
185  * be set for the Intel SAS Storage Controller Unit (SCU).
186  */
187 typedef struct SCI_BIOS_OEM_PARAM_ELEMENT
188 {
189     /**
190      * Per SCU Controller Data
191      */
192     struct
193     {
194         /**
195          * This field indicates the port configuration mode for
196          * this controller:
197          *   Automatic Port Configuration(APC) or
198          *   Manual Port Configuration (MPC).
199          *
200          * APC means the Platform OEM expects SCI to configure
201          * SAS Ports automatically according to the discovered SAS
202          * Address pairs of the endpoints, wide and/or narrow.
203          *
204          * MPC means the Platform OEM manually defines wide or narrow
205          * connectors by apriori assigning PHYs to SAS Ports.
206          *
207          * By default, the mode type is APC
208          * in APC mode, if ANY of the phy mask is non-zero,
209          *    SCI_FAILURE_INVALID_PARAMETER_VALUE will be returned
210          *      from scic_oem_parameters_set AND the default oem
211          *      configuration will be applied
212          * in MPC mode, if ALL of the phy masks are zero,
213          *    SCI_FAILURE_INVALID_PARAMETER_VALUE will be returned
214          *      from scic_oem_parameters_set AND the default oem
215          *      configuration will be applied
216          */
217         U8  mode_type;
218 
219         /**
220          * This field specifies the maximum number of direct attached
221          * devices the OEM will allow to have powered up simultaneously
222          * on this controller.  This allows the OEM to avoid exceeding
223          * power supply limits for this platform.  A value of zero
224          * indicates there are no restrictions.
225          */
226         U8  max_number_concurrent_device_spin_up;
227 
228         /**
229          * This field indicates OEM's desired default
230          * Spread Spectrum Clocking (SSC) setting for Tx:
231          *   enabled     = 1
232          *   disabled    = 0
233          */
234         U8 do_enable_ssc;
235 
236         U8 reserved;
237 
238     } controller;
239 
240     /**
241      * Per SAS Port data.
242      */
243     struct
244     {
245         /**
246          * This field specifies the phys to be contained inside a port.
247          * The bit position in the mask specifies the index of the phy
248          * to be contained in the port.  Multiple bits (i.e. phys)
249         * can be contained in a single port:
250         *      Bit 0 = This controller's PHY index 0     (0x01)
251         *      Bit 1 = This controller's PHY index 1     (0x02)
252         *      Bit 2 = This controller's PHY index 2     (0x04)
253         *      Bit 3 = This controller's PHY index 3     (0x08)
254         *
255         * Refer to the mode_type field for rules regarding APC and MPC mode.
256         * General rule: For APC mode phy_mask = 0
257         */
258         U8 phy_mask;
259 
260     } ports[SCI_MAX_PORTS]; // Up to 4 Ports per SCU controller unit
261 
262     /**
263      * Per PHY Parameter data.
264      */
265     struct
266     {
267         /**
268          * This field indicates the SAS Address that will be transmitted on
269          * this PHY index.  The field is defined as a union, however, the
270          * OEM should use the U8 array definition when encoding it to ensure
271          * correct byte ordering.
272          *
273          * NOTE: If using APC MODE, along with phy_mask being set to ZERO, the
274          * SAS Addresses for all PHYs within a controller group SHALL be the
275          * same.
276          */
277         union
278         {
279             /**
280              * The array should be stored in little endian order.  For example,
281              * if the desired SAS Address is 0x50010B90_0003538D, then it
282              * should be stored in the following manner:
283              *    array[0] = 0x90
284              *    array[1] = 0x0B
285              *    array[2] = 0x01
286              *    array[3] = 0x50
287              *    array[4] = 0x8D
288              *    array[5] = 0x53
289              *    array[6] = 0x03
290              *    array[7] = 0x00
291              */
292             U8 array[8];
293             /**
294              * This is the typedef'd version of the SAS Address used in
295              * the SCI Library.
296              */
297             SCI_SAS_ADDRESS_T  sci_format;
298 
299         } sas_address;
300 
301         /**
302          * These are the per PHY equalization settings associated with the
303          * AFE XCVR Tx Amplitude and Equalization Control Register Set
304          * (0 thru 3).
305          *
306          * Operational Note: The following Look-Up-Table registers are engaged
307          * by the AFE block after the following:
308          *  - Software programs the Link Layer AFE Look Up Table Control
309          *    Registers (AFE_LUTCR).
310          *  - Software sets AFE XCVR Tx Control Register Tx Equalization
311          *    Enable bit.
312          */
313         /**
314          * AFE_TX_AMP_CTRL0.  This register is associated with AFE_LUTCR
315          * LUTSel=00b. It contains the Tx Equalization settings that will be
316          * used if a SATA 1.5Gbs or SATA 3.0Gbs device is direct-attached.
317          */
318         U32 afe_tx_amp_control0;
319 
320         /**
321          * AFE_TX_AMP_CTRL1.  This register is associated with AFE_LUTCR
322          * LUTSel=01b. It contains the Tx Equalization settings that will
323          * be used if a SATA 6.0Gbs device is direct-attached.
324          */
325         U32 afe_tx_amp_control1;
326 
327         /**
328          * AFE_TX_AMP_CTRL2.  This register is associated with AFE_LUTCR
329          * LUTSel=10b. It contains the Tx Equalization settings that will
330          * be used if a SAS 1.5Gbs or SAS 3.0Gbs device is direct-attached.
331          */
332         U32 afe_tx_amp_control2;
333 
334         /**
335          * AFE_TX_AMP_CTRL3.  This register is associated with AFE_LUTCR
336          * LUTSel=11b. It contains the Tx Equalization settings that will
337          * be used if a SAS 6.0Gbs device is direct-attached.
338          */
339         U32 afe_tx_amp_control3;
340 
341     } phys[SCI_MAX_PHYS];   // 4 PHYs per SCU controller unit
342 
343 } SCI_BIOS_OEM_PARAM_ELEMENT_T;
344 
345 /**
346  * @struct SCIC_SDS_OEM_PARAMETERS VER 1.1
347  *
348  * @brief This structure delineates the various OEM parameters that must
349  * be set for the Intel SAS Storage Controller Unit (SCU).
350  */
351 typedef struct SCI_BIOS_OEM_PARAM_ELEMENT_v_1_1
352 {
353     /**
354      * Per SCU Controller Data
355      */
356     struct
357     {
358         /**
359          * This field indicates the port configuration mode for
360          * this controller:
361          *   Automatic Port Configuration(APC) or
362          *   Manual Port Configuration (MPC).
363          *
364          * APC means the Platform OEM expects SCI to configure
365          * SAS Ports automatically according to the discovered SAS
366          * Address pairs of the endpoints, wide and/or narrow.
367          *
368          * MPC means the Platform OEM manually defines wide or narrow
369          * connectors by apriori assigning PHYs to SAS Ports.
370          *
371          * By default, the mode type is APC
372          * in APC mode, if ANY of the phy mask is non-zero,
373          *    SCI_FAILURE_INVALID_PARAMETER_VALUE will be returned
374          *      from scic_oem_parameters_set AND the default oem
375          *      configuration will be applied
376          * in MPC mode, if ALL of the phy masks are zero,
377          *    SCI_FAILURE_INVALID_PARAMETER_VALUE will be returned
378          *      from scic_oem_parameters_set AND the default oem
379          *      configuration will be applied
380          */
381         U8  mode_type;
382 
383         /**
384          * This field specifies the maximum number of direct attached
385          * devices the OEM will allow to have powered up simultaneously
386          * on this controller.  This allows the OEM to avoid exceeding
387          * power supply limits for this platform.  A value of zero
388          * indicates there are no restrictions.
389          */
390         U8  max_number_concurrent_device_spin_up;
391 
392         /**
393          * This bitfield indicates the OEM's desired default Tx
394          * Spread Spectrum Clocking (SSC) settings for SATA and SAS.
395          * NOTE: Default SSC Modulation Frequency is 31.5KHz.
396          *--------------------------------------------------------------------*/
397         /**
398          * NOTE: Max spread for SATA is +0 / -5000 PPM.
399          * Down-spreading SSC (only method allowed for SATA):
400          *  SATA SSC Tx Disabled                    = 0x0
401          *  SATA SSC Tx at +0 / -1419 PPM Spread    = 0x2
402          *  SATA SSC Tx at +0 / -2129 PPM Spread    = 0x3
403          *  SATA SSC Tx at +0 / -4257 PPM Spread    = 0x6
404          *  SATA SSC Tx at +0 / -4967 PPM Spread    = 0x7
405         */
406         U8 ssc_sata_tx_spread_level : 4;
407 
408         /**
409          * SAS SSC Tx Disabled                     = 0x0
410          *
411          * NOTE: Max spread for SAS down-spreading +0 / -2300 PPM
412          * Down-spreading SSC:
413          *  SAS SSC Tx at +0 / -1419 PPM Spread     = 0x2
414          *  SAS SSC Tx at +0 / -2129 PPM Spread     = 0x3
415          *
416          * NOTE: Max spread for SAS center-spreading +2300 / -2300 PPM
417          * Center-spreading SSC:
418          *  SAS SSC Tx at +1064 / -1064 PPM Spread  = 0x3
419          *  SAS SSC Tx at +2129 / -2129 PPM Spread  = 0x6
420          */
421         U8 ssc_sas_tx_spread_level : 3;
422         /**
423          * NOTE: Refer to the SSC section of the SAS 2.x Specification
424          * for proper setting of this field. For standard SAS Initiator
425          * SAS PHY operation it should be 0 for Down-spreading.
426          * SAS SSC Tx spread type:
427          *  Down-spreading SSC      = 0
428          *  Center-spreading SSC    = 1
429          */
430         U8 ssc_sas_tx_type : 1;
431         /*--------------------------------------------------------------------*/
432 
433         U8 reserved;
434 
435     } controller;
436 
437     /**
438      * Per SAS Port data.
439      */
440     struct
441     {
442         /**
443          * This field specifies the phys to be contained inside a port.
444          * The bit position in the mask specifies the index of the phy
445          * to be contained in the port.  Multiple bits (i.e. phys)
446         * can be contained in a single port:
447         *      Bit 0 = This controller's PHY index 0     (0x01)
448         *      Bit 1 = This controller's PHY index 1     (0x02)
449         *      Bit 2 = This controller's PHY index 2     (0x04)
450         *      Bit 3 = This controller's PHY index 3     (0x08)
451         *
452         * Refer to the mode_type field for rules regarding APC and MPC mode.
453         * General rule: For APC mode phy_mask = 0
454         */
455         U8 phy_mask;
456 
457     } ports[SCI_MAX_PORTS]; // Up to 4 Ports per SCU controller unit
458 
459     /**
460      * Per PHY Parameter data.
461      */
462     struct
463     {
464         /**
465          * This field indicates the SAS Address that will be transmitted on
466          * this PHY index.  The field is defined as a union, however, the
467          * OEM should use the U8 array definition when encoding it to ensure
468          * correct byte ordering.
469          *
470          * NOTE: If using APC MODE, along with phy_mask being set to ZERO, the
471          * SAS Addresses for all PHYs within a controller group SHALL be the
472          * same.
473          */
474         union
475         {
476             /**
477              * The array should be stored in little endian order.  For example,
478              * if the desired SAS Address is 0x50010B90_0003538D, then it
479              * should be stored in the following manner:
480              *    array[0] = 0x90
481              *    array[1] = 0x0B
482              *    array[2] = 0x01
483              *    array[3] = 0x50
484              *    array[4] = 0x8D
485              *    array[5] = 0x53
486              *    array[6] = 0x03
487              *    array[7] = 0x00
488              */
489             U8 array[8];
490             /**
491              * This is the typedef'd version of the SAS Address used in
492              * the SCI Library.
493              */
494             SCI_SAS_ADDRESS_T  sci_format;
495 
496         } sas_address;
497 
498         /**
499          * These are the per PHY equalization settings associated with the
500          * AFE XCVR Tx Amplitude and Equalization Control Register Set
501          * (0 thru 3).
502          *
503          * Operational Note: The following Look-Up-Table registers are engaged
504          * by the AFE block after the following:
505          *  - Software programs the Link Layer AFE Look Up Table Control
506          *    Registers (AFE_LUTCR).
507          *  - Software sets AFE XCVR Tx Control Register Tx Equalization
508          *    Enable bit.
509          */
510         /**
511          * AFE_TX_AMP_CTRL0.  This register is associated with AFE_LUTCR
512          * LUTSel=00b. It contains the Tx Equalization settings that will be
513          * used if a SATA 1.5Gbs or SATA 3.0Gbs device is direct-attached.
514          */
515         U32 afe_tx_amp_control0;
516 
517         /**
518          * AFE_TX_AMP_CTRL1.  This register is associated with AFE_LUTCR
519          * LUTSel=01b. It contains the Tx Equalization settings that will
520          * be used if a SATA 6.0Gbs device is direct-attached.
521          */
522         U32 afe_tx_amp_control1;
523 
524         /**
525          * AFE_TX_AMP_CTRL2.  This register is associated with AFE_LUTCR
526          * LUTSel=10b. It contains the Tx Equalization settings that will
527          * be used if a SAS 1.5Gbs or SAS 3.0Gbs device is direct-attached.
528          */
529         U32 afe_tx_amp_control2;
530 
531         /**
532          * AFE_TX_AMP_CTRL3.  This register is associated with AFE_LUTCR
533          * LUTSel=11b. It contains the Tx Equalization settings that will
534          * be used if a SAS 6.0Gbs device is direct-attached.
535          */
536         U32 afe_tx_amp_control3;
537 
538     } phys[SCI_MAX_PHYS];   // 4 PHYs per SCU controller unit
539 
540 } SCI_BIOS_OEM_PARAM_ELEMENT_v_1_1_T;
541 
542 /**
543  * @struct SCIC_SDS_OEM_PARAMETERS VER 1.2
544  *
545  * @brief This structure delineates the various OEM parameters that must
546  * be set for the Intel SAS Storage Controller Unit (SCU).
547  */
548 typedef struct SCI_BIOS_OEM_PARAM_ELEMENT_v_1_2
549 {
550     /**
551      * Per SCU Controller Data
552      */
553     struct
554     {
555         /**
556          * This field indicates the port configuration mode for
557          * this controller:
558          *   Automatic Port Configuration(APC) or
559          *   Manual Port Configuration (MPC).
560          *
561          * APC means the Platform OEM expects SCI to configure
562          * SAS Ports automatically according to the discovered SAS
563          * Address pairs of the endpoints, wide and/or narrow.
564          *
565          * MPC means the Platform OEM manually defines wide or narrow
566          * connectors by apriori assigning PHYs to SAS Ports.
567          *
568          * By default, the mode type is APC
569          * in APC mode, if ANY of the phy mask is non-zero,
570          *    SCI_FAILURE_INVALID_PARAMETER_VALUE will be returned
571          *      from scic_oem_parameters_set AND the default oem
572          *      configuration will be applied
573          * in MPC mode, if ALL of the phy masks are zero,
574          *    SCI_FAILURE_INVALID_PARAMETER_VALUE will be returned
575          *      from scic_oem_parameters_set AND the default oem
576          *      configuration will be applied
577          */
578         U8  mode_type;
579 
580         /**
581          * This field specifies the maximum number of direct attached
582          * devices the OEM will allow to have powered up simultaneously
583          * on this controller.  This allows the OEM to avoid exceeding
584          * power supply limits for this platform.  A value of zero
585          * indicates there are no restrictions.
586          */
587         U8  max_number_concurrent_device_spin_up;
588 
589         /**
590          * This bitfield indicates the OEM's desired default Tx
591          * Spread Spectrum Clocking (SSC) settings for SATA and SAS.
592          * NOTE: Default SSC Modulation Frequency is 31.5KHz.
593          *--------------------------------------------------------------------*/
594         /**
595          * NOTE: Max spread for SATA is +0 / -5000 PPM.
596          * Down-spreading SSC (only method allowed for SATA):
597          *  SATA SSC Tx Disabled                    = 0x0
598          *  SATA SSC Tx at +0 / -1419 PPM Spread    = 0x2
599          *  SATA SSC Tx at +0 / -2129 PPM Spread    = 0x3
600          *  SATA SSC Tx at +0 / -4257 PPM Spread    = 0x6
601          *  SATA SSC Tx at +0 / -4967 PPM Spread    = 0x7
602         */
603         U8 ssc_sata_tx_spread_level : 4;
604 
605         /**
606          * SAS SSC Tx Disabled                     = 0x0
607          *
608          * NOTE: Max spread for SAS down-spreading +0 / -2300 PPM
609          * Down-spreading SSC:
610          *  SAS SSC Tx at +0 / -1419 PPM Spread     = 0x2
611          *  SAS SSC Tx at +0 / -2129 PPM Spread     = 0x3
612          *
613          * NOTE: Max spread for SAS center-spreading +2300 / -2300 PPM
614          * Center-spreading SSC:
615          *  SAS SSC Tx at +1064 / -1064 PPM Spread  = 0x3
616          *  SAS SSC Tx at +2129 / -2129 PPM Spread  = 0x6
617          */
618         U8 ssc_sas_tx_spread_level : 3;
619         /**
620          * NOTE: Refer to the SSC section of the SAS 2.x Specification
621          * for proper setting of this field. For standard SAS Initiator
622          * SAS PHY operation it should be 0 for Down-spreading.
623          * SAS SSC Tx spread type:
624          *  Down-spreading SSC      = 0
625          *  Center-spreading SSC    = 1
626          */
627         U8 ssc_sas_tx_type : 1;
628 
629         /**
630          * This field indicates length of the SAS/SATA cable between
631          * host and device.
632          * This field is used make relationship between analog parameters of
633          * the phy in the silicon and length of the cable.
634          * Supported length: "short"- up to 3m, "long"- more than 3m
635          * This is bit mask field:
636          *
637          * BIT:           7  6  5  4   3     2     1     0 (LSB)
638          * ASSIGNMENT:   <-><-><-><-><phy3><phy2><phy1><phy0>
639          *
640          * For short cable corresponding bit shall be reset,
641          * for long cable shall be set.
642          */
643         U8 long_cable_selection_mask;
644 
645     } controller;
646 
647     /**
648      * Per SAS Port data.
649      */
650     struct
651     {
652         /**
653          * This field specifies the phys to be contained inside a port.
654          * The bit position in the mask specifies the index of the phy
655          * to be contained in the port.  Multiple bits (i.e. phys)
656         * can be contained in a single port:
657         *      Bit 0 = This controller's PHY index 0     (0x01)
658         *      Bit 1 = This controller's PHY index 1     (0x02)
659         *      Bit 2 = This controller's PHY index 2     (0x04)
660         *      Bit 3 = This controller's PHY index 3     (0x08)
661         *
662         * Refer to the mode_type field for rules regarding APC and MPC mode.
663         * General rule: For APC mode phy_mask = 0
664         */
665         U8 phy_mask;
666 
667     } ports[SCI_MAX_PORTS]; // Up to 4 Ports per SCU controller unit
668 
669     /**
670      * Per PHY Parameter data.
671      */
672     struct
673     {
674         /**
675          * This field indicates the SAS Address that will be transmitted on
676          * this PHY index.  The field is defined as a union, however, the
677          * OEM should use the U8 array definition when encoding it to ensure
678          * correct byte ordering.
679          *
680          * NOTE: If using APC MODE, along with phy_mask being set to ZERO, the
681          * SAS Addresses for all PHYs within a controller group SHALL be the
682          * same.
683          */
684         union
685         {
686             /**
687              * The array should be stored in little endian order.  For example,
688              * if the desired SAS Address is 0x50010B90_0003538D, then it
689              * should be stored in the following manner:
690              *    array[0] = 0x90
691              *    array[1] = 0x0B
692              *    array[2] = 0x01
693              *    array[3] = 0x50
694              *    array[4] = 0x8D
695              *    array[5] = 0x53
696              *    array[6] = 0x03
697              *    array[7] = 0x00
698              */
699             U8 array[8];
700             /**
701              * This is the typedef'd version of the SAS Address used in
702              * the SCI Library.
703              */
704             SCI_SAS_ADDRESS_T  sci_format;
705 
706         } sas_address;
707 
708         /**
709          * These are the per PHY equalization settings associated with the
710          * AFE XCVR Tx Amplitude and Equalization Control Register Set
711          * (0 thru 3).
712          *
713          * Operational Note: The following Look-Up-Table registers are engaged
714          * by the AFE block after the following:
715          *  - Software programs the Link Layer AFE Look Up Table Control
716          *    Registers (AFE_LUTCR).
717          *  - Software sets AFE XCVR Tx Control Register Tx Equalization
718          *    Enable bit.
719          */
720         /**
721          * AFE_TX_AMP_CTRL0.  This register is associated with AFE_LUTCR
722          * LUTSel=00b. It contains the Tx Equalization settings that will be
723          * used if a SATA 1.5Gbs or SATA 3.0Gbs device is direct-attached.
724          */
725         U32 afe_tx_amp_control0;
726 
727         /**
728          * AFE_TX_AMP_CTRL1.  This register is associated with AFE_LUTCR
729          * LUTSel=01b. It contains the Tx Equalization settings that will
730          * be used if a SATA 6.0Gbs device is direct-attached.
731          */
732         U32 afe_tx_amp_control1;
733 
734         /**
735          * AFE_TX_AMP_CTRL2.  This register is associated with AFE_LUTCR
736          * LUTSel=10b. It contains the Tx Equalization settings that will
737          * be used if a SAS 1.5Gbs or SAS 3.0Gbs device is direct-attached.
738          */
739         U32 afe_tx_amp_control2;
740 
741         /**
742          * AFE_TX_AMP_CTRL3.  This register is associated with AFE_LUTCR
743          * LUTSel=11b. It contains the Tx Equalization settings that will
744          * be used if a SAS 6.0Gbs device is direct-attached.
745          */
746         U32 afe_tx_amp_control3;
747 
748     } phys[SCI_MAX_PHYS];   // 4 PHYs per SCU controller unit
749 
750 } SCI_BIOS_OEM_PARAM_ELEMENT_v_1_2_T;
751 
752 /**
753  * @struct SCIC_SDS_OEM_PARAMETERS VER 1.3
754  *
755  * @brief This structure delineates the various OEM parameters that must
756  * be set for the Intel SAS Storage Controller Unit (SCU).
757  */
758 typedef struct SCI_BIOS_OEM_PARAM_ELEMENT_v_1_3
759 {
760     /**
761      * Per SCU Controller Data
762      */
763     struct
764     {
765         /**
766          * This field indicates the port configuration mode for
767          * this controller:
768          *   Automatic Port Configuration(APC) or
769          *   Manual Port Configuration (MPC).
770          *
771          * APC means the Platform OEM expects SCI to configure
772          * SAS Ports automatically according to the discovered SAS
773          * Address pairs of the endpoints, wide and/or narrow.
774          *
775          * MPC means the Platform OEM manually defines wide or narrow
776          * connectors by apriori assigning PHYs to SAS Ports.
777          *
778          * By default, the mode type is APC
779          * in APC mode, if ANY of the phy mask is non-zero,
780          *    SCI_FAILURE_INVALID_PARAMETER_VALUE will be returned
781          *      from scic_oem_parameters_set AND the default oem
782          *      configuration will be applied
783          * in MPC mode, if ALL of the phy masks are zero,
784          *    SCI_FAILURE_INVALID_PARAMETER_VALUE will be returned
785          *      from scic_oem_parameters_set AND the default oem
786          *      configuration will be applied
787          */
788         U8  mode_type;
789 
790         /**
791          * This field specifies the maximum number of direct attached
792          * devices the OEM will allow to have powered up simultaneously
793          * on this controller.  This allows the OEM to avoid exceeding
794          * power supply limits for this platform.  A value of zero
795          * indicates there are no restrictions.
796          */
797         U8  max_number_concurrent_device_spin_up;
798 
799         /**
800          * This bitfield indicates the OEM's desired default Tx
801          * Spread Spectrum Clocking (SSC) settings for SATA and SAS.
802          * NOTE: Default SSC Modulation Frequency is 31.5KHz.
803          *--------------------------------------------------------------------*/
804         /**
805          * NOTE: Max spread for SATA is +0 / -5000 PPM.
806          * Down-spreading SSC (only method allowed for SATA):
807          *  SATA SSC Tx Disabled                    = 0x0
808          *  SATA SSC Tx at +0 / -1419 PPM Spread    = 0x2
809          *  SATA SSC Tx at +0 / -2129 PPM Spread    = 0x3
810          *  SATA SSC Tx at +0 / -4257 PPM Spread    = 0x6
811          *  SATA SSC Tx at +0 / -4967 PPM Spread    = 0x7
812         */
813         U8 ssc_sata_tx_spread_level : 4;
814 
815         /**
816          * SAS SSC Tx Disabled                     = 0x0
817          *
818          * NOTE: Max spread for SAS down-spreading +0 / -2300 PPM
819          * Down-spreading SSC:
820          *  SAS SSC Tx at +0 / -1419 PPM Spread     = 0x2
821          *  SAS SSC Tx at +0 / -2129 PPM Spread     = 0x3
822          *
823          * NOTE: Max spread for SAS center-spreading +2300 / -2300 PPM
824          * Center-spreading SSC:
825          *  SAS SSC Tx at +1064 / -1064 PPM Spread  = 0x3
826          *  SAS SSC Tx at +2129 / -2129 PPM Spread  = 0x6
827          */
828         U8 ssc_sas_tx_spread_level : 3;
829         /**
830          * NOTE: Refer to the SSC section of the SAS 2.x Specification
831          * for proper setting of this field. For standard SAS Initiator
832          * SAS PHY operation it should be 0 for Down-spreading.
833          * SAS SSC Tx spread type:
834          *  Down-spreading SSC      = 0
835          *  Center-spreading SSC    = 1
836          */
837         U8 ssc_sas_tx_type : 1;
838 
839         /**
840          * This field indicates length of the SAS/SATA cable between
841          * host and device.
842          * This field is used make relationship between analog parameters of
843          * the phy in the silicon and length of the cable.
844          * Supported cable attenuation levels:
845          * "short"- up to 3m, "medium"-3m to 6m, and "long"- more than 6m
846          * This is bit mask field:
847          *
848          * BIT:      (MSB) 7     6     5     4
849          * ASSIGNMENT:   <phy3><phy2><phy1><phy0>  - Medium cable length assignment
850          * BIT:            3     2     1     0  (LSB)
851          * ASSIGNMENT:   <phy3><phy2><phy1><phy0>  - Long cable length assignment
852          *
853          * BITS 7-4 are set when the cable length is assigned to medium
854          * BITS 3-0 are set when the cable length is assigned to long
855          * The BIT positions are clear when the cable length is assigned to short
856          * Setting the bits for both long and medium cable length is undefined.
857          *
858          * A value of 0x84 would assign
859          *    phy3 - medium
860          *    phy2 - long
861          *    phy1 - short
862          *    phy0 - short
863          */
864         U8 cable_selection_mask;
865 
866     } controller;
867 
868     /**
869      * Per SAS Port data.
870      */
871     struct
872     {
873         /**
874          * This field specifies the phys to be contained inside a port.
875          * The bit position in the mask specifies the index of the phy
876          * to be contained in the port.  Multiple bits (i.e. phys)
877         * can be contained in a single port:
878         *      Bit 0 = This controller's PHY index 0     (0x01)
879         *      Bit 1 = This controller's PHY index 1     (0x02)
880         *      Bit 2 = This controller's PHY index 2     (0x04)
881         *      Bit 3 = This controller's PHY index 3     (0x08)
882         *
883         * Refer to the mode_type field for rules regarding APC and MPC mode.
884         * General rule: For APC mode phy_mask = 0
885         */
886         U8 phy_mask;
887 
888     } ports[SCI_MAX_PORTS]; // Up to 4 Ports per SCU controller unit
889 
890     /**
891      * Per PHY Parameter data.
892      */
893     struct
894     {
895         /**
896          * This field indicates the SAS Address that will be transmitted on
897          * this PHY index.  The field is defined as a union, however, the
898          * OEM should use the U8 array definition when encoding it to ensure
899          * correct byte ordering.
900          *
901          * NOTE: If using APC MODE, along with phy_mask being set to ZERO, the
902          * SAS Addresses for all PHYs within a controller group SHALL be the
903          * same.
904          */
905         union
906         {
907             /**
908              * The array should be stored in little endian order.  For example,
909              * if the desired SAS Address is 0x50010B90_0003538D, then it
910              * should be stored in the following manner:
911              *    array[0] = 0x90
912              *    array[1] = 0x0B
913              *    array[2] = 0x01
914              *    array[3] = 0x50
915              *    array[4] = 0x8D
916              *    array[5] = 0x53
917              *    array[6] = 0x03
918              *    array[7] = 0x00
919              */
920             U8 array[8];
921             /**
922              * This is the typedef'd version of the SAS Address used in
923              * the SCI Library.
924              */
925             SCI_SAS_ADDRESS_T  sci_format;
926 
927         } sas_address;
928 
929         /**
930          * These are the per PHY equalization settings associated with the
931          * AFE XCVR Tx Amplitude and Equalization Control Register Set
932          * (0 thru 3).
933          *
934          * Operational Note: The following Look-Up-Table registers are engaged
935          * by the AFE block after the following:
936          *  - Software programs the Link Layer AFE Look Up Table Control
937          *    Registers (AFE_LUTCR).
938          *  - Software sets AFE XCVR Tx Control Register Tx Equalization
939          *    Enable bit.
940          */
941         /**
942          * AFE_TX_AMP_CTRL0.  This register is associated with AFE_LUTCR
943          * LUTSel=00b. It contains the Tx Equalization settings that will be
944          * used if a SATA 1.5Gbs or SATA 3.0Gbs device is direct-attached.
945          */
946         U32 afe_tx_amp_control0;
947 
948         /**
949          * AFE_TX_AMP_CTRL1.  This register is associated with AFE_LUTCR
950          * LUTSel=01b. It contains the Tx Equalization settings that will
951          * be used if a SATA 6.0Gbs device is direct-attached.
952          */
953         U32 afe_tx_amp_control1;
954 
955         /**
956          * AFE_TX_AMP_CTRL2.  This register is associated with AFE_LUTCR
957          * LUTSel=10b. It contains the Tx Equalization settings that will
958          * be used if a SAS 1.5Gbs or SAS 3.0Gbs device is direct-attached.
959          */
960         U32 afe_tx_amp_control2;
961 
962         /**
963          * AFE_TX_AMP_CTRL3.  This register is associated with AFE_LUTCR
964          * LUTSel=11b. It contains the Tx Equalization settings that will
965          * be used if a SAS 6.0Gbs device is direct-attached.
966          */
967         U32 afe_tx_amp_control3;
968 
969     } phys[SCI_MAX_PHYS];   // 4 PHYs per SCU controller unit
970 
971 } SCI_BIOS_OEM_PARAM_ELEMENT_v_1_3_T;
972 
973 /**
974  *  @struct SCI_BIOS_OEM_PARAM_BLOCK
975  *
976  * @brief This structure defines the OEM Parameter block as it will be stored
977  *  in the last 512 bytes of the PDR region in the SPI flash.  It must be
978  *  unpacked or pack(1).
979  */
980 typedef struct SCI_BIOS_OEM_PARAM_BLOCK
981 {
982     /**
983      * OEM Parameter Block header.
984      */
985     SCI_BIOS_OEM_PARAM_BLOCK_HDR_T  header;
986 
987     /**
988      * Per controller element descriptor containing the controller's
989      * parameter data. The prototype defines just one of these descriptors,
990      * however, the actual runtime number is determined by the num_elements
991      * field in the header.
992      */
993     SCI_BIOS_OEM_PARAM_ELEMENT_T controller_element[1];
994 
995 } SCI_BIOS_OEM_PARAM_BLOCK_T;
996 
997 #ifdef __cplusplus
998 }
999 #endif // __cplusplus
1000 
1001 #endif // _SCU_BIOS_DEFINITIONS_H_
1002 
1003