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