2 * Copyright (C) 2012 Intel Corporation
3 * Copyright (C) 2017 Linaro Ltd. <ard.biesheuvel@linaro.org>
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
,