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