diff options
Diffstat (limited to 'drivers/md/raid6mmx.c')
-rw-r--r-- | drivers/md/raid6mmx.c | 16 |
1 files changed, 4 insertions, 12 deletions
diff --git a/drivers/md/raid6mmx.c b/drivers/md/raid6mmx.c index 359157aaf9e0..6181a5a3365a 100644 --- a/drivers/md/raid6mmx.c +++ b/drivers/md/raid6mmx.c | |||
@@ -30,14 +30,8 @@ const struct raid6_mmx_constants { | |||
30 | 30 | ||
31 | static int raid6_have_mmx(void) | 31 | static int raid6_have_mmx(void) |
32 | { | 32 | { |
33 | #ifdef __KERNEL__ | ||
34 | /* Not really "boot_cpu" but "all_cpus" */ | 33 | /* Not really "boot_cpu" but "all_cpus" */ |
35 | return boot_cpu_has(X86_FEATURE_MMX); | 34 | return boot_cpu_has(X86_FEATURE_MMX); |
36 | #else | ||
37 | /* User space test code */ | ||
38 | u32 features = cpuid_features(); | ||
39 | return ( (features & (1<<23)) == (1<<23) ); | ||
40 | #endif | ||
41 | } | 35 | } |
42 | 36 | ||
43 | /* | 37 | /* |
@@ -48,13 +42,12 @@ static void raid6_mmx1_gen_syndrome(int disks, size_t bytes, void **ptrs) | |||
48 | u8 **dptr = (u8 **)ptrs; | 42 | u8 **dptr = (u8 **)ptrs; |
49 | u8 *p, *q; | 43 | u8 *p, *q; |
50 | int d, z, z0; | 44 | int d, z, z0; |
51 | raid6_mmx_save_t sa; | ||
52 | 45 | ||
53 | z0 = disks - 3; /* Highest data disk */ | 46 | z0 = disks - 3; /* Highest data disk */ |
54 | p = dptr[z0+1]; /* XOR parity */ | 47 | p = dptr[z0+1]; /* XOR parity */ |
55 | q = dptr[z0+2]; /* RS syndrome */ | 48 | q = dptr[z0+2]; /* RS syndrome */ |
56 | 49 | ||
57 | raid6_before_mmx(&sa); | 50 | kernel_fpu_begin(); |
58 | 51 | ||
59 | asm volatile("movq %0,%%mm0" : : "m" (raid6_mmx_constants.x1d)); | 52 | asm volatile("movq %0,%%mm0" : : "m" (raid6_mmx_constants.x1d)); |
60 | asm volatile("pxor %mm5,%mm5"); /* Zero temp */ | 53 | asm volatile("pxor %mm5,%mm5"); /* Zero temp */ |
@@ -78,7 +71,7 @@ static void raid6_mmx1_gen_syndrome(int disks, size_t bytes, void **ptrs) | |||
78 | asm volatile("pxor %mm4,%mm4"); | 71 | asm volatile("pxor %mm4,%mm4"); |
79 | } | 72 | } |
80 | 73 | ||
81 | raid6_after_mmx(&sa); | 74 | kernel_fpu_end(); |
82 | } | 75 | } |
83 | 76 | ||
84 | const struct raid6_calls raid6_mmxx1 = { | 77 | const struct raid6_calls raid6_mmxx1 = { |
@@ -96,13 +89,12 @@ static void raid6_mmx2_gen_syndrome(int disks, size_t bytes, void **ptrs) | |||
96 | u8 **dptr = (u8 **)ptrs; | 89 | u8 **dptr = (u8 **)ptrs; |
97 | u8 *p, *q; | 90 | u8 *p, *q; |
98 | int d, z, z0; | 91 | int d, z, z0; |
99 | raid6_mmx_save_t sa; | ||
100 | 92 | ||
101 | z0 = disks - 3; /* Highest data disk */ | 93 | z0 = disks - 3; /* Highest data disk */ |
102 | p = dptr[z0+1]; /* XOR parity */ | 94 | p = dptr[z0+1]; /* XOR parity */ |
103 | q = dptr[z0+2]; /* RS syndrome */ | 95 | q = dptr[z0+2]; /* RS syndrome */ |
104 | 96 | ||
105 | raid6_before_mmx(&sa); | 97 | kernel_fpu_begin(); |
106 | 98 | ||
107 | asm volatile("movq %0,%%mm0" : : "m" (raid6_mmx_constants.x1d)); | 99 | asm volatile("movq %0,%%mm0" : : "m" (raid6_mmx_constants.x1d)); |
108 | asm volatile("pxor %mm5,%mm5"); /* Zero temp */ | 100 | asm volatile("pxor %mm5,%mm5"); /* Zero temp */ |
@@ -137,7 +129,7 @@ static void raid6_mmx2_gen_syndrome(int disks, size_t bytes, void **ptrs) | |||
137 | asm volatile("movq %%mm6,%0" : "=m" (q[d+8])); | 129 | asm volatile("movq %%mm6,%0" : "=m" (q[d+8])); |
138 | } | 130 | } |
139 | 131 | ||
140 | raid6_after_mmx(&sa); | 132 | kernel_fpu_end(); |
141 | } | 133 | } |
142 | 134 | ||
143 | const struct raid6_calls raid6_mmxx2 = { | 135 | const struct raid6_calls raid6_mmxx2 = { |