Blame view

include/linux/raid/pq.h 4.47 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
  /* -*- linux-c -*- ------------------------------------------------------- *
   *
   *   Copyright 2003 H. Peter Anvin - All Rights Reserved
   *
   *   This program is free software; you can redistribute it and/or modify
   *   it under the terms of the GNU General Public License as published by
   *   the Free Software Foundation, Inc., 53 Temple Place Ste 330,
93ed05e2a   Atsushi SAKAI   md: fix typo in F...
8
   *   Boston MA 02111-1307, USA; either version 2 of the License, or
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
9
10
11
12
13
14
15
16
17
18
19
   *   (at your option) any later version; incorporated herein by reference.
   *
   * ----------------------------------------------------------------------- */
  
  #ifndef LINUX_RAID_RAID6_H
  #define LINUX_RAID_RAID6_H
  
  #ifdef __KERNEL__
  
  /* Set to 1 to use kernel-wide empty_zero_page */
  #define RAID6_USE_EMPTY_ZERO_PAGE 0
bff61975b   NeilBrown   md: move lots of ...
20
  #include <linux/blkdev.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  /* We need a pre-zeroed page... if we don't want to use the kernel-provided
     one define it here */
  #if RAID6_USE_EMPTY_ZERO_PAGE
  # define raid6_empty_zero_page empty_zero_page
  #else
  extern const char raid6_empty_zero_page[PAGE_SIZE];
  #endif
  
  #else /* ! __KERNEL__ */
  /* Used for testing in user space */
  
  #include <errno.h>
  #include <inttypes.h>
  #include <limits.h>
  #include <stddef.h>
  #include <sys/mman.h>
  #include <sys/types.h>
  
  /* Not standard, but glibc defines it */
  #define BITS_PER_LONG __WORDSIZE
  
  typedef uint8_t  u8;
  typedef uint16_t u16;
  typedef uint32_t u32;
  typedef uint64_t u64;
  
  #ifndef PAGE_SIZE
  # define PAGE_SIZE 4096
  #endif
  extern const char raid6_empty_zero_page[PAGE_SIZE];
  
  #define __init
  #define __exit
  #define __attribute_const__ __attribute__((const))
d7e70ba45   H. Peter Anvin   [PATCH] RAID6 Alt...
56
  #define noinline __attribute__((noinline))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
57
58
59
  
  #define preempt_enable()
  #define preempt_disable()
d7e70ba45   H. Peter Anvin   [PATCH] RAID6 Alt...
60
61
62
  #define cpu_has_feature(x) 1
  #define enable_kernel_altivec()
  #define disable_kernel_altivec()
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
63

f701d589a   Dan Williams   md/raid6: move ra...
64
  #define EXPORT_SYMBOL(sym)
d5302fe41   NeilBrown   Make lib/raid6/te...
65
  #define EXPORT_SYMBOL_GPL(sym)
f701d589a   Dan Williams   md/raid6: move ra...
66
  #define MODULE_LICENSE(licence)
d5302fe41   NeilBrown   Make lib/raid6/te...
67
  #define MODULE_DESCRIPTION(desc)
f701d589a   Dan Williams   md/raid6: move ra...
68
69
  #define subsys_initcall(x)
  #define module_exit(x)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
70
71
72
73
74
75
76
77
78
79
80
81
  #endif /* __KERNEL__ */
  
  /* Routine choices */
  struct raid6_calls {
  	void (*gen_syndrome)(int, size_t, void **);
  	int  (*valid)(void);	/* Returns 1 if this routine set is usable */
  	const char *name;	/* Name of this routine set */
  	int prefer;		/* Has special performance attribute */
  };
  
  /* Selected algorithm */
  extern struct raid6_calls raid6_call;
7820f9e1d   NeilBrown   md: remove sparse...
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
  /* Various routine sets */
  extern const struct raid6_calls raid6_intx1;
  extern const struct raid6_calls raid6_intx2;
  extern const struct raid6_calls raid6_intx4;
  extern const struct raid6_calls raid6_intx8;
  extern const struct raid6_calls raid6_intx16;
  extern const struct raid6_calls raid6_intx32;
  extern const struct raid6_calls raid6_mmxx1;
  extern const struct raid6_calls raid6_mmxx2;
  extern const struct raid6_calls raid6_sse1x1;
  extern const struct raid6_calls raid6_sse1x2;
  extern const struct raid6_calls raid6_sse2x1;
  extern const struct raid6_calls raid6_sse2x2;
  extern const struct raid6_calls raid6_sse2x4;
  extern const struct raid6_calls raid6_altivec1;
  extern const struct raid6_calls raid6_altivec2;
  extern const struct raid6_calls raid6_altivec4;
  extern const struct raid6_calls raid6_altivec8;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
  /* Algorithm list */
  extern const struct raid6_calls * const raid6_algos[];
  int raid6_select_algo(void);
  
  /* Return values from chk_syndrome */
  #define RAID6_OK	0
  #define RAID6_P_BAD	1
  #define RAID6_Q_BAD	2
  #define RAID6_PQ_BAD	3
  
  /* Galois field tables */
  extern const u8 raid6_gfmul[256][256] __attribute__((aligned(256)));
  extern const u8 raid6_gfexp[256]      __attribute__((aligned(256)));
  extern const u8 raid6_gfinv[256]      __attribute__((aligned(256)));
  extern const u8 raid6_gfexi[256]      __attribute__((aligned(256)));
  
  /* Recovery routines */
f701d589a   Dan Williams   md/raid6: move ra...
117
118
  void raid6_2data_recov(int disks, size_t bytes, int faila, int failb,
  		       void **ptrs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
119
  void raid6_datap_recov(int disks, size_t bytes, int faila, void **ptrs);
f701d589a   Dan Williams   md/raid6: move ra...
120
121
  void raid6_dual_recov(int disks, size_t bytes, int faila, int failb,
  		      void **ptrs);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
122
123
124
125
126
127
128
  
  /* Some definitions to allow code to be compiled for testing in userspace */
  #ifndef __KERNEL__
  
  # define jiffies	raid6_jiffies()
  # define printk 	printf
  # define GFP_KERNEL	0
f701d589a   Dan Williams   md/raid6: move ra...
129
130
131
132
133
  # define __get_free_pages(x, y)	((unsigned long)mmap(NULL, PAGE_SIZE << (y), \
  						     PROT_READ|PROT_WRITE,   \
  						     MAP_PRIVATE|MAP_ANONYMOUS,\
  						     0, 0))
  # define free_pages(x, y)	munmap((void *)(x), (y)*PAGE_SIZE)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
  
  static inline void cpu_relax(void)
  {
  	/* Nothing */
  }
  
  #undef  HZ
  #define HZ 1000
  static inline uint32_t raid6_jiffies(void)
  {
  	struct timeval tv;
  	gettimeofday(&tv, NULL);
  	return tv.tv_sec*1000 + tv.tv_usec/1000;
  }
  
  #endif /* ! __KERNEL__ */
  
  #endif /* LINUX_RAID_RAID6_H */