blob: 002469d74d24d65128be15b7f9a4e1b32bf4cb9b [file] [log] [blame]
/*
* arch/arm/plat-ambarella/include/plat/crypto.h
*
* Author: Anthony Ginger <hfjiang@ambarella.com>
*
* Copyright (C) 2004-2010, Ambarella, Inc.
*
* 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 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#ifndef __PLAT_AMBARELLA_CRYPTO_H__
#define __PLAT_AMBARELLA_CRYPTO_H__
/* ==========================================================================*/
#if (CHIP_REV == A5S)
#define CRYPT_UNIT_OFFSET 0x14000
#define CRYPT_UNIT_BASE (AHB_BASE + CRYPT_UNIT_OFFSET)
#else
#define CRYPT_UNIT_OFFSET 0x20000
#define CRYPT_UNIT_BASE (AXI_BASE + CRYPT_UNIT_OFFSET)
#endif
#define CRYPT_UNIT_REG(x) (CRYPT_UNIT_BASE + (x))
#define DES_OFFSET(x) (x)
#define AES_OFFSET(x) ((1 << 9) | (x))
#define SHA1_MD5_OFFSET(x) ((2 << 9) | (x))
#define DES_REG(x) CRYPT_UNIT_REG(DES_OFFSET(x))
#define AES_REG(x) CRYPT_UNIT_REG(AES_OFFSET(x))
#define SHA1_MD5_REG(x) CRYPT_UNIT_REG(SHA1_MD5_OFFSET(x))
/* ==========================================================================*/
/* AES/DES */
#define CRYPT_D_HI_OFFSET 0x00
#define CRYPT_D_LO_OFFSET 0x04
#define CRYPT_D_INPUT_ENC_HI_OFFSET 0x08
#define CRYPT_D_INPUT_ENC_LO_OFFSET 0x0c
#define CRYPT_D_INPUT_DEC_HI_OFFSET 0x10
#define CRYPT_D_INPUT_DEC_LO_OFFSET 0x14
#define CRYPT_D_OUTPUT_HI_OFFSET 0x18
#define CRYPT_D_OUTPUT_LO_OFFSET 0x1c
#define CRYPT_D_OUTPUT_READY_OFFSET 0x20
#define CRYPT_D_INT_EN_OFFSET 0x28
#define CRYPT_A_256_224_OFFSET 0x00
#define CRYPT_A_256_192_OFFSET 0x04
#define CRYPT_A_256_160_OFFSET 0x08
#define CRYPT_A_256_128_OFFSET 0x0c
#define CRYPT_A_256_96_OFFSET 0x10
#define CRYPT_A_256_64_OFFSET 0x14
#define CRYPT_A_256_32_OFFSET 0x18
#define CRYPT_A_256_0_OFFSET 0x1c
#define CRYPT_A_192_160_OFFSET 0x20
#define CRYPT_A_192_128_OFFSET 0x24
#define CRYPT_A_192_96_OFFSET 0x28
#define CRYPT_A_192_64_OFFSET 0x2c
#define CRYPT_A_192_32_OFFSET 0x30
#define CRYPT_A_192_0_OFFSET 0x34
#define CRYPT_A_128_96_OFFSET 0x38
#define CRYPT_A_128_64_OFFSET 0x3c
#define CRYPT_A_128_32_OFFSET 0x40
#define CRYPT_A_128_0_OFFSET 0x44
#define CRYPT_A_INPUT_ENC_96_OFFSET 0x48
#define CRYPT_A_INPUT_ENC_64_OFFSET 0x4c
#define CRYPT_A_INPUT_ENC_32_OFFSET 0x50
#define CRYPT_A_INPUT_ENC_0_OFFSET 0x54
#define CRYPT_A_INPUT_DEC_96_OFFSET 0x58
#define CRYPT_A_INPUT_DEC_64_OFFSET 0x5c
#define CRYPT_A_INPUT_DEC_32_OFFSET 0x60
#define CRYPT_A_INPUT_DEC_0_OFFSET 0x64
#define CRYPT_A_OUTPUT_96_OFFSET 0x68
#define CRYPT_A_OUTPUT_64_OFFSET 0x6c
#define CRYPT_A_OUTPUT_32_OFFSET 0x70
#define CRYPT_A_OUTPUT_0_OFFSET 0x74
#define CRYPT_A_OUTPUT_READY_OFFSET 0x78
#define CRYPT_A_INT_EN_OFFSET 0x80
#define CRYPT_D_HI_REG DES_REG(0x00)
#define CRYPT_D_LO_REG DES_REG(0x04)
#define CRYPT_D_INPUT_ENC_HI_REG DES_REG(0x08)
#define CRYPT_D_INPUT_ENC_LO_REG DES_REG(0x0c)
#define CRYPT_D_INPUT_DEC_HI_REG DES_REG(0x10)
#define CRYPT_D_INPUT_DEC_LO_REG DES_REG(0x14)
#define CRYPT_D_OUTPUT_HI_REG DES_REG(0x18)
#define CRYPT_D_OUTPUT_LO_REG DES_REG(0x1c)
#define CRYPT_D_OUTPUT_READY_REG DES_REG(0x20)
#define CRYPT_D_INT_EN_REG DES_REG(0x28)
#define CRYPT_A_256_224_REG AES_REG(0x00)
#define CRYPT_A_256_192_REG AES_REG(0x04)
#define CRYPT_A_256_160_REG AES_REG(0x08)
#define CRYPT_A_256_128_REG AES_REG(0x0c)
#define CRYPT_A_256_96_REG AES_REG(0x10)
#define CRYPT_A_256_64_REG AES_REG(0x14)
#define CRYPT_A_256_32_REG AES_REG(0x18)
#define CRYPT_A_256_0_REG AES_REG(0x1c)
#define CRYPT_A_192_160_REG AES_REG(0x20)
#define CRYPT_A_192_128_REG AES_REG(0x24)
#define CRYPT_A_192_96_REG AES_REG(0x28)
#define CRYPT_A_192_64_REG AES_REG(0x2c)
#define CRYPT_A_192_32_REG AES_REG(0x30)
#define CRYPT_A_192_0_REG AES_REG(0x34)
#define CRYPT_A_128_96_REG AES_REG(0x38)
#define CRYPT_A_128_64_REG AES_REG(0x3c)
#define CRYPT_A_128_32_REG AES_REG(0x40)
#define CRYPT_A_128_0_REG AES_REG(0x44)
#define CRYPT_A_INPUT_ENC_96_REG AES_REG(0x48)
#define CRYPT_A_INPUT_ENC_64_REG AES_REG(0x4c)
#define CRYPT_A_INPUT_ENC_32_REG AES_REG(0x50)
#define CRYPT_A_INPUT_ENC_0_REG AES_REG(0x54)
#define CRYPT_A_INPUT_DEC_96_REG AES_REG(0x58)
#define CRYPT_A_INPUT_DEC_64_REG AES_REG(0x5c)
#define CRYPT_A_INPUT_DEC_32_REG AES_REG(0x60)
#define CRYPT_A_INPUT_DEC_0_REG AES_REG(0x64)
#define CRYPT_A_OUTPUT_96_REG AES_REG(0x68)
#define CRYPT_A_OUTPUT_64_REG AES_REG(0x6c)
#define CRYPT_A_OUTPUT_32_REG AES_REG(0x70)
#define CRYPT_A_OUTPUT_0_REG AES_REG(0x74)
#define CRYPT_A_OUTPUT_READY_REG AES_REG(0x78)
#define CRYPT_A_INT_EN_REG AES_REG(0x80)
/* ==========================================================================*/
/* SHA1/MD5 */
#define CRYPT_SHA1_INIT_31_0_OFFSET SHA1_MD5_OFFSET(0x0)
#define CRYPT_SHA1_INIT_63_32_OFFSET SHA1_MD5_OFFSET(0x4)
#define CRYPT_SHA1_INIT_95_64_OFFSET SHA1_MD5_OFFSET(0x8)
#define CRYPT_SHA1_INIT_127_96_OFFSET SHA1_MD5_OFFSET(0xc)
#define CRYPT_SHA1_INIT_159_128_OFFSET SHA1_MD5_OFFSET(0x10)
#define CRYPT_SHA1_INPUT_31_0_OFFSET SHA1_MD5_OFFSET(0x18)
#define CRYPT_SHA1_INPUT_63_32_OFFSET SHA1_MD5_OFFSET(0x1c)
#define CRYPT_SHA1_INPUT_95_64_OFFSET SHA1_MD5_OFFSET(0x20)
#define CRYPT_SHA1_INPUT_127_96_OFFSET SHA1_MD5_OFFSET(0x24)
#define CRYPT_SHA1_INPUT_159_128_OFFSET SHA1_MD5_OFFSET(0x28)
#define CRYPT_SHA1_INPUT_191_160_OFFSET SHA1_MD5_OFFSET(0x2c)
#define CRYPT_SHA1_INPUT_223_192_OFFSET SHA1_MD5_OFFSET(0x30)
#define CRYPT_SHA1_INPUT_255_224_OFFSET SHA1_MD5_OFFSET(0x34)
#define CRYPT_SHA1_INPUT_287_256_OFFSET SHA1_MD5_OFFSET(0x38)
#define CRYPT_SHA1_INPUT_319_288_OFFSET SHA1_MD5_OFFSET(0x3c)
#define CRYPT_SHA1_INPUT_351_320_OFFSET SHA1_MD5_OFFSET(0x40)
#define CRYPT_SHA1_INPUT_383_352_OFFSET SHA1_MD5_OFFSET(0x44)
#define CRYPT_SHA1_INPUT_415_384_OFFSET SHA1_MD5_OFFSET(0x48)
#define CRYPT_SHA1_INPUT_447_416_OFFSET SHA1_MD5_OFFSET(0x4c)
#define CRYPT_SHA1_INPUT_479_448_OFFSET SHA1_MD5_OFFSET(0x50)
#define CRYPT_SHA1_INPUT_511_480_OFFSET SHA1_MD5_OFFSET(0x54)
#define CRYPT_SHA1_OUTPUT_31_0_OFFSET SHA1_MD5_OFFSET(0x58)
#define CRYPT_SHA1_OUTPUT_63_32_OFFSET SHA1_MD5_OFFSET(0x5c)
#define CRYPT_SHA1_OUTPUT_95_64_OFFSET SHA1_MD5_OFFSET(0x60)
#define CRYPT_SHA1_OUTPUT_127_96_OFFSET SHA1_MD5_OFFSET(0x64)
#define CRYPT_SHA1_OUTPUT_159_128_OFFSET SHA1_MD5_OFFSET(0x68)
#define CRYPT_SHA1_OUTPUT_READY_OFFSET SHA1_MD5_OFFSET(0x70)
#define CRYPT_SHA1_INT_EN_OFFSET SHA1_MD5_OFFSET(0x78)
#define CRYPT_MD5_INIT_31_0_OFFSET SHA1_MD5_OFFSET(0x80)
#define CRYPT_MD5_INIT_63_32_OFFSET SHA1_MD5_OFFSET(0x84)
#define CRYPT_MD5_INIT_95_64_OFFSET SHA1_MD5_OFFSET(0x88)
#define CRYPT_MD5_INIT_127_96_OFFSET SHA1_MD5_OFFSET(0x8c)
#define CRYPT_MD5_INPUT_31_0_OFFSET SHA1_MD5_OFFSET(0x90)
#define CRYPT_MD5_INPUT_63_32_OFFSET SHA1_MD5_OFFSET(0x94)
#define CRYPT_MD5_INPUT_95_64_OFFSET SHA1_MD5_OFFSET(0x98)
#define CRYPT_MD5_INPUT_127_96_OFFSET SHA1_MD5_OFFSET(0x9c)
#define CRYPT_MD5_INPUT_159_128_OFFSET SHA1_MD5_OFFSET(0xa0)
#define CRYPT_MD5_INPUT_191_160_OFFSET SHA1_MD5_OFFSET(0xa4)
#define CRYPT_MD5_INPUT_223_192_OFFSET SHA1_MD5_OFFSET(0xa8)
#define CRYPT_MD5_INPUT_255_224_OFFSET SHA1_MD5_OFFSET(0xac)
#define CRYPT_MD5_INPUT_287_256_OFFSET SHA1_MD5_OFFSET(0xb0)
#define CRYPT_MD5_INPUT_319_288_OFFSET SHA1_MD5_OFFSET(0xb4)
#define CRYPT_MD5_INPUT_351_320_OFFSET SHA1_MD5_OFFSET(0xb8)
#define CRYPT_MD5_INPUT_383_352_OFFSET SHA1_MD5_OFFSET(0xbc)
#define CRYPT_MD5_INPUT_415_384_OFFSET SHA1_MD5_OFFSET(0xc0)
#define CRYPT_MD5_INPUT_447_416_OFFSET SHA1_MD5_OFFSET(0xc4)
#define CRYPT_MD5_INPUT_479_448_OFFSET SHA1_MD5_OFFSET(0xc8)
#define CRYPT_MD5_INPUT_511_480_OFFSET SHA1_MD5_OFFSET(0xcc)
#define CRYPT_MD5_OUTPUT_31_0_OFFSET SHA1_MD5_OFFSET(0xd0)
#define CRYPT_MD5_OUTPUT_63_32_OFFSET SHA1_MD5_OFFSET(0xd4)
#define CRYPT_MD5_OUTPUT_95_64_OFFSET SHA1_MD5_OFFSET(0xd8)
#define CRYPT_MD5_OUTPUT_127_96_OFFSET SHA1_MD5_OFFSET(0xdc)
#define CRYPT_MD5_OUTPUT_READY_OFFSET SHA1_MD5_OFFSET(0xe0)
#define CRYPT_MD5_INT_EN_OFFSET SHA1_MD5_OFFSET(0xe8)
#define CRYPT_MD5_SHA1_READY_INPUT_OFFSET SHA1_MD5_OFFSET(0xf0)
#define CRYPT_SHA1_INIT_31_0_REG SHA1_MD5_REG(0x0)
#define CRYPT_SHA1_INIT_63_32_REG SHA1_MD5_REG(0x4)
#define CRYPT_SHA1_INIT_95_64_REG SHA1_MD5_REG(0x8)
#define CRYPT_SHA1_INIT_127_96_REG SHA1_MD5_REG(0xc)
#define CRYPT_SHA1_INIT_159_128_REG SHA1_MD5_REG(0x10)
#define CRYPT_SHA1_INPUT_31_0_REG SHA1_MD5_REG(0x18)
#define CRYPT_SHA1_INPUT_63_32_REG SHA1_MD5_REG(0x1c)
#define CRYPT_SHA1_INPUT_95_64_REG SHA1_MD5_REG(0x20)
#define CRYPT_SHA1_INPUT_127_96_REG SHA1_MD5_REG(0x24)
#define CRYPT_SHA1_INPUT_159_128_REG SHA1_MD5_REG(0x28)
#define CRYPT_SHA1_INPUT_191_160_REG SHA1_MD5_REG(0x2c)
#define CRYPT_SHA1_INPUT_223_192_REG SHA1_MD5_REG(0x30)
#define CRYPT_SHA1_INPUT_255_224_REG SHA1_MD5_REG(0x34)
#define CRYPT_SHA1_INPUT_287_256_REG SHA1_MD5_REG(0x38)
#define CRYPT_SHA1_INPUT_319_288_REG SHA1_MD5_REG(0x3c)
#define CRYPT_SHA1_INPUT_351_320_REG SHA1_MD5_REG(0x40)
#define CRYPT_SHA1_INPUT_383_352_REG SHA1_MD5_REG(0x44)
#define CRYPT_SHA1_INPUT_415_384_REG SHA1_MD5_REG(0x48)
#define CRYPT_SHA1_INPUT_447_416_REG SHA1_MD5_REG(0x4c)
#define CRYPT_SHA1_INPUT_479_448_REG SHA1_MD5_REG(0x50)
#define CRYPT_SHA1_INPUT_511_480_REG SHA1_MD5_REG(0x54)
#define CRYPT_SHA1_OUTPUT_31_0_REG SHA1_MD5_REG(0x58)
#define CRYPT_SHA1_OUTPUT_63_32_REG SHA1_MD5_REG(0x5c)
#define CRYPT_SHA1_OUTPUT_95_64_REG SHA1_MD5_REG(0x60)
#define CRYPT_SHA1_OUTPUT_127_96_REG SHA1_MD5_REG(0x64)
#define CRYPT_SHA1_OUTPUT_159_128_REG SHA1_MD5_REG(0x68)
#define CRYPT_SHA1_OUTPUT_READY_REG SHA1_MD5_REG(0x70)
#define CRYPT_SHA1_INT_EN_REG SHA1_MD5_REG(0x78)
#define CRYPT_MD5_INIT_31_0_REG SHA1_MD5_REG(0x80)
#define CRYPT_MD5_INIT_63_32_REG SHA1_MD5_REG(0x84)
#define CRYPT_MD5_INIT_95_64_REG SHA1_MD5_REG(0x88)
#define CRYPT_MD5_INIT_127_96_REG SHA1_MD5_REG(0x8c)
#define CRYPT_MD5_INPUT_31_0_REG SHA1_MD5_REG(0x90)
#define CRYPT_MD5_INPUT_63_32_REG SHA1_MD5_REG(0x94)
#define CRYPT_MD5_INPUT_95_64_REG SHA1_MD5_REG(0x98)
#define CRYPT_MD5_INPUT_127_96_REG SHA1_MD5_REG(0x9c)
#define CRYPT_MD5_INPUT_159_128_REG SHA1_MD5_REG(0xa0)
#define CRYPT_MD5_INPUT_191_160_REG SHA1_MD5_REG(0xa4)
#define CRYPT_MD5_INPUT_223_192_REG SHA1_MD5_REG(0xa8)
#define CRYPT_MD5_INPUT_255_224_REG SHA1_MD5_REG(0xac)
#define CRYPT_MD5_INPUT_287_256_REG SHA1_MD5_REG(0xb0)
#define CRYPT_MD5_INPUT_319_288_REG SHA1_MD5_REG(0xb4)
#define CRYPT_MD5_INPUT_351_320_REG SHA1_MD5_REG(0xb8)
#define CRYPT_MD5_INPUT_383_352_REG SHA1_MD5_REG(0xbc)
#define CRYPT_MD5_INPUT_415_384_REG SHA1_MD5_REG(0xc0)
#define CRYPT_MD5_INPUT_447_416_REG SHA1_MD5_REG(0xc4)
#define CRYPT_MD5_INPUT_479_448_REG SHA1_MD5_REG(0xc8)
#define CRYPT_MD5_INPUT_511_480_REG SHA1_MD5_REG(0xcc)
#define CRYPT_MD5_OUTPUT_31_0_REG SHA1_MD5_REG(0xd0)
#define CRYPT_MD5_OUTPUT_63_32_REG SHA1_MD5_REG(0xd4)
#define CRYPT_MD5_OUTPUT_95_64_REG SHA1_MD5_REG(0xd8)
#define CRYPT_MD5_OUTPUT_127_96_REG SHA1_MD5_REG(0xdc)
#define CRYPT_MD5_OUTPUT_READY_REG SHA1_MD5_REG(0xe0)
#define CRYPT_MD5_INT_EN_REG SHA1_MD5_REG(0xe8)
#define CRYPT_MD5_SHA1_READY_INPUT_REG SHA1_MD5_REG(0xf0)
/* ==========================================================================*/
#define AMBARELLA_CRYPTO_ALIGNMENT (16)
#define AMBARELLA_CRA_PRIORITY (300)
#define AMBARELLA_COMPOSITE_PRIORITY (400)
#define AMBA_HW_ENCRYPT_CMD (0)
#define AMBA_HW_DECRYPT_CMD (1)
/* ==========================================================================*/
#ifndef __ASSEMBLER__
#define CRYPT_A_INPUT1 CRYPT_A_INPUT_ENC_96_REG
#define CRYPT_A_INPUT2 CRYPT_A_INPUT_DEC_96_REG
#define CRYPT_A_OPCODE NULL
#define CRYPT_D_INPUT1 CRYPT_D_INPUT_ENC_HI_REG
#define CRYPT_D_INPUT2 CRYPT_D_INPUT_DEC_HI_REG
#define CRYPT_D_OPCODE NULL
#define CRYPT_MD5_SHA1_READY_INPUT CRYPT_MD5_SHA1_READY_INPUT_REG
#define CRYPT_MD5_INIT_31_0 CRYPT_MD5_INIT_31_0_REG
#define CRYPT_MD5_INPUT_31_0 CRYPT_MD5_INPUT_31_0_REG
#define CRYPT_MD5_OUTPUT_READY CRYPT_MD5_OUTPUT_READY_REG
#define CRYPT_MD5_OUTPUT_31_0 CRYPT_MD5_OUTPUT_31_0_REG
#define CRYPT_SHA1_INIT_31_0 CRYPT_SHA1_INIT_31_0_REG
#define CRYPT_SHA1_INPUT_31_0 CRYPT_SHA1_INPUT_31_0_REG
#define CRYPT_SHA1_OUTPUT_READY CRYPT_SHA1_OUTPUT_READY_REG
#define CRYPT_SHA1_OUTPUT_31_0 CRYPT_SHA1_OUTPUT_31_0_REG
#define CRYPT_MD5_INT_EN CRYPT_MD5_INT_EN_REG
#define CRYPT_SHA1_INT_EN CRYPT_SHA1_INT_EN_REG
#define INDEPENDENT_MD5 1
typedef struct md5_digest_s
{
u32 digest_0;
u32 digest_32;
u32 digest_64;
u32 digest_96;
u32 digest_128;
u32 digest_160;
u32 digest_192;
u32 digest_224;
u32 digest_256;
u32 digest_288;
u32 digest_320;
u32 digest_352;
u32 digest_384;
u32 digest_416;
u32 digest_448;
u32 digest_480;
} md5_digest_t;
typedef struct md5_data_s
{
u32 data[16];
} md5_data_t;
typedef struct sha1_digest_s
{
u32 digest_0;
u32 digest_32;
u32 digest_64;
u32 digest_96;
u32 digest_128;
u32 digest_padding;
} sha1_digest_t;
typedef struct sha1_data_s
{
u32 data[16];
} sha1_data_t;
#endif /* __ASSEMBLER__ */
/* ==========================================================================*/
#endif