text: /*-
   * Copyright (c) 2011, Oleksandr Tymoshenko <gonzo@FreeBSD.org>
   * All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   * 1. Redistributions of source code must retain the above copyright
   *    notice unmodified, this list of conditions, and the following
   *    disclaimer.
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in the
   *    documentation and/or other materials provided with the distribution.
   *
   * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   *
   * $FreeBSD$
   *
   */
  
  #ifndef __OCTEON_COP2_H__
  #define __OCTEON_COP2_H__
  
  /*
   * COP2 registers of interest
   */
  #define	COP2_CRC_IV		0x201
  #define	COP2_CRC_IV_SET		COP2_CRC_IV
  #define	COP2_CRC_LENGTH		0x202
  #define	COP2_CRC_LENGTH_SET	0x1202
  #define	COP2_CRC_POLY		0x200
  #define	COP2_CRC_POLY_SET	0x4200
  #define	COP2_LLM_DAT0		0x402
  #define	COP2_LLM_DAT0_SET	COP2_LLM_DAT0
  #define	COP2_LLM_DAT1		0x40A
  #define	COP2_LLM_DAT1_SET	COP2_LLM_DAT1
  #define	COP2_3DES_IV		0x084
  #define	COP2_3DES_IV_SET	COP2_3DES_IV
  #define	COP2_3DES_KEY0		0x080
  #define	COP2_3DES_KEY0_SET	COP2_3DES_KEY0
  #define	COP2_3DES_KEY1		0x081
  #define	COP2_3DES_KEY1_SET	COP2_3DES_KEY1
  #define	COP2_3DES_KEY2		0x082
  #define	COP2_3DES_KEY2_SET	COP2_3DES_KEY2
  #define	COP2_3DES_RESULT	0x088
  #define	COP2_3DES_RESULT_SET	0x098
  #define	COP2_AES_INP0		0x111
  #define	COP2_AES_INP0_SET	COP2_AES_INP0
  #define	COP2_AES_IV0		0x102
  #define	COP2_AES_IV0_SET	COP2_AES_IV0
  #define	COP2_AES_IV1		0x103
  #define	COP2_AES_IV1_SET	COP2_AES_IV1
  #define	COP2_AES_KEY0		0x104
  #define	COP2_AES_KEY0_SET	COP2_AES_KEY0
  #define	COP2_AES_KEY1		0x105
  #define	COP2_AES_KEY1_SET	COP2_AES_KEY1
  #define	COP2_AES_KEY2		0x106
  #define	COP2_AES_KEY2_SET	COP2_AES_KEY2
  #define	COP2_AES_KEY3		0x107
  #define	COP2_AES_KEY3_SET	COP2_AES_KEY3
  #define	COP2_AES_KEYLEN		0x110
  #define	COP2_AES_KEYLEN_SET	COP2_AES_KEYLEN
  #define	COP2_AES_RESULT0	0x100
  #define	COP2_AES_RESULT0_SET	COP2_AES_RESULT0
  #define	COP2_AES_RESULT1	0x101
  #define	COP2_AES_RESULT1_SET	COP2_AES_RESULT1
  #define	COP2_HSH_DATW0		0x240
  #define	COP2_HSH_DATW0_SET	COP2_HSH_DATW0
  #define	COP2_HSH_DATW1		0x241
  #define	COP2_HSH_DATW1_SET	COP2_HSH_DATW1
  #define	COP2_HSH_DATW2		0x242
  #define	COP2_HSH_DATW2_SET	COP2_HSH_DATW2
  #define	COP2_HSH_DATW3		0x243
  #define	COP2_HSH_DATW3_SET	COP2_HSH_DATW3
  #define	COP2_HSH_DATW4		0x244
  #define	COP2_HSH_DATW4_SET	COP2_HSH_DATW4
  #define	COP2_HSH_DATW5		0x245
  #define	COP2_HSH_DATW5_SET	COP2_HSH_DATW5
  #define	COP2_HSH_DATW6		0x246
  #define	COP2_HSH_DATW6_SET	COP2_HSH_DATW6
  #define	COP2_HSH_DATW7		0x247
  #define	COP2_HSH_DATW7_SET	COP2_HSH_DATW7
  #define	COP2_HSH_DATW8		0x248
  #define	COP2_HSH_DATW8_SET	COP2_HSH_DATW8
  #define	COP2_HSH_DATW9		0x249
  #define	COP2_HSH_DATW9_SET	COP2_HSH_DATW9
  #define	COP2_HSH_DATW10		0x24A
  #define	COP2_HSH_DATW10_SET	COP2_HSH_DATW10
  #define	COP2_HSH_DATW11		0x24B
  #define	COP2_HSH_DATW11_SET	COP2_HSH_DATW11
  #define	COP2_HSH_DATW12		0x24C
  #define	COP2_HSH_DATW12_SET	COP2_HSH_DATW12
  #define	COP2_HSH_DATW13		0x24D
  #define	COP2_HSH_DATW13_SET	COP2_HSH_DATW13
  #define	COP2_HSH_DATW14		0x24E
  #define	COP2_HSH_DATW14_SET	COP2_HSH_DATW14
  #define	COP2_HSH_IVW0		0x250
  #define	COP2_HSH_IVW0_SET	COP2_HSH_IVW0
  #define	COP2_HSH_IVW1		0x251
  #define	COP2_HSH_IVW1_SET	COP2_HSH_IVW1
  #define	COP2_HSH_IVW2		0x252
  #define	COP2_HSH_IVW2_SET	COP2_HSH_IVW2
  #define	COP2_HSH_IVW3		0x253
  #define	COP2_HSH_IVW3_SET	COP2_HSH_IVW3
  #define	COP2_HSH_IVW4		0x254
  #define	COP2_HSH_IVW4_SET	COP2_HSH_IVW4
  #define	COP2_HSH_IVW5		0x255
  #define	COP2_HSH_IVW5_SET	COP2_HSH_IVW5
  #define	COP2_HSH_IVW6		0x256
  #define	COP2_HSH_IVW6_SET	COP2_HSH_IVW6
  #define	COP2_HSH_IVW7		0x257
  #define	COP2_HSH_IVW7_SET	COP2_HSH_IVW7
  #define	COP2_GFM_MULT0		0x258
  #define	COP2_GFM_MULT0_SET	COP2_GFM_MULT0
  #define	COP2_GFM_MULT1		0x259
  #define	COP2_GFM_MULT1_SET	COP2_GFM_MULT1
  #define	COP2_GFM_POLY		0x25E
  #define	COP2_GFM_POLY_SET	COP2_GFM_POLY
  #define	COP2_GFM_RESULT0	0x25A
  #define	COP2_GFM_RESULT0_SET	COP2_GFM_RESULT0
  #define	COP2_GFM_RESULT1	0x25B
  #define	COP2_GFM_RESULT1_SET	COP2_GFM_RESULT1
  #define	COP2_HSH_DATW0_PASS1	0x040
  #define	COP2_HSH_DATW0_PASS1_SET	COP2_HSH_DATW0_PASS1
  #define	COP2_HSH_DATW1_PASS1	0x041
  #define	COP2_HSH_DATW1_PASS1_SET	COP2_HSH_DATW1_PASS1
  #define	COP2_HSH_DATW2_PASS1	0x042
  #define	COP2_HSH_DATW2_PASS1_SET	COP2_HSH_DATW2_PASS1
  #define	COP2_HSH_DATW3_PASS1	0x043
  #define	COP2_HSH_DATW3_PASS1_SET	COP2_HSH_DATW3_PASS1
  #define	COP2_HSH_DATW4_PASS1	0x044
  #define	COP2_HSH_DATW4_PASS1_SET	COP2_HSH_DATW4_PASS1
  #define	COP2_HSH_DATW5_PASS1	0x045
  #define	COP2_HSH_DATW5_PASS1_SET	COP2_HSH_DATW5_PASS1
  #define	COP2_HSH_DATW6_PASS1	0x046
  #define	COP2_HSH_DATW6_PASS1_SET	COP2_HSH_DATW6_PASS1
  #define	COP2_HSH_IVW0_PASS1	0x048
  #define	COP2_HSH_IVW0_PASS1_SET	COP2_HSH_IVW0_PASS1
  #define	COP2_HSH_IVW1_PASS1	0x049
  #define	COP2_HSH_IVW1_PASS1_SET	COP2_HSH_IVW1_PASS1
  #define	COP2_HSH_IVW2_PASS1	0x04A
  #define	COP2_HSH_IVW2_PASS1_SET	COP2_HSH_IVW2_PASS1
  
  #ifndef LOCORE
  
  struct octeon_cop2_state {
  	/* 3DES */
          /* 0x0084 */
          unsigned long   _3des_iv;
          /* 0x0080..0x0082 */
          unsigned long   _3des_key[3];
          /* 0x0088, set: 0x0098 */
          unsigned long   _3des_result;
  
  	/* AES */
          /* 0x0111 */
          unsigned long   aes_inp0;
          /* 0x0102..0x0103 */
          unsigned long   aes_iv[2];
          /* 0x0104..0x0107 */
          unsigned long   aes_key[4];
          /* 0x0110 */
          unsigned long   aes_keylen;
          /* 0x0100..0x0101 */
          unsigned long   aes_result[2];
  
  	/* CRC */
          /*  0x0201 */
          unsigned long   crc_iv;
          /* 0x0202, set: 0x1202 */
          unsigned long   crc_length;
          /* 0x0200, set: 0x4200 */
          unsigned long   crc_poly;
  
  	/* Low-latency memory stuff */
          /* 0x0402, 0x040A */
          unsigned long   llm_dat[2];
  
  	/* SHA & MD5 */
          /* 0x0240..0x024E */
          unsigned long   hsh_datw[15];
          /* 0x0250..0x0257 */
          unsigned long   hsh_ivw[8];
  
  	/* GFM */
          /*  0x0258..0x0259 */
          unsigned long   gfm_mult[2];
          /* 0x025E */
          unsigned long   gfm_poly;
          /* 0x025A..0x025B */
          unsigned long   gfm_result[2];
  };
  
  /* Prototypes */
  
  void octeon_cop2_save(struct octeon_cop2_state *);
  void octeon_cop2_restore(struct octeon_cop2_state *);
  
  #endif /* LOCORE */
  #endif /* __OCTEON_COP2_H__ */
  