2 * Copyright (C) 2012 Intel Corporation
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; version 2
11 #include <linux/raid/pq.h>
16 #define kernel_neon_begin()
17 #define kernel_neon_end()
18 #define cpu_has_neon() (1)
21 static int raid6_has_neon(void)
23 return cpu_has_neon();
26 void __raid6_2data_recov_neon(int bytes, uint8_t *p, uint8_t *q, uint8_t *dp,
27 uint8_t *dq, const uint8_t *pbmul,
30 void __raid6_datap_recov_neon(int bytes, uint8_t *p, uint8_t *q, uint8_t *dq,
33 static void raid6_2data_recov_neon(int disks, size_t bytes, int faila,
34 int failb, void **ptrs)
37 const u8 *pbmul; /* P multiplier table for B data */
38 const u8 *qmul; /* Q multiplier table (for both) */
40 p = (u8 *)ptrs[disks - 2];
41 q = (u8 *)ptrs[disks - 1];
44 * Compute syndrome with zero for the missing data pages
45 * Use the dead data pages as temporary storage for
48 dp = (u8 *)ptrs[faila];
49 ptrs[faila] = (void *)raid6_empty_zero_page;
51 dq = (u8 *)ptrs[failb];
52 ptrs[failb] = (void *)raid6_empty_zero_page;
55 raid6_call.gen_syndrome(disks, bytes, ptrs);
57 /* Restore pointer table */
63 /* Now, pick the proper data tables */
64 pbmul = raid6_vgfmul[raid6_gfexi[failb-faila]];
65 qmul = raid6_vgfmul[raid6_gfinv[raid6_gfexp[faila] ^
69 __raid6_2data_recov_neon(bytes, p, q, dp, dq, pbmul, qmul);
73 static void raid6_datap_recov_neon(int disks, size_t bytes, int faila,
77 const u8 *qmul; /* Q multiplier table */
79 p = (u8 *)ptrs[disks - 2];
80 q = (u8 *)ptrs[disks - 1];
83 * Compute syndrome with zero for the missing data page
84 * Use the dead data page as temporary storage for delta q
86 dq = (u8 *)ptrs[faila];
87 ptrs[faila] = (void *)raid6_empty_zero_page;
90 raid6_call.gen_syndrome(disks, bytes, ptrs);
92 /* Restore pointer table */
96 /* Now, pick the proper data tables */
97 qmul = raid6_vgfmul[raid6_gfinv[raid6_gfexp[faila]]];
100 __raid6_datap_recov_neon(bytes, p, q, dq, qmul);
104 const struct raid6_recov_calls raid6_recov_neon = {
105 .data2 = raid6_2data_recov_neon,
106 .datap = raid6_datap_recov_neon,
107 .valid = raid6_has_neon,