OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [crypto/] [xor.c] - Blame information for rev 17

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
/*
2
 * xor.c : Multiple Devices driver for Linux
3
 *
4
 * Copyright (C) 1996, 1997, 1998, 1999, 2000,
5
 * Ingo Molnar, Matti Aarnio, Jakub Jelinek, Richard Henderson.
6
 *
7
 * Dispatch optimized RAID-5 checksumming functions.
8
 *
9
 * This program is free software; you can redistribute it and/or modify
10
 * it under the terms of the GNU General Public License as published by
11
 * the Free Software Foundation; either version 2, or (at your option)
12
 * any later version.
13
 *
14
 * You should have received a copy of the GNU General Public License
15
 * (for example /usr/src/linux/COPYING); if not, write to the Free
16
 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
 */
18
 
19
#define BH_TRACE 0
20
#include <linux/module.h>
21
#include <linux/raid/md.h>
22
#include <linux/raid/xor.h>
23
#include <asm/xor.h>
24
 
25
/* The xor routines to use.  */
26
static struct xor_block_template *active_template;
27
 
28
void
29
xor_blocks(unsigned int src_count, unsigned int bytes, void *dest, void **srcs)
30
{
31
        unsigned long *p1, *p2, *p3, *p4;
32
 
33
        p1 = (unsigned long *) srcs[0];
34
        if (src_count == 1) {
35
                active_template->do_2(bytes, dest, p1);
36
                return;
37
        }
38
 
39
        p2 = (unsigned long *) srcs[1];
40
        if (src_count == 2) {
41
                active_template->do_3(bytes, dest, p1, p2);
42
                return;
43
        }
44
 
45
        p3 = (unsigned long *) srcs[2];
46
        if (src_count == 3) {
47
                active_template->do_4(bytes, dest, p1, p2, p3);
48
                return;
49
        }
50
 
51
        p4 = (unsigned long *) srcs[3];
52
        active_template->do_5(bytes, dest, p1, p2, p3, p4);
53
}
54
EXPORT_SYMBOL(xor_blocks);
55
 
56
/* Set of all registered templates.  */
57
static struct xor_block_template *template_list;
58
 
59
#define BENCH_SIZE (PAGE_SIZE)
60
 
61
static void
62
do_xor_speed(struct xor_block_template *tmpl, void *b1, void *b2)
63
{
64
        int speed;
65
        unsigned long now;
66
        int i, count, max;
67
 
68
        tmpl->next = template_list;
69
        template_list = tmpl;
70
 
71
        /*
72
         * Count the number of XORs done during a whole jiffy, and use
73
         * this to calculate the speed of checksumming.  We use a 2-page
74
         * allocation to have guaranteed color L1-cache layout.
75
         */
76
        max = 0;
77
        for (i = 0; i < 5; i++) {
78
                now = jiffies;
79
                count = 0;
80
                while (jiffies == now) {
81
                        mb(); /* prevent loop optimzation */
82
                        tmpl->do_2(BENCH_SIZE, b1, b2);
83
                        mb();
84
                        count++;
85
                        mb();
86
                }
87
                if (count > max)
88
                        max = count;
89
        }
90
 
91
        speed = max * (HZ * BENCH_SIZE / 1024);
92
        tmpl->speed = speed;
93
 
94
        printk(KERN_INFO "   %-10s: %5d.%03d MB/sec\n", tmpl->name,
95
               speed / 1000, speed % 1000);
96
}
97
 
98
static int __init
99
calibrate_xor_blocks(void)
100
{
101
        void *b1, *b2;
102
        struct xor_block_template *f, *fastest;
103
 
104
        b1 = (void *) __get_free_pages(GFP_KERNEL, 2);
105
        if (!b1) {
106
                printk(KERN_WARNING "xor: Yikes!  No memory available.\n");
107
                return -ENOMEM;
108
        }
109
        b2 = b1 + 2*PAGE_SIZE + BENCH_SIZE;
110
 
111
        /*
112
         * If this arch/cpu has a short-circuited selection, don't loop through
113
         * all the possible functions, just test the best one
114
         */
115
 
116
        fastest = NULL;
117
 
118
#ifdef XOR_SELECT_TEMPLATE
119
                fastest = XOR_SELECT_TEMPLATE(fastest);
120
#endif
121
 
122
#define xor_speed(templ)        do_xor_speed((templ), b1, b2)
123
 
124
        if (fastest) {
125
                printk(KERN_INFO "xor: automatically using best "
126
                        "checksumming function: %s\n",
127
                        fastest->name);
128
                xor_speed(fastest);
129
        } else {
130
                printk(KERN_INFO "xor: measuring software checksum speed\n");
131
                XOR_TRY_TEMPLATES;
132
                fastest = template_list;
133
                for (f = fastest; f; f = f->next)
134
                        if (f->speed > fastest->speed)
135
                                fastest = f;
136
        }
137
 
138
        printk(KERN_INFO "xor: using function: %s (%d.%03d MB/sec)\n",
139
               fastest->name, fastest->speed / 1000, fastest->speed % 1000);
140
 
141
#undef xor_speed
142
 
143
        free_pages((unsigned long)b1, 2);
144
 
145
        active_template = fastest;
146
        return 0;
147
}
148
 
149
static __exit void xor_exit(void) { }
150
 
151
MODULE_LICENSE("GPL");
152
 
153
/* when built-in xor.o must initialize before drivers/md/md.o */
154
core_initcall(calibrate_xor_blocks);
155
module_exit(xor_exit);

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.