Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * Copyright (C) 2012 Intel Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  * Copyright (C) 2017 Linaro Ltd. <ard.biesheuvel@linaro.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) #include <linux/raid/pq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) #ifdef __KERNEL__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #include <asm/neon.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) #define kernel_neon_begin()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) #define kernel_neon_end()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #define cpu_has_neon()		(1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) static int raid6_has_neon(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 	return cpu_has_neon();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) void __raid6_2data_recov_neon(int bytes, uint8_t *p, uint8_t *q, uint8_t *dp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 			      uint8_t *dq, const uint8_t *pbmul,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 			      const uint8_t *qmul);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) void __raid6_datap_recov_neon(int bytes, uint8_t *p, uint8_t *q, uint8_t *dq,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 			      const uint8_t *qmul);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) static void raid6_2data_recov_neon(int disks, size_t bytes, int faila,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 		int failb, void **ptrs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 	u8 *p, *q, *dp, *dq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	const u8 *pbmul;	/* P multiplier table for B data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 	const u8 *qmul;		/* Q multiplier table (for both) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 	p = (u8 *)ptrs[disks - 2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 	q = (u8 *)ptrs[disks - 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 	 * Compute syndrome with zero for the missing data pages
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	 * Use the dead data pages as temporary storage for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	 * delta p and delta q
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	dp = (u8 *)ptrs[faila];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	ptrs[faila] = (void *)raid6_empty_zero_page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	ptrs[disks - 2] = dp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	dq = (u8 *)ptrs[failb];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	ptrs[failb] = (void *)raid6_empty_zero_page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	ptrs[disks - 1] = dq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	raid6_call.gen_syndrome(disks, bytes, ptrs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	/* Restore pointer table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	ptrs[faila]     = dp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	ptrs[failb]     = dq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	ptrs[disks - 2] = p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	ptrs[disks - 1] = q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	/* Now, pick the proper data tables */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	pbmul = raid6_vgfmul[raid6_gfexi[failb-faila]];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	qmul  = raid6_vgfmul[raid6_gfinv[raid6_gfexp[faila] ^
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 					 raid6_gfexp[failb]]];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	kernel_neon_begin();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	__raid6_2data_recov_neon(bytes, p, q, dp, dq, pbmul, qmul);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	kernel_neon_end();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) static void raid6_datap_recov_neon(int disks, size_t bytes, int faila,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 		void **ptrs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	u8 *p, *q, *dq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	const u8 *qmul;		/* Q multiplier table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	p = (u8 *)ptrs[disks - 2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	q = (u8 *)ptrs[disks - 1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	 * Compute syndrome with zero for the missing data page
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	 * Use the dead data page as temporary storage for delta q
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	dq = (u8 *)ptrs[faila];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	ptrs[faila] = (void *)raid6_empty_zero_page;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	ptrs[disks - 1] = dq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	raid6_call.gen_syndrome(disks, bytes, ptrs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	/* Restore pointer table */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	ptrs[faila]     = dq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	ptrs[disks - 1] = q;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	/* Now, pick the proper data tables */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 	qmul = raid6_vgfmul[raid6_gfinv[raid6_gfexp[faila]]];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	kernel_neon_begin();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	__raid6_datap_recov_neon(bytes, p, q, dq, qmul);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	kernel_neon_end();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) const struct raid6_recov_calls raid6_recov_neon = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 	.data2		= raid6_2data_recov_neon,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	.datap		= raid6_datap_recov_neon,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	.valid		= raid6_has_neon,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	.name		= "neon",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	.priority	= 10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) };