Path: blob/master/drivers/crypto/caam/desc_constr.h
15109 views
/*1* caam descriptor construction helper functions2*3* Copyright 2008-2011 Freescale Semiconductor, Inc.4*/56#include "desc.h"78#define IMMEDIATE (1 << 23)9#define CAAM_CMD_SZ sizeof(u32)10#define CAAM_PTR_SZ sizeof(dma_addr_t)11#define CAAM_DESC_BYTES_MAX (CAAM_CMD_SZ * 64)1213#ifdef DEBUG14#define PRINT_POS do { printk(KERN_DEBUG "%02d: %s\n", desc_len(desc),\15&__func__[sizeof("append")]); } while (0)16#else17#define PRINT_POS18#endif1920#define DISABLE_AUTO_INFO_FIFO (IMMEDIATE | LDST_CLASS_DECO | \21LDST_SRCDST_WORD_DECOCTRL | \22(LDOFF_DISABLE_AUTO_NFIFO << LDST_OFFSET_SHIFT))23#define ENABLE_AUTO_INFO_FIFO (IMMEDIATE | LDST_CLASS_DECO | \24LDST_SRCDST_WORD_DECOCTRL | \25(LDOFF_ENABLE_AUTO_NFIFO << LDST_OFFSET_SHIFT))2627static inline int desc_len(u32 *desc)28{29return *desc & HDR_DESCLEN_MASK;30}3132static inline int desc_bytes(void *desc)33{34return desc_len(desc) * CAAM_CMD_SZ;35}3637static inline u32 *desc_end(u32 *desc)38{39return desc + desc_len(desc);40}4142static inline void *sh_desc_pdb(u32 *desc)43{44return desc + 1;45}4647static inline void init_desc(u32 *desc, u32 options)48{49*desc = options | HDR_ONE | 1;50}5152static inline void init_sh_desc(u32 *desc, u32 options)53{54PRINT_POS;55init_desc(desc, CMD_SHARED_DESC_HDR | options);56}5758static inline void init_sh_desc_pdb(u32 *desc, u32 options, size_t pdb_bytes)59{60u32 pdb_len = pdb_bytes / CAAM_CMD_SZ + 1;6162init_sh_desc(desc, ((pdb_len << HDR_START_IDX_SHIFT) + pdb_len) |63options);64}6566static inline void init_job_desc(u32 *desc, u32 options)67{68init_desc(desc, CMD_DESC_HDR | options);69}7071static inline void append_ptr(u32 *desc, dma_addr_t ptr)72{73dma_addr_t *offset = (dma_addr_t *)desc_end(desc);7475*offset = ptr;7677(*desc) += CAAM_PTR_SZ / CAAM_CMD_SZ;78}7980static inline void init_job_desc_shared(u32 *desc, dma_addr_t ptr, int len,81u32 options)82{83PRINT_POS;84init_job_desc(desc, HDR_SHARED | options |85(len << HDR_START_IDX_SHIFT));86append_ptr(desc, ptr);87}8889static inline void append_data(u32 *desc, void *data, int len)90{91u32 *offset = desc_end(desc);9293if (len) /* avoid sparse warning: memcpy with byte count of 0 */94memcpy(offset, data, len);9596(*desc) += (len + CAAM_CMD_SZ - 1) / CAAM_CMD_SZ;97}9899static inline void append_cmd(u32 *desc, u32 command)100{101u32 *cmd = desc_end(desc);102103*cmd = command;104105(*desc)++;106}107108static inline void append_cmd_ptr(u32 *desc, dma_addr_t ptr, int len,109u32 command)110{111append_cmd(desc, command | len);112append_ptr(desc, ptr);113}114115static inline void append_cmd_data(u32 *desc, void *data, int len,116u32 command)117{118append_cmd(desc, command | IMMEDIATE | len);119append_data(desc, data, len);120}121122static inline u32 *append_jump(u32 *desc, u32 options)123{124u32 *cmd = desc_end(desc);125126PRINT_POS;127append_cmd(desc, CMD_JUMP | options);128129return cmd;130}131132static inline void set_jump_tgt_here(u32 *desc, u32 *jump_cmd)133{134*jump_cmd = *jump_cmd | (desc_len(desc) - (jump_cmd - desc));135}136137#define APPEND_CMD(cmd, op) \138static inline void append_##cmd(u32 *desc, u32 options) \139{ \140PRINT_POS; \141append_cmd(desc, CMD_##op | options); \142}143APPEND_CMD(operation, OPERATION)144APPEND_CMD(move, MOVE)145146#define APPEND_CMD_LEN(cmd, op) \147static inline void append_##cmd(u32 *desc, unsigned int len, u32 options) \148{ \149PRINT_POS; \150append_cmd(desc, CMD_##op | len | options); \151}152APPEND_CMD_LEN(seq_store, SEQ_STORE)153APPEND_CMD_LEN(seq_fifo_load, SEQ_FIFO_LOAD)154APPEND_CMD_LEN(seq_fifo_store, SEQ_FIFO_STORE)155156#define APPEND_CMD_PTR(cmd, op) \157static inline void append_##cmd(u32 *desc, dma_addr_t ptr, unsigned int len, \158u32 options) \159{ \160PRINT_POS; \161append_cmd_ptr(desc, ptr, len, CMD_##op | options); \162}163APPEND_CMD_PTR(key, KEY)164APPEND_CMD_PTR(seq_in_ptr, SEQ_IN_PTR)165APPEND_CMD_PTR(seq_out_ptr, SEQ_OUT_PTR)166APPEND_CMD_PTR(load, LOAD)167APPEND_CMD_PTR(store, STORE)168APPEND_CMD_PTR(fifo_load, FIFO_LOAD)169APPEND_CMD_PTR(fifo_store, FIFO_STORE)170171#define APPEND_CMD_PTR_TO_IMM(cmd, op) \172static inline void append_##cmd##_as_imm(u32 *desc, void *data, \173unsigned int len, u32 options) \174{ \175PRINT_POS; \176append_cmd_data(desc, data, len, CMD_##op | options); \177}178APPEND_CMD_PTR_TO_IMM(load, LOAD);179APPEND_CMD_PTR_TO_IMM(fifo_load, FIFO_LOAD);180181/*182* 2nd variant for commands whose specified immediate length differs183* from length of immediate data provided, e.g., split keys184*/185#define APPEND_CMD_PTR_TO_IMM2(cmd, op) \186static inline void append_##cmd##_as_imm(u32 *desc, void *data, \187unsigned int data_len, \188unsigned int len, u32 options) \189{ \190PRINT_POS; \191append_cmd(desc, CMD_##op | IMMEDIATE | len | options); \192append_data(desc, data, data_len); \193}194APPEND_CMD_PTR_TO_IMM2(key, KEY);195196#define APPEND_CMD_RAW_IMM(cmd, op, type) \197static inline void append_##cmd##_imm_##type(u32 *desc, type immediate, \198u32 options) \199{ \200PRINT_POS; \201append_cmd(desc, CMD_##op | IMMEDIATE | options | sizeof(type)); \202append_cmd(desc, immediate); \203}204APPEND_CMD_RAW_IMM(load, LOAD, u32);205206207