octeon_cop2.S revision 285830
1/*- 2 * Copyright (c) 2011 Oleksandr Tymoshenko 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD: releng/10.2/sys/mips/cavium/octeon_cop2.S 229677 2012-01-06 01:23:26Z gonzo $ 27 */ 28 29#include <machine/asm.h> 30#include <mips/cavium/octeon_cop2.h> 31 32#include "assym.s" 33 34.set noreorder 35 36#define SAVE_COP2_REGISTER(reg) \ 37 dmfc2 t1, reg; sd t1, reg##_OFFSET(a0) 38 39 40#define RESTORE_COP2_REGISTER(reg) \ 41 ld t1, reg##_OFFSET(a0); dmtc2 t1, reg##_SET 42 43LEAF(octeon_cop2_save) 44 /* Get CvmCtl register */ 45 dmfc0 t0, $9, 7 46 47 /* CRC state */ 48 SAVE_COP2_REGISTER(COP2_CRC_IV) 49 SAVE_COP2_REGISTER(COP2_CRC_LENGTH) 50 SAVE_COP2_REGISTER(COP2_CRC_POLY) 51 52 /* if CvmCtl[NODFA_CP2] -> save_nodfa */ 53 bbit1 t0, 28, save_nodfa 54 nop 55 56 /* LLM state */ 57 SAVE_COP2_REGISTER(COP2_LLM_DAT0) 58 SAVE_COP2_REGISTER(COP2_LLM_DAT1) 59 60save_nodfa: 61 /* crypto stuff is irrelevant if CvmCtl[NOCRYPTO] */ 62 bbit1 t0, 26, save_done 63 nop 64 65 SAVE_COP2_REGISTER(COP2_3DES_IV) 66 SAVE_COP2_REGISTER(COP2_3DES_KEY0) 67 SAVE_COP2_REGISTER(COP2_3DES_KEY1) 68 SAVE_COP2_REGISTER(COP2_3DES_KEY2) 69 SAVE_COP2_REGISTER(COP2_3DES_RESULT) 70 71 SAVE_COP2_REGISTER(COP2_AES_INP0) 72 SAVE_COP2_REGISTER(COP2_AES_IV0) 73 SAVE_COP2_REGISTER(COP2_AES_IV1) 74 SAVE_COP2_REGISTER(COP2_AES_KEY0) 75 SAVE_COP2_REGISTER(COP2_AES_KEY1) 76 SAVE_COP2_REGISTER(COP2_AES_KEY2) 77 SAVE_COP2_REGISTER(COP2_AES_KEY3) 78 SAVE_COP2_REGISTER(COP2_AES_KEYLEN) 79 SAVE_COP2_REGISTER(COP2_AES_RESULT0) 80 SAVE_COP2_REGISTER(COP2_AES_RESULT1) 81 82 dmfc0 t0, $15 83 li t1, 0x000d0000 /* Octeon Pass1 */ 84 beq t0, t1, save_pass1 85 nop 86 87 SAVE_COP2_REGISTER(COP2_HSH_DATW0) 88 SAVE_COP2_REGISTER(COP2_HSH_DATW1) 89 SAVE_COP2_REGISTER(COP2_HSH_DATW2) 90 SAVE_COP2_REGISTER(COP2_HSH_DATW3) 91 SAVE_COP2_REGISTER(COP2_HSH_DATW4) 92 SAVE_COP2_REGISTER(COP2_HSH_DATW5) 93 SAVE_COP2_REGISTER(COP2_HSH_DATW6) 94 SAVE_COP2_REGISTER(COP2_HSH_DATW7) 95 SAVE_COP2_REGISTER(COP2_HSH_DATW8) 96 SAVE_COP2_REGISTER(COP2_HSH_DATW9) 97 SAVE_COP2_REGISTER(COP2_HSH_DATW10) 98 SAVE_COP2_REGISTER(COP2_HSH_DATW11) 99 SAVE_COP2_REGISTER(COP2_HSH_DATW12) 100 SAVE_COP2_REGISTER(COP2_HSH_DATW13) 101 SAVE_COP2_REGISTER(COP2_HSH_DATW14) 102 SAVE_COP2_REGISTER(COP2_HSH_IVW0) 103 SAVE_COP2_REGISTER(COP2_HSH_IVW1) 104 SAVE_COP2_REGISTER(COP2_HSH_IVW2) 105 SAVE_COP2_REGISTER(COP2_HSH_IVW3) 106 SAVE_COP2_REGISTER(COP2_HSH_IVW4) 107 SAVE_COP2_REGISTER(COP2_HSH_IVW5) 108 SAVE_COP2_REGISTER(COP2_HSH_IVW6) 109 SAVE_COP2_REGISTER(COP2_HSH_IVW7) 110 SAVE_COP2_REGISTER(COP2_GFM_MULT0) 111 SAVE_COP2_REGISTER(COP2_GFM_MULT1) 112 SAVE_COP2_REGISTER(COP2_GFM_POLY) 113 SAVE_COP2_REGISTER(COP2_GFM_RESULT0) 114 SAVE_COP2_REGISTER(COP2_GFM_RESULT1) 115 jr ra 116 nop 117 118save_pass1: 119 SAVE_COP2_REGISTER(COP2_HSH_DATW0_PASS1) 120 SAVE_COP2_REGISTER(COP2_HSH_DATW1_PASS1) 121 SAVE_COP2_REGISTER(COP2_HSH_DATW2_PASS1) 122 SAVE_COP2_REGISTER(COP2_HSH_DATW3_PASS1) 123 SAVE_COP2_REGISTER(COP2_HSH_DATW4_PASS1) 124 SAVE_COP2_REGISTER(COP2_HSH_DATW5_PASS1) 125 SAVE_COP2_REGISTER(COP2_HSH_DATW6_PASS1) 126 SAVE_COP2_REGISTER(COP2_HSH_IVW0_PASS1) 127 SAVE_COP2_REGISTER(COP2_HSH_IVW1_PASS1) 128 SAVE_COP2_REGISTER(COP2_HSH_IVW2_PASS1) 129 130save_done: 131 jr ra 132 nop 133END(octeon_cop2_save) 134 135LEAF(octeon_cop2_restore) 136 /* Get CvmCtl register */ 137 dmfc0 t0, $9, 7 138 139 /* CRC state */ 140 RESTORE_COP2_REGISTER(COP2_CRC_IV) 141 RESTORE_COP2_REGISTER(COP2_CRC_LENGTH) 142 RESTORE_COP2_REGISTER(COP2_CRC_POLY) 143 144 /* if CvmCtl[NODFA_CP2] -> save_nodfa */ 145 bbit1 t0, 28, restore_nodfa 146 nop 147 148 /* LLM state */ 149 RESTORE_COP2_REGISTER(COP2_LLM_DAT0) 150 RESTORE_COP2_REGISTER(COP2_LLM_DAT1) 151 152restore_nodfa: 153 /* crypto stuff is irrelevant if CvmCtl[NOCRYPTO] */ 154 bbit1 t0, 26, restore_done 155 nop 156 157 RESTORE_COP2_REGISTER(COP2_3DES_IV) 158 RESTORE_COP2_REGISTER(COP2_3DES_KEY0) 159 RESTORE_COP2_REGISTER(COP2_3DES_KEY1) 160 RESTORE_COP2_REGISTER(COP2_3DES_KEY2) 161 RESTORE_COP2_REGISTER(COP2_3DES_RESULT) 162 163 RESTORE_COP2_REGISTER(COP2_AES_INP0) 164 RESTORE_COP2_REGISTER(COP2_AES_IV0) 165 RESTORE_COP2_REGISTER(COP2_AES_IV1) 166 RESTORE_COP2_REGISTER(COP2_AES_KEY0) 167 RESTORE_COP2_REGISTER(COP2_AES_KEY1) 168 RESTORE_COP2_REGISTER(COP2_AES_KEY2) 169 RESTORE_COP2_REGISTER(COP2_AES_KEY3) 170 RESTORE_COP2_REGISTER(COP2_AES_KEYLEN) 171 RESTORE_COP2_REGISTER(COP2_AES_RESULT0) 172 RESTORE_COP2_REGISTER(COP2_AES_RESULT1) 173 174 dmfc0 t0, $15 175 li t1, 0x000d0000 /* Octeon Pass1 */ 176 beq t0, t1, restore_pass1 177 nop 178 179 RESTORE_COP2_REGISTER(COP2_HSH_DATW0) 180 RESTORE_COP2_REGISTER(COP2_HSH_DATW1) 181 RESTORE_COP2_REGISTER(COP2_HSH_DATW2) 182 RESTORE_COP2_REGISTER(COP2_HSH_DATW3) 183 RESTORE_COP2_REGISTER(COP2_HSH_DATW4) 184 RESTORE_COP2_REGISTER(COP2_HSH_DATW5) 185 RESTORE_COP2_REGISTER(COP2_HSH_DATW6) 186 RESTORE_COP2_REGISTER(COP2_HSH_DATW7) 187 RESTORE_COP2_REGISTER(COP2_HSH_DATW8) 188 RESTORE_COP2_REGISTER(COP2_HSH_DATW9) 189 RESTORE_COP2_REGISTER(COP2_HSH_DATW10) 190 RESTORE_COP2_REGISTER(COP2_HSH_DATW11) 191 RESTORE_COP2_REGISTER(COP2_HSH_DATW12) 192 RESTORE_COP2_REGISTER(COP2_HSH_DATW13) 193 RESTORE_COP2_REGISTER(COP2_HSH_DATW14) 194 RESTORE_COP2_REGISTER(COP2_HSH_IVW0) 195 RESTORE_COP2_REGISTER(COP2_HSH_IVW1) 196 RESTORE_COP2_REGISTER(COP2_HSH_IVW2) 197 RESTORE_COP2_REGISTER(COP2_HSH_IVW3) 198 RESTORE_COP2_REGISTER(COP2_HSH_IVW4) 199 RESTORE_COP2_REGISTER(COP2_HSH_IVW5) 200 RESTORE_COP2_REGISTER(COP2_HSH_IVW6) 201 RESTORE_COP2_REGISTER(COP2_HSH_IVW7) 202 RESTORE_COP2_REGISTER(COP2_GFM_MULT0) 203 RESTORE_COP2_REGISTER(COP2_GFM_MULT1) 204 RESTORE_COP2_REGISTER(COP2_GFM_POLY) 205 RESTORE_COP2_REGISTER(COP2_GFM_RESULT0) 206 RESTORE_COP2_REGISTER(COP2_GFM_RESULT1) 207 jr ra 208 nop 209 210restore_pass1: 211 RESTORE_COP2_REGISTER(COP2_HSH_DATW0_PASS1) 212 RESTORE_COP2_REGISTER(COP2_HSH_DATW1_PASS1) 213 RESTORE_COP2_REGISTER(COP2_HSH_DATW2_PASS1) 214 RESTORE_COP2_REGISTER(COP2_HSH_DATW3_PASS1) 215 RESTORE_COP2_REGISTER(COP2_HSH_DATW4_PASS1) 216 RESTORE_COP2_REGISTER(COP2_HSH_DATW5_PASS1) 217 RESTORE_COP2_REGISTER(COP2_HSH_DATW6_PASS1) 218 RESTORE_COP2_REGISTER(COP2_HSH_IVW0_PASS1) 219 RESTORE_COP2_REGISTER(COP2_HSH_IVW1_PASS1) 220 RESTORE_COP2_REGISTER(COP2_HSH_IVW2_PASS1) 221 222restore_done: 223 jr ra 224 nop 225END(octeon_cop2_restore) 226