diff options
Diffstat (limited to 'drivers/scsi/isci/remote_node_table.h')
-rw-r--r-- | drivers/scsi/isci/remote_node_table.h | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/drivers/scsi/isci/remote_node_table.h b/drivers/scsi/isci/remote_node_table.h new file mode 100644 index 000000000000..721ab982d2ac --- /dev/null +++ b/drivers/scsi/isci/remote_node_table.h | |||
@@ -0,0 +1,188 @@ | |||
1 | /* | ||
2 | * This file is provided under a dual BSD/GPLv2 license. When using or | ||
3 | * redistributing this file, you may do so under either license. | ||
4 | * | ||
5 | * GPL LICENSE SUMMARY | ||
6 | * | ||
7 | * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved. | ||
8 | * | ||
9 | * This program is free software; you can redistribute it and/or modify | ||
10 | * it under the terms of version 2 of the GNU General Public License as | ||
11 | * published by the Free Software Foundation. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, but | ||
14 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
16 | * General Public License for more details. | ||
17 | * | ||
18 | * You should have received a copy of the GNU General Public License | ||
19 | * along with this program; if not, write to the Free Software | ||
20 | * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. | ||
21 | * The full GNU General Public License is included in this distribution | ||
22 | * in the file called LICENSE.GPL. | ||
23 | * | ||
24 | * BSD LICENSE | ||
25 | * | ||
26 | * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved. | ||
27 | * All rights reserved. | ||
28 | * | ||
29 | * Redistribution and use in source and binary forms, with or without | ||
30 | * modification, are permitted provided that the following conditions | ||
31 | * are met: | ||
32 | * | ||
33 | * * Redistributions of source code must retain the above copyright | ||
34 | * notice, this list of conditions and the following disclaimer. | ||
35 | * * Redistributions in binary form must reproduce the above copyright | ||
36 | * notice, this list of conditions and the following disclaimer in | ||
37 | * the documentation and/or other materials provided with the | ||
38 | * distribution. | ||
39 | * * Neither the name of Intel Corporation nor the names of its | ||
40 | * contributors may be used to endorse or promote products derived | ||
41 | * from this software without specific prior written permission. | ||
42 | * | ||
43 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
44 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
45 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
46 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
47 | * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
48 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
49 | * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
50 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
51 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
52 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
53 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
54 | */ | ||
55 | |||
56 | #ifndef _SCIC_SDS_REMOTE_NODE_TABLE_H_ | ||
57 | #define _SCIC_SDS_REMOTE_NODE_TABLE_H_ | ||
58 | |||
59 | #include "isci.h" | ||
60 | |||
61 | /** | ||
62 | * | ||
63 | * | ||
64 | * Remote node sets are sets of remote node index in the remtoe node table The | ||
65 | * SCU hardware requires that STP remote node entries take three consecutive | ||
66 | * remote node index so the table is arranged in sets of three. The bits are | ||
67 | * used as 0111 0111 to make a byte and the bits define the set of three remote | ||
68 | * nodes to use as a sequence. | ||
69 | */ | ||
70 | #define SCIC_SDS_REMOTE_NODE_SETS_PER_BYTE 2 | ||
71 | |||
72 | /** | ||
73 | * | ||
74 | * | ||
75 | * Since the remote node table is organized as DWORDS take the remote node sets | ||
76 | * in bytes and represent them in DWORDs. The lowest ordered bits are the ones | ||
77 | * used in case full DWORD is not being used. i.e. 0000 0000 0000 0000 0111 | ||
78 | * 0111 0111 0111 // if only a single WORD is in use in the DWORD. | ||
79 | */ | ||
80 | #define SCIC_SDS_REMOTE_NODE_SETS_PER_DWORD \ | ||
81 | (sizeof(u32) * SCIC_SDS_REMOTE_NODE_SETS_PER_BYTE) | ||
82 | /** | ||
83 | * | ||
84 | * | ||
85 | * This is a count of the numeber of remote nodes that can be represented in a | ||
86 | * byte | ||
87 | */ | ||
88 | #define SCIC_SDS_REMOTE_NODES_PER_BYTE \ | ||
89 | (SCU_STP_REMOTE_NODE_COUNT * SCIC_SDS_REMOTE_NODE_SETS_PER_BYTE) | ||
90 | |||
91 | /** | ||
92 | * | ||
93 | * | ||
94 | * This is a count of the number of remote nodes that can be represented in a | ||
95 | * DWROD | ||
96 | */ | ||
97 | #define SCIC_SDS_REMOTE_NODES_PER_DWORD \ | ||
98 | (sizeof(u32) * SCIC_SDS_REMOTE_NODES_PER_BYTE) | ||
99 | |||
100 | /** | ||
101 | * | ||
102 | * | ||
103 | * This is the number of bits in a remote node group | ||
104 | */ | ||
105 | #define SCIC_SDS_REMOTE_NODES_BITS_PER_GROUP 4 | ||
106 | |||
107 | #define SCIC_SDS_REMOTE_NODE_TABLE_INVALID_INDEX (0xFFFFFFFF) | ||
108 | #define SCIC_SDS_REMOTE_NODE_TABLE_FULL_SLOT_VALUE (0x07) | ||
109 | #define SCIC_SDS_REMOTE_NODE_TABLE_EMPTY_SLOT_VALUE (0x00) | ||
110 | |||
111 | /** | ||
112 | * | ||
113 | * | ||
114 | * Expander attached sata remote node count | ||
115 | */ | ||
116 | #define SCU_STP_REMOTE_NODE_COUNT 3 | ||
117 | |||
118 | /** | ||
119 | * | ||
120 | * | ||
121 | * Expander or direct attached ssp remote node count | ||
122 | */ | ||
123 | #define SCU_SSP_REMOTE_NODE_COUNT 1 | ||
124 | |||
125 | /** | ||
126 | * | ||
127 | * | ||
128 | * Direct attached STP remote node count | ||
129 | */ | ||
130 | #define SCU_SATA_REMOTE_NODE_COUNT 1 | ||
131 | |||
132 | /** | ||
133 | * struct sci_remote_node_table - | ||
134 | * | ||
135 | * | ||
136 | */ | ||
137 | struct sci_remote_node_table { | ||
138 | /** | ||
139 | * This field contains the array size in dwords | ||
140 | */ | ||
141 | u16 available_nodes_array_size; | ||
142 | |||
143 | /** | ||
144 | * This field contains the array size of the | ||
145 | */ | ||
146 | u16 group_array_size; | ||
147 | |||
148 | /** | ||
149 | * This field is the array of available remote node entries in bits. | ||
150 | * Because of the way STP remote node data is allocated on the SCU hardware | ||
151 | * the remote nodes must occupy three consecutive remote node context | ||
152 | * entries. For ease of allocation and de-allocation we have broken the | ||
153 | * sets of three into a single nibble. When the STP RNi is allocated all | ||
154 | * of the bits in the nibble are cleared. This math results in a table size | ||
155 | * of MAX_REMOTE_NODES / CONSECUTIVE RNi ENTRIES for STP / 2 entries per byte. | ||
156 | */ | ||
157 | u32 available_remote_nodes[ | ||
158 | (SCI_MAX_REMOTE_DEVICES / SCIC_SDS_REMOTE_NODES_PER_DWORD) | ||
159 | + ((SCI_MAX_REMOTE_DEVICES % SCIC_SDS_REMOTE_NODES_PER_DWORD) != 0)]; | ||
160 | |||
161 | /** | ||
162 | * This field is the nibble selector for the above table. There are three | ||
163 | * possible selectors each for fast lookup when trying to find one, two or | ||
164 | * three remote node entries. | ||
165 | */ | ||
166 | u32 remote_node_groups[ | ||
167 | SCU_STP_REMOTE_NODE_COUNT][ | ||
168 | (SCI_MAX_REMOTE_DEVICES / (32 * SCU_STP_REMOTE_NODE_COUNT)) | ||
169 | + ((SCI_MAX_REMOTE_DEVICES % (32 * SCU_STP_REMOTE_NODE_COUNT)) != 0)]; | ||
170 | |||
171 | }; | ||
172 | |||
173 | /* --------------------------------------------------------------------------- */ | ||
174 | |||
175 | void sci_remote_node_table_initialize( | ||
176 | struct sci_remote_node_table *remote_node_table, | ||
177 | u32 remote_node_entries); | ||
178 | |||
179 | u16 sci_remote_node_table_allocate_remote_node( | ||
180 | struct sci_remote_node_table *remote_node_table, | ||
181 | u32 remote_node_count); | ||
182 | |||
183 | void sci_remote_node_table_release_remote_node_index( | ||
184 | struct sci_remote_node_table *remote_node_table, | ||
185 | u32 remote_node_count, | ||
186 | u16 remote_node_index); | ||
187 | |||
188 | #endif /* _SCIC_SDS_REMOTE_NODE_TABLE_H_ */ | ||