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_REMOTE_NODE_TABLE_H_ 57 #define _SCIC_SDS_REMOTE_NODE_TABLE_H_ 58 59 /** 60 * @file 61 * 62 * @brief This file contains the structures, constants and prototypes used for 63 * the remote node table. 64 */ 65 66 #ifdef __cplusplus 67 extern "C" { 68 #endif // __cplusplus 69 70 #include <dev/isci/scil/sci_types.h> 71 #include <dev/isci/scil/sci_controller_constants.h> 72 73 /** 74 * Remote node sets are sets of remote node index in the remtoe node table 75 * The SCU hardware requires that STP remote node entries take three 76 * consecutive remote node index so the table is arranged in sets of three. 77 * The bits are used as 0111 0111 to make a byte and the bits define the set 78 * of three remote nodes to use as a sequence. 79 */ 80 #define SCIC_SDS_REMOTE_NODE_SETS_PER_BYTE 2 81 82 /** 83 * Since the remote node table is organized as DWORDS take the remote node 84 * sets in bytes and represent them in DWORDs. The lowest ordered bits are the 85 * ones used in case full DWORD is not being used. 86 * 87 * i.e. 0000 0000 0000 0000 0111 0111 0111 0111 // if only a single WORD is in 88 * use in the DWORD. 89 */ 90 #define SCIC_SDS_REMOTE_NODE_SETS_PER_DWORD \ 91 (sizeof(U32) * SCIC_SDS_REMOTE_NODE_SETS_PER_BYTE) 92 /** 93 * This is a count of the numeber of remote nodes that can be represented in 94 * a byte 95 */ 96 #define SCIC_SDS_REMOTE_NODES_PER_BYTE \ 97 (SCU_STP_REMOTE_NODE_COUNT * SCIC_SDS_REMOTE_NODE_SETS_PER_BYTE) 98 99 /** 100 * This is a count of the number of remote nodes that can be represented in a 101 * DWROD 102 */ 103 #define SCIC_SDS_REMOTE_NODES_PER_DWORD \ 104 (sizeof(U32) * SCIC_SDS_REMOTE_NODES_PER_BYTE) 105 106 /** 107 * This is the number of bits in a remote node group 108 */ 109 #define SCIC_SDS_REMOTE_NODES_BITS_PER_GROUP 4 110 111 #define SCIC_SDS_REMOTE_NODE_TABLE_INVALID_INDEX (0xFFFFFFFF) 112 #define SCIC_SDS_REMOTE_NODE_TABLE_FULL_SLOT_VALUE (0x07) 113 #define SCIC_SDS_REMOTE_NODE_TABLE_EMPTY_SLOT_VALUE (0x00) 114 115 /** 116 * Expander attached sata remote node count 117 */ 118 #define SCU_STP_REMOTE_NODE_COUNT 3 119 120 /** 121 * Expander or direct attached ssp remote node count 122 */ 123 #define SCU_SSP_REMOTE_NODE_COUNT 1 124 125 /** 126 * Direct attached STP remote node count 127 */ 128 #define SCU_SATA_REMOTE_NODE_COUNT 1 129 130 /** 131 * @struct SCIC_REMOTE_NODE_TABLE 132 */ 133 typedef struct SCIC_REMOTE_NODE_TABLE 134 { 135 /** 136 * This field contains the array size in dwords 137 */ 138 U16 available_nodes_array_size; 139 140 /** 141 * This field contains the array size of the 142 */ 143 U16 group_array_size; 144 145 /** 146 * This field is the array of available remote node entries in bits. 147 * Because of the way STP remote node data is allocated on the SCU hardware 148 * the remote nodes must occupy three consecutive remote node context 149 * entries. For ease of allocation and de-allocation we have broken the 150 * sets of three into a single nibble. When the STP RNi is allocated all 151 * of the bits in the nibble are cleared. This math results in a table size 152 * of MAX_REMOTE_NODES / CONSECUTIVE RNi ENTRIES for STP / 2 entries per byte. 153 */ 154 U32 available_remote_nodes[ 155 (SCI_MAX_REMOTE_DEVICES / SCIC_SDS_REMOTE_NODES_PER_DWORD) 156 + ((SCI_MAX_REMOTE_DEVICES % SCIC_SDS_REMOTE_NODES_PER_DWORD) != 0)]; 157 158 /** 159 * This field is the nibble selector for the above table. There are three 160 * possible selectors each for fast lookup when trying to find one, two or 161 * three remote node entries. 162 */ 163 U32 remote_node_groups[ 164 SCU_STP_REMOTE_NODE_COUNT][ 165 (SCI_MAX_REMOTE_DEVICES / (32 * SCU_STP_REMOTE_NODE_COUNT)) 166 + ((SCI_MAX_REMOTE_DEVICES % (32 * SCU_STP_REMOTE_NODE_COUNT)) != 0)]; 167 168 } SCIC_REMOTE_NODE_TABLE_T; 169 170 // --------------------------------------------------------------------------- 171 172 void scic_sds_remote_node_table_initialize( 173 SCIC_REMOTE_NODE_TABLE_T * remote_node_table, 174 U32 remote_node_entries 175 ); 176 177 U16 scic_sds_remote_node_table_allocate_remote_node( 178 SCIC_REMOTE_NODE_TABLE_T * remote_node_table, 179 U32 remote_node_count 180 ); 181 182 void scic_sds_remote_node_table_release_remote_node_index( 183 SCIC_REMOTE_NODE_TABLE_T * remote_node_table, 184 U32 remote_node_count, 185 U16 remote_node_index 186 ); 187 188 #ifdef __cplusplus 189 } 190 #endif // __cplusplus 191 192 #endif // _SCIC_SDS_REMOTE_NODE_TABLE_H_ 193