Skip to content

Commit 38e8fb4

Browse files
AlexJones0jwnrt
authored andcommitted
[ot] hw/opentitan: ot_kmac: Update register interface
This commit updates the KMAC's register interface to match the latest changes to Earlgrey's KMAC. These changes include: - Removal of `ERR_PROCESSED` from the `CFG_SHADOWED` register. - Addition of the `ERR_PROCESSED` command. Most of the functionality is related to the entropy FSM which is still a TODO, but this does also clear the relevant alert as in the RTL. - Replaced `ENTROPY_SEED_{0,4}` with just one `ENTROPY_SEED` register, which shifts the mappings of subsequent registers. - Increase the MMIO State and MSG FIFO sizes.
1 parent 6303248 commit 38e8fb4

File tree

1 file changed

+57
-67
lines changed

1 file changed

+57
-67
lines changed

hw/opentitan/ot_kmac.c

Lines changed: 57 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,12 @@ REG32(CFG_SHADOWED, 0x14u)
7575
FIELD(CFG_SHADOWED, ENTROPY_FAST_PROCESS, 19u, 1u)
7676
FIELD(CFG_SHADOWED, MSG_MASK, 20u, 1u)
7777
FIELD(CFG_SHADOWED, ENTROPY_READY, 24u, 1u)
78-
FIELD(CFG_SHADOWED, ERR_PROCESSED, 25u, 1u)
7978
FIELD(CFG_SHADOWED, EN_UNSUPPORTED_MODESTRENGTH, 26u, 1u)
8079
REG32(CMD, 0x18u)
8180
FIELD(CMD, CMD, 0u, 6u)
8281
FIELD(CMD, ENTROPY_REQ, 8u, 1u)
8382
FIELD(CMD, HASH_CNT_CLR, 9u, 1u)
83+
FIELD(CMD, ERR_PROCESSED, 10u, 1u)
8484
REG32(STATUS, 0x1cu)
8585
FIELD(STATUS, SHA3_IDLE, 0u, 1u)
8686
FIELD(STATUS, SHA3_ABSORB, 1u, 1u)
@@ -97,57 +97,53 @@ REG32(ENTROPY_REFRESH_HASH_CNT, 0x24u)
9797
FIELD(ENTROPY_REFRESH_HASH_CNT, HASH_CNT, 0u, 10u)
9898
REG32(ENTROPY_REFRESH_THRESHOLD_SHADOWED, 0x28u)
9999
FIELD(ENTROPY_REFRESH_THRESHOLD_SHADOWED, THRESHOLD, 0u, 10u)
100-
REG32(ENTROPY_SEED_0, 0x2cu)
101-
REG32(ENTROPY_SEED_1, 0x30u)
102-
REG32(ENTROPY_SEED_2, 0x34u)
103-
REG32(ENTROPY_SEED_3, 0x38u)
104-
REG32(ENTROPY_SEED_4, 0x3cu)
105-
REG32(KEY_SHARE0_0, 0x40u)
106-
REG32(KEY_SHARE0_1, 0x44u)
107-
REG32(KEY_SHARE0_2, 0x48u)
108-
REG32(KEY_SHARE0_3, 0x4cu)
109-
REG32(KEY_SHARE0_4, 0x50u)
110-
REG32(KEY_SHARE0_5, 0x54u)
111-
REG32(KEY_SHARE0_6, 0x58u)
112-
REG32(KEY_SHARE0_7, 0x5cu)
113-
REG32(KEY_SHARE0_8, 0x60u)
114-
REG32(KEY_SHARE0_9, 0x64u)
115-
REG32(KEY_SHARE0_10, 0x68u)
116-
REG32(KEY_SHARE0_11, 0x6cu)
117-
REG32(KEY_SHARE0_12, 0x70u)
118-
REG32(KEY_SHARE0_13, 0x74u)
119-
REG32(KEY_SHARE0_14, 0x78u)
120-
REG32(KEY_SHARE0_15, 0x7cu)
121-
REG32(KEY_SHARE1_0, 0x80u)
122-
REG32(KEY_SHARE1_1, 0x84u)
123-
REG32(KEY_SHARE1_2, 0x88u)
124-
REG32(KEY_SHARE1_3, 0x8cu)
125-
REG32(KEY_SHARE1_4, 0x90u)
126-
REG32(KEY_SHARE1_5, 0x94u)
127-
REG32(KEY_SHARE1_6, 0x98u)
128-
REG32(KEY_SHARE1_7, 0x9cu)
129-
REG32(KEY_SHARE1_8, 0xa0u)
130-
REG32(KEY_SHARE1_9, 0xa4u)
131-
REG32(KEY_SHARE1_10, 0xa8u)
132-
REG32(KEY_SHARE1_11, 0xacu)
133-
REG32(KEY_SHARE1_12, 0xb0u)
134-
REG32(KEY_SHARE1_13, 0xb4u)
135-
REG32(KEY_SHARE1_14, 0xb8u)
136-
REG32(KEY_SHARE1_15, 0xbcu)
137-
REG32(KEY_LEN, 0xc0u)
100+
REG32(ENTROPY_SEED, 0x2cu)
101+
REG32(KEY_SHARE0_0, 0x30u)
102+
REG32(KEY_SHARE0_1, 0x34u)
103+
REG32(KEY_SHARE0_2, 0x38u)
104+
REG32(KEY_SHARE0_3, 0x3cu)
105+
REG32(KEY_SHARE0_4, 0x40u)
106+
REG32(KEY_SHARE0_5, 0x44u)
107+
REG32(KEY_SHARE0_6, 0x48u)
108+
REG32(KEY_SHARE0_7, 0x4cu)
109+
REG32(KEY_SHARE0_8, 0x50u)
110+
REG32(KEY_SHARE0_9, 0x54u)
111+
REG32(KEY_SHARE0_10, 0x58u)
112+
REG32(KEY_SHARE0_11, 0x5cu)
113+
REG32(KEY_SHARE0_12, 0x60u)
114+
REG32(KEY_SHARE0_13, 0x64u)
115+
REG32(KEY_SHARE0_14, 0x68u)
116+
REG32(KEY_SHARE0_15, 0x6cu)
117+
REG32(KEY_SHARE1_0, 0x70u)
118+
REG32(KEY_SHARE1_1, 0x74u)
119+
REG32(KEY_SHARE1_2, 0x78u)
120+
REG32(KEY_SHARE1_3, 0x7cu)
121+
REG32(KEY_SHARE1_4, 0x80u)
122+
REG32(KEY_SHARE1_5, 0x84u)
123+
REG32(KEY_SHARE1_6, 0x88u)
124+
REG32(KEY_SHARE1_7, 0x8cu)
125+
REG32(KEY_SHARE1_8, 0x90u)
126+
REG32(KEY_SHARE1_9, 0x94u)
127+
REG32(KEY_SHARE1_10, 0x98u)
128+
REG32(KEY_SHARE1_11, 0x9cu)
129+
REG32(KEY_SHARE1_12, 0xa0u)
130+
REG32(KEY_SHARE1_13, 0xa4u)
131+
REG32(KEY_SHARE1_14, 0xa8u)
132+
REG32(KEY_SHARE1_15, 0xacu)
133+
REG32(KEY_LEN, 0xb0u)
138134
FIELD(KEY_LEN, LEN, 0u, 3u)
139-
REG32(PREFIX_0, 0xc4u)
140-
REG32(PREFIX_1, 0xc8u)
141-
REG32(PREFIX_2, 0xccu)
142-
REG32(PREFIX_3, 0xd0u)
143-
REG32(PREFIX_4, 0xd4u)
144-
REG32(PREFIX_5, 0xd8u)
145-
REG32(PREFIX_6, 0xdcu)
146-
REG32(PREFIX_7, 0xe0u)
147-
REG32(PREFIX_8, 0xe4u)
148-
REG32(PREFIX_9, 0xe8u)
149-
REG32(PREFIX_10, 0xecu)
150-
REG32(ERR_CODE, 0xf0u)
135+
REG32(PREFIX_0, 0xb4u)
136+
REG32(PREFIX_1, 0xb8u)
137+
REG32(PREFIX_2, 0xbcu)
138+
REG32(PREFIX_3, 0xc0u)
139+
REG32(PREFIX_4, 0xc4u)
140+
REG32(PREFIX_5, 0xc8u)
141+
REG32(PREFIX_6, 0xccu)
142+
REG32(PREFIX_7, 0xd0u)
143+
REG32(PREFIX_8, 0xd4u)
144+
REG32(PREFIX_9, 0xd8u)
145+
REG32(PREFIX_10, 0xdcu)
146+
REG32(ERR_CODE, 0xe0u)
151147
FIELD(ERR_CODE, INFO, 0u, 24u)
152148
FIELD(ERR_CODE, CODE, 24u, 8u)
153149
/* clang-format on */
@@ -162,7 +158,7 @@ REG32(ERR_CODE, 0xf0u)
162158
R_CFG_SHADOWED_STATE_ENDIANNESS_MASK | R_CFG_SHADOWED_SIDELOAD_MASK | \
163159
R_CFG_SHADOWED_ENTROPY_MODE_MASK | \
164160
R_CFG_SHADOWED_ENTROPY_FAST_PROCESS_MASK | R_CFG_SHADOWED_MSG_MASK_MASK | \
165-
R_CFG_SHADOWED_ENTROPY_READY_MASK | R_CFG_SHADOWED_ERR_PROCESSED_MASK | \
161+
R_CFG_SHADOWED_ENTROPY_READY_MASK | \
166162
R_CFG_SHADOWED_EN_UNSUPPORTED_MODESTRENGTH_MASK)
167163

168164
enum {
@@ -254,11 +250,7 @@ static const char *REG_NAMES[REGS_COUNT] = {
254250
REG_NAME_ENTRY(ENTROPY_PERIOD),
255251
REG_NAME_ENTRY(ENTROPY_REFRESH_HASH_CNT),
256252
REG_NAME_ENTRY(ENTROPY_REFRESH_THRESHOLD_SHADOWED),
257-
REG_NAME_ENTRY(ENTROPY_SEED_0),
258-
REG_NAME_ENTRY(ENTROPY_SEED_1),
259-
REG_NAME_ENTRY(ENTROPY_SEED_2),
260-
REG_NAME_ENTRY(ENTROPY_SEED_3),
261-
REG_NAME_ENTRY(ENTROPY_SEED_4),
253+
REG_NAME_ENTRY(ENTROPY_SEED),
262254
REG_NAME_ENTRY(KEY_SHARE0_0),
263255
REG_NAME_ENTRY(KEY_SHARE0_1),
264256
REG_NAME_ENTRY(KEY_SHARE0_2),
@@ -1094,11 +1086,7 @@ static uint64_t ot_kmac_regs_read(void *opaque, hwaddr addr, unsigned size)
10941086
break;
10951087
case R_INTR_TEST:
10961088
case R_ALERT_TEST:
1097-
case R_ENTROPY_SEED_0:
1098-
case R_ENTROPY_SEED_1:
1099-
case R_ENTROPY_SEED_2:
1100-
case R_ENTROPY_SEED_3:
1101-
case R_ENTROPY_SEED_4:
1089+
case R_ENTROPY_SEED:
11021090
case R_KEY_SHARE0_0:
11031091
case R_KEY_SHARE0_1:
11041092
case R_KEY_SHARE0_2:
@@ -1212,6 +1200,12 @@ static void ot_kmac_regs_write(void *opaque, hwaddr addr, uint64_t value,
12121200
qemu_log_mask(LOG_UNIMP, "%s: CMD.HASH_CNT_CLR is not supported\n",
12131201
__func__);
12141202
}
1203+
1204+
if (val32 & R_CMD_ERR_PROCESSED_MASK) {
1205+
/* TODO: implement entropy */
1206+
s->regs[R_STATUS] &= ~R_STATUS_ALERT_RECOV_CTRL_UPDATE_ERR_MASK;
1207+
ot_kmac_update_alert(s);
1208+
}
12151209
break;
12161210
}
12171211
case R_ENTROPY_PERIOD:
@@ -1240,11 +1234,7 @@ static void ot_kmac_regs_write(void *opaque, hwaddr addr, uint64_t value,
12401234
break;
12411235
}
12421236
break;
1243-
case R_ENTROPY_SEED_0:
1244-
case R_ENTROPY_SEED_1:
1245-
case R_ENTROPY_SEED_2:
1246-
case R_ENTROPY_SEED_3:
1247-
case R_ENTROPY_SEED_4:
1237+
case R_ENTROPY_SEED:
12481238
/* TODO: implement entropy */
12491239
qemu_log_mask(LOG_UNIMP, "%s: R_ENTROPY_SEED_* is not supported\n",
12501240
__func__);

0 commit comments

Comments
 (0)