xref: /isa-l/include/raid.h (revision fa5b8baf84e6a18dbaad48a3fa0d1fa062ae2fe8)
1d6c5e962SGreg Tucker /**********************************************************************
2d6c5e962SGreg Tucker   Copyright(c) 2011-2015 Intel Corporation All rights reserved.
3d6c5e962SGreg Tucker 
4d6c5e962SGreg Tucker   Redistribution and use in source and binary forms, with or without
5d6c5e962SGreg Tucker   modification, are permitted provided that the following conditions
6d6c5e962SGreg Tucker   are met:
7d6c5e962SGreg Tucker     * Redistributions of source code must retain the above copyright
8d6c5e962SGreg Tucker       notice, this list of conditions and the following disclaimer.
9d6c5e962SGreg Tucker     * Redistributions in binary form must reproduce the above copyright
10d6c5e962SGreg Tucker       notice, this list of conditions and the following disclaimer in
11d6c5e962SGreg Tucker       the documentation and/or other materials provided with the
12d6c5e962SGreg Tucker       distribution.
13d6c5e962SGreg Tucker     * Neither the name of Intel Corporation nor the names of its
14d6c5e962SGreg Tucker       contributors may be used to endorse or promote products derived
15d6c5e962SGreg Tucker       from this software without specific prior written permission.
16d6c5e962SGreg Tucker 
17d6c5e962SGreg Tucker   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18d6c5e962SGreg Tucker   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19d6c5e962SGreg Tucker   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20d6c5e962SGreg Tucker   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21d6c5e962SGreg Tucker   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22d6c5e962SGreg Tucker   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23d6c5e962SGreg Tucker   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24d6c5e962SGreg Tucker   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25d6c5e962SGreg Tucker   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26d6c5e962SGreg Tucker   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27d6c5e962SGreg Tucker   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28d6c5e962SGreg Tucker **********************************************************************/
29d6c5e962SGreg Tucker 
30d6c5e962SGreg Tucker #ifndef _RAID_H_
31d6c5e962SGreg Tucker #define _RAID_H_
32d6c5e962SGreg Tucker 
33d6c5e962SGreg Tucker /**
34d6c5e962SGreg Tucker  *  @file  raid.h
35d6c5e962SGreg Tucker  *  @brief Interface to RAID functions - XOR and P+Q calculation.
36d6c5e962SGreg Tucker  *
37d6c5e962SGreg Tucker  *  This file defines the interface to optimized XOR calculation (RAID5) or P+Q
38d6c5e962SGreg Tucker  *  dual parity (RAID6).  Operations are carried out on an array of pointers to
39d6c5e962SGreg Tucker  *  sources and output arrays.
40d6c5e962SGreg Tucker  */
41d6c5e962SGreg Tucker 
42d6c5e962SGreg Tucker #ifdef __cplusplus
43d6c5e962SGreg Tucker extern "C" {
44d6c5e962SGreg Tucker #endif
45d6c5e962SGreg Tucker 
46d6c5e962SGreg Tucker /* Multi-binary functions */
47d6c5e962SGreg Tucker 
48d6c5e962SGreg Tucker /**
49d6c5e962SGreg Tucker  * @brief Generate XOR parity vector from N sources, runs appropriate version.
50d6c5e962SGreg Tucker  *
51d6c5e962SGreg Tucker  * This function determines what instruction sets are enabled and
52d6c5e962SGreg Tucker  * selects the appropriate version at runtime.
53d6c5e962SGreg Tucker  *
542c705a26SGreg Tucker  * @param vects   Number of source+dest vectors in array. Must be > 2.
55d6c5e962SGreg Tucker  * @param len     Length of each vector in bytes.
56d6c5e962SGreg Tucker  * @param array   Array of pointers to source and dest. For XOR the dest is
57d6c5e962SGreg Tucker  *                the last pointer. ie array[vects-1]. Src and dest
58d6c5e962SGreg Tucker  *                pointers must be aligned to 32B.
59d6c5e962SGreg Tucker  *
60d6c5e962SGreg Tucker  * @returns 0 pass, other fail
61d6c5e962SGreg Tucker  */
62d6c5e962SGreg Tucker 
63*fa5b8bafSMarcel Cornu int
64*fa5b8bafSMarcel Cornu xor_gen(int vects, int len, void **array);
65d6c5e962SGreg Tucker 
66d6c5e962SGreg Tucker /**
67d6c5e962SGreg Tucker  * @brief Checks that array has XOR parity sum of 0 across all vectors, runs appropriate version.
68d6c5e962SGreg Tucker  *
69d6c5e962SGreg Tucker  * This function determines what instruction sets are enabled and
70d6c5e962SGreg Tucker  * selects the appropriate version at runtime.
71d6c5e962SGreg Tucker  *
722c705a26SGreg Tucker  * @param vects   Number of vectors in array. Must be > 1.
73d6c5e962SGreg Tucker  * @param len     Length of each vector in bytes.
74d6c5e962SGreg Tucker  * @param array   Array of pointers to vectors. Src and dest pointers
75d6c5e962SGreg Tucker  *                must be aligned to 16B.
76d6c5e962SGreg Tucker  *
77d6c5e962SGreg Tucker  * @returns 0 pass, other fail
78d6c5e962SGreg Tucker  */
79d6c5e962SGreg Tucker 
80*fa5b8bafSMarcel Cornu int
81*fa5b8bafSMarcel Cornu xor_check(int vects, int len, void **array);
82d6c5e962SGreg Tucker 
83d6c5e962SGreg Tucker /**
84d6c5e962SGreg Tucker  * @brief Generate P+Q parity vectors from N sources, runs appropriate version.
85d6c5e962SGreg Tucker  *
86d6c5e962SGreg Tucker  * This function determines what instruction sets are enabled and
87d6c5e962SGreg Tucker  * selects the appropriate version at runtime.
88d6c5e962SGreg Tucker  *
892c705a26SGreg Tucker  * @param vects   Number of source+dest vectors in array. Must be > 3.
90d6c5e962SGreg Tucker  * @param len     Length of each vector in bytes. Must be 32B aligned.
91d6c5e962SGreg Tucker  * @param array   Array of pointers to source and dest. For P+Q the dest
92d6c5e962SGreg Tucker  *                is the last two pointers. ie array[vects-2],
93d6c5e962SGreg Tucker  *                array[vects-1].  P and Q parity vectors are
94d6c5e962SGreg Tucker  *                written to these last two pointers. Src and dest
95d6c5e962SGreg Tucker  *                pointers must be aligned to 32B.
96d6c5e962SGreg Tucker  *
97d6c5e962SGreg Tucker  * @returns 0 pass, other fail
98d6c5e962SGreg Tucker  */
99d6c5e962SGreg Tucker 
100*fa5b8bafSMarcel Cornu int
101*fa5b8bafSMarcel Cornu pq_gen(int vects, int len, void **array);
102d6c5e962SGreg Tucker 
103d6c5e962SGreg Tucker /**
104*fa5b8bafSMarcel Cornu  * @brief Checks that array of N sources, P and Q are consistent across all vectors, runs
105*fa5b8bafSMarcel Cornu  * appropriate version.
106d6c5e962SGreg Tucker  *
107d6c5e962SGreg Tucker  * This function determines what instruction sets are enabled and
108d6c5e962SGreg Tucker  * selects the appropriate version at runtime.
109d6c5e962SGreg Tucker  *
1102c705a26SGreg Tucker  * @param vects  Number of vectors in array including P&Q. Must be > 3.
111d6c5e962SGreg Tucker  * @param len    Length of each vector in bytes. Must be 16B aligned.
112d6c5e962SGreg Tucker  * @param array  Array of pointers to source and P, Q. P and Q parity
113d6c5e962SGreg Tucker  *               are assumed to be the last two pointers in the array.
114d6c5e962SGreg Tucker  *               All pointers must be aligned to 16B.
115d6c5e962SGreg Tucker  *
116d6c5e962SGreg Tucker  * @returns 0 pass, other fail
117d6c5e962SGreg Tucker  */
118d6c5e962SGreg Tucker 
119*fa5b8bafSMarcel Cornu int
120*fa5b8bafSMarcel Cornu pq_check(int vects, int len, void **array);
121d6c5e962SGreg Tucker 
122d6c5e962SGreg Tucker /* Arch specific versions */
12323937916SJohn Kariuki // x86 only
12423937916SJohn Kariuki #if defined(__i386__) || defined(__x86_64__)
125d6c5e962SGreg Tucker 
126d6c5e962SGreg Tucker /**
127d6c5e962SGreg Tucker  * @brief Generate XOR parity vector from N sources.
128d6c5e962SGreg Tucker  * @requires SSE4.1
129d6c5e962SGreg Tucker  *
1302c705a26SGreg Tucker  * @param vects   Number of source+dest vectors in array. Must be > 2.
131d6c5e962SGreg Tucker  * @param len     Length of each vector in bytes.
132d6c5e962SGreg Tucker  * @param array   Array of pointers to source and dest. For XOR the dest is
133d6c5e962SGreg Tucker  *                the last pointer. ie array[vects-1]. Src and dest pointers
134d6c5e962SGreg Tucker  *                must be aligned to 16B.
135d6c5e962SGreg Tucker  *
136d6c5e962SGreg Tucker  * @returns 0 pass, other fail
137d6c5e962SGreg Tucker  */
138d6c5e962SGreg Tucker 
139*fa5b8bafSMarcel Cornu int
140*fa5b8bafSMarcel Cornu xor_gen_sse(int vects, int len, void **array);
141d6c5e962SGreg Tucker 
142d6c5e962SGreg Tucker /**
143d6c5e962SGreg Tucker  * @brief Generate XOR parity vector from N sources.
144d6c5e962SGreg Tucker  * @requires AVX
145d6c5e962SGreg Tucker  *
1462c705a26SGreg Tucker  * @param vects   Number of source+dest vectors in array. Must be > 2.
147d6c5e962SGreg Tucker  * @param len     Length of each vector in bytes.
148d6c5e962SGreg Tucker  * @param array   Array of pointers to source and dest. For XOR the dest is
149d6c5e962SGreg Tucker  *                the last pointer. ie array[vects-1]. Src and dest pointers
150d6c5e962SGreg Tucker  *                must be aligned to 32B.
151d6c5e962SGreg Tucker  *
152d6c5e962SGreg Tucker  * @returns 0 pass, other fail
153d6c5e962SGreg Tucker  */
154d6c5e962SGreg Tucker 
155*fa5b8bafSMarcel Cornu int
156*fa5b8bafSMarcel Cornu xor_gen_avx(int vects, int len, void **array);
157d6c5e962SGreg Tucker 
158d6c5e962SGreg Tucker /**
159d6c5e962SGreg Tucker  * @brief Checks that array has XOR parity sum of 0 across all vectors.
160d6c5e962SGreg Tucker  * @requires SSE4.1
161d6c5e962SGreg Tucker  *
1622c705a26SGreg Tucker  * @param vects   Number of vectors in array. Must be > 1.
163d6c5e962SGreg Tucker  * @param len     Length of each vector in bytes.
164d6c5e962SGreg Tucker  * @param array   Array of pointers to vectors. Src and dest pointers
165d6c5e962SGreg Tucker  *                must be aligned to 16B.
166d6c5e962SGreg Tucker  *
167d6c5e962SGreg Tucker  * @returns 0 pass, other fail
168d6c5e962SGreg Tucker  */
169d6c5e962SGreg Tucker 
170*fa5b8bafSMarcel Cornu int
171*fa5b8bafSMarcel Cornu xor_check_sse(int vects, int len, void **array);
172d6c5e962SGreg Tucker 
173d6c5e962SGreg Tucker /**
174d6c5e962SGreg Tucker  * @brief Generate P+Q parity vectors from N sources.
175d6c5e962SGreg Tucker  * @requires SSE4.1
176d6c5e962SGreg Tucker  *
1772c705a26SGreg Tucker  * @param vects   Number of source+dest vectors in array. Must be > 3.
178d6c5e962SGreg Tucker  * @param len     Length of each vector in bytes. Must be 16B aligned.
179d6c5e962SGreg Tucker  * @param array   Array of pointers to source and dest. For P+Q the dest
180d6c5e962SGreg Tucker  *                is the last two pointers. ie array[vects-2],
181d6c5e962SGreg Tucker  *                array[vects-1]. P and Q parity vectors are
182d6c5e962SGreg Tucker  *                written to these last two pointers. Src and dest
183d6c5e962SGreg Tucker  *                pointers must be aligned to 16B.
184d6c5e962SGreg Tucker  *
185d6c5e962SGreg Tucker  * @returns 0 pass, other fail
186d6c5e962SGreg Tucker  */
187d6c5e962SGreg Tucker 
188*fa5b8bafSMarcel Cornu int
189*fa5b8bafSMarcel Cornu pq_gen_sse(int vects, int len, void **array);
190d6c5e962SGreg Tucker 
191d6c5e962SGreg Tucker /**
192d6c5e962SGreg Tucker  * @brief Generate P+Q parity vectors from N sources.
193d6c5e962SGreg Tucker  * @requires AVX
194d6c5e962SGreg Tucker  *
1952c705a26SGreg Tucker  * @param vects   Number of source+dest vectors in array. Must be > 3.
196d6c5e962SGreg Tucker  * @param len     Length of each vector in bytes. Must be 16B aligned.
197d6c5e962SGreg Tucker  * @param array   Array of pointers to source and dest. For P+Q the dest
198d6c5e962SGreg Tucker  *                is the last two pointers. ie array[vects-2],
199d6c5e962SGreg Tucker  *                array[vects-1]. P and Q parity vectors are
200d6c5e962SGreg Tucker  *                written to these last two pointers. Src and dest
201d6c5e962SGreg Tucker  *                pointers must be aligned to 16B.
202d6c5e962SGreg Tucker  *
203d6c5e962SGreg Tucker  * @returns 0 pass, other fail
204d6c5e962SGreg Tucker  */
205d6c5e962SGreg Tucker 
206*fa5b8bafSMarcel Cornu int
207*fa5b8bafSMarcel Cornu pq_gen_avx(int vects, int len, void **array);
208d6c5e962SGreg Tucker 
209d6c5e962SGreg Tucker /**
210d6c5e962SGreg Tucker  * @brief Generate P+Q parity vectors from N sources.
211d6c5e962SGreg Tucker  * @requires AVX2
212d6c5e962SGreg Tucker  *
2132c705a26SGreg Tucker  * @param vects   Number of source+dest vectors in array. Must be > 3.
214d6c5e962SGreg Tucker  * @param len     Length of each vector in bytes. Must be 32B aligned.
215d6c5e962SGreg Tucker  * @param array   Array of pointers to source and dest. For P+Q the dest
216d6c5e962SGreg Tucker  *                is the last two pointers. ie array[vects-2],
217d6c5e962SGreg Tucker  *                array[vects-1]. P and Q parity vectors are
218d6c5e962SGreg Tucker  *                written to these last two pointers. Src and dest
219d6c5e962SGreg Tucker  *                pointers must be aligned to 32B.
220d6c5e962SGreg Tucker  *
221d6c5e962SGreg Tucker  * @returns 0 pass, other fail
222d6c5e962SGreg Tucker  */
223d6c5e962SGreg Tucker 
224*fa5b8bafSMarcel Cornu int
225*fa5b8bafSMarcel Cornu pq_gen_avx2(int vects, int len, void **array);
226d6c5e962SGreg Tucker 
227d6c5e962SGreg Tucker /**
228d6c5e962SGreg Tucker  * @brief Checks that array of N sources, P and Q are consistent across all vectors.
229d6c5e962SGreg Tucker  * @requires SSE4.1
230d6c5e962SGreg Tucker  *
2312c705a26SGreg Tucker  * @param vects  Number of vectors in array including P&Q. Must be > 3.
232d6c5e962SGreg Tucker  * @param len    Length of each vector in bytes. Must be 16B aligned.
233d6c5e962SGreg Tucker  * @param array  Array of pointers to source and P, Q. P and Q parity
234d6c5e962SGreg Tucker                  are assumed to be the last two pointers in the array.
235d6c5e962SGreg Tucker                  All pointers must be aligned to 16B.
236d6c5e962SGreg Tucker  * @returns 0 pass, other fail
237d6c5e962SGreg Tucker  */
238d6c5e962SGreg Tucker 
239*fa5b8bafSMarcel Cornu int
240*fa5b8bafSMarcel Cornu pq_check_sse(int vects, int len, void **array);
241d6c5e962SGreg Tucker 
24223937916SJohn Kariuki #endif
243d6c5e962SGreg Tucker 
244d6c5e962SGreg Tucker /**
245d6c5e962SGreg Tucker  * @brief Generate P+Q parity vectors from N sources, runs baseline version.
2462c705a26SGreg Tucker  * @param vects   Number of source+dest vectors in array. Must be > 3.
247d6c5e962SGreg Tucker  * @param len     Length of each vector in bytes. Must be 16B aligned.
248d6c5e962SGreg Tucker  * @param array   Array of pointers to source and dest. For P+Q the dest
249d6c5e962SGreg Tucker  * 		  is the last two pointers. ie array[vects-2],
250d6c5e962SGreg Tucker  * 		  array[vects-1]. P and Q parity vectors are
251d6c5e962SGreg Tucker  * 		  written to these last two pointers. Src and dest pointers
252d6c5e962SGreg Tucker  * 		  must be aligned to 16B.
253d6c5e962SGreg Tucker  *
254d6c5e962SGreg Tucker  * @returns 0 pass, other fail
255d6c5e962SGreg Tucker  */
256d6c5e962SGreg Tucker 
257*fa5b8bafSMarcel Cornu int
258*fa5b8bafSMarcel Cornu pq_gen_base(int vects, int len, void **array);
259d6c5e962SGreg Tucker 
260d6c5e962SGreg Tucker /**
261d6c5e962SGreg Tucker  * @brief Generate XOR parity vector from N sources, runs baseline version.
2622c705a26SGreg Tucker  * @param vects   Number of source+dest vectors in array. Must be > 2.
263d6c5e962SGreg Tucker  * @param len     Length of each vector in bytes.
264d6c5e962SGreg Tucker  * @param array   Array of pointers to source and dest. For XOR the dest is
265d6c5e962SGreg Tucker  * 		  the last pointer. ie array[vects-1]. Src and dest pointers
266d6c5e962SGreg Tucker  * 		  must be aligned to 32B.
267d6c5e962SGreg Tucker  *
268d6c5e962SGreg Tucker  * @returns 0 pass, other fail
269d6c5e962SGreg Tucker  */
270d6c5e962SGreg Tucker 
271*fa5b8bafSMarcel Cornu int
272*fa5b8bafSMarcel Cornu xor_gen_base(int vects, int len, void **array);
273d6c5e962SGreg Tucker 
274d6c5e962SGreg Tucker /**
275d6c5e962SGreg Tucker  * @brief Checks that array has XOR parity sum of 0 across all vectors, runs baseline version.
276d6c5e962SGreg Tucker  *
2772c705a26SGreg Tucker  * @param vects   Number of vectors in array. Must be > 1.
278d6c5e962SGreg Tucker  * @param len     Length of each vector in bytes.
279d6c5e962SGreg Tucker  * @param array   Array of pointers to vectors. Src and dest pointers
280d6c5e962SGreg Tucker  *                must be aligned to 16B.
281d6c5e962SGreg Tucker  *
282d6c5e962SGreg Tucker  * @returns 0 pass, other fail
283d6c5e962SGreg Tucker  */
284d6c5e962SGreg Tucker 
285*fa5b8bafSMarcel Cornu int
286*fa5b8bafSMarcel Cornu xor_check_base(int vects, int len, void **array);
287d6c5e962SGreg Tucker 
288d6c5e962SGreg Tucker /**
289*fa5b8bafSMarcel Cornu  * @brief Checks that array of N sources, P and Q are consistent across all vectors, runs baseline
290*fa5b8bafSMarcel Cornu  * version.
291d6c5e962SGreg Tucker  *
2922c705a26SGreg Tucker  * @param vects  Number of vectors in array including P&Q. Must be > 3.
293d6c5e962SGreg Tucker  * @param len    Length of each vector in bytes. Must be 16B aligned.
294d6c5e962SGreg Tucker  * @param array  Array of pointers to source and P, Q. P and Q parity
295d6c5e962SGreg Tucker  *               are assumed to be the last two pointers in the array.
296d6c5e962SGreg Tucker  *               All pointers must be aligned to 16B.
297d6c5e962SGreg Tucker  *
298d6c5e962SGreg Tucker  * @returns 0 pass, other fail
299d6c5e962SGreg Tucker  */
300d6c5e962SGreg Tucker 
301*fa5b8bafSMarcel Cornu int
302*fa5b8bafSMarcel Cornu pq_check_base(int vects, int len, void **array);
303d6c5e962SGreg Tucker 
304d6c5e962SGreg Tucker #ifdef __cplusplus
305d6c5e962SGreg Tucker }
306d6c5e962SGreg Tucker #endif
307d6c5e962SGreg Tucker 
308d6c5e962SGreg Tucker #endif //_RAID_H_
309