blob: e3afc390592ce92a4075056b28ff2b1fa5f4dfcb [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001#ifndef _ASR_GEU_H
2#define _ASR_GEU_H
3
4#include <crypto/aes.h>
5#include <linux/crypto.h>
6#include <crypto/algapi.h>
7#include <linux/interrupt.h>
8#include <linux/mutex.h>
9#include <linux/miscdevice.h>
10
11#include "asr-aes.h"
12
13/*
14 * THE REGISTER DEFINES
15 */
16/* Generic regiseters */
17#define GEU_STATUS (0x0000)
18#define GEU_CONFIG (0x0004)
19#define GEU_FUSE_PROG_VAL1 (0x0038)
20
21/* AES related registers */
22#define GEU_INIT_KEY(x) (0x08 + (x << 2))
23#define GEU_IN_DATA(x) (0x28 + (x << 2))
24#define GEU_INIT_IV(x) (0x38 + (x << 2))
25#define GEU_OUT_DATA(x) (0x58 + (x << 2))
26
27#if !defined(CONFIG_CPU_ASR1901)
28/* Fuse related registers */
29#define GEU_FUSE_STATUS (0x0484)
30#define GEU_FUSE_VAL_APCFG1 (0x0404)
31#define GEU_FUSE_VAL_APCFG2 (0x0408)
32#define GEU_FUSE_VAL_APCFG3 (0x040C)
33#define GEU_FUSE_BANK0_192TO207 (0x041C)
34#define BLOCK0_RESERVED_1 (0x0420)
35#define GEU_FUSE_VAL_OEM_HASH_KEY (0x0444)
36#define GEU_FUSE_VAL_OEM_UID_H (0x048C)
37#define GEU_FUSE_VAL_OEM_UID_L (0x04A8)
38#define GEU_FUSE_VAL_OEM_UID_H_LAPW (0x041C)
39#define GEU_FUSE_VAL_OEM_UID_L_LAPW (0x0420)
40
41/* GEU_CONFIG */
42#define GEU_FUSE_SOFTWARE_RESET (1 << 22)
43/* GEU_FUSE_STATUS */
44#define GEU_FUSE_BURN_DONE (1 << 8)
45#define GEU_FUSE_READY (1 << 9)
46#else
47/* 1901/1906 registers */
48#define GEU_FUSE_STATUS (0x0184)
49#define GEU_KSTR_BANK6_LCS (0x0168)
50#define GEU_FUSE_VAL_OEM_HASH_KEY (0x0144)
51#define GEU_FUSE_VAL_APCFG1 (0x0104)
52#define GEU_FUSE_VAL_APCFG2 (0x0108)
53#define GEU_FUSE_VAL_APCFG3 (0x010C)
54#define GEU_FUSE_VAL_OEM_UID_L (0x0298)
55#define GEU_FUSE_VAL_OEM_UID_H (0x029C)
56
57#define GEU_KSTR_LCS_CM_BASE (0)
58#define GEU_KSTR_LCS_DM_BASE (3)
59#define GEU_KSTR_LCS_SP_BASE (6)
60#define GEU_KSTR_LCS_RMA_BASE (9)
61#define GEU_KSTR_LCS_MASK (0x7)
62
63/* GEU_CONFIG */
64#define GEU_FUSE_SOFTWARE_RESET (1 << 22)
65/* GEU_FUSE_STATUS */
66#define GEU_FUSE_BURN_DONE (1 << 0)
67#define GEU_FUSE_READY (1 << 1)
68#endif
69
70/* HWRNG related registers*/
71#if defined(CONFIG_CPU_ASR1901)
72#define GEU_RNG_CTRL (0x10C0)
73#define GEU_RNG_GEN (0x10C4)
74#define GEU_SQU_RNG_CTRL (0x1044)
75#define GEU_RNG_EN (3 << 0)
76#define RNG_FIFO_CLR (1 << 30)
77#define RNG_VALID (1 << 31)
78#else
79#define GEU_RNG_GEN (0x488)
80#define GEU_RNG_SEED_LO (0x038)
81#define GEU_RNG_SEED_HI (0x03c)
82#define GEU_RNG_CTRL (0x3A8)
83#define GEU_RNG_EN (1 << 24)
84#endif
85
86#if defined(CONFIG_CPU_ASR1903)
87#define ASR1903_RNG_SEED (0xD4282C00+0x190)
88#endif
89
90
91/* 1826 specific */
92#define GEU_REGULATOR_CNT (0x03A8)
93#define GEU_SCLK_DIV_CNTR (0x03B0)
94#define GEU_SECURITY_CONFIG (0x0490)
95
96/* GEU status */
97#define GEU_STATUS_DATA_ISR (1 << 9)
98#define GEU_STATUS_DATAO_READY (1 << 3)
99#define GEU_STATUS_ROUND_KEY_READY (1 << 2)
100#define GEU_STATUS_DATA_ENCDEC_ENA (1 << 1)
101#define GEU_STATUS_ROUND_KEY_START (1 << 0)
102
103/* GEU config*/
104#define GEU_CFG_DMA_MODE_EN (1 << 31)
105#define GEU_CFG_CBC_ECB (1 << 29)
106#define GEU_CFG_PWR_BYP (1 << 28)
107#define GEU_CFG_WRITE_IV (1 << 24)
108#define GEU_CFG_ENA_RKEK (1 << 13)
109#define GEU_CFG_DATARSR (1 << 11)
110#define GEU_CFG_DATA_IMR (1 << 10)
111#define GEU_CFG_ENC_DEC (1 << 3)
112#define GEU_CFG_OCB_BYP (1 << 2)
113#define GEU_CFG_KEYSIZE_MASK (3 << 0)
114#define GEU_CFG_KEYSIZE_128 (1 << 0)
115#define GEU_CFG_KEYSIZE_192 (2 << 0)
116#define GEU_CFG_KEYSIZE_256 (3 << 0)
117
118/* ASR1803/1806/1828/1903 */
119#define GEU_SECURE_KEY_ACCESS_DISABLED (1 << 29)
120
121#define SIZE_IN_WORDS(x) ((x) >> 2)
122
123#define ASR_OEM_KEY_SHA160_SIZE 20
124#define ASR_OEM_KEY_SHA224_SIZE 28
125#define ASR_OEM_KEY_SHA256_SIZE 32
126
127struct asr_geu_dev;
128struct asr_geu_fuse;
129
130struct asr_geu_rng {
131 struct device *dev;
132 void __iomem *io_base;
133#ifdef CONFIG_CPU_ASR1903
134 void __iomem *seed_base;
135#endif
136 struct hwrng *hwrng;
137 unsigned int rn_saved;
138};
139
140struct asr_geu_fuse {
141 struct device *dev;
142 void __iomem *io_base;
143 struct miscdevice fuse_misc;
144 struct asr_geu_dev *geu_dd;
145};
146
147struct asr_geu_ops {
148 int (*dev_get)(struct asr_geu_dev *);
149 int (*dev_put)(struct asr_geu_dev *);
150};
151
152struct asr_geu_dev {
153 unsigned long phys_base;
154 void __iomem *io_base;
155 struct mutex geu_lock;
156 struct device *dev;
157
158 struct clk *geu_clk;
159 int clk_synced;
160 refcount_t refcount;
161
162 int irq;
163
164 struct asr_geu_rng asr_rng;
165 struct asr_geu_fuse asr_fuse;
166 struct asr_geu_aes asr_aes;
167
168 struct asr_geu_ops *geu_ops;
169};
170
171int asr_geu_rng_register(struct asr_geu_dev *geu_dd);
172int asr_geu_rng_unregister(struct asr_geu_dev *geu_dd);
173
174int asr_geu_fuse_register(struct asr_geu_dev *geu_dd);
175int asr_geu_fuse_unregister(struct asr_geu_dev *geu_dd);
176
177int asr_geu_aes_register(struct asr_geu_dev *geu_dd);
178int asr_geu_aes_unregister(struct asr_geu_dev *geu_dd);
179
180#endif