hw/i3c/dw-i3c: Add more register fields
Adds the rest of the Designware register fields. Signed-off-by: Joe Komlodi <komlodi@google.com> Reviewed-by: Patrick Venture <venture@google.com> Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com> Tested-by: Jithu Joseph <jithu.joseph@oss.qualcomm.com> Link: https://lore.kernel.org/qemu-devel/20260225021158.1586584-6-jamin_lin@aspeedtech.com Signed-off-by: Cédric Le Goater <clg@redhat.com>
Jamin Lin committed
Feb 25, 2026 at 02:12 UTC
d2b3d3b3a58bd2f355559cc490a3738da6e4111b
1 file changed
+199
hw/i3c/dw-i3c.c
+199
@@ -19,54 +19,253 @@
19
#include "trace.h"
20
21
REG32(DEVICE_CTRL, 0x00)
22
+ FIELD(DEVICE_CTRL, I3C_BROADCAST_ADDR_INC, 0, 1)
23
+ FIELD(DEVICE_CTRL, I2C_SLAVE_PRESENT, 7, 1)
24
+ FIELD(DEVICE_CTRL, HOT_JOIN_ACK_NACK_CTRL, 8, 1)
25
+ FIELD(DEVICE_CTRL, IDLE_CNT_MULTIPLIER, 24, 2)
26
+ FIELD(DEVICE_CTRL, SLV_ADAPT_TO_I2C_I3C_MODE, 27, 1)
27
+ FIELD(DEVICE_CTRL, DMA_HANDSHAKE_EN, 28, 1)
28
+ FIELD(DEVICE_CTRL, I3C_ABORT, 29, 1)
29
+ FIELD(DEVICE_CTRL, I3C_RESUME, 30, 1)
30
+ FIELD(DEVICE_CTRL, I3C_EN, 31, 1)
31
REG32(DEVICE_ADDR, 0x04)
32
+ FIELD(DEVICE_ADDR, STATIC_ADDR, 0, 7)
33
+ FIELD(DEVICE_ADDR, STATIC_ADDR_VALID, 15, 1)
34
+ FIELD(DEVICE_ADDR, DYNAMIC_ADDR, 16, 7)
35
+ FIELD(DEVICE_ADDR, DYNAMIC_ADDR_VALID, 31, 1)
36
REG32(HW_CAPABILITY, 0x08)
37
+ FIELD(HW_CAPABILITY, DEVICE_ROLE_CONFIG, 0, 3)
38
+ FIELD(HW_CAPABILITY, HDR_DDR, 3, 1)
39
+ FIELD(HW_CAPABILITY, HDR_TS, 4, 1)
40
REG32(COMMAND_QUEUE_PORT, 0x0c)
41
+ FIELD(COMMAND_QUEUE_PORT, CMD_ATTR, 0, 3)
42
+ /* Transfer command structure */
43
+ FIELD(COMMAND_QUEUE_PORT, TID, 3, 4)
44
+ FIELD(COMMAND_QUEUE_PORT, CMD, 7, 8)
45
+ FIELD(COMMAND_QUEUE_PORT, CP, 15, 1)
46
+ FIELD(COMMAND_QUEUE_PORT, DEV_INDEX, 16, 5)
47
+ FIELD(COMMAND_QUEUE_PORT, SPEED, 21, 3)
48
+ FIELD(COMMAND_QUEUE_PORT, ROC, 26, 1)
49
+ FIELD(COMMAND_QUEUE_PORT, SDAP, 27, 1)
50
+ FIELD(COMMAND_QUEUE_PORT, RNW, 28, 1)
51
+ FIELD(COMMAND_QUEUE_PORT, TOC, 30, 1)
52
+ FIELD(COMMAND_QUEUE_PORT, PEC, 31, 1)
53
+ /* Transfer argument data structure */
54
+ FIELD(COMMAND_QUEUE_PORT, DB, 8, 8)
55
+ FIELD(COMMAND_QUEUE_PORT, DL, 16, 16)
56
+ /* Short data argument data structure */
57
+ FIELD(COMMAND_QUEUE_PORT, BYTE_STRB, 3, 3)
58
+ FIELD(COMMAND_QUEUE_PORT, BYTE0, 8, 8)
59
+ FIELD(COMMAND_QUEUE_PORT, BYTE1, 16, 8)
60
+ FIELD(COMMAND_QUEUE_PORT, BYTE2, 24, 8)
61
+ /* Address assignment command structure */
62
+ /*
63
+ * bits 3..21 and 26..31 are the same as the transfer command structure, or
64
+ * marked as reserved.
65
+ */
66
+ FIELD(COMMAND_QUEUE_PORT, DEV_COUNT, 21, 3)
67
REG32(RESPONSE_QUEUE_PORT, 0x10)
68
+ FIELD(RESPONSE_QUEUE_PORT, DL, 0, 16)
69
+ FIELD(RESPONSE_QUEUE_PORT, CCCT, 16, 8)
70
+ FIELD(RESPONSE_QUEUE_PORT, TID, 24, 3)
71
+ FIELD(RESPONSE_QUEUE_PORT, ERR_STATUS, 28, 4)
72
REG32(RX_TX_DATA_PORT, 0x14)
73
REG32(IBI_QUEUE_STATUS, 0x18)
74
+ FIELD(IBI_QUEUE_STATUS, IBI_DATA_LEN, 0, 8)
75
+ FIELD(IBI_QUEUE_STATUS, IBI_ID, 8, 8)
76
+ FIELD(IBI_QUEUE_STATUS, LAST_STATUS, 24, 1)
77
+ FIELD(IBI_QUEUE_STATUS, ERROR, 30, 1)
78
+ FIELD(IBI_QUEUE_STATUS, IBI_STATUS, 31, 1)
79
REG32(IBI_QUEUE_DATA, 0x18)
80
REG32(QUEUE_THLD_CTRL, 0x1c)
81
+ FIELD(QUEUE_THLD_CTRL, CMD_BUF_EMPTY_THLD, 0, 8);
82
+ FIELD(QUEUE_THLD_CTRL, RESP_BUF_THLD, 8, 8);
83
+ FIELD(QUEUE_THLD_CTRL, IBI_DATA_THLD, 16, 5);
84
+ FIELD(QUEUE_THLD_CTRL, IBI_STATUS_THLD, 24, 8);
85
REG32(DATA_BUFFER_THLD_CTRL, 0x20)
86
+ FIELD(DATA_BUFFER_THLD_CTRL, TX_BUF_THLD, 0, 3)
87
+ FIELD(DATA_BUFFER_THLD_CTRL, RX_BUF_THLD, 8, 3)
88
+ FIELD(DATA_BUFFER_THLD_CTRL, TX_START_THLD, 16, 3)
89
+ FIELD(DATA_BUFFER_THLD_CTRL, RX_START_THLD, 24, 3)
90
REG32(IBI_QUEUE_CTRL, 0x24)
91
+ FIELD(IBI_QUEUE_CTRL, NOTIFY_REJECTED_HOT_JOIN, 0, 1)
92
+ FIELD(IBI_QUEUE_CTRL, NOTIFY_REJECTED_MASTER_REQ, 1, 1)
93
+ FIELD(IBI_QUEUE_CTRL, NOTIFY_REJECTED_SLAVE_IRQ, 3, 1)
94
REG32(IBI_MR_REQ_REJECT, 0x2c)
95
REG32(IBI_SIR_REQ_REJECT, 0x30)
96
REG32(RESET_CTRL, 0x34)
97
+ FIELD(RESET_CTRL, CORE_RESET, 0, 1)
98
+ FIELD(RESET_CTRL, CMD_QUEUE_RESET, 1, 1)
99
+ FIELD(RESET_CTRL, RESP_QUEUE_RESET, 2, 1)
100
+ FIELD(RESET_CTRL, TX_BUF_RESET, 3, 1)
101
+ FIELD(RESET_CTRL, RX_BUF_RESET, 4, 1)
102
+ FIELD(RESET_CTRL, IBI_QUEUE_RESET, 5, 1)
103
REG32(SLV_EVENT_CTRL, 0x38)
104
+ FIELD(SLV_EVENT_CTRL, SLV_INTERRUPT, 0, 1)
105
+ FIELD(SLV_EVENT_CTRL, MASTER_INTERRUPT, 1, 1)
106
+ FIELD(SLV_EVENT_CTRL, HOT_JOIN_INTERRUPT, 3, 1)
107
+ FIELD(SLV_EVENT_CTRL, ACTIVITY_STATE, 4, 2)
108
+ FIELD(SLV_EVENT_CTRL, MRL_UPDATED, 6, 1)
109
+ FIELD(SLV_EVENT_CTRL, MWL_UPDATED, 7, 1)
110
REG32(INTR_STATUS, 0x3c)
111
+ FIELD(INTR_STATUS, TX_THLD, 0, 1)
112
+ FIELD(INTR_STATUS, RX_THLD, 1, 1)
113
+ FIELD(INTR_STATUS, IBI_THLD, 2, 1)
114
+ FIELD(INTR_STATUS, CMD_QUEUE_RDY, 3, 1)
115
+ FIELD(INTR_STATUS, RESP_RDY, 4, 1)
116
+ FIELD(INTR_STATUS, TRANSFER_ABORT, 5, 1)
117
+ FIELD(INTR_STATUS, CCC_UPDATED, 6, 1)
118
+ FIELD(INTR_STATUS, DYN_ADDR_ASSGN, 8, 1)
119
+ FIELD(INTR_STATUS, TRANSFER_ERR, 9, 1)
120
+ FIELD(INTR_STATUS, DEFSLV, 10, 1)
121
+ FIELD(INTR_STATUS, READ_REQ_RECV, 11, 1)
122
+ FIELD(INTR_STATUS, IBI_UPDATED, 12, 1)
123
+ FIELD(INTR_STATUS, BUSOWNER_UPDATED, 13, 1)
124
REG32(INTR_STATUS_EN, 0x40)
125
+ FIELD(INTR_STATUS_EN, TX_THLD, 0, 1)
126
+ FIELD(INTR_STATUS_EN, RX_THLD, 1, 1)
127
+ FIELD(INTR_STATUS_EN, IBI_THLD, 2, 1)
128
+ FIELD(INTR_STATUS_EN, CMD_QUEUE_RDY, 3, 1)
129
+ FIELD(INTR_STATUS_EN, RESP_RDY, 4, 1)
130
+ FIELD(INTR_STATUS_EN, TRANSFER_ABORT, 5, 1)
131
+ FIELD(INTR_STATUS_EN, CCC_UPDATED, 6, 1)
132
+ FIELD(INTR_STATUS_EN, DYN_ADDR_ASSGN, 8, 1)
133
+ FIELD(INTR_STATUS_EN, TRANSFER_ERR, 9, 1)
134
+ FIELD(INTR_STATUS_EN, DEFSLV, 10, 1)
135
+ FIELD(INTR_STATUS_EN, READ_REQ_RECV, 11, 1)
136
+ FIELD(INTR_STATUS_EN, IBI_UPDATED, 12, 1)
137
+ FIELD(INTR_STATUS_EN, BUSOWNER_UPDATED, 13, 1)
138
REG32(INTR_SIGNAL_EN, 0x44)
139
+ FIELD(INTR_SIGNAL_EN, TX_THLD, 0, 1)
140
+ FIELD(INTR_SIGNAL_EN, RX_THLD, 1, 1)
141
+ FIELD(INTR_SIGNAL_EN, IBI_THLD, 2, 1)
142
+ FIELD(INTR_SIGNAL_EN, CMD_QUEUE_RDY, 3, 1)
143
+ FIELD(INTR_SIGNAL_EN, RESP_RDY, 4, 1)
144
+ FIELD(INTR_SIGNAL_EN, TRANSFER_ABORT, 5, 1)
145
+ FIELD(INTR_SIGNAL_EN, CCC_UPDATED, 6, 1)
146
+ FIELD(INTR_SIGNAL_EN, DYN_ADDR_ASSGN, 8, 1)
147
+ FIELD(INTR_SIGNAL_EN, TRANSFER_ERR, 9, 1)
148
+ FIELD(INTR_SIGNAL_EN, DEFSLV, 10, 1)
149
+ FIELD(INTR_SIGNAL_EN, READ_REQ_RECV, 11, 1)
150
+ FIELD(INTR_SIGNAL_EN, IBI_UPDATED, 12, 1)
151
+ FIELD(INTR_SIGNAL_EN, BUSOWNER_UPDATED, 13, 1)
152
REG32(INTR_FORCE, 0x48)
153
+ FIELD(INTR_FORCE, TX_THLD, 0, 1)
154
+ FIELD(INTR_FORCE, RX_THLD, 1, 1)
155
+ FIELD(INTR_FORCE, IBI_THLD, 2, 1)
156
+ FIELD(INTR_FORCE, CMD_QUEUE_RDY, 3, 1)
157
+ FIELD(INTR_FORCE, RESP_RDY, 4, 1)
158
+ FIELD(INTR_FORCE, TRANSFER_ABORT, 5, 1)
159
+ FIELD(INTR_FORCE, CCC_UPDATED, 6, 1)
160
+ FIELD(INTR_FORCE, DYN_ADDR_ASSGN, 8, 1)
161
+ FIELD(INTR_FORCE, TRANSFER_ERR, 9, 1)
162
+ FIELD(INTR_FORCE, DEFSLV, 10, 1)
163
+ FIELD(INTR_FORCE, READ_REQ_RECV, 11, 1)
164
+ FIELD(INTR_FORCE, IBI_UPDATED, 12, 1)
165
+ FIELD(INTR_FORCE, BUSOWNER_UPDATED, 13, 1)
166
REG32(QUEUE_STATUS_LEVEL, 0x4c)
167
+ FIELD(QUEUE_STATUS_LEVEL, CMD_QUEUE_EMPTY_LOC, 0, 8)
168
+ FIELD(QUEUE_STATUS_LEVEL, RESP_BUF_BLR, 8, 8)
169
+ FIELD(QUEUE_STATUS_LEVEL, IBI_BUF_BLR, 16, 8)
170
+ FIELD(QUEUE_STATUS_LEVEL, IBI_STATUS_CNT, 24, 5)
171
REG32(DATA_BUFFER_STATUS_LEVEL, 0x50)
172
+ FIELD(DATA_BUFFER_STATUS_LEVEL, TX_BUF_EMPTY_LOC, 0, 8)
173
+ FIELD(DATA_BUFFER_STATUS_LEVEL, RX_BUF_BLR, 16, 8)
174
REG32(PRESENT_STATE, 0x54)
175
+ FIELD(PRESENT_STATE, SCL_LINE_SIGNAL_LEVEL, 0, 1)
176
+ FIELD(PRESENT_STATE, SDA_LINE_SIGNAL_LEVEL, 1, 1)
177
+ FIELD(PRESENT_STATE, CURRENT_MASTER, 2, 1)
178
+ FIELD(PRESENT_STATE, CM_TFR_STATUS, 8, 6)
179
+ FIELD(PRESENT_STATE, CM_TFR_ST_STATUS, 16, 6)
180
+ FIELD(PRESENT_STATE, CMD_TID, 24, 4)
181
REG32(CCC_DEVICE_STATUS, 0x58)
182
+ FIELD(CCC_DEVICE_STATUS, PENDING_INTR, 0, 4)
183
+ FIELD(CCC_DEVICE_STATUS, PROTOCOL_ERR, 5, 1)
184
+ FIELD(CCC_DEVICE_STATUS, ACTIVITY_MODE, 6, 2)
185
+ FIELD(CCC_DEVICE_STATUS, UNDER_ERR, 8, 1)
186
+ FIELD(CCC_DEVICE_STATUS, SLV_BUSY, 9, 1)
187
+ FIELD(CCC_DEVICE_STATUS, OVERFLOW_ERR, 10, 1)
188
+ FIELD(CCC_DEVICE_STATUS, DATA_NOT_READY, 11, 1)
189
+ FIELD(CCC_DEVICE_STATUS, BUFFER_NOT_AVAIL, 12, 1)
190
REG32(DEVICE_ADDR_TABLE_POINTER, 0x5c)
191
FIELD(DEVICE_ADDR_TABLE_POINTER, DEPTH, 16, 16)
192
FIELD(DEVICE_ADDR_TABLE_POINTER, ADDR, 0, 16)
193
REG32(DEV_CHAR_TABLE_POINTER, 0x60)
194
+ FIELD(DEV_CHAR_TABLE_POINTER, P_DEV_CHAR_TABLE_START_ADDR, 0, 12)
195
+ FIELD(DEV_CHAR_TABLE_POINTER, DEV_CHAR_TABLE_DEPTH, 12, 7)
196
+ FIELD(DEV_CHAR_TABLE_POINTER, PRESENT_DEV_CHAR_TABLE_INDEX, 19, 3)
197
REG32(VENDOR_SPECIFIC_REG_POINTER, 0x6c)
198
+ FIELD(VENDOR_SPECIFIC_REG_POINTER, P_VENDOR_REG_START_ADDR, 0, 16)
199
REG32(SLV_MIPI_PID_VALUE, 0x70)
200
REG32(SLV_PID_VALUE, 0x74)
201
+ FIELD(SLV_PID_VALUE, SLV_PID_DCR, 0, 12)
202
+ FIELD(SLV_PID_VALUE, SLV_INST_ID, 12, 4)
203
+ FIELD(SLV_PID_VALUE, SLV_PART_ID, 16, 16)
204
REG32(SLV_CHAR_CTRL, 0x78)
205
+ FIELD(SLV_CHAR_CTRL, BCR, 0, 8)
206
+ FIELD(SLV_CHAR_CTRL, DCR, 8, 8)
207
+ FIELD(SLV_CHAR_CTRL, HDR_CAP, 16, 8)
208
REG32(SLV_MAX_LEN, 0x7c)
209
+ FIELD(SLV_MAX_LEN, MWL, 0, 16)
210
+ FIELD(SLV_MAX_LEN, MRL, 16, 16)
211
REG32(MAX_READ_TURNAROUND, 0x80)
212
REG32(MAX_DATA_SPEED, 0x84)
213
REG32(SLV_DEBUG_STATUS, 0x88)
214
REG32(SLV_INTR_REQ, 0x8c)
215
+ FIELD(SLV_INTR_REQ, SIR, 0, 1)
216
+ FIELD(SLV_INTR_REQ, SIR_CTRL, 1, 2)
217
+ FIELD(SLV_INTR_REQ, MIR, 3, 1)
218
+ FIELD(SLV_INTR_REQ, TS, 4, 1)
219
+ FIELD(SLV_INTR_REQ, IBI_STS, 8, 2)
220
+REG32(SLV_TSX_SYMBL_TIMING, 0x90)
221
+ FIELD(SLV_TSX_SYMBL_TIMING, SLV_TSX_SYMBL_CNT, 0, 6)
222
REG32(DEVICE_CTRL_EXTENDED, 0xb0)
223
+ FIELD(DEVICE_CTRL_EXTENDED, MODE, 0, 2)
224
+ FIELD(DEVICE_CTRL_EXTENDED, REQMST_ACK_CTRL, 3, 1)
225
REG32(SCL_I3C_OD_TIMING, 0xb4)
226
+ FIELD(SCL_I3C_OD_TIMING, I3C_OD_LCNT, 0, 8)
227
+ FIELD(SCL_I3C_OD_TIMING, I3C_OD_HCNT, 16, 8)
228
REG32(SCL_I3C_PP_TIMING, 0xb8)
229
+ FIELD(SCL_I3C_PP_TIMING, I3C_PP_LCNT, 0, 8)
230
+ FIELD(SCL_I3C_PP_TIMING, I3C_PP_HCNT, 16, 8)
231
REG32(SCL_I2C_FM_TIMING, 0xbc)
232
REG32(SCL_I2C_FMP_TIMING, 0xc0)
233
+ FIELD(SCL_I2C_FMP_TIMING, I2C_FMP_LCNT, 0, 16)
234
+ FIELD(SCL_I2C_FMP_TIMING, I2C_FMP_HCNT, 16, 8)
235
REG32(SCL_EXT_LCNT_TIMING, 0xc8)
236
REG32(SCL_EXT_TERMN_LCNT_TIMING, 0xcc)
237
REG32(BUS_FREE_TIMING, 0xd4)
238
REG32(BUS_IDLE_TIMING, 0xd8)
239
+ FIELD(BUS_IDLE_TIMING, BUS_IDLE_TIME, 0, 20)
240
REG32(I3C_VER_ID, 0xe0)
241
REG32(I3C_VER_TYPE, 0xe4)
242
REG32(EXTENDED_CAPABILITY, 0xe8)
243
REG32(SLAVE_CONFIG, 0xec)
244
+/* Device characteristic table fields */
245
+REG32(DEVICE_CHARACTERISTIC_TABLE_LOC1, 0x200)
246
+REG32(DEVICE_CHARACTERISTIC_TABLE_LOC_SECONDARY, 0x200)
247
+ FIELD(DEVICE_CHARACTERISTIC_TABLE_LOC_SECONDARY, DYNAMIC_ADDR, 0, 8)
248
+ FIELD(DEVICE_CHARACTERISTIC_TABLE_LOC_SECONDARY, DCR, 8, 8)
249
+ FIELD(DEVICE_CHARACTERISTIC_TABLE_LOC_SECONDARY, BCR, 16, 8)
250
+ FIELD(DEVICE_CHARACTERISTIC_TABLE_LOC_SECONDARY, STATIC_ADDR, 24, 8)
251
+REG32(DEVICE_CHARACTERISTIC_TABLE_LOC2, 0x204)
252
+ FIELD(DEVICE_CHARACTERISTIC_TABLE_LOC2, MSB_PID, 0, 16)
253
+REG32(DEVICE_CHARACTERISTIC_TABLE_LOC3, 0x208)
254
+ FIELD(DEVICE_CHARACTERISTIC_TABLE_LOC3, DCR, 0, 8)
255
+ FIELD(DEVICE_CHARACTERISTIC_TABLE_LOC3, BCR, 8, 8)
256
+REG32(DEVICE_CHARACTERISTIC_TABLE_LOC4, 0x20c)
257
+ FIELD(DEVICE_CHARACTERISTIC_TABLE_LOC4, DEV_DYNAMIC_ADDR, 0, 8)
258
+/* Dev addr table fields */
259
+REG32(DEVICE_ADDR_TABLE_LOC1, 0x280)
260
+ FIELD(DEVICE_ADDR_TABLE_LOC1, DEV_STATIC_ADDR, 0, 7)
261
+ FIELD(DEVICE_ADDR_TABLE_LOC1, IBI_PEC_EN, 11, 1)
262
+ FIELD(DEVICE_ADDR_TABLE_LOC1, IBI_WITH_DATA, 12, 1)
263
+ FIELD(DEVICE_ADDR_TABLE_LOC1, SIR_REJECT, 13, 1)
264
+ FIELD(DEVICE_ADDR_TABLE_LOC1, MR_REJECT, 14, 1)
265
+ FIELD(DEVICE_ADDR_TABLE_LOC1, DEV_DYNAMIC_ADDR, 16, 8)
266
+ FIELD(DEVICE_ADDR_TABLE_LOC1, IBI_ADDR_MASK, 24, 2)
267
+ FIELD(DEVICE_ADDR_TABLE_LOC1, DEV_NACK_RETRY_CNT, 29, 2)
268
+ FIELD(DEVICE_ADDR_TABLE_LOC1, LEGACY_I2C_DEVICE, 31, 1)
269
270
static const uint32_t dw_i3c_resets[DW_I3C_NR_REGS] = {
271
[R_HW_CAPABILITY] = 0x000e00bf,