15b3b1688SDavid Daney/* 25b3b1688SDavid Daney * This file is subject to the terms and conditions of the GNU General Public 35b3b1688SDavid Daney * License. See the file "COPYING" in the main directory of this archive 45b3b1688SDavid Daney * for more details. 55b3b1688SDavid Daney * 65b3b1688SDavid Daney * Copyright (C) 1994, 1995, 1996, 1998, 1999, 2002, 2003 Ralf Baechle 779add627SJustin P. Mattock * Copyright (C) 1996 David S. Miller (davem@davemloft.net) 85b3b1688SDavid Daney * Copyright (C) 1994, 1995, 1996, by Andreas Busse 95b3b1688SDavid Daney * Copyright (C) 1999 Silicon Graphics, Inc. 105b3b1688SDavid Daney * Copyright (C) 2000 MIPS Technologies, Inc. 115b3b1688SDavid Daney * written by Carsten Langgaard, carstenl@mips.com 125b3b1688SDavid Daney */ 135b3b1688SDavid Daney 14a36d8225SDavid Daney#define USE_ALTERNATE_RESUME_IMPL 1 15a36d8225SDavid Daney .set push 16a36d8225SDavid Daney .set arch=mips64r2 17a36d8225SDavid Daney#include "r4k_switch.S" 18a36d8225SDavid Daney .set pop 195b3b1688SDavid Daney/* 205b3b1688SDavid Daney * task_struct *resume(task_struct *prev, task_struct *next, 212dd17030SLeonid Yegoshin * struct thread_info *next_ti, int usedfpu) 225b3b1688SDavid Daney */ 235b3b1688SDavid Daney .align 7 245b3b1688SDavid Daney LEAF(resume) 255b3b1688SDavid Daney .set arch=octeon 265b3b1688SDavid Daney mfc0 t1, CP0_STATUS 275b3b1688SDavid Daney LONG_S t1, THREAD_STATUS(a0) 285b3b1688SDavid Daney cpu_save_nonscratch a0 295b3b1688SDavid Daney LONG_S ra, THREAD_REG31(a0) 305b3b1688SDavid Daney 31a36d8225SDavid Daney /* 32a36d8225SDavid Daney * check if we need to save FPU registers 33a36d8225SDavid Daney */ 34d6e41525SDavid Daney .set push 35d6e41525SDavid Daney .set noreorder 36d6e41525SDavid Daney beqz a3, 1f 37a36d8225SDavid Daney PTR_L t3, TASK_THREAD_INFO(a0) 38d6e41525SDavid Daney .set pop 39a36d8225SDavid Daney 40a36d8225SDavid Daney /* 41a36d8225SDavid Daney * clear saved user stack CU1 bit 42a36d8225SDavid Daney */ 43a36d8225SDavid Daney LONG_L t0, ST_OFF(t3) 44a36d8225SDavid Daney li t1, ~ST0_CU1 45a36d8225SDavid Daney and t0, t0, t1 46a36d8225SDavid Daney LONG_S t0, ST_OFF(t3) 47a36d8225SDavid Daney 48a36d8225SDavid Daney .set push 49a36d8225SDavid Daney .set arch=mips64r2 50a36d8225SDavid Daney fpu_save_double a0 t0 t1 # c0_status passed in t0 51a36d8225SDavid Daney # clobbers t1 52a36d8225SDavid Daney .set pop 53a36d8225SDavid Daney1: 54a36d8225SDavid Daney 55a36d8225SDavid Daney /* check if we need to save COP2 registers */ 56d6e41525SDavid Daney LONG_L t0, ST_OFF(t3) 57a36d8225SDavid Daney bbit0 t0, 30, 1f 58a36d8225SDavid Daney 59a36d8225SDavid Daney /* Disable COP2 in the stored process state */ 60a36d8225SDavid Daney li t1, ST0_CU2 61a36d8225SDavid Daney xor t0, t1 62d6e41525SDavid Daney LONG_S t0, ST_OFF(t3) 63a36d8225SDavid Daney 64a36d8225SDavid Daney /* Enable COP2 so we can save it */ 65a36d8225SDavid Daney mfc0 t0, CP0_STATUS 66a36d8225SDavid Daney or t0, t1 67a36d8225SDavid Daney mtc0 t0, CP0_STATUS 68a36d8225SDavid Daney 69a36d8225SDavid Daney /* Save COP2 */ 70a36d8225SDavid Daney daddu a0, THREAD_CP2 71a36d8225SDavid Daney jal octeon_cop2_save 72a36d8225SDavid Daney dsubu a0, THREAD_CP2 73a36d8225SDavid Daney 74a36d8225SDavid Daney /* Disable COP2 now that we are done */ 75a36d8225SDavid Daney mfc0 t0, CP0_STATUS 76a36d8225SDavid Daney li t1, ST0_CU2 77a36d8225SDavid Daney xor t0, t1 78a36d8225SDavid Daney mtc0 t0, CP0_STATUS 79a36d8225SDavid Daney 80a36d8225SDavid Daney1: 815b3b1688SDavid Daney#if CONFIG_CAVIUM_OCTEON_CVMSEG_SIZE > 0 825b3b1688SDavid Daney /* Check if we need to store CVMSEG state */ 83*2d98cae6SChandrakala Chavva dmfc0 t0, $11,7 /* CvmMemCtl */ 845b3b1688SDavid Daney bbit0 t0, 6, 3f /* Is user access enabled? */ 855b3b1688SDavid Daney 865b3b1688SDavid Daney /* Store the CVMSEG state */ 875b3b1688SDavid Daney /* Extract the size of CVMSEG */ 885b3b1688SDavid Daney andi t0, 0x3f 895b3b1688SDavid Daney /* Multiply * (cache line size/sizeof(long)/2) */ 905b3b1688SDavid Daney sll t0, 7-LONGLOG-1 915b3b1688SDavid Daney li t1, -32768 /* Base address of CVMSEG */ 925b3b1688SDavid Daney LONG_ADDI t2, a0, THREAD_CVMSEG /* Where to store CVMSEG to */ 935b3b1688SDavid Daney synciobdma 945b3b1688SDavid Daney2: 955b3b1688SDavid Daney .set noreorder 965b3b1688SDavid Daney LONG_L t8, 0(t1) /* Load from CVMSEG */ 975b3b1688SDavid Daney subu t0, 1 /* Decrement loop var */ 985b3b1688SDavid Daney LONG_L t9, LONGSIZE(t1)/* Load from CVMSEG */ 995b3b1688SDavid Daney LONG_ADDU t1, LONGSIZE*2 /* Increment loc in CVMSEG */ 1005b3b1688SDavid Daney LONG_S t8, 0(t2) /* Store CVMSEG to thread storage */ 1015b3b1688SDavid Daney LONG_ADDU t2, LONGSIZE*2 /* Increment loc in thread storage */ 1025b3b1688SDavid Daney bnez t0, 2b /* Loop until we've copied it all */ 1035b3b1688SDavid Daney LONG_S t9, -LONGSIZE(t2)/* Store CVMSEG to thread storage */ 1045b3b1688SDavid Daney .set reorder 1055b3b1688SDavid Daney 1065b3b1688SDavid Daney /* Disable access to CVMSEG */ 107*2d98cae6SChandrakala Chavva dmfc0 t0, $11,7 /* CvmMemCtl */ 1085b3b1688SDavid Daney xori t0, t0, 0x40 /* Bit 6 is CVMSEG user enable */ 109*2d98cae6SChandrakala Chavva dmtc0 t0, $11,7 /* CvmMemCtl */ 1105b3b1688SDavid Daney#endif 1115b3b1688SDavid Daney3: 1121400eb65SGregory Fong 1131400eb65SGregory Fong#if defined(CONFIG_CC_STACKPROTECTOR) && !defined(CONFIG_SMP) 1148b3c569aSJames Hogan PTR_LA t8, __stack_chk_guard 1151400eb65SGregory Fong LONG_L t9, TASK_STACK_CANARY(a1) 1161400eb65SGregory Fong LONG_S t9, 0(t8) 1171400eb65SGregory Fong#endif 1181400eb65SGregory Fong 1195b3b1688SDavid Daney /* 1205b3b1688SDavid Daney * The order of restoring the registers takes care of the race 1215b3b1688SDavid Daney * updating $28, $29 and kernelsp without disabling ints. 1225b3b1688SDavid Daney */ 1235b3b1688SDavid Daney move $28, a2 1245b3b1688SDavid Daney cpu_restore_nonscratch a1 1255b3b1688SDavid Daney 126a36d8225SDavid Daney PTR_ADDU t0, $28, _THREAD_SIZE - 32 1275b3b1688SDavid Daney set_saved_sp t0, t1, t2 1285b3b1688SDavid Daney 1295b3b1688SDavid Daney mfc0 t1, CP0_STATUS /* Do we really need this? */ 1305b3b1688SDavid Daney li a3, 0xff01 1315b3b1688SDavid Daney and t1, a3 1325b3b1688SDavid Daney LONG_L a2, THREAD_STATUS(a1) 1335b3b1688SDavid Daney nor a3, $0, a3 1345b3b1688SDavid Daney and a2, a3 1355b3b1688SDavid Daney or a2, t1 1365b3b1688SDavid Daney mtc0 a2, CP0_STATUS 1375b3b1688SDavid Daney move v0, a0 1385b3b1688SDavid Daney jr ra 1395b3b1688SDavid Daney END(resume) 1405b3b1688SDavid Daney 1415b3b1688SDavid Daney/* 1425b3b1688SDavid Daney * void octeon_cop2_save(struct octeon_cop2_state *a0) 1435b3b1688SDavid Daney */ 1445b3b1688SDavid Daney .align 7 1456b3a287eSDavid Daney .set push 1466b3a287eSDavid Daney .set noreorder 1475b3b1688SDavid Daney LEAF(octeon_cop2_save) 1485b3b1688SDavid Daney 1495b3b1688SDavid Daney dmfc0 t9, $9,7 /* CvmCtl register. */ 1505b3b1688SDavid Daney 1515b3b1688SDavid Daney /* Save the COP2 CRC state */ 1525b3b1688SDavid Daney dmfc2 t0, 0x0201 1535b3b1688SDavid Daney dmfc2 t1, 0x0202 1545b3b1688SDavid Daney dmfc2 t2, 0x0200 1555b3b1688SDavid Daney sd t0, OCTEON_CP2_CRC_IV(a0) 1565b3b1688SDavid Daney sd t1, OCTEON_CP2_CRC_LENGTH(a0) 1575b3b1688SDavid Daney /* Skip next instructions if CvmCtl[NODFA_CP2] set */ 1585b3b1688SDavid Daney bbit1 t9, 28, 1f 1596b3a287eSDavid Daney sd t2, OCTEON_CP2_CRC_POLY(a0) 1605b3b1688SDavid Daney 1615b3b1688SDavid Daney /* Save the LLM state */ 1625b3b1688SDavid Daney dmfc2 t0, 0x0402 1635b3b1688SDavid Daney dmfc2 t1, 0x040A 1645b3b1688SDavid Daney sd t0, OCTEON_CP2_LLM_DAT(a0) 1655b3b1688SDavid Daney 1665b3b1688SDavid Daney1: bbit1 t9, 26, 3f /* done if CvmCtl[NOCRYPTO] set */ 1676b3a287eSDavid Daney sd t1, OCTEON_CP2_LLM_DAT+8(a0) 1685b3b1688SDavid Daney 1695b3b1688SDavid Daney /* Save the COP2 crypto state */ 1705b3b1688SDavid Daney /* this part is mostly common to both pass 1 and later revisions */ 1715b3b1688SDavid Daney dmfc2 t0, 0x0084 1725b3b1688SDavid Daney dmfc2 t1, 0x0080 1735b3b1688SDavid Daney dmfc2 t2, 0x0081 1745b3b1688SDavid Daney dmfc2 t3, 0x0082 1755b3b1688SDavid Daney sd t0, OCTEON_CP2_3DES_IV(a0) 1765b3b1688SDavid Daney dmfc2 t0, 0x0088 1775b3b1688SDavid Daney sd t1, OCTEON_CP2_3DES_KEY(a0) 1785b3b1688SDavid Daney dmfc2 t1, 0x0111 /* only necessary for pass 1 */ 1795b3b1688SDavid Daney sd t2, OCTEON_CP2_3DES_KEY+8(a0) 1805b3b1688SDavid Daney dmfc2 t2, 0x0102 1815b3b1688SDavid Daney sd t3, OCTEON_CP2_3DES_KEY+16(a0) 1825b3b1688SDavid Daney dmfc2 t3, 0x0103 1835b3b1688SDavid Daney sd t0, OCTEON_CP2_3DES_RESULT(a0) 1845b3b1688SDavid Daney dmfc2 t0, 0x0104 1855b3b1688SDavid Daney sd t1, OCTEON_CP2_AES_INP0(a0) /* only necessary for pass 1 */ 1865b3b1688SDavid Daney dmfc2 t1, 0x0105 1875b3b1688SDavid Daney sd t2, OCTEON_CP2_AES_IV(a0) 1885b3b1688SDavid Daney dmfc2 t2, 0x0106 1895b3b1688SDavid Daney sd t3, OCTEON_CP2_AES_IV+8(a0) 1905b3b1688SDavid Daney dmfc2 t3, 0x0107 1915b3b1688SDavid Daney sd t0, OCTEON_CP2_AES_KEY(a0) 1925b3b1688SDavid Daney dmfc2 t0, 0x0110 1935b3b1688SDavid Daney sd t1, OCTEON_CP2_AES_KEY+8(a0) 1945b3b1688SDavid Daney dmfc2 t1, 0x0100 1955b3b1688SDavid Daney sd t2, OCTEON_CP2_AES_KEY+16(a0) 1965b3b1688SDavid Daney dmfc2 t2, 0x0101 1975b3b1688SDavid Daney sd t3, OCTEON_CP2_AES_KEY+24(a0) 1986b3a287eSDavid Daney mfc0 v0, $15,0 /* Get the processor ID register */ 1995b3b1688SDavid Daney sd t0, OCTEON_CP2_AES_KEYLEN(a0) 2006b3a287eSDavid Daney li v1, 0x000d0000 /* This is the processor ID of Octeon Pass1 */ 2015b3b1688SDavid Daney sd t1, OCTEON_CP2_AES_RESULT(a0) 2025b3b1688SDavid Daney /* Skip to the Pass1 version of the remainder of the COP2 state */ 2036b3a287eSDavid Daney beq v0, v1, 2f 2046b3a287eSDavid Daney sd t2, OCTEON_CP2_AES_RESULT+8(a0) 2055b3b1688SDavid Daney 2065b3b1688SDavid Daney /* the non-pass1 state when !CvmCtl[NOCRYPTO] */ 2075b3b1688SDavid Daney dmfc2 t1, 0x0240 2085b3b1688SDavid Daney dmfc2 t2, 0x0241 2096b3a287eSDavid Daney ori v1, v1, 0x9500 /* lowest OCTEON III PrId*/ 2105b3b1688SDavid Daney dmfc2 t3, 0x0242 2116b3a287eSDavid Daney subu v1, v0, v1 /* prid - lowest OCTEON III PrId */ 2125b3b1688SDavid Daney dmfc2 t0, 0x0243 2135b3b1688SDavid Daney sd t1, OCTEON_CP2_HSH_DATW(a0) 2145b3b1688SDavid Daney dmfc2 t1, 0x0244 2155b3b1688SDavid Daney sd t2, OCTEON_CP2_HSH_DATW+8(a0) 2165b3b1688SDavid Daney dmfc2 t2, 0x0245 2175b3b1688SDavid Daney sd t3, OCTEON_CP2_HSH_DATW+16(a0) 2185b3b1688SDavid Daney dmfc2 t3, 0x0246 2195b3b1688SDavid Daney sd t0, OCTEON_CP2_HSH_DATW+24(a0) 2205b3b1688SDavid Daney dmfc2 t0, 0x0247 2215b3b1688SDavid Daney sd t1, OCTEON_CP2_HSH_DATW+32(a0) 2225b3b1688SDavid Daney dmfc2 t1, 0x0248 2235b3b1688SDavid Daney sd t2, OCTEON_CP2_HSH_DATW+40(a0) 2245b3b1688SDavid Daney dmfc2 t2, 0x0249 2255b3b1688SDavid Daney sd t3, OCTEON_CP2_HSH_DATW+48(a0) 2265b3b1688SDavid Daney dmfc2 t3, 0x024A 2275b3b1688SDavid Daney sd t0, OCTEON_CP2_HSH_DATW+56(a0) 2285b3b1688SDavid Daney dmfc2 t0, 0x024B 2295b3b1688SDavid Daney sd t1, OCTEON_CP2_HSH_DATW+64(a0) 2305b3b1688SDavid Daney dmfc2 t1, 0x024C 2315b3b1688SDavid Daney sd t2, OCTEON_CP2_HSH_DATW+72(a0) 2325b3b1688SDavid Daney dmfc2 t2, 0x024D 2335b3b1688SDavid Daney sd t3, OCTEON_CP2_HSH_DATW+80(a0) 2345b3b1688SDavid Daney dmfc2 t3, 0x024E 2355b3b1688SDavid Daney sd t0, OCTEON_CP2_HSH_DATW+88(a0) 2365b3b1688SDavid Daney dmfc2 t0, 0x0250 2375b3b1688SDavid Daney sd t1, OCTEON_CP2_HSH_DATW+96(a0) 2385b3b1688SDavid Daney dmfc2 t1, 0x0251 2395b3b1688SDavid Daney sd t2, OCTEON_CP2_HSH_DATW+104(a0) 2405b3b1688SDavid Daney dmfc2 t2, 0x0252 2415b3b1688SDavid Daney sd t3, OCTEON_CP2_HSH_DATW+112(a0) 2425b3b1688SDavid Daney dmfc2 t3, 0x0253 2435b3b1688SDavid Daney sd t0, OCTEON_CP2_HSH_IVW(a0) 2445b3b1688SDavid Daney dmfc2 t0, 0x0254 2455b3b1688SDavid Daney sd t1, OCTEON_CP2_HSH_IVW+8(a0) 2465b3b1688SDavid Daney dmfc2 t1, 0x0255 2475b3b1688SDavid Daney sd t2, OCTEON_CP2_HSH_IVW+16(a0) 2485b3b1688SDavid Daney dmfc2 t2, 0x0256 2495b3b1688SDavid Daney sd t3, OCTEON_CP2_HSH_IVW+24(a0) 2505b3b1688SDavid Daney dmfc2 t3, 0x0257 2515b3b1688SDavid Daney sd t0, OCTEON_CP2_HSH_IVW+32(a0) 2525b3b1688SDavid Daney dmfc2 t0, 0x0258 2535b3b1688SDavid Daney sd t1, OCTEON_CP2_HSH_IVW+40(a0) 2545b3b1688SDavid Daney dmfc2 t1, 0x0259 2555b3b1688SDavid Daney sd t2, OCTEON_CP2_HSH_IVW+48(a0) 2565b3b1688SDavid Daney dmfc2 t2, 0x025E 2575b3b1688SDavid Daney sd t3, OCTEON_CP2_HSH_IVW+56(a0) 2585b3b1688SDavid Daney dmfc2 t3, 0x025A 2595b3b1688SDavid Daney sd t0, OCTEON_CP2_GFM_MULT(a0) 2605b3b1688SDavid Daney dmfc2 t0, 0x025B 2615b3b1688SDavid Daney sd t1, OCTEON_CP2_GFM_MULT+8(a0) 2625b3b1688SDavid Daney sd t2, OCTEON_CP2_GFM_POLY(a0) 2635b3b1688SDavid Daney sd t3, OCTEON_CP2_GFM_RESULT(a0) 2646b3a287eSDavid Daney bltz v1, 4f 2655b3b1688SDavid Daney sd t0, OCTEON_CP2_GFM_RESULT+8(a0) 2666b3a287eSDavid Daney /* OCTEON III things*/ 2676b3a287eSDavid Daney dmfc2 t0, 0x024F 2686b3a287eSDavid Daney dmfc2 t1, 0x0050 2696b3a287eSDavid Daney sd t0, OCTEON_CP2_SHA3(a0) 2706b3a287eSDavid Daney sd t1, OCTEON_CP2_SHA3+8(a0) 2716b3a287eSDavid Daney4: 2725b3b1688SDavid Daney jr ra 2736b3a287eSDavid Daney nop 2745b3b1688SDavid Daney 2755b3b1688SDavid Daney2: /* pass 1 special stuff when !CvmCtl[NOCRYPTO] */ 2765b3b1688SDavid Daney dmfc2 t3, 0x0040 2775b3b1688SDavid Daney dmfc2 t0, 0x0041 2785b3b1688SDavid Daney dmfc2 t1, 0x0042 2795b3b1688SDavid Daney dmfc2 t2, 0x0043 2805b3b1688SDavid Daney sd t3, OCTEON_CP2_HSH_DATW(a0) 2815b3b1688SDavid Daney dmfc2 t3, 0x0044 2825b3b1688SDavid Daney sd t0, OCTEON_CP2_HSH_DATW+8(a0) 2835b3b1688SDavid Daney dmfc2 t0, 0x0045 2845b3b1688SDavid Daney sd t1, OCTEON_CP2_HSH_DATW+16(a0) 2855b3b1688SDavid Daney dmfc2 t1, 0x0046 2865b3b1688SDavid Daney sd t2, OCTEON_CP2_HSH_DATW+24(a0) 2875b3b1688SDavid Daney dmfc2 t2, 0x0048 2885b3b1688SDavid Daney sd t3, OCTEON_CP2_HSH_DATW+32(a0) 2895b3b1688SDavid Daney dmfc2 t3, 0x0049 2905b3b1688SDavid Daney sd t0, OCTEON_CP2_HSH_DATW+40(a0) 2915b3b1688SDavid Daney dmfc2 t0, 0x004A 2925b3b1688SDavid Daney sd t1, OCTEON_CP2_HSH_DATW+48(a0) 2935b3b1688SDavid Daney sd t2, OCTEON_CP2_HSH_IVW(a0) 2945b3b1688SDavid Daney sd t3, OCTEON_CP2_HSH_IVW+8(a0) 2955b3b1688SDavid Daney sd t0, OCTEON_CP2_HSH_IVW+16(a0) 2965b3b1688SDavid Daney 2975b3b1688SDavid Daney3: /* pass 1 or CvmCtl[NOCRYPTO] set */ 2985b3b1688SDavid Daney jr ra 2996b3a287eSDavid Daney nop 3005b3b1688SDavid Daney END(octeon_cop2_save) 3016b3a287eSDavid Daney .set pop 3025b3b1688SDavid Daney 3035b3b1688SDavid Daney/* 3045b3b1688SDavid Daney * void octeon_cop2_restore(struct octeon_cop2_state *a0) 3055b3b1688SDavid Daney */ 3065b3b1688SDavid Daney .align 7 3075b3b1688SDavid Daney .set push 3085b3b1688SDavid Daney .set noreorder 3095b3b1688SDavid Daney LEAF(octeon_cop2_restore) 3105b3b1688SDavid Daney /* First cache line was prefetched before the call */ 3115b3b1688SDavid Daney pref 4, 128(a0) 3125b3b1688SDavid Daney dmfc0 t9, $9,7 /* CvmCtl register. */ 3135b3b1688SDavid Daney 3145b3b1688SDavid Daney pref 4, 256(a0) 3155b3b1688SDavid Daney ld t0, OCTEON_CP2_CRC_IV(a0) 3165b3b1688SDavid Daney pref 4, 384(a0) 3175b3b1688SDavid Daney ld t1, OCTEON_CP2_CRC_LENGTH(a0) 3185b3b1688SDavid Daney ld t2, OCTEON_CP2_CRC_POLY(a0) 3195b3b1688SDavid Daney 3205b3b1688SDavid Daney /* Restore the COP2 CRC state */ 3215b3b1688SDavid Daney dmtc2 t0, 0x0201 3225b3b1688SDavid Daney dmtc2 t1, 0x1202 3235b3b1688SDavid Daney bbit1 t9, 28, 2f /* Skip LLM if CvmCtl[NODFA_CP2] is set */ 3245b3b1688SDavid Daney dmtc2 t2, 0x4200 3255b3b1688SDavid Daney 3265b3b1688SDavid Daney /* Restore the LLM state */ 3275b3b1688SDavid Daney ld t0, OCTEON_CP2_LLM_DAT(a0) 3285b3b1688SDavid Daney ld t1, OCTEON_CP2_LLM_DAT+8(a0) 3295b3b1688SDavid Daney dmtc2 t0, 0x0402 3305b3b1688SDavid Daney dmtc2 t1, 0x040A 3315b3b1688SDavid Daney 3325b3b1688SDavid Daney2: 3335b3b1688SDavid Daney bbit1 t9, 26, done_restore /* done if CvmCtl[NOCRYPTO] set */ 3345b3b1688SDavid Daney nop 3355b3b1688SDavid Daney 3365b3b1688SDavid Daney /* Restore the COP2 crypto state common to pass 1 and pass 2 */ 3375b3b1688SDavid Daney ld t0, OCTEON_CP2_3DES_IV(a0) 3385b3b1688SDavid Daney ld t1, OCTEON_CP2_3DES_KEY(a0) 3395b3b1688SDavid Daney ld t2, OCTEON_CP2_3DES_KEY+8(a0) 3405b3b1688SDavid Daney dmtc2 t0, 0x0084 3415b3b1688SDavid Daney ld t0, OCTEON_CP2_3DES_KEY+16(a0) 3425b3b1688SDavid Daney dmtc2 t1, 0x0080 3435b3b1688SDavid Daney ld t1, OCTEON_CP2_3DES_RESULT(a0) 3445b3b1688SDavid Daney dmtc2 t2, 0x0081 3455b3b1688SDavid Daney ld t2, OCTEON_CP2_AES_INP0(a0) /* only really needed for pass 1 */ 3465b3b1688SDavid Daney dmtc2 t0, 0x0082 3475b3b1688SDavid Daney ld t0, OCTEON_CP2_AES_IV(a0) 3485b3b1688SDavid Daney dmtc2 t1, 0x0098 3495b3b1688SDavid Daney ld t1, OCTEON_CP2_AES_IV+8(a0) 3505b3b1688SDavid Daney dmtc2 t2, 0x010A /* only really needed for pass 1 */ 3515b3b1688SDavid Daney ld t2, OCTEON_CP2_AES_KEY(a0) 3525b3b1688SDavid Daney dmtc2 t0, 0x0102 3535b3b1688SDavid Daney ld t0, OCTEON_CP2_AES_KEY+8(a0) 3545b3b1688SDavid Daney dmtc2 t1, 0x0103 3555b3b1688SDavid Daney ld t1, OCTEON_CP2_AES_KEY+16(a0) 3565b3b1688SDavid Daney dmtc2 t2, 0x0104 3575b3b1688SDavid Daney ld t2, OCTEON_CP2_AES_KEY+24(a0) 3585b3b1688SDavid Daney dmtc2 t0, 0x0105 3595b3b1688SDavid Daney ld t0, OCTEON_CP2_AES_KEYLEN(a0) 3605b3b1688SDavid Daney dmtc2 t1, 0x0106 3615b3b1688SDavid Daney ld t1, OCTEON_CP2_AES_RESULT(a0) 3625b3b1688SDavid Daney dmtc2 t2, 0x0107 3635b3b1688SDavid Daney ld t2, OCTEON_CP2_AES_RESULT+8(a0) 3645b3b1688SDavid Daney mfc0 t3, $15,0 /* Get the processor ID register */ 3655b3b1688SDavid Daney dmtc2 t0, 0x0110 3666b3a287eSDavid Daney li v0, 0x000d0000 /* This is the processor ID of Octeon Pass1 */ 3675b3b1688SDavid Daney dmtc2 t1, 0x0100 3686b3a287eSDavid Daney bne v0, t3, 3f /* Skip the next stuff for non-pass1 */ 3695b3b1688SDavid Daney dmtc2 t2, 0x0101 3705b3b1688SDavid Daney 3715b3b1688SDavid Daney /* this code is specific for pass 1 */ 3725b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_DATW(a0) 3735b3b1688SDavid Daney ld t1, OCTEON_CP2_HSH_DATW+8(a0) 3745b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_DATW+16(a0) 3755b3b1688SDavid Daney dmtc2 t0, 0x0040 3765b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_DATW+24(a0) 3775b3b1688SDavid Daney dmtc2 t1, 0x0041 3785b3b1688SDavid Daney ld t1, OCTEON_CP2_HSH_DATW+32(a0) 3795b3b1688SDavid Daney dmtc2 t2, 0x0042 3805b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_DATW+40(a0) 3815b3b1688SDavid Daney dmtc2 t0, 0x0043 3825b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_DATW+48(a0) 3835b3b1688SDavid Daney dmtc2 t1, 0x0044 3845b3b1688SDavid Daney ld t1, OCTEON_CP2_HSH_IVW(a0) 3855b3b1688SDavid Daney dmtc2 t2, 0x0045 3865b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_IVW+8(a0) 3875b3b1688SDavid Daney dmtc2 t0, 0x0046 3885b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_IVW+16(a0) 3895b3b1688SDavid Daney dmtc2 t1, 0x0048 3905b3b1688SDavid Daney dmtc2 t2, 0x0049 3915b3b1688SDavid Daney b done_restore /* unconditional branch */ 3925b3b1688SDavid Daney dmtc2 t0, 0x004A 3935b3b1688SDavid Daney 3945b3b1688SDavid Daney3: /* this is post-pass1 code */ 3955b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_DATW(a0) 3966b3a287eSDavid Daney ori v0, v0, 0x9500 /* lowest OCTEON III PrId*/ 3975b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_DATW+8(a0) 3985b3b1688SDavid Daney ld t1, OCTEON_CP2_HSH_DATW+16(a0) 3995b3b1688SDavid Daney dmtc2 t2, 0x0240 4005b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_DATW+24(a0) 4015b3b1688SDavid Daney dmtc2 t0, 0x0241 4025b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_DATW+32(a0) 4035b3b1688SDavid Daney dmtc2 t1, 0x0242 4045b3b1688SDavid Daney ld t1, OCTEON_CP2_HSH_DATW+40(a0) 4055b3b1688SDavid Daney dmtc2 t2, 0x0243 4065b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_DATW+48(a0) 4075b3b1688SDavid Daney dmtc2 t0, 0x0244 4085b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_DATW+56(a0) 4095b3b1688SDavid Daney dmtc2 t1, 0x0245 4105b3b1688SDavid Daney ld t1, OCTEON_CP2_HSH_DATW+64(a0) 4115b3b1688SDavid Daney dmtc2 t2, 0x0246 4125b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_DATW+72(a0) 4135b3b1688SDavid Daney dmtc2 t0, 0x0247 4145b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_DATW+80(a0) 4155b3b1688SDavid Daney dmtc2 t1, 0x0248 4165b3b1688SDavid Daney ld t1, OCTEON_CP2_HSH_DATW+88(a0) 4175b3b1688SDavid Daney dmtc2 t2, 0x0249 4185b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_DATW+96(a0) 4195b3b1688SDavid Daney dmtc2 t0, 0x024A 4205b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_DATW+104(a0) 4215b3b1688SDavid Daney dmtc2 t1, 0x024B 4225b3b1688SDavid Daney ld t1, OCTEON_CP2_HSH_DATW+112(a0) 4235b3b1688SDavid Daney dmtc2 t2, 0x024C 4245b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_IVW(a0) 4255b3b1688SDavid Daney dmtc2 t0, 0x024D 4265b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_IVW+8(a0) 4275b3b1688SDavid Daney dmtc2 t1, 0x024E 4285b3b1688SDavid Daney ld t1, OCTEON_CP2_HSH_IVW+16(a0) 4295b3b1688SDavid Daney dmtc2 t2, 0x0250 4305b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_IVW+24(a0) 4315b3b1688SDavid Daney dmtc2 t0, 0x0251 4325b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_IVW+32(a0) 4335b3b1688SDavid Daney dmtc2 t1, 0x0252 4345b3b1688SDavid Daney ld t1, OCTEON_CP2_HSH_IVW+40(a0) 4355b3b1688SDavid Daney dmtc2 t2, 0x0253 4365b3b1688SDavid Daney ld t2, OCTEON_CP2_HSH_IVW+48(a0) 4375b3b1688SDavid Daney dmtc2 t0, 0x0254 4385b3b1688SDavid Daney ld t0, OCTEON_CP2_HSH_IVW+56(a0) 4395b3b1688SDavid Daney dmtc2 t1, 0x0255 4405b3b1688SDavid Daney ld t1, OCTEON_CP2_GFM_MULT(a0) 4415b3b1688SDavid Daney dmtc2 t2, 0x0256 4425b3b1688SDavid Daney ld t2, OCTEON_CP2_GFM_MULT+8(a0) 4435b3b1688SDavid Daney dmtc2 t0, 0x0257 4445b3b1688SDavid Daney ld t0, OCTEON_CP2_GFM_POLY(a0) 4455b3b1688SDavid Daney dmtc2 t1, 0x0258 4465b3b1688SDavid Daney ld t1, OCTEON_CP2_GFM_RESULT(a0) 4475b3b1688SDavid Daney dmtc2 t2, 0x0259 4485b3b1688SDavid Daney ld t2, OCTEON_CP2_GFM_RESULT+8(a0) 4495b3b1688SDavid Daney dmtc2 t0, 0x025E 4506b3a287eSDavid Daney subu v0, t3, v0 /* prid - lowest OCTEON III PrId */ 4515b3b1688SDavid Daney dmtc2 t1, 0x025A 4526b3a287eSDavid Daney bltz v0, done_restore 4535b3b1688SDavid Daney dmtc2 t2, 0x025B 4546b3a287eSDavid Daney /* OCTEON III things*/ 4556b3a287eSDavid Daney ld t0, OCTEON_CP2_SHA3(a0) 4566b3a287eSDavid Daney ld t1, OCTEON_CP2_SHA3+8(a0) 4576b3a287eSDavid Daney dmtc2 t0, 0x0051 4586b3a287eSDavid Daney dmtc2 t1, 0x0050 4595b3b1688SDavid Daneydone_restore: 4605b3b1688SDavid Daney jr ra 4615b3b1688SDavid Daney nop 4625b3b1688SDavid Daney END(octeon_cop2_restore) 4635b3b1688SDavid Daney .set pop 4645b3b1688SDavid Daney 4655b3b1688SDavid Daney/* 4665b3b1688SDavid Daney * void octeon_mult_save() 4675b3b1688SDavid Daney * sp is assumed to point to a struct pt_regs 4685b3b1688SDavid Daney * 469ac655fb7SDavid Daney * NOTE: This is called in SAVE_TEMP in stackframe.h. It can 470ac655fb7SDavid Daney * safely modify v1,k0, k1,$10-$15, and $24. It will 471ac655fb7SDavid Daney * be overwritten with a processor specific version of the code. 4725b3b1688SDavid Daney */ 473ac655fb7SDavid Daney .p2align 7 4745b3b1688SDavid Daney .set push 4755b3b1688SDavid Daney .set noreorder 4765b3b1688SDavid Daney LEAF(octeon_mult_save) 477ac655fb7SDavid Daney jr ra 4785b3b1688SDavid Daney nop 479ac655fb7SDavid Daney .space 30 * 4, 0 480ac655fb7SDavid Daneyocteon_mult_save_end: 481ac655fb7SDavid Daney EXPORT(octeon_mult_save_end) 482ac655fb7SDavid Daney END(octeon_mult_save) 4835b3b1688SDavid Daney 484ac655fb7SDavid Daney LEAF(octeon_mult_save2) 485ac655fb7SDavid Daney /* Save the multiplier state OCTEON II and earlier*/ 4865b3b1688SDavid Daney v3mulu k0, $0, $0 4875b3b1688SDavid Daney v3mulu k1, $0, $0 4885b3b1688SDavid Daney sd k0, PT_MTP(sp) /* PT_MTP has P0 */ 4895b3b1688SDavid Daney v3mulu k0, $0, $0 4905b3b1688SDavid Daney sd k1, PT_MTP+8(sp) /* PT_MTP+8 has P1 */ 4915b3b1688SDavid Daney ori k1, $0, 1 4925b3b1688SDavid Daney v3mulu k1, k1, $0 4935b3b1688SDavid Daney sd k0, PT_MTP+16(sp) /* PT_MTP+16 has P2 */ 4945b3b1688SDavid Daney v3mulu k0, $0, $0 4955b3b1688SDavid Daney sd k1, PT_MPL(sp) /* PT_MPL has MPL0 */ 4965b3b1688SDavid Daney v3mulu k1, $0, $0 4975b3b1688SDavid Daney sd k0, PT_MPL+8(sp) /* PT_MPL+8 has MPL1 */ 4985b3b1688SDavid Daney jr ra 4995b3b1688SDavid Daney sd k1, PT_MPL+16(sp) /* PT_MPL+16 has MPL2 */ 500ac655fb7SDavid Daneyocteon_mult_save2_end: 501ac655fb7SDavid Daney EXPORT(octeon_mult_save2_end) 502ac655fb7SDavid Daney END(octeon_mult_save2) 5035b3b1688SDavid Daney 504ac655fb7SDavid Daney LEAF(octeon_mult_save3) 505ac655fb7SDavid Daney /* Save the multiplier state OCTEON III */ 506ac655fb7SDavid Daney v3mulu $10, $0, $0 /* read P0 */ 507ac655fb7SDavid Daney v3mulu $11, $0, $0 /* read P1 */ 508ac655fb7SDavid Daney v3mulu $12, $0, $0 /* read P2 */ 509ac655fb7SDavid Daney sd $10, PT_MTP+(0*8)(sp) /* store P0 */ 510ac655fb7SDavid Daney v3mulu $10, $0, $0 /* read P3 */ 511ac655fb7SDavid Daney sd $11, PT_MTP+(1*8)(sp) /* store P1 */ 512ac655fb7SDavid Daney v3mulu $11, $0, $0 /* read P4 */ 513ac655fb7SDavid Daney sd $12, PT_MTP+(2*8)(sp) /* store P2 */ 514ac655fb7SDavid Daney ori $13, $0, 1 515ac655fb7SDavid Daney v3mulu $12, $0, $0 /* read P5 */ 516ac655fb7SDavid Daney sd $10, PT_MTP+(3*8)(sp) /* store P3 */ 517ac655fb7SDavid Daney v3mulu $13, $13, $0 /* P4-P0 = MPL5-MPL1, $13 = MPL0 */ 518ac655fb7SDavid Daney sd $11, PT_MTP+(4*8)(sp) /* store P4 */ 519ac655fb7SDavid Daney v3mulu $10, $0, $0 /* read MPL1 */ 520ac655fb7SDavid Daney sd $12, PT_MTP+(5*8)(sp) /* store P5 */ 521ac655fb7SDavid Daney v3mulu $11, $0, $0 /* read MPL2 */ 522ac655fb7SDavid Daney sd $13, PT_MPL+(0*8)(sp) /* store MPL0 */ 523ac655fb7SDavid Daney v3mulu $12, $0, $0 /* read MPL3 */ 524ac655fb7SDavid Daney sd $10, PT_MPL+(1*8)(sp) /* store MPL1 */ 525ac655fb7SDavid Daney v3mulu $10, $0, $0 /* read MPL4 */ 526ac655fb7SDavid Daney sd $11, PT_MPL+(2*8)(sp) /* store MPL2 */ 527ac655fb7SDavid Daney v3mulu $11, $0, $0 /* read MPL5 */ 528ac655fb7SDavid Daney sd $12, PT_MPL+(3*8)(sp) /* store MPL3 */ 529ac655fb7SDavid Daney sd $10, PT_MPL+(4*8)(sp) /* store MPL4 */ 5305b3b1688SDavid Daney jr ra 531ac655fb7SDavid Daney sd $11, PT_MPL+(5*8)(sp) /* store MPL5 */ 532ac655fb7SDavid Daneyocteon_mult_save3_end: 533ac655fb7SDavid Daney EXPORT(octeon_mult_save3_end) 534ac655fb7SDavid Daney END(octeon_mult_save3) 5355b3b1688SDavid Daney .set pop 5365b3b1688SDavid Daney 5375b3b1688SDavid Daney/* 5385b3b1688SDavid Daney * void octeon_mult_restore() 5395b3b1688SDavid Daney * sp is assumed to point to a struct pt_regs 5405b3b1688SDavid Daney * 541ac655fb7SDavid Daney * NOTE: This is called in RESTORE_TEMP in stackframe.h. 5425b3b1688SDavid Daney */ 543ac655fb7SDavid Daney .p2align 7 5445b3b1688SDavid Daney .set push 5455b3b1688SDavid Daney .set noreorder 5465b3b1688SDavid Daney LEAF(octeon_mult_restore) 547ac655fb7SDavid Daney jr ra 548ac655fb7SDavid Daney nop 549ac655fb7SDavid Daney .space 30 * 4, 0 550ac655fb7SDavid Daneyocteon_mult_restore_end: 551ac655fb7SDavid Daney EXPORT(octeon_mult_restore_end) 552ac655fb7SDavid Daney END(octeon_mult_restore) 553ac655fb7SDavid Daney 554ac655fb7SDavid Daney LEAF(octeon_mult_restore2) 5555b3b1688SDavid Daney ld v0, PT_MPL(sp) /* MPL0 */ 5565b3b1688SDavid Daney ld v1, PT_MPL+8(sp) /* MPL1 */ 5575b3b1688SDavid Daney ld k0, PT_MPL+16(sp) /* MPL2 */ 5585b3b1688SDavid Daney /* Restore the multiplier state */ 5595b3b1688SDavid Daney ld k1, PT_MTP+16(sp) /* P2 */ 560ac655fb7SDavid Daney mtm0 v0 /* MPL0 */ 5615b3b1688SDavid Daney ld v0, PT_MTP+8(sp) /* P1 */ 562ac655fb7SDavid Daney mtm1 v1 /* MPL1 */ 5635b3b1688SDavid Daney ld v1, PT_MTP(sp) /* P0 */ 564ac655fb7SDavid Daney mtm2 k0 /* MPL2 */ 565ac655fb7SDavid Daney mtp2 k1 /* P2 */ 566ac655fb7SDavid Daney mtp1 v0 /* P1 */ 5675b3b1688SDavid Daney jr ra 568ac655fb7SDavid Daney mtp0 v1 /* P0 */ 569ac655fb7SDavid Daneyocteon_mult_restore2_end: 570ac655fb7SDavid Daney EXPORT(octeon_mult_restore2_end) 571ac655fb7SDavid Daney END(octeon_mult_restore2) 5725b3b1688SDavid Daney 573ac655fb7SDavid Daney LEAF(octeon_mult_restore3) 574ac655fb7SDavid Daney ld $12, PT_MPL+(0*8)(sp) /* read MPL0 */ 575ac655fb7SDavid Daney ld $13, PT_MPL+(3*8)(sp) /* read MPL3 */ 576ac655fb7SDavid Daney ld $10, PT_MPL+(1*8)(sp) /* read MPL1 */ 577ac655fb7SDavid Daney ld $11, PT_MPL+(4*8)(sp) /* read MPL4 */ 578ac655fb7SDavid Daney .word 0x718d0008 579ac655fb7SDavid Daney /* mtm0 $12, $13 restore MPL0 and MPL3 */ 580ac655fb7SDavid Daney ld $12, PT_MPL+(2*8)(sp) /* read MPL2 */ 581ac655fb7SDavid Daney .word 0x714b000c 582ac655fb7SDavid Daney /* mtm1 $10, $11 restore MPL1 and MPL4 */ 583ac655fb7SDavid Daney ld $13, PT_MPL+(5*8)(sp) /* read MPL5 */ 584ac655fb7SDavid Daney ld $10, PT_MTP+(0*8)(sp) /* read P0 */ 585ac655fb7SDavid Daney ld $11, PT_MTP+(3*8)(sp) /* read P3 */ 586ac655fb7SDavid Daney .word 0x718d000d 587ac655fb7SDavid Daney /* mtm2 $12, $13 restore MPL2 and MPL5 */ 588ac655fb7SDavid Daney ld $12, PT_MTP+(1*8)(sp) /* read P1 */ 589ac655fb7SDavid Daney .word 0x714b0009 590ac655fb7SDavid Daney /* mtp0 $10, $11 restore P0 and P3 */ 591ac655fb7SDavid Daney ld $13, PT_MTP+(4*8)(sp) /* read P4 */ 592ac655fb7SDavid Daney ld $10, PT_MTP+(2*8)(sp) /* read P2 */ 593ac655fb7SDavid Daney ld $11, PT_MTP+(5*8)(sp) /* read P5 */ 594ac655fb7SDavid Daney .word 0x718d000a 595ac655fb7SDavid Daney /* mtp1 $12, $13 restore P1 and P4 */ 5965b3b1688SDavid Daney jr ra 597ac655fb7SDavid Daney .word 0x714b000b 598ac655fb7SDavid Daney /* mtp2 $10, $11 restore P2 and P5 */ 599ac655fb7SDavid Daney 600ac655fb7SDavid Daneyocteon_mult_restore3_end: 601ac655fb7SDavid Daney EXPORT(octeon_mult_restore3_end) 602ac655fb7SDavid Daney END(octeon_mult_restore3) 6035b3b1688SDavid Daney .set pop 604