Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * include/asm/xor.h
0004  *
0005  * High speed xor_block operation for RAID4/5 utilizing the
0006  * UltraSparc Visual Instruction Set and Niagara block-init
0007  * twin-load instructions.
0008  *
0009  * Copyright (C) 1997, 1999 Jakub Jelinek (jj@ultra.linux.cz)
0010  * Copyright (C) 2006 David S. Miller <davem@davemloft.net>
0011  */
0012 
0013 #include <asm/spitfire.h>
0014 
0015 void xor_vis_2(unsigned long bytes, unsigned long * __restrict p1,
0016            const unsigned long * __restrict p2);
0017 void xor_vis_3(unsigned long bytes, unsigned long * __restrict p1,
0018            const unsigned long * __restrict p2,
0019            const unsigned long * __restrict p3);
0020 void xor_vis_4(unsigned long bytes, unsigned long * __restrict p1,
0021            const unsigned long * __restrict p2,
0022            const unsigned long * __restrict p3,
0023            const unsigned long * __restrict p4);
0024 void xor_vis_5(unsigned long bytes, unsigned long * __restrict p1,
0025            const unsigned long * __restrict p2,
0026            const unsigned long * __restrict p3,
0027            const unsigned long * __restrict p4,
0028            const unsigned long * __restrict p5);
0029 
0030 /* XXX Ugh, write cheetah versions... -DaveM */
0031 
0032 static struct xor_block_template xor_block_VIS = {
0033         .name   = "VIS",
0034         .do_2   = xor_vis_2,
0035         .do_3   = xor_vis_3,
0036         .do_4   = xor_vis_4,
0037         .do_5   = xor_vis_5,
0038 };
0039 
0040 void xor_niagara_2(unsigned long bytes, unsigned long * __restrict p1,
0041            const unsigned long * __restrict p2);
0042 void xor_niagara_3(unsigned long bytes, unsigned long * __restrict p1,
0043            const unsigned long * __restrict p2,
0044            const unsigned long * __restrict p3);
0045 void xor_niagara_4(unsigned long bytes, unsigned long * __restrict p1,
0046            const unsigned long * __restrict p2,
0047            const unsigned long * __restrict p3,
0048            const unsigned long * __restrict p4);
0049 void xor_niagara_5(unsigned long bytes, unsigned long * __restrict p1,
0050            const unsigned long * __restrict p2,
0051            const unsigned long * __restrict p3,
0052            const unsigned long * __restrict p4,
0053            const unsigned long * __restrict p5);
0054 
0055 static struct xor_block_template xor_block_niagara = {
0056         .name   = "Niagara",
0057         .do_2   = xor_niagara_2,
0058         .do_3   = xor_niagara_3,
0059         .do_4   = xor_niagara_4,
0060         .do_5   = xor_niagara_5,
0061 };
0062 
0063 #undef XOR_TRY_TEMPLATES
0064 #define XOR_TRY_TEMPLATES               \
0065     do {                        \
0066         xor_speed(&xor_block_VIS);      \
0067         xor_speed(&xor_block_niagara);      \
0068     } while (0)
0069 
0070 /* For VIS for everything except Niagara.  */
0071 #define XOR_SELECT_TEMPLATE(FASTEST) \
0072     ((tlb_type == hypervisor && \
0073       (sun4v_chip_type == SUN4V_CHIP_NIAGARA1 || \
0074        sun4v_chip_type == SUN4V_CHIP_NIAGARA2 || \
0075        sun4v_chip_type == SUN4V_CHIP_NIAGARA3 || \
0076        sun4v_chip_type == SUN4V_CHIP_NIAGARA4 || \
0077        sun4v_chip_type == SUN4V_CHIP_NIAGARA5)) ? \
0078      &xor_block_niagara : \
0079      &xor_block_VIS)