Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * K3 DTHE V2 crypto accelerator driver
4 *
5 * Copyright (C) Texas Instruments 2025 - https://www.ti.com
6 * Author: T Pratham <t-pratham@ti.com>
7 */
8
9#ifndef __TI_DTHEV2_H__
10#define __TI_DTHEV2_H__
11
12#include <crypto/aead.h>
13#include <crypto/aes.h>
14#include <crypto/algapi.h>
15#include <crypto/engine.h>
16#include <crypto/hash.h>
17#include <crypto/internal/aead.h>
18#include <crypto/internal/hash.h>
19#include <crypto/internal/skcipher.h>
20
21#include <linux/delay.h>
22#include <linux/dmaengine.h>
23#include <linux/dmapool.h>
24#include <linux/dma-mapping.h>
25#include <linux/io.h>
26#include <linux/scatterlist.h>
27
28#define DTHE_REG_SIZE 4
29#define DTHE_DMA_TIMEOUT_MS 2000
30/*
31 * Size of largest possible key (of all algorithms) to be stored in dthe_tfm_ctx
32 * This is currently the keysize of XTS-AES-256 which is 512 bits (64 bytes)
33 */
34#define DTHE_MAX_KEYSIZE (AES_MAX_KEY_SIZE * 2)
35
36enum dthe_aes_mode {
37 DTHE_AES_ECB = 0,
38 DTHE_AES_CBC,
39 DTHE_AES_CTR,
40 DTHE_AES_XTS,
41 DTHE_AES_GCM,
42 DTHE_AES_CCM,
43};
44
45/* Driver specific struct definitions */
46
47/**
48 * struct dthe_data - DTHE_V2 driver instance data
49 * @dev: Device pointer
50 * @regs: Base address of the register space
51 * @list: list node for dev
52 * @engine: Crypto engine instance
53 * @dma_aes_rx: AES Rx DMA Channel
54 * @dma_aes_tx: AES Tx DMA Channel
55 * @dma_sha_tx: SHA Tx DMA Channel
56 */
57struct dthe_data {
58 struct device *dev;
59 void __iomem *regs;
60 struct list_head list;
61 struct crypto_engine *engine;
62
63 struct dma_chan *dma_aes_rx;
64 struct dma_chan *dma_aes_tx;
65
66 struct dma_chan *dma_sha_tx;
67};
68
69/**
70 * struct dthe_list - device data list head
71 * @dev_list: linked list head
72 * @lock: Spinlock protecting accesses to the list
73 */
74struct dthe_list {
75 struct list_head dev_list;
76 spinlock_t lock;
77};
78
79/**
80 * struct dthe_tfm_ctx - Transform ctx struct containing ctx for all sub-components of DTHE V2
81 * @dev_data: Device data struct pointer
82 * @keylen: AES key length
83 * @authsize: Authentication size for modes with authentication
84 * @key: AES key
85 * @aes_mode: AES mode
86 * @aead_fb: Fallback crypto aead handle
87 * @skcipher_fb: Fallback crypto skcipher handle for AES-XTS mode
88 */
89struct dthe_tfm_ctx {
90 struct dthe_data *dev_data;
91 unsigned int keylen;
92 unsigned int authsize;
93 u32 key[DTHE_MAX_KEYSIZE / sizeof(u32)];
94 enum dthe_aes_mode aes_mode;
95 union {
96 struct crypto_sync_aead *aead_fb;
97 struct crypto_sync_skcipher *skcipher_fb;
98 };
99};
100
101/**
102 * struct dthe_aes_req_ctx - AES engine req ctx struct
103 * @enc: flag indicating encryption or decryption operation
104 * @padding: padding buffer for handling unaligned data
105 * @aes_compl: Completion variable for use in manual completion in case of DMA callback failure
106 */
107struct dthe_aes_req_ctx {
108 int enc;
109 u8 padding[2 * AES_BLOCK_SIZE];
110 struct completion aes_compl;
111};
112
113/* Struct definitions end */
114
115struct dthe_data *dthe_get_dev(struct dthe_tfm_ctx *ctx);
116
117/**
118 * dthe_copy_sg - Copy sg entries from src to dst
119 * @dst: Destination sg to be filled
120 * @src: Source sg to be copied from
121 * @buflen: Number of bytes to be copied
122 *
123 * Description:
124 * Copy buflen bytes of data from src to dst.
125 *
126 **/
127struct scatterlist *dthe_copy_sg(struct scatterlist *dst,
128 struct scatterlist *src,
129 int buflen);
130
131int dthe_register_aes_algs(void);
132void dthe_unregister_aes_algs(void);
133
134#endif