blob: 572234825e595ed462b33a89c21f0520eb229d42 [file] [log] [blame]
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* Copyright 2018-2019 NXP
*
* Brief CAAM Descriptor interface.
*/
#ifndef __CAAM_DESC_HELPER_H__
#define __CAAM_DESC_HELPER_H__
#include <caam_desc_defines.h>
#include <trace.h>
/*
* Returns the number of entries of the descriptor
*/
uint32_t caam_desc_get_len(uint32_t *desc);
/* Descriptor Modification function */
void caam_desc_init(uint32_t *desc);
void caam_desc_update_hdr(uint32_t *desc, uint32_t word);
void caam_desc_add_ptr(uint32_t *desc, paddr_t ptr);
void caam_desc_add_word(uint32_t *desc, uint32_t word);
/* Push/Pop descriptor rings queue */
#ifdef CFG_CAAM_64BIT
void caam_desc_push(uint64_t *in_entry, paddr_t paddr);
paddr_t caam_desc_pop(uint64_t *out_entry);
#else
void caam_desc_push(uint32_t *in_entry, paddr_t paddr);
paddr_t caam_desc_pop(uint32_t *out_entry);
#endif /* CFG_CAAM_64BIT */
uint32_t caam_read_jobstatus(uint32_t *addr);
/* Debug print function to dump a Descriptor in hex */
static inline void dump_desc(uint32_t *desc)
{
size_t idx = 0;
size_t len = 0;
len = caam_desc_get_len(desc);
for (idx = 0; idx < len; idx++)
trace_printf(NULL, 0, 0, false, "[%02zu] %08" PRIX32, idx,
desc[idx]);
}
/*
* Returns the descriptor size in bytes of nbEntries
*/
#define DESC_SZBYTES(nbentries) ((nbentries) * sizeof(uint32_t))
/*
* Descriptor Header starting at idx w/o descriptor length
*/
#define DESC_HDR(idx) (CMD_HDR_JD_TYPE | HDR_JD_ONE | HDR_JD_START_IDX(idx))
/*
* Descriptor Header starting at index 0 with descriptor length len
*/
#define DESC_HEADER(len) (DESC_HDR(0) | HDR_JD_DESCLEN(len))
/*
* Descriptor Header starting at idx with descriptor length len
*/
#define DESC_HEADER_IDX(len, idx) (DESC_HDR(idx) | HDR_JD_DESCLEN(len))
/*
* Jump Local of class cla to descriptor offset if test meet the
* condition cond
*/
#define JUMP_LOCAL(cla, test, cond, offset) \
(CMD_JUMP_TYPE | CMD_CLASS(cla) | JUMP_TYPE(LOCAL) | \
JUMP_TST_TYPE(test) | (cond) | JMP_LOCAL_OFFSET(offset))
/*
* Jump Local of no class to descriptor offset if test meet the
* condition cond
*/
#define JUMP_CNO_LOCAL(test, cond, offset) \
JUMP_LOCAL(CLASS_NO, test, cond, offset)
/*
* Jump Local of class 1 to descriptor offset if test meet the
* condition ond
*/
#define JUMP_C1_LOCAL(test, cond, offset) \
JUMP_LOCAL(CLASS_1, test, cond, offset)
/*
* Jump No Local of class cla to descriptor offset if test meet the
* condition cond
*/
#define JUMP_NOTLOCAL(cla, test, cond) \
(CMD_JUMP_TYPE | CMD_CLASS(cla) | JUMP_TYPE(NON_LOCAL) | \
JUMP_TST_TYPE(test) | (cond))
/*
* User Halt with error if test meet the condition cond
*/
#define HALT_USER(test, cond, error) \
(CMD_JUMP_TYPE | JUMP_TYPE(HALT_USER_STATUS) | JUMP_TST_TYPE(test) | \
JMP_COND(cond) | JMP_LOCAL_OFFSET(error))
/*
* Load Immediate value of length len to register dst of class cla
*/
#define LD_IMM(cla, dst, len) \
(CMD_LOAD_TYPE | CMD_CLASS(cla) | CMD_IMM | LOAD_DST(dst) | \
LOAD_LENGTH(len))
/*
* Load Immediate value of length len to register dst w/o class
*/
#define LD_NOCLASS_IMM(dst, len) LD_IMM(CLASS_NO, dst, len)
/*
* Load value of length len to register dst of class cla
*/
#define LD_NOIMM(cla, dst, len) \
(CMD_LOAD_TYPE | CMD_CLASS(cla) | LOAD_DST(dst) | LOAD_LENGTH(len))
/*
* Load value of length len to register dst of class cla starting
* at register offset off
*/
#define LD_NOIMM_OFF(cla, dst, len, off) \
(CMD_LOAD_TYPE | CMD_CLASS(cla) | LOAD_DST(dst) | LOAD_OFFSET(off) | \
LOAD_LENGTH(len))
/*
* FIFO Load to register dst class cla with action act
*/
#define FIFO_LD(cla, dst, act, len) \
(CMD_FIFO_LOAD_TYPE | CMD_CLASS(cla) | FIFO_LOAD_INPUT(dst) | \
FIFO_LOAD_ACTION(act) | FIFO_LOAD_LENGTH(len))
/*
* FIFO Load to register dst class cla with action act.
* Pointer is a Scatter/Gatter Table
*/
#define FIFO_LD_SGT(cla, dst, act, len) \
(CMD_FIFO_LOAD_TYPE | CMD_CLASS(cla) | CMD_SGT | \
FIFO_LOAD_INPUT(dst) | FIFO_LOAD_ACTION(act) | FIFO_LOAD_LENGTH(len))
/*
* FIFO Load to register dst class cla with action act.
* The length is externally defined
*/
#define FIFO_LD_EXT(cla, dst, act) \
(CMD_FIFO_LOAD_TYPE | FIFO_LOAD_EXT | CMD_CLASS(cla) | \
FIFO_LOAD_INPUT(dst) | FIFO_LOAD_ACTION(act))
/*
* FIFO Load Immediate data length len to register dst class cla
* with action act.
*/
#define FIFO_LD_IMM(cla, dst, act, len) \
(CMD_FIFO_LOAD_TYPE | CMD_IMM | CMD_CLASS(cla) | \
FIFO_LOAD_INPUT(dst) | FIFO_LOAD_ACTION(act) | FIFO_LOAD_LENGTH(len))
/*
* Store value of length len from register src of class cla
*/
#define ST_NOIMM(cla, src, len) \
(CMD_STORE_TYPE | CMD_CLASS(cla) | STORE_SRC(src) | STORE_LENGTH(len))
/*
* Store value of length len from register src of class cla starting
* at register offset off
*/
#define ST_NOIMM_OFF(cla, src, len, off) \
(CMD_STORE_TYPE | CMD_CLASS(cla) | STORE_SRC(src) | \
STORE_OFFSET(off) | STORE_LENGTH(len))
/*
* FIFO Store from register src of length len
*/
#define FIFO_ST(src, len) \
(CMD_FIFO_STORE_TYPE | FIFO_STORE_OUTPUT(src) | FIFO_STORE_LENGTH(len))
/*
* FIFO Store from register src.
* The length is externally defined
*/
#define FIFO_ST_EXT(src) \
(CMD_FIFO_STORE_TYPE | FIFO_LOAD_EXT | FIFO_STORE_OUTPUT(src))
/*
* FIFO Store from register src of length len.
* Pointer is a Scatter/Gatter Table
*/
#define FIFO_ST_SGT(src, len) \
(CMD_FIFO_STORE_TYPE | CMD_SGT | FIFO_STORE_OUTPUT(src) | \
FIFO_STORE_LENGTH(len))
/*
* RNG State Handle instantation operation for sh ID
*/
#define RNG_SH_INST(sh) \
(CMD_OP_TYPE | OP_TYPE(CLASS1) | OP_ALGO(RNG) | ALGO_RNG_SH(sh) | \
ALGO_AS(RNG_INSTANTIATE))
/*
* RNG Generates Secure Keys
*/
#define RNG_GEN_SECKEYS \
(CMD_OP_TYPE | OP_TYPE(CLASS1) | OP_ALGO(RNG) | ALGO_RNG_SK | \
ALGO_AS(RNG_GENERATE))
/*
* RNG Generates Data
*/
#define RNG_GEN_DATA \
(CMD_OP_TYPE | OP_TYPE(CLASS1) | OP_ALGO(RNG) | ALGO_AS(RNG_GENERATE))
/*
* Hash Init Operation of algorithm algo
*/
#define HASH_INIT(algo) \
(CMD_OP_TYPE | OP_TYPE(CLASS2) | (algo) | ALGO_AS(INIT) | ALGO_ENCRYPT)
/*
* Hash Update Operation of algorithm algo
*/
#define HASH_UPDATE(algo) \
(CMD_OP_TYPE | OP_TYPE(CLASS2) | (algo) | ALGO_AS(UPDATE) | \
ALGO_ENCRYPT)
/*
* Hash Final Operation of algorithm algo
*/
#define HASH_FINAL(algo) \
(CMD_OP_TYPE | OP_TYPE(CLASS2) | (algo) | ALGO_AS(FINAL) | ALGO_ENCRYPT)
/*
* Hash Init and Final Operation of algorithm algo
*/
#define HASH_INITFINAL(algo) \
(CMD_OP_TYPE | OP_TYPE(CLASS2) | (algo) | ALGO_AS(INIT_FINAL) | \
ALGO_ENCRYPT)
/*
* HMAC Init Decryption Operation of algorithm algo
*/
#define HMAC_INIT_DECRYPT(algo) \
(CMD_OP_TYPE | OP_TYPE(CLASS2) | (algo) | ALGO_AS(INIT) | \
ALGO_AAI(DIGEST_HMAC) | ALGO_DECRYPT)
/*
* HMAC Init and Final Operation of algorithm algo with Precomp key
*/
#define HMAC_INITFINAL_PRECOMP(algo) \
(CMD_OP_TYPE | OP_TYPE(CLASS2) | (algo) | ALGO_AS(INIT_FINAL) | \
ALGO_AAI(DIGEST_HMAC_PRECOMP) | ALGO_ENCRYPT)
/*
* HMAC Init Operation of algorithm algo with Precomp key
*/
#define HMAC_INIT_PRECOMP(algo) \
(CMD_OP_TYPE | OP_TYPE(CLASS2) | (algo) | ALGO_AS(INIT) | \
ALGO_AAI(DIGEST_HMAC_PRECOMP) | ALGO_ENCRYPT)
/*
* HMAC Final Operation of algorithm algo with Precomp key
*/
#define HMAC_FINAL_PRECOMP(algo) \
(CMD_OP_TYPE | OP_TYPE(CLASS2) | (algo) | ALGO_AS(FINAL) | \
ALGO_AAI(DIGEST_HMAC_PRECOMP) | ALGO_ENCRYPT)
/*
* Cipher Init and Final Operation of algorithm algo
*/
#define CIPHER_INITFINAL(algo, encrypt) \
(CMD_OP_TYPE | OP_TYPE(CLASS1) | (algo) | ALGO_AS(INIT_FINAL) | \
((encrypt) ? ALGO_ENCRYPT : ALGO_DECRYPT))
/*
* Cipher Init Operation of algorithm algo
*/
#define CIPHER_INIT(algo, encrypt) \
(CMD_OP_TYPE | OP_TYPE(CLASS1) | (algo) | ALGO_AS(INIT) | \
((encrypt) ? ALGO_ENCRYPT : ALGO_DECRYPT))
/*
* Cipher Update Operation of algorithm algo
*/
#define CIPHER_UPDATE(algo, encrypt) \
(CMD_OP_TYPE | OP_TYPE(CLASS1) | (algo) | ALGO_AS(UPDATE) | \
((encrypt) ? ALGO_ENCRYPT : ALGO_DECRYPT))
/*
* Cipher Final Operation of algorithm algo
*/
#define CIPHER_FINAL(algo, encrypt) \
(CMD_OP_TYPE | OP_TYPE(CLASS1) | (algo) | ALGO_AS(FINAL) | \
((encrypt) ? ALGO_ENCRYPT : ALGO_DECRYPT))
/*
* Load a class cla key of length len to register dst.
* Key can be stored in plain text.
*/
#define LD_KEY_PLAIN(cla, dst, len) \
(CMD_KEY_TYPE | CMD_CLASS(cla) | KEY_PTS | KEY_DEST(dst) | \
KEY_LENGTH(len))
/*
* Load a split key of length len.
*/
#define LD_KEY_SPLIT(len) \
(CMD_KEY_TYPE | CMD_CLASS(CLASS_2) | KEY_DEST(MDHA_SPLIT) | \
KEY_LENGTH(len))
/*
* MPPRIVK generation function.
*/
#define MPPRIVK (CMD_OP_TYPE | OP_TYPE(ENCAPS) | PROTID(MPKEY))
/*
* MPPUBK generation function.
*/
#define MPPUBK (CMD_OP_TYPE | OP_TYPE(DECAPS) | PROTID(MPKEY))
/*
* MPSIGN function.
*/
#define MPSIGN_OP (CMD_OP_TYPE | OP_TYPE(DECAPS) | PROTID(MPSIGN))
/*
* Operation Mathematical of length len
* dest = src0 (operation func) src1
*/
#define MATH(func, src0, src1, dst, len) \
(CMD_MATH_TYPE | MATH_FUNC(func) | MATH_SRC0(src0) | MATH_SRC1(src1) | \
MATH_DST(dst) | MATH_LENGTH(len))
/*
* Operation Mathematical of length len using an immediate value as operand 1
* dest = src (operation func) val
*/
#define MATHI_OP1(func, src, val, dst, len) \
(CMD_MATHI_TYPE | MATH_FUNC(func) | MATHI_SRC(src) | \
MATHI_IMM_VALUE(val) | MATHI_DST(dst) | MATH_LENGTH(len))
/*
* PKHA Copy function from src to dst. Copy number of words specified
* in Source size register
*/
#define PKHA_CPY_SSIZE(src, dst) \
(CMD_OP_TYPE | OP_TYPE(PKHA) | PKHA_ALG | PKHA_FUNC(CPY_SSIZE) | \
PKHA_CPY_SRC(src) | PKHA_CPY_DST(dst))
/*
* PKHA Operation op result into dst
*/
#define PKHA_OP(op, dst) \
(CMD_OP_TYPE | OP_TYPE(PKHA) | PKHA_ALG | PKHA_FUNC(op) | \
PKHA_OUTSEL(dst))
/*
* PKHA Binomial operation op result into dst
*/
#define PKHA_F2M_OP(op, dst) \
(CMD_OP_TYPE | OP_TYPE(PKHA) | PKHA_ALG | PKHA_F2M | PKHA_FUNC(op) | \
PKHA_OUTSEL(dst))
/*
* Move src to dst
*/
#define MOVE(src, dst, off, len) \
(CMD_MOVE_TYPE | MOVE_SRC(src) | MOVE_DST(dst) | MOVE_OFFSET(off) | \
MOVE_LENGTH(len))
/*
* Move src to dst and wait until completion
*/
#define MOVE_WAIT(src, dst, off, len) \
(CMD_MOVE_TYPE | MOVE_WC | MOVE_SRC(src) | MOVE_DST(dst) | \
MOVE_OFFSET(off) | MOVE_LENGTH(len))
/*
* RSA Encryption using format
*/
#define RSA_ENCRYPT(format) \
(CMD_OP_TYPE | PROTID(RSA_ENC) | PROT_RSA_FMT(format))
/*
* RSA Decryption using format
*/
#define RSA_DECRYPT(format) \
(CMD_OP_TYPE | PROTID(RSA_DEC) | PROT_RSA_FMT(format))
/*
* RSA Finalize Key in format
*/
#define RSA_FINAL_KEY(format) \
(CMD_OP_TYPE | PROTID(RSA_FINISH_KEY) | PROT_RSA_KEY(format))
/*
* Public Keypair generation
*/
#define PK_KEYPAIR_GEN(type) \
(CMD_OP_TYPE | OP_TYPE(UNI) | PROTID(PKKEY) | PROT_PK_TYPE(type))
/*
* DSA/ECDSA signature of message hashed
*/
#define DSA_SIGN(type) \
(CMD_OP_TYPE | OP_TYPE(UNI) | PROTID(DSASIGN) | PROT_PK_MSG(HASHED) | \
PROT_PK_TYPE(type))
/*
* DSA/ECDSA signature verify message hashed
*/
#define DSA_VERIFY(type) \
(CMD_OP_TYPE | OP_TYPE(UNI) | PROTID(DSAVERIFY) | \
PROT_PK_MSG(HASHED) | PROT_PK_TYPE(type))
/*
* DH/ECC Shared Secret
*/
#define SHARED_SECRET(type) \
(CMD_OP_TYPE | OP_TYPE(UNI) | PROTID(SHARED_SECRET) | \
PROT_PK_TYPE(type))
/*
* Blob Master Key Verification
*/
#define BLOB_MSTR_KEY \
(CMD_OP_TYPE | OP_TYPE(ENCAPS) | PROTID(BLOB) | PROT_BLOB_FMT_MSTR)
/*
* Blob encapsulation
*/
#define BLOB_ENCAPS \
(CMD_OP_TYPE | OP_TYPE(ENCAPS) | PROTID(BLOB) | \
PROT_BLOB_FORMAT(NORMAL))
/*
* Blob decapsulation
*/
#define BLOB_DECAPS \
(CMD_OP_TYPE | OP_TYPE(DECAPS) | PROTID(BLOB) | \
PROT_BLOB_FORMAT(NORMAL))
/*
* Black key CCM size
*/
#define BLACK_KEY_CCM_SIZE(size) \
(ROUNDUP(size, 8) + BLACK_KEY_NONCE_SIZE + BLACK_KEY_ICV_SIZE)
/*
* Black key ECB size
*/
#define BLACK_KEY_ECB_SIZE(size) ROUNDUP(size, 16)
/*
* Sequence Inout Pointer of length len
*/
#define SEQ_IN_PTR(len) (CMD_SEQ_IN_TYPE | SEQ_LENGTH(len))
/*
* Sequence Output Pointer of length len
*/
#define SEQ_OUT_PTR(len) (CMD_SEQ_OUT_TYPE | SEQ_LENGTH(len))
#endif /* __CAAM_DESC_HELPER_H__ */