blob: 7f8148809efc87d4bd6d82ff6a765b1e150c0a06 [file] [log] [blame]
/* Copyright (c) 2012,2015, The Linux Foundation. All rights reserved.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * 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.
* * Neither the name of The Linux Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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.
*/
#ifndef __CRYPTO5_ENG_H__
#define __CRYPYO5_ENG_H__
#include <bits.h>
#include <bam.h>
#include <crypto_hash.h>
/* CRYPTO registers */
#define CRYPTO_VERSION(x) (x + 0x0000)
#define CRYPTO_DATA_IN(x) (x + 0x0010)
#define CRYPTO_DATA_OUT(x) (x + 0x0020)
#define CRYPTO_STATUS(x) (x + 0x0100)
#define CRYPTO_STATUS2(x) (x + 0x0104)
#define CRYPTO_SEG_SIZE(x) (x + 0x0110)
#define CRYPTO_GOPROC(x) (x + 0x0120)
#define CRYPTO_ENGINES_AVAIL(x) (x + 0x0108)
#define CRYPTO_ENCR_SEG_CFG(x) (x + 0x0200)
#define CRYPTO_AUTH_SEG_CFG(x) (x + 0x0300)
#define CRYPTO_AUTH_SEG_SIZE(x) (x + 0x0304)
#define CRYPTO_AUTH_SEG_START(x) (x + 0x0308)
#define CRYPTO_AUTH_IVn(x, n) (x + 0x0310 + 4*(n))
#define CRYPTO_AUTH_BYTECNTn(x, n) (x + 0x0390 + 4*(n))
#define CRYPTO_CONFIG(x) (x + 0x0400)
#define CRYPTO_DEBUG(x) (x + 0x5004)
/* Status register errors. */
#define SW_ERR BIT(0)
#define AXI_ERR BIT(14)
#define HSD_ERR BIT(20)
#define AUTH_BUSY BIT(8)
/* Status2 register errors. */
#define AXI_EXTRA BIT(1)
/* CRYPTO_CONFIG register bit definitions */
#define MASK_ERR_INTR BIT(0)
#define MASK_OP_DONE_INTR BIT(1)
#define MASK_DIN_INTR BIT(2)
#define MASK_DOUT_INTR BIT(3)
#define HIGH_SPD_IN_EN_N (0 << 4)
#define PIPE_SET_SELECT_SHIFT 5
#define LITTLE_ENDIAN_MODE BIT(9)
#define MAX_QUEUED_REQS (0 << 14) /* 1 Max queued request. */
#define REQ_SIZE (7 << 17) /* 8 beats */
/* CRYPTO_AUTH_SEG_CFG register bit definitions */
#define SEG_CFG_AUTH_ALG_SHA (1 << 0)
#define SEG_CFG_AUTH_SIZE_SHA1 (0 << 9)
#define SEG_CFG_AUTH_SIZE_SHA256 (1 << 9)
#define SEG_CFG_LAST (1 << 16)
/* The value to be written to the GOPROC register.
* Enable result dump option along with GO bit.
*/
#define GOPROC_GO (1 | 1 << 2)
#define CRYPTO_READ_PIPE_INDEX 0
#define CRYPTO_WRITE_PIPE_INDEX 1
/* Burst length recommended by HPG for maximum throughput. */
#define CRYPTO_BURST_LEN 64
/* This value determines how much descriptor data can be advertised on
* the pipe sideband interface at a time.
* The recommendation is to make it the size of your largest descriptor.
* The max setting is 32KB.
*/
#define CRYPTO_MAX_THRESHOLD (32 * 1024)
/* Basic CE setting to put the CE in HS mode. */
#define CRYPTO_RESET_CONFIG 0xE000F
struct crypto_bam_pipes
{
uint8_t read_pipe;
uint8_t write_pipe;
uint8_t read_pipe_grp;
uint8_t write_pipe_grp;
};
struct output_dump
{
uint32_t auth_iv[16];
uint32_t auth_bytcnt[4];
uint32_t encr_cntr_iv[4];
uint32_t status;
uint32_t status2;
uint8_t burst_align_buf[24];
}__PACKED;
/* Struct to save the CE device info.
* base : Base addr of CE.
* instance : CE instance used.
* ce_array : ptr to the cmd elements array.
* ce_array_index : index within ce_array where the next cmd element needs to be added.
* cd_start : index within the ce_array to keep track of the num of
* cmd elements that need to be added in the next desc.
* dump : ptr to the result dump memory.
* bam : bam instance used with this CE.
* do_bam_init : Flag to determine if bam should be initalized.
*/
struct crypto_dev
{
uint32_t base;
uint32_t instance;
struct cmd_element *ce_array;
uint32_t ce_array_index;
uint32_t cd_start;
struct output_dump *dump;
struct bam_instance bam;
uint8_t do_bam_init;
};
/* Struct to pass the initial params to CE.
* crypto_base : Base addr of the CE.
* crypto_instance : CE instance used.
* bam_base : Base addr of CE BAM.
* bam_ee : EE used for CE BAM.
* num_ce : Number of cmd elements to be allocated.
* read_fifo_size : Size of the BAM desc read fifo.
* write_fifo_size : Size of the BAM desc write fifo.
* do_bam_init : Flag to determine if bam should be initalized.
*/
struct crypto_init_params
{
uint32_t crypto_base;
uint32_t crypto_instance;
uint32_t bam_base;
uint32_t bam_ee;
uint32_t num_ce;
uint32_t read_fifo_size;
uint32_t write_fifo_size;
uint8_t do_bam_init;
struct crypto_bam_pipes pipes;
};
void crypto5_init_params(struct crypto_dev *dev, struct crypto_init_params *params);
void crypto5_init(struct crypto_dev *dev);
void crypto5_set_ctx(struct crypto_dev *dev,
void *ctx_ptr,
crypto_auth_alg_type auth_alg);
uint32_t crypto5_send_data(struct crypto_dev *dev,
void *ctx_ptr,
uint8_t *data_ptr);
void crypto5_cleanup(struct crypto_dev *dev);
uint32_t crypto5_get_digest(struct crypto_dev *dev,
uint8_t *digest_ptr,
crypto_auth_alg_type auth_alg);
void crypto5_get_ctx(struct crypto_dev *dev, void *ctx_ptr);
uint32_t crypto5_get_max_auth_blk_size(struct crypto_dev *dev);
void crypto5_unlock_pipes(struct crypto_dev *dev);
#endif