2005-04-17 02:20:36 +04:00
/*
* include / asm - sparc64 / xor . h
*
* High speed xor_block operation for RAID4 / 5 utilizing the
2006-02-26 04:16:29 +03:00
* UltraSparc Visual Instruction Set and Niagara block - init
* twin - load instructions .
2005-04-17 02:20:36 +04:00
*
* Copyright ( C ) 1997 , 1999 Jakub Jelinek ( jj @ ultra . linux . cz )
2006-02-26 04:16:29 +03:00
* Copyright ( C ) 2006 David S . Miller < davem @ davemloft . net >
2005-04-17 02:20:36 +04:00
*
* 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 ; either version 2 , or ( at your option )
* any later version .
*
* You should have received a copy of the GNU General Public License
* ( for example / usr / src / linux / COPYING ) ; if not , write to the Free
* Software Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
2006-02-26 04:16:29 +03:00
# include <asm/spitfire.h>
2005-04-17 02:20:36 +04:00
extern void xor_vis_2 ( unsigned long , unsigned long * , unsigned long * ) ;
extern void xor_vis_3 ( unsigned long , unsigned long * , unsigned long * ,
unsigned long * ) ;
extern void xor_vis_4 ( unsigned long , unsigned long * , unsigned long * ,
unsigned long * , unsigned long * ) ;
extern void xor_vis_5 ( unsigned long , unsigned long * , unsigned long * ,
unsigned long * , unsigned long * , unsigned long * ) ;
/* XXX Ugh, write cheetah versions... -DaveM */
static struct xor_block_template xor_block_VIS = {
. name = " VIS " ,
. do_2 = xor_vis_2 ,
. do_3 = xor_vis_3 ,
. do_4 = xor_vis_4 ,
. do_5 = xor_vis_5 ,
} ;
2006-02-26 04:16:29 +03:00
extern void xor_niagara_2 ( unsigned long , unsigned long * , unsigned long * ) ;
extern void xor_niagara_3 ( unsigned long , unsigned long * , unsigned long * ,
unsigned long * ) ;
extern void xor_niagara_4 ( unsigned long , unsigned long * , unsigned long * ,
unsigned long * , unsigned long * ) ;
extern void xor_niagara_5 ( unsigned long , unsigned long * , unsigned long * ,
unsigned long * , unsigned long * , unsigned long * ) ;
static struct xor_block_template xor_block_niagara = {
. name = " Niagara " ,
. do_2 = xor_niagara_2 ,
. do_3 = xor_niagara_3 ,
. do_4 = xor_niagara_4 ,
. do_5 = xor_niagara_5 ,
} ;
# undef XOR_TRY_TEMPLATES
# define XOR_TRY_TEMPLATES \
do { \
xor_speed ( & xor_block_VIS ) ; \
xor_speed ( & xor_block_niagara ) ; \
} while ( 0 )
/* For VIS for everything except Niagara. */
# define XOR_SELECT_TEMPLATE(FASTEST) \
2007-08-09 04:11:39 +04:00
( ( tlb_type = = hypervisor & & \
( sun4v_chip_type = = SUN4V_CHIP_NIAGARA1 | | \
sun4v_chip_type = = SUN4V_CHIP_NIAGARA2 ) ) ? \
& xor_block_niagara : \
& xor_block_VIS )