]> git.ipfire.org Git - thirdparty/qemu.git/blob - hw/net/can/xlnx-zynqmp-can.c
hw/net: Constify VMState
[thirdparty/qemu.git] / hw / net / can / xlnx-zynqmp-can.c
1 /*
2 * QEMU model of the Xilinx ZynqMP CAN controller.
3 * This implementation is based on the following datasheet:
4 * https://www.xilinx.com/support/documentation/user_guides/ug1085-zynq-ultrascale-trm.pdf
5 *
6 * Copyright (c) 2020 Xilinx Inc.
7 *
8 * Written-by: Vikram Garhwal<fnu.vikram@xilinx.com>
9 *
10 * Based on QEMU CAN Device emulation implemented by Jin Yang, Deniz Eren and
11 * Pavel Pisa
12 *
13 * Permission is hereby granted, free of charge, to any person obtaining a copy
14 * of this software and associated documentation files (the "Software"), to deal
15 * in the Software without restriction, including without limitation the rights
16 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
17 * copies of the Software, and to permit persons to whom the Software is
18 * furnished to do so, subject to the following conditions:
19 *
20 * The above copyright notice and this permission notice shall be included in
21 * all copies or substantial portions of the Software.
22 *
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
26 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
27 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
28 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
29 * THE SOFTWARE.
30 */
31
32 #include "qemu/osdep.h"
33 #include "hw/sysbus.h"
34 #include "hw/register.h"
35 #include "hw/irq.h"
36 #include "qapi/error.h"
37 #include "qemu/bitops.h"
38 #include "qemu/log.h"
39 #include "qemu/cutils.h"
40 #include "migration/vmstate.h"
41 #include "hw/qdev-properties.h"
42 #include "net/can_emu.h"
43 #include "net/can_host.h"
44 #include "qemu/event_notifier.h"
45 #include "qom/object_interfaces.h"
46 #include "hw/net/xlnx-zynqmp-can.h"
47 #include "trace.h"
48
49 #ifndef XLNX_ZYNQMP_CAN_ERR_DEBUG
50 #define XLNX_ZYNQMP_CAN_ERR_DEBUG 0
51 #endif
52
53 #define MAX_DLC 8
54 #undef ERROR
55
56 REG32(SOFTWARE_RESET_REGISTER, 0x0)
57 FIELD(SOFTWARE_RESET_REGISTER, CEN, 1, 1)
58 FIELD(SOFTWARE_RESET_REGISTER, SRST, 0, 1)
59 REG32(MODE_SELECT_REGISTER, 0x4)
60 FIELD(MODE_SELECT_REGISTER, SNOOP, 2, 1)
61 FIELD(MODE_SELECT_REGISTER, LBACK, 1, 1)
62 FIELD(MODE_SELECT_REGISTER, SLEEP, 0, 1)
63 REG32(ARBITRATION_PHASE_BAUD_RATE_PRESCALER_REGISTER, 0x8)
64 FIELD(ARBITRATION_PHASE_BAUD_RATE_PRESCALER_REGISTER, BRP, 0, 8)
65 REG32(ARBITRATION_PHASE_BIT_TIMING_REGISTER, 0xc)
66 FIELD(ARBITRATION_PHASE_BIT_TIMING_REGISTER, SJW, 7, 2)
67 FIELD(ARBITRATION_PHASE_BIT_TIMING_REGISTER, TS2, 4, 3)
68 FIELD(ARBITRATION_PHASE_BIT_TIMING_REGISTER, TS1, 0, 4)
69 REG32(ERROR_COUNTER_REGISTER, 0x10)
70 FIELD(ERROR_COUNTER_REGISTER, REC, 8, 8)
71 FIELD(ERROR_COUNTER_REGISTER, TEC, 0, 8)
72 REG32(ERROR_STATUS_REGISTER, 0x14)
73 FIELD(ERROR_STATUS_REGISTER, ACKER, 4, 1)
74 FIELD(ERROR_STATUS_REGISTER, BERR, 3, 1)
75 FIELD(ERROR_STATUS_REGISTER, STER, 2, 1)
76 FIELD(ERROR_STATUS_REGISTER, FMER, 1, 1)
77 FIELD(ERROR_STATUS_REGISTER, CRCER, 0, 1)
78 REG32(STATUS_REGISTER, 0x18)
79 FIELD(STATUS_REGISTER, SNOOP, 12, 1)
80 FIELD(STATUS_REGISTER, ACFBSY, 11, 1)
81 FIELD(STATUS_REGISTER, TXFLL, 10, 1)
82 FIELD(STATUS_REGISTER, TXBFLL, 9, 1)
83 FIELD(STATUS_REGISTER, ESTAT, 7, 2)
84 FIELD(STATUS_REGISTER, ERRWRN, 6, 1)
85 FIELD(STATUS_REGISTER, BBSY, 5, 1)
86 FIELD(STATUS_REGISTER, BIDLE, 4, 1)
87 FIELD(STATUS_REGISTER, NORMAL, 3, 1)
88 FIELD(STATUS_REGISTER, SLEEP, 2, 1)
89 FIELD(STATUS_REGISTER, LBACK, 1, 1)
90 FIELD(STATUS_REGISTER, CONFIG, 0, 1)
91 REG32(INTERRUPT_STATUS_REGISTER, 0x1c)
92 FIELD(INTERRUPT_STATUS_REGISTER, TXFEMP, 14, 1)
93 FIELD(INTERRUPT_STATUS_REGISTER, TXFWMEMP, 13, 1)
94 FIELD(INTERRUPT_STATUS_REGISTER, RXFWMFLL, 12, 1)
95 FIELD(INTERRUPT_STATUS_REGISTER, WKUP, 11, 1)
96 FIELD(INTERRUPT_STATUS_REGISTER, SLP, 10, 1)
97 FIELD(INTERRUPT_STATUS_REGISTER, BSOFF, 9, 1)
98 FIELD(INTERRUPT_STATUS_REGISTER, ERROR, 8, 1)
99 FIELD(INTERRUPT_STATUS_REGISTER, RXNEMP, 7, 1)
100 FIELD(INTERRUPT_STATUS_REGISTER, RXOFLW, 6, 1)
101 FIELD(INTERRUPT_STATUS_REGISTER, RXUFLW, 5, 1)
102 FIELD(INTERRUPT_STATUS_REGISTER, RXOK, 4, 1)
103 FIELD(INTERRUPT_STATUS_REGISTER, TXBFLL, 3, 1)
104 FIELD(INTERRUPT_STATUS_REGISTER, TXFLL, 2, 1)
105 FIELD(INTERRUPT_STATUS_REGISTER, TXOK, 1, 1)
106 FIELD(INTERRUPT_STATUS_REGISTER, ARBLST, 0, 1)
107 REG32(INTERRUPT_ENABLE_REGISTER, 0x20)
108 FIELD(INTERRUPT_ENABLE_REGISTER, ETXFEMP, 14, 1)
109 FIELD(INTERRUPT_ENABLE_REGISTER, ETXFWMEMP, 13, 1)
110 FIELD(INTERRUPT_ENABLE_REGISTER, ERXFWMFLL, 12, 1)
111 FIELD(INTERRUPT_ENABLE_REGISTER, EWKUP, 11, 1)
112 FIELD(INTERRUPT_ENABLE_REGISTER, ESLP, 10, 1)
113 FIELD(INTERRUPT_ENABLE_REGISTER, EBSOFF, 9, 1)
114 FIELD(INTERRUPT_ENABLE_REGISTER, EERROR, 8, 1)
115 FIELD(INTERRUPT_ENABLE_REGISTER, ERXNEMP, 7, 1)
116 FIELD(INTERRUPT_ENABLE_REGISTER, ERXOFLW, 6, 1)
117 FIELD(INTERRUPT_ENABLE_REGISTER, ERXUFLW, 5, 1)
118 FIELD(INTERRUPT_ENABLE_REGISTER, ERXOK, 4, 1)
119 FIELD(INTERRUPT_ENABLE_REGISTER, ETXBFLL, 3, 1)
120 FIELD(INTERRUPT_ENABLE_REGISTER, ETXFLL, 2, 1)
121 FIELD(INTERRUPT_ENABLE_REGISTER, ETXOK, 1, 1)
122 FIELD(INTERRUPT_ENABLE_REGISTER, EARBLST, 0, 1)
123 REG32(INTERRUPT_CLEAR_REGISTER, 0x24)
124 FIELD(INTERRUPT_CLEAR_REGISTER, CTXFEMP, 14, 1)
125 FIELD(INTERRUPT_CLEAR_REGISTER, CTXFWMEMP, 13, 1)
126 FIELD(INTERRUPT_CLEAR_REGISTER, CRXFWMFLL, 12, 1)
127 FIELD(INTERRUPT_CLEAR_REGISTER, CWKUP, 11, 1)
128 FIELD(INTERRUPT_CLEAR_REGISTER, CSLP, 10, 1)
129 FIELD(INTERRUPT_CLEAR_REGISTER, CBSOFF, 9, 1)
130 FIELD(INTERRUPT_CLEAR_REGISTER, CERROR, 8, 1)
131 FIELD(INTERRUPT_CLEAR_REGISTER, CRXNEMP, 7, 1)
132 FIELD(INTERRUPT_CLEAR_REGISTER, CRXOFLW, 6, 1)
133 FIELD(INTERRUPT_CLEAR_REGISTER, CRXUFLW, 5, 1)
134 FIELD(INTERRUPT_CLEAR_REGISTER, CRXOK, 4, 1)
135 FIELD(INTERRUPT_CLEAR_REGISTER, CTXBFLL, 3, 1)
136 FIELD(INTERRUPT_CLEAR_REGISTER, CTXFLL, 2, 1)
137 FIELD(INTERRUPT_CLEAR_REGISTER, CTXOK, 1, 1)
138 FIELD(INTERRUPT_CLEAR_REGISTER, CARBLST, 0, 1)
139 REG32(TIMESTAMP_REGISTER, 0x28)
140 FIELD(TIMESTAMP_REGISTER, CTS, 0, 1)
141 REG32(WIR, 0x2c)
142 FIELD(WIR, EW, 8, 8)
143 FIELD(WIR, FW, 0, 8)
144 REG32(TXFIFO_ID, 0x30)
145 FIELD(TXFIFO_ID, IDH, 21, 11)
146 FIELD(TXFIFO_ID, SRRRTR, 20, 1)
147 FIELD(TXFIFO_ID, IDE, 19, 1)
148 FIELD(TXFIFO_ID, IDL, 1, 18)
149 FIELD(TXFIFO_ID, RTR, 0, 1)
150 REG32(TXFIFO_DLC, 0x34)
151 FIELD(TXFIFO_DLC, DLC, 28, 4)
152 REG32(TXFIFO_DATA1, 0x38)
153 FIELD(TXFIFO_DATA1, DB0, 24, 8)
154 FIELD(TXFIFO_DATA1, DB1, 16, 8)
155 FIELD(TXFIFO_DATA1, DB2, 8, 8)
156 FIELD(TXFIFO_DATA1, DB3, 0, 8)
157 REG32(TXFIFO_DATA2, 0x3c)
158 FIELD(TXFIFO_DATA2, DB4, 24, 8)
159 FIELD(TXFIFO_DATA2, DB5, 16, 8)
160 FIELD(TXFIFO_DATA2, DB6, 8, 8)
161 FIELD(TXFIFO_DATA2, DB7, 0, 8)
162 REG32(TXHPB_ID, 0x40)
163 FIELD(TXHPB_ID, IDH, 21, 11)
164 FIELD(TXHPB_ID, SRRRTR, 20, 1)
165 FIELD(TXHPB_ID, IDE, 19, 1)
166 FIELD(TXHPB_ID, IDL, 1, 18)
167 FIELD(TXHPB_ID, RTR, 0, 1)
168 REG32(TXHPB_DLC, 0x44)
169 FIELD(TXHPB_DLC, DLC, 28, 4)
170 REG32(TXHPB_DATA1, 0x48)
171 FIELD(TXHPB_DATA1, DB0, 24, 8)
172 FIELD(TXHPB_DATA1, DB1, 16, 8)
173 FIELD(TXHPB_DATA1, DB2, 8, 8)
174 FIELD(TXHPB_DATA1, DB3, 0, 8)
175 REG32(TXHPB_DATA2, 0x4c)
176 FIELD(TXHPB_DATA2, DB4, 24, 8)
177 FIELD(TXHPB_DATA2, DB5, 16, 8)
178 FIELD(TXHPB_DATA2, DB6, 8, 8)
179 FIELD(TXHPB_DATA2, DB7, 0, 8)
180 REG32(RXFIFO_ID, 0x50)
181 FIELD(RXFIFO_ID, IDH, 21, 11)
182 FIELD(RXFIFO_ID, SRRRTR, 20, 1)
183 FIELD(RXFIFO_ID, IDE, 19, 1)
184 FIELD(RXFIFO_ID, IDL, 1, 18)
185 FIELD(RXFIFO_ID, RTR, 0, 1)
186 REG32(RXFIFO_DLC, 0x54)
187 FIELD(RXFIFO_DLC, DLC, 28, 4)
188 FIELD(RXFIFO_DLC, RXT, 0, 16)
189 REG32(RXFIFO_DATA1, 0x58)
190 FIELD(RXFIFO_DATA1, DB0, 24, 8)
191 FIELD(RXFIFO_DATA1, DB1, 16, 8)
192 FIELD(RXFIFO_DATA1, DB2, 8, 8)
193 FIELD(RXFIFO_DATA1, DB3, 0, 8)
194 REG32(RXFIFO_DATA2, 0x5c)
195 FIELD(RXFIFO_DATA2, DB4, 24, 8)
196 FIELD(RXFIFO_DATA2, DB5, 16, 8)
197 FIELD(RXFIFO_DATA2, DB6, 8, 8)
198 FIELD(RXFIFO_DATA2, DB7, 0, 8)
199 REG32(AFR, 0x60)
200 FIELD(AFR, UAF4, 3, 1)
201 FIELD(AFR, UAF3, 2, 1)
202 FIELD(AFR, UAF2, 1, 1)
203 FIELD(AFR, UAF1, 0, 1)
204 REG32(AFMR1, 0x64)
205 FIELD(AFMR1, AMIDH, 21, 11)
206 FIELD(AFMR1, AMSRR, 20, 1)
207 FIELD(AFMR1, AMIDE, 19, 1)
208 FIELD(AFMR1, AMIDL, 1, 18)
209 FIELD(AFMR1, AMRTR, 0, 1)
210 REG32(AFIR1, 0x68)
211 FIELD(AFIR1, AIIDH, 21, 11)
212 FIELD(AFIR1, AISRR, 20, 1)
213 FIELD(AFIR1, AIIDE, 19, 1)
214 FIELD(AFIR1, AIIDL, 1, 18)
215 FIELD(AFIR1, AIRTR, 0, 1)
216 REG32(AFMR2, 0x6c)
217 FIELD(AFMR2, AMIDH, 21, 11)
218 FIELD(AFMR2, AMSRR, 20, 1)
219 FIELD(AFMR2, AMIDE, 19, 1)
220 FIELD(AFMR2, AMIDL, 1, 18)
221 FIELD(AFMR2, AMRTR, 0, 1)
222 REG32(AFIR2, 0x70)
223 FIELD(AFIR2, AIIDH, 21, 11)
224 FIELD(AFIR2, AISRR, 20, 1)
225 FIELD(AFIR2, AIIDE, 19, 1)
226 FIELD(AFIR2, AIIDL, 1, 18)
227 FIELD(AFIR2, AIRTR, 0, 1)
228 REG32(AFMR3, 0x74)
229 FIELD(AFMR3, AMIDH, 21, 11)
230 FIELD(AFMR3, AMSRR, 20, 1)
231 FIELD(AFMR3, AMIDE, 19, 1)
232 FIELD(AFMR3, AMIDL, 1, 18)
233 FIELD(AFMR3, AMRTR, 0, 1)
234 REG32(AFIR3, 0x78)
235 FIELD(AFIR3, AIIDH, 21, 11)
236 FIELD(AFIR3, AISRR, 20, 1)
237 FIELD(AFIR3, AIIDE, 19, 1)
238 FIELD(AFIR3, AIIDL, 1, 18)
239 FIELD(AFIR3, AIRTR, 0, 1)
240 REG32(AFMR4, 0x7c)
241 FIELD(AFMR4, AMIDH, 21, 11)
242 FIELD(AFMR4, AMSRR, 20, 1)
243 FIELD(AFMR4, AMIDE, 19, 1)
244 FIELD(AFMR4, AMIDL, 1, 18)
245 FIELD(AFMR4, AMRTR, 0, 1)
246 REG32(AFIR4, 0x80)
247 FIELD(AFIR4, AIIDH, 21, 11)
248 FIELD(AFIR4, AISRR, 20, 1)
249 FIELD(AFIR4, AIIDE, 19, 1)
250 FIELD(AFIR4, AIIDL, 1, 18)
251 FIELD(AFIR4, AIRTR, 0, 1)
252
253 static void can_update_irq(XlnxZynqMPCANState *s)
254 {
255 uint32_t irq;
256
257 /* Watermark register interrupts. */
258 if ((fifo32_num_free(&s->tx_fifo) / CAN_FRAME_SIZE) >
259 ARRAY_FIELD_EX32(s->regs, WIR, EW)) {
260 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, TXFWMEMP, 1);
261 }
262
263 if ((fifo32_num_used(&s->rx_fifo) / CAN_FRAME_SIZE) >
264 ARRAY_FIELD_EX32(s->regs, WIR, FW)) {
265 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, RXFWMFLL, 1);
266 }
267
268 /* RX Interrupts. */
269 if (fifo32_num_used(&s->rx_fifo) >= CAN_FRAME_SIZE) {
270 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, RXNEMP, 1);
271 }
272
273 /* TX interrupts. */
274 if (fifo32_is_empty(&s->tx_fifo)) {
275 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, TXFEMP, 1);
276 }
277
278 if (fifo32_is_full(&s->tx_fifo)) {
279 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, TXFLL, 1);
280 }
281
282 if (fifo32_is_full(&s->txhpb_fifo)) {
283 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, TXBFLL, 1);
284 }
285
286 irq = s->regs[R_INTERRUPT_STATUS_REGISTER];
287 irq &= s->regs[R_INTERRUPT_ENABLE_REGISTER];
288
289 trace_xlnx_can_update_irq(s->regs[R_INTERRUPT_STATUS_REGISTER],
290 s->regs[R_INTERRUPT_ENABLE_REGISTER], irq);
291 qemu_set_irq(s->irq, irq);
292 }
293
294 static void can_ier_post_write(RegisterInfo *reg, uint64_t val)
295 {
296 XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
297
298 can_update_irq(s);
299 }
300
301 static uint64_t can_icr_pre_write(RegisterInfo *reg, uint64_t val)
302 {
303 XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
304
305 s->regs[R_INTERRUPT_STATUS_REGISTER] &= ~val;
306 can_update_irq(s);
307
308 return 0;
309 }
310
311 static void can_config_reset(XlnxZynqMPCANState *s)
312 {
313 /* Reset all the configuration registers. */
314 register_reset(&s->reg_info[R_SOFTWARE_RESET_REGISTER]);
315 register_reset(&s->reg_info[R_MODE_SELECT_REGISTER]);
316 register_reset(
317 &s->reg_info[R_ARBITRATION_PHASE_BAUD_RATE_PRESCALER_REGISTER]);
318 register_reset(&s->reg_info[R_ARBITRATION_PHASE_BIT_TIMING_REGISTER]);
319 register_reset(&s->reg_info[R_STATUS_REGISTER]);
320 register_reset(&s->reg_info[R_INTERRUPT_STATUS_REGISTER]);
321 register_reset(&s->reg_info[R_INTERRUPT_ENABLE_REGISTER]);
322 register_reset(&s->reg_info[R_INTERRUPT_CLEAR_REGISTER]);
323 register_reset(&s->reg_info[R_WIR]);
324 }
325
326 static void can_config_mode(XlnxZynqMPCANState *s)
327 {
328 register_reset(&s->reg_info[R_ERROR_COUNTER_REGISTER]);
329 register_reset(&s->reg_info[R_ERROR_STATUS_REGISTER]);
330
331 /* Put XlnxZynqMPCAN in configuration mode. */
332 ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, CONFIG, 1);
333 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, WKUP, 0);
334 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, SLP, 0);
335 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, BSOFF, 0);
336 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, ERROR, 0);
337 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, RXOFLW, 0);
338 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, RXOK, 0);
339 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, TXOK, 0);
340 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, ARBLST, 0);
341
342 can_update_irq(s);
343 }
344
345 static void update_status_register_mode_bits(XlnxZynqMPCANState *s)
346 {
347 bool sleep_status = ARRAY_FIELD_EX32(s->regs, STATUS_REGISTER, SLEEP);
348 bool sleep_mode = ARRAY_FIELD_EX32(s->regs, MODE_SELECT_REGISTER, SLEEP);
349 /* Wake up interrupt bit. */
350 bool wakeup_irq_val = sleep_status && (sleep_mode == 0);
351 /* Sleep interrupt bit. */
352 bool sleep_irq_val = sleep_mode && (sleep_status == 0);
353
354 /* Clear previous core mode status bits. */
355 ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, LBACK, 0);
356 ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, SLEEP, 0);
357 ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, SNOOP, 0);
358 ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, NORMAL, 0);
359
360 /* set current mode bit and generate irqs accordingly. */
361 if (ARRAY_FIELD_EX32(s->regs, MODE_SELECT_REGISTER, LBACK)) {
362 ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, LBACK, 1);
363 } else if (ARRAY_FIELD_EX32(s->regs, MODE_SELECT_REGISTER, SLEEP)) {
364 ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, SLEEP, 1);
365 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, SLP,
366 sleep_irq_val);
367 } else if (ARRAY_FIELD_EX32(s->regs, MODE_SELECT_REGISTER, SNOOP)) {
368 ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, SNOOP, 1);
369 } else {
370 /*
371 * If all bits are zero then XlnxZynqMPCAN is set in normal mode.
372 */
373 ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, NORMAL, 1);
374 /* Set wakeup interrupt bit. */
375 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, WKUP,
376 wakeup_irq_val);
377 }
378
379 can_update_irq(s);
380 }
381
382 static void can_exit_sleep_mode(XlnxZynqMPCANState *s)
383 {
384 ARRAY_FIELD_DP32(s->regs, MODE_SELECT_REGISTER, SLEEP, 0);
385 update_status_register_mode_bits(s);
386 }
387
388 static void generate_frame(qemu_can_frame *frame, uint32_t *data)
389 {
390 frame->can_id = data[0];
391 frame->can_dlc = FIELD_EX32(data[1], TXFIFO_DLC, DLC);
392
393 frame->data[0] = FIELD_EX32(data[2], TXFIFO_DATA1, DB3);
394 frame->data[1] = FIELD_EX32(data[2], TXFIFO_DATA1, DB2);
395 frame->data[2] = FIELD_EX32(data[2], TXFIFO_DATA1, DB1);
396 frame->data[3] = FIELD_EX32(data[2], TXFIFO_DATA1, DB0);
397
398 frame->data[4] = FIELD_EX32(data[3], TXFIFO_DATA2, DB7);
399 frame->data[5] = FIELD_EX32(data[3], TXFIFO_DATA2, DB6);
400 frame->data[6] = FIELD_EX32(data[3], TXFIFO_DATA2, DB5);
401 frame->data[7] = FIELD_EX32(data[3], TXFIFO_DATA2, DB4);
402 }
403
404 static bool tx_ready_check(XlnxZynqMPCANState *s)
405 {
406 if (ARRAY_FIELD_EX32(s->regs, SOFTWARE_RESET_REGISTER, SRST)) {
407 g_autofree char *path = object_get_canonical_path(OBJECT(s));
408
409 qemu_log_mask(LOG_GUEST_ERROR, "%s: Attempting to transfer data while"
410 " data while controller is in reset mode.\n",
411 path);
412 return false;
413 }
414
415 if (ARRAY_FIELD_EX32(s->regs, SOFTWARE_RESET_REGISTER, CEN) == 0) {
416 g_autofree char *path = object_get_canonical_path(OBJECT(s));
417
418 qemu_log_mask(LOG_GUEST_ERROR, "%s: Attempting to transfer"
419 " data while controller is in configuration mode. Reset"
420 " the core so operations can start fresh.\n",
421 path);
422 return false;
423 }
424
425 if (ARRAY_FIELD_EX32(s->regs, STATUS_REGISTER, SNOOP)) {
426 g_autofree char *path = object_get_canonical_path(OBJECT(s));
427
428 qemu_log_mask(LOG_GUEST_ERROR, "%s: Attempting to transfer"
429 " data while controller is in SNOOP MODE.\n",
430 path);
431 return false;
432 }
433
434 return true;
435 }
436
437 static void read_tx_frame(XlnxZynqMPCANState *s, Fifo32 *fifo, uint32_t *data)
438 {
439 unsigned used = fifo32_num_used(fifo);
440 bool is_txhpb = fifo == &s->txhpb_fifo;
441
442 assert(used > 0);
443 used %= CAN_FRAME_SIZE;
444
445 /*
446 * Frame Message Format
447 *
448 * Each frame includes four words (16 bytes). Software must read and write
449 * all four words regardless of the actual number of data bytes and valid
450 * fields in the message.
451 * If software misbehave (not writing all four words), we use the previous
452 * registers content to initialize each missing word.
453 *
454 * If used is 1 then ID, DLC and DATA1 are missing.
455 * if used is 2 then ID and DLC are missing.
456 * if used is 3 then only ID is missing.
457 */
458 if (used > 0) {
459 data[0] = s->regs[is_txhpb ? R_TXHPB_ID : R_TXFIFO_ID];
460 } else {
461 data[0] = fifo32_pop(fifo);
462 }
463 if (used == 1 || used == 2) {
464 data[1] = s->regs[is_txhpb ? R_TXHPB_DLC : R_TXFIFO_DLC];
465 } else {
466 data[1] = fifo32_pop(fifo);
467 }
468 if (used == 1) {
469 data[2] = s->regs[is_txhpb ? R_TXHPB_DATA1 : R_TXFIFO_DATA1];
470 } else {
471 data[2] = fifo32_pop(fifo);
472 }
473 /* DATA2 triggered the transfer thus is always available */
474 data[3] = fifo32_pop(fifo);
475
476 if (used) {
477 qemu_log_mask(LOG_GUEST_ERROR,
478 "%s: Incomplete CAN frame (only %u/%u slots used)\n",
479 TYPE_XLNX_ZYNQMP_CAN, used, CAN_FRAME_SIZE);
480 }
481 }
482
483 static void transfer_fifo(XlnxZynqMPCANState *s, Fifo32 *fifo)
484 {
485 qemu_can_frame frame;
486 uint32_t data[CAN_FRAME_SIZE];
487 int i;
488 bool can_tx = tx_ready_check(s);
489
490 if (!can_tx) {
491 g_autofree char *path = object_get_canonical_path(OBJECT(s));
492
493 qemu_log_mask(LOG_GUEST_ERROR, "%s: Controller is not enabled for data"
494 " transfer.\n", path);
495 can_update_irq(s);
496 return;
497 }
498
499 while (!fifo32_is_empty(fifo)) {
500 read_tx_frame(s, fifo, data);
501
502 if (ARRAY_FIELD_EX32(s->regs, STATUS_REGISTER, LBACK)) {
503 /*
504 * Controller is in loopback. In Loopback mode, the CAN core
505 * transmits a recessive bitstream on to the XlnxZynqMPCAN Bus.
506 * Any message transmitted is looped back to the RX line and
507 * acknowledged. The XlnxZynqMPCAN core receives any message
508 * that it transmits.
509 */
510 if (fifo32_is_full(&s->rx_fifo)) {
511 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, RXOFLW, 1);
512 } else {
513 for (i = 0; i < CAN_FRAME_SIZE; i++) {
514 fifo32_push(&s->rx_fifo, data[i]);
515 }
516
517 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, RXOK, 1);
518 }
519 } else {
520 /* Normal mode Tx. */
521 generate_frame(&frame, data);
522
523 trace_xlnx_can_tx_data(frame.can_id, frame.can_dlc,
524 frame.data[0], frame.data[1],
525 frame.data[2], frame.data[3],
526 frame.data[4], frame.data[5],
527 frame.data[6], frame.data[7]);
528 can_bus_client_send(&s->bus_client, &frame, 1);
529 }
530 }
531
532 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, TXOK, 1);
533 ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, TXBFLL, 0);
534
535 if (ARRAY_FIELD_EX32(s->regs, STATUS_REGISTER, SLEEP)) {
536 can_exit_sleep_mode(s);
537 }
538
539 can_update_irq(s);
540 }
541
542 static uint64_t can_srr_pre_write(RegisterInfo *reg, uint64_t val)
543 {
544 XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
545
546 ARRAY_FIELD_DP32(s->regs, SOFTWARE_RESET_REGISTER, CEN,
547 FIELD_EX32(val, SOFTWARE_RESET_REGISTER, CEN));
548
549 if (FIELD_EX32(val, SOFTWARE_RESET_REGISTER, SRST)) {
550 trace_xlnx_can_reset(val);
551
552 /* First, core will do software reset then will enter in config mode. */
553 can_config_reset(s);
554 }
555
556 if (ARRAY_FIELD_EX32(s->regs, SOFTWARE_RESET_REGISTER, CEN) == 0) {
557 can_config_mode(s);
558 } else {
559 /*
560 * Leave config mode. Now XlnxZynqMPCAN core will enter normal,
561 * sleep, snoop or loopback mode depending upon LBACK, SLEEP, SNOOP
562 * register states.
563 */
564 ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, CONFIG, 0);
565
566 ptimer_transaction_begin(s->can_timer);
567 ptimer_set_count(s->can_timer, 0);
568 ptimer_transaction_commit(s->can_timer);
569
570 /* XlnxZynqMPCAN is out of config mode. It will send pending data. */
571 transfer_fifo(s, &s->txhpb_fifo);
572 transfer_fifo(s, &s->tx_fifo);
573 }
574
575 update_status_register_mode_bits(s);
576
577 return s->regs[R_SOFTWARE_RESET_REGISTER];
578 }
579
580 static uint64_t can_msr_pre_write(RegisterInfo *reg, uint64_t val)
581 {
582 XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
583 uint8_t multi_mode;
584
585 /*
586 * Multiple mode set check. This is done to make sure user doesn't set
587 * multiple modes.
588 */
589 multi_mode = FIELD_EX32(val, MODE_SELECT_REGISTER, LBACK) +
590 FIELD_EX32(val, MODE_SELECT_REGISTER, SLEEP) +
591 FIELD_EX32(val, MODE_SELECT_REGISTER, SNOOP);
592
593 if (multi_mode > 1) {
594 g_autofree char *path = object_get_canonical_path(OBJECT(s));
595
596 qemu_log_mask(LOG_GUEST_ERROR, "%s: Attempting to config"
597 " several modes simultaneously. One mode will be selected"
598 " according to their priority: LBACK > SLEEP > SNOOP.\n",
599 path);
600 }
601
602 if (ARRAY_FIELD_EX32(s->regs, SOFTWARE_RESET_REGISTER, CEN) == 0) {
603 /* We are in configuration mode, any mode can be selected. */
604 s->regs[R_MODE_SELECT_REGISTER] = val;
605 } else {
606 bool sleep_mode_bit = FIELD_EX32(val, MODE_SELECT_REGISTER, SLEEP);
607
608 ARRAY_FIELD_DP32(s->regs, MODE_SELECT_REGISTER, SLEEP, sleep_mode_bit);
609
610 if (FIELD_EX32(val, MODE_SELECT_REGISTER, LBACK)) {
611 g_autofree char *path = object_get_canonical_path(OBJECT(s));
612
613 qemu_log_mask(LOG_GUEST_ERROR, "%s: Attempting to set"
614 " LBACK mode without setting CEN bit as 0.\n",
615 path);
616 } else if (FIELD_EX32(val, MODE_SELECT_REGISTER, SNOOP)) {
617 g_autofree char *path = object_get_canonical_path(OBJECT(s));
618
619 qemu_log_mask(LOG_GUEST_ERROR, "%s: Attempting to set"
620 " SNOOP mode without setting CEN bit as 0.\n",
621 path);
622 }
623
624 update_status_register_mode_bits(s);
625 }
626
627 return s->regs[R_MODE_SELECT_REGISTER];
628 }
629
630 static uint64_t can_brpr_pre_write(RegisterInfo *reg, uint64_t val)
631 {
632 XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
633
634 /* Only allow writes when in config mode. */
635 if (ARRAY_FIELD_EX32(s->regs, SOFTWARE_RESET_REGISTER, CEN)) {
636 return s->regs[R_ARBITRATION_PHASE_BAUD_RATE_PRESCALER_REGISTER];
637 }
638
639 return val;
640 }
641
642 static uint64_t can_btr_pre_write(RegisterInfo *reg, uint64_t val)
643 {
644 XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
645
646 /* Only allow writes when in config mode. */
647 if (ARRAY_FIELD_EX32(s->regs, SOFTWARE_RESET_REGISTER, CEN)) {
648 return s->regs[R_ARBITRATION_PHASE_BIT_TIMING_REGISTER];
649 }
650
651 return val;
652 }
653
654 static uint64_t can_tcr_pre_write(RegisterInfo *reg, uint64_t val)
655 {
656 XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
657
658 if (FIELD_EX32(val, TIMESTAMP_REGISTER, CTS)) {
659 ptimer_transaction_begin(s->can_timer);
660 ptimer_set_count(s->can_timer, 0);
661 ptimer_transaction_commit(s->can_timer);
662 }
663
664 return 0;
665 }
666
667 static void update_rx_fifo(XlnxZynqMPCANState *s, const qemu_can_frame *frame)
668 {
669 bool filter_pass = false;
670 uint16_t timestamp = 0;
671
672 /* If no filter is enabled. Message will be stored in FIFO. */
673 if (!((ARRAY_FIELD_EX32(s->regs, AFR, UAF1)) |
674 (ARRAY_FIELD_EX32(s->regs, AFR, UAF2)) |
675 (ARRAY_FIELD_EX32(s->regs, AFR, UAF3)) |
676 (ARRAY_FIELD_EX32(s->regs, AFR, UAF4)))) {
677 filter_pass = true;
678 }
679
680 /*
681 * Messages that pass any of the acceptance filters will be stored in
682 * the RX FIFO.
683 */
684 if (ARRAY_FIELD_EX32(s->regs, AFR, UAF1)) {
685 uint32_t id_masked = s->regs[R_AFMR1] & frame->can_id;
686 uint32_t filter_id_masked = s->regs[R_AFMR1] & s->regs[R_AFIR1];
687
688 if (filter_id_masked == id_masked) {
689 filter_pass = true;
690 }
691 }
692
693 if (ARRAY_FIELD_EX32(s->regs, AFR, UAF2)) {
694 uint32_t id_masked = s->regs[R_AFMR2] & frame->can_id;
695 uint32_t filter_id_masked = s->regs[R_AFMR2] & s->regs[R_AFIR2];
696
697 if (filter_id_masked == id_masked) {
698 filter_pass = true;
699 }
700 }
701
702 if (ARRAY_FIELD_EX32(s->regs, AFR, UAF3)) {
703 uint32_t id_masked = s->regs[R_AFMR3] & frame->can_id;
704 uint32_t filter_id_masked = s->regs[R_AFMR3] & s->regs[R_AFIR3];
705
706 if (filter_id_masked == id_masked) {
707 filter_pass = true;
708 }
709 }
710
711 if (ARRAY_FIELD_EX32(s->regs, AFR, UAF4)) {
712 uint32_t id_masked = s->regs[R_AFMR4] & frame->can_id;
713 uint32_t filter_id_masked = s->regs[R_AFMR4] & s->regs[R_AFIR4];
714
715 if (filter_id_masked == id_masked) {
716 filter_pass = true;
717 }
718 }
719
720 if (!filter_pass) {
721 trace_xlnx_can_rx_fifo_filter_reject(frame->can_id, frame->can_dlc);
722 return;
723 }
724
725 /* Store the message in fifo if it passed through any of the filters. */
726 if (filter_pass && frame->can_dlc <= MAX_DLC) {
727
728 if (fifo32_is_full(&s->rx_fifo)) {
729 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, RXOFLW, 1);
730 } else {
731 timestamp = CAN_TIMER_MAX - ptimer_get_count(s->can_timer);
732
733 fifo32_push(&s->rx_fifo, frame->can_id);
734
735 fifo32_push(&s->rx_fifo, deposit32(0, R_RXFIFO_DLC_DLC_SHIFT,
736 R_RXFIFO_DLC_DLC_LENGTH,
737 frame->can_dlc) |
738 deposit32(0, R_RXFIFO_DLC_RXT_SHIFT,
739 R_RXFIFO_DLC_RXT_LENGTH,
740 timestamp));
741
742 /* First 32 bit of the data. */
743 fifo32_push(&s->rx_fifo, deposit32(0, R_RXFIFO_DATA1_DB3_SHIFT,
744 R_RXFIFO_DATA1_DB3_LENGTH,
745 frame->data[0]) |
746 deposit32(0, R_RXFIFO_DATA1_DB2_SHIFT,
747 R_RXFIFO_DATA1_DB2_LENGTH,
748 frame->data[1]) |
749 deposit32(0, R_RXFIFO_DATA1_DB1_SHIFT,
750 R_RXFIFO_DATA1_DB1_LENGTH,
751 frame->data[2]) |
752 deposit32(0, R_RXFIFO_DATA1_DB0_SHIFT,
753 R_RXFIFO_DATA1_DB0_LENGTH,
754 frame->data[3]));
755 /* Last 32 bit of the data. */
756 fifo32_push(&s->rx_fifo, deposit32(0, R_RXFIFO_DATA2_DB7_SHIFT,
757 R_RXFIFO_DATA2_DB7_LENGTH,
758 frame->data[4]) |
759 deposit32(0, R_RXFIFO_DATA2_DB6_SHIFT,
760 R_RXFIFO_DATA2_DB6_LENGTH,
761 frame->data[5]) |
762 deposit32(0, R_RXFIFO_DATA2_DB5_SHIFT,
763 R_RXFIFO_DATA2_DB5_LENGTH,
764 frame->data[6]) |
765 deposit32(0, R_RXFIFO_DATA2_DB4_SHIFT,
766 R_RXFIFO_DATA2_DB4_LENGTH,
767 frame->data[7]));
768
769 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, RXOK, 1);
770 trace_xlnx_can_rx_data(frame->can_id, frame->can_dlc,
771 frame->data[0], frame->data[1],
772 frame->data[2], frame->data[3],
773 frame->data[4], frame->data[5],
774 frame->data[6], frame->data[7]);
775 }
776
777 can_update_irq(s);
778 }
779 }
780
781 static uint64_t can_rxfifo_post_read_id(RegisterInfo *reg, uint64_t val)
782 {
783 XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
784 unsigned used = fifo32_num_used(&s->rx_fifo);
785
786 if (used < CAN_FRAME_SIZE) {
787 ARRAY_FIELD_DP32(s->regs, INTERRUPT_STATUS_REGISTER, RXUFLW, 1);
788 } else {
789 val = s->regs[R_RXFIFO_ID] = fifo32_pop(&s->rx_fifo);
790 s->regs[R_RXFIFO_DLC] = fifo32_pop(&s->rx_fifo);
791 s->regs[R_RXFIFO_DATA1] = fifo32_pop(&s->rx_fifo);
792 s->regs[R_RXFIFO_DATA2] = fifo32_pop(&s->rx_fifo);
793 }
794
795 can_update_irq(s);
796 return val;
797 }
798
799 static void can_filter_enable_post_write(RegisterInfo *reg, uint64_t val)
800 {
801 XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
802
803 if (ARRAY_FIELD_EX32(s->regs, AFR, UAF1) &&
804 ARRAY_FIELD_EX32(s->regs, AFR, UAF2) &&
805 ARRAY_FIELD_EX32(s->regs, AFR, UAF3) &&
806 ARRAY_FIELD_EX32(s->regs, AFR, UAF4)) {
807 ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, ACFBSY, 1);
808 } else {
809 ARRAY_FIELD_DP32(s->regs, STATUS_REGISTER, ACFBSY, 0);
810 }
811 }
812
813 static uint64_t can_filter_mask_pre_write(RegisterInfo *reg, uint64_t val)
814 {
815 XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
816 uint32_t reg_idx = (reg->access->addr) / 4;
817 uint32_t filter_number = (reg_idx - R_AFMR1) / 2;
818
819 /* modify an acceptance filter, the corresponding UAF bit should be '0'. */
820 if (!(s->regs[R_AFR] & (1 << filter_number))) {
821 s->regs[reg_idx] = val;
822
823 trace_xlnx_can_filter_mask_pre_write(filter_number, s->regs[reg_idx]);
824 } else {
825 g_autofree char *path = object_get_canonical_path(OBJECT(s));
826
827 qemu_log_mask(LOG_GUEST_ERROR, "%s: Acceptance filter %d"
828 " mask is not set as corresponding UAF bit is not 0.\n",
829 path, filter_number + 1);
830 }
831
832 return s->regs[reg_idx];
833 }
834
835 static uint64_t can_filter_id_pre_write(RegisterInfo *reg, uint64_t val)
836 {
837 XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
838 uint32_t reg_idx = (reg->access->addr) / 4;
839 uint32_t filter_number = (reg_idx - R_AFIR1) / 2;
840
841 if (!(s->regs[R_AFR] & (1 << filter_number))) {
842 s->regs[reg_idx] = val;
843
844 trace_xlnx_can_filter_id_pre_write(filter_number, s->regs[reg_idx]);
845 } else {
846 g_autofree char *path = object_get_canonical_path(OBJECT(s));
847
848 qemu_log_mask(LOG_GUEST_ERROR, "%s: Acceptance filter %d"
849 " id is not set as corresponding UAF bit is not 0.\n",
850 path, filter_number + 1);
851 }
852
853 return s->regs[reg_idx];
854 }
855
856 static void can_tx_post_write(RegisterInfo *reg, uint64_t val)
857 {
858 XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(reg->opaque);
859
860 bool is_txhpb = reg->access->addr > A_TXFIFO_DATA2;
861
862 bool initiate_transfer = (reg->access->addr == A_TXFIFO_DATA2) ||
863 (reg->access->addr == A_TXHPB_DATA2);
864
865 Fifo32 *f = is_txhpb ? &s->txhpb_fifo : &s->tx_fifo;
866
867 if (!fifo32_is_full(f)) {
868 fifo32_push(f, val);
869 } else {
870 g_autofree char *path = object_get_canonical_path(OBJECT(s));
871
872 qemu_log_mask(LOG_GUEST_ERROR, "%s: TX FIFO is full.\n", path);
873 }
874
875 /* Initiate the message send if TX register is written. */
876 if (initiate_transfer &&
877 ARRAY_FIELD_EX32(s->regs, SOFTWARE_RESET_REGISTER, CEN)) {
878 transfer_fifo(s, f);
879 }
880
881 can_update_irq(s);
882 }
883
884 static const RegisterAccessInfo can_regs_info[] = {
885 { .name = "SOFTWARE_RESET_REGISTER",
886 .addr = A_SOFTWARE_RESET_REGISTER,
887 .rsvd = 0xfffffffc,
888 .pre_write = can_srr_pre_write,
889 },{ .name = "MODE_SELECT_REGISTER",
890 .addr = A_MODE_SELECT_REGISTER,
891 .rsvd = 0xfffffff8,
892 .pre_write = can_msr_pre_write,
893 },{ .name = "ARBITRATION_PHASE_BAUD_RATE_PRESCALER_REGISTER",
894 .addr = A_ARBITRATION_PHASE_BAUD_RATE_PRESCALER_REGISTER,
895 .rsvd = 0xffffff00,
896 .pre_write = can_brpr_pre_write,
897 },{ .name = "ARBITRATION_PHASE_BIT_TIMING_REGISTER",
898 .addr = A_ARBITRATION_PHASE_BIT_TIMING_REGISTER,
899 .rsvd = 0xfffffe00,
900 .pre_write = can_btr_pre_write,
901 },{ .name = "ERROR_COUNTER_REGISTER",
902 .addr = A_ERROR_COUNTER_REGISTER,
903 .rsvd = 0xffff0000,
904 .ro = 0xffffffff,
905 },{ .name = "ERROR_STATUS_REGISTER",
906 .addr = A_ERROR_STATUS_REGISTER,
907 .rsvd = 0xffffffe0,
908 .w1c = 0x1f,
909 },{ .name = "STATUS_REGISTER", .addr = A_STATUS_REGISTER,
910 .reset = 0x1,
911 .rsvd = 0xffffe000,
912 .ro = 0x1fff,
913 },{ .name = "INTERRUPT_STATUS_REGISTER",
914 .addr = A_INTERRUPT_STATUS_REGISTER,
915 .reset = 0x6000,
916 .rsvd = 0xffff8000,
917 .ro = 0x7fff,
918 },{ .name = "INTERRUPT_ENABLE_REGISTER",
919 .addr = A_INTERRUPT_ENABLE_REGISTER,
920 .rsvd = 0xffff8000,
921 .post_write = can_ier_post_write,
922 },{ .name = "INTERRUPT_CLEAR_REGISTER",
923 .addr = A_INTERRUPT_CLEAR_REGISTER,
924 .rsvd = 0xffff8000,
925 .pre_write = can_icr_pre_write,
926 },{ .name = "TIMESTAMP_REGISTER",
927 .addr = A_TIMESTAMP_REGISTER,
928 .rsvd = 0xfffffffe,
929 .pre_write = can_tcr_pre_write,
930 },{ .name = "WIR", .addr = A_WIR,
931 .reset = 0x3f3f,
932 .rsvd = 0xffff0000,
933 },{ .name = "TXFIFO_ID", .addr = A_TXFIFO_ID,
934 .post_write = can_tx_post_write,
935 },{ .name = "TXFIFO_DLC", .addr = A_TXFIFO_DLC,
936 .rsvd = 0xfffffff,
937 .post_write = can_tx_post_write,
938 },{ .name = "TXFIFO_DATA1", .addr = A_TXFIFO_DATA1,
939 .post_write = can_tx_post_write,
940 },{ .name = "TXFIFO_DATA2", .addr = A_TXFIFO_DATA2,
941 .post_write = can_tx_post_write,
942 },{ .name = "TXHPB_ID", .addr = A_TXHPB_ID,
943 .post_write = can_tx_post_write,
944 },{ .name = "TXHPB_DLC", .addr = A_TXHPB_DLC,
945 .rsvd = 0xfffffff,
946 .post_write = can_tx_post_write,
947 },{ .name = "TXHPB_DATA1", .addr = A_TXHPB_DATA1,
948 .post_write = can_tx_post_write,
949 },{ .name = "TXHPB_DATA2", .addr = A_TXHPB_DATA2,
950 .post_write = can_tx_post_write,
951 },{ .name = "RXFIFO_ID", .addr = A_RXFIFO_ID,
952 .ro = 0xffffffff,
953 .post_read = can_rxfifo_post_read_id,
954 },{ .name = "RXFIFO_DLC", .addr = A_RXFIFO_DLC,
955 .rsvd = 0xfff0000,
956 },{ .name = "RXFIFO_DATA1", .addr = A_RXFIFO_DATA1,
957 },{ .name = "RXFIFO_DATA2", .addr = A_RXFIFO_DATA2,
958 },{ .name = "AFR", .addr = A_AFR,
959 .rsvd = 0xfffffff0,
960 .post_write = can_filter_enable_post_write,
961 },{ .name = "AFMR1", .addr = A_AFMR1,
962 .pre_write = can_filter_mask_pre_write,
963 },{ .name = "AFIR1", .addr = A_AFIR1,
964 .pre_write = can_filter_id_pre_write,
965 },{ .name = "AFMR2", .addr = A_AFMR2,
966 .pre_write = can_filter_mask_pre_write,
967 },{ .name = "AFIR2", .addr = A_AFIR2,
968 .pre_write = can_filter_id_pre_write,
969 },{ .name = "AFMR3", .addr = A_AFMR3,
970 .pre_write = can_filter_mask_pre_write,
971 },{ .name = "AFIR3", .addr = A_AFIR3,
972 .pre_write = can_filter_id_pre_write,
973 },{ .name = "AFMR4", .addr = A_AFMR4,
974 .pre_write = can_filter_mask_pre_write,
975 },{ .name = "AFIR4", .addr = A_AFIR4,
976 .pre_write = can_filter_id_pre_write,
977 }
978 };
979
980 static void xlnx_zynqmp_can_ptimer_cb(void *opaque)
981 {
982 /* No action required on the timer rollover. */
983 }
984
985 static const MemoryRegionOps can_ops = {
986 .read = register_read_memory,
987 .write = register_write_memory,
988 .endianness = DEVICE_LITTLE_ENDIAN,
989 .valid = {
990 .min_access_size = 4,
991 .max_access_size = 4,
992 },
993 };
994
995 static void xlnx_zynqmp_can_reset_init(Object *obj, ResetType type)
996 {
997 XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(obj);
998 unsigned int i;
999
1000 for (i = R_RXFIFO_ID; i < ARRAY_SIZE(s->reg_info); ++i) {
1001 register_reset(&s->reg_info[i]);
1002 }
1003
1004 ptimer_transaction_begin(s->can_timer);
1005 ptimer_set_count(s->can_timer, 0);
1006 ptimer_transaction_commit(s->can_timer);
1007 }
1008
1009 static void xlnx_zynqmp_can_reset_hold(Object *obj)
1010 {
1011 XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(obj);
1012 unsigned int i;
1013
1014 for (i = 0; i < R_RXFIFO_ID; ++i) {
1015 register_reset(&s->reg_info[i]);
1016 }
1017
1018 /*
1019 * Reset FIFOs when CAN model is reset. This will clear the fifo writes
1020 * done by post_write which gets called from register_reset function,
1021 * post_write handle will not be able to trigger tx because CAN will be
1022 * disabled when software_reset_register is cleared first.
1023 */
1024 fifo32_reset(&s->rx_fifo);
1025 fifo32_reset(&s->tx_fifo);
1026 fifo32_reset(&s->txhpb_fifo);
1027 }
1028
1029 static bool xlnx_zynqmp_can_can_receive(CanBusClientState *client)
1030 {
1031 XlnxZynqMPCANState *s = container_of(client, XlnxZynqMPCANState,
1032 bus_client);
1033
1034 if (ARRAY_FIELD_EX32(s->regs, SOFTWARE_RESET_REGISTER, SRST)) {
1035 g_autofree char *path = object_get_canonical_path(OBJECT(s));
1036
1037 qemu_log_mask(LOG_GUEST_ERROR, "%s: Controller is in reset state.\n",
1038 path);
1039 return false;
1040 }
1041
1042 if ((ARRAY_FIELD_EX32(s->regs, SOFTWARE_RESET_REGISTER, CEN)) == 0) {
1043 g_autofree char *path = object_get_canonical_path(OBJECT(s));
1044
1045 qemu_log_mask(LOG_GUEST_ERROR, "%s: Controller is disabled. Incoming"
1046 " messages will be discarded.\n", path);
1047 return false;
1048 }
1049
1050 return true;
1051 }
1052
1053 static ssize_t xlnx_zynqmp_can_receive(CanBusClientState *client,
1054 const qemu_can_frame *buf, size_t buf_size) {
1055 XlnxZynqMPCANState *s = container_of(client, XlnxZynqMPCANState,
1056 bus_client);
1057 const qemu_can_frame *frame = buf;
1058
1059 if (buf_size <= 0) {
1060 g_autofree char *path = object_get_canonical_path(OBJECT(s));
1061
1062 qemu_log_mask(LOG_GUEST_ERROR, "%s: Error in the data received.\n",
1063 path);
1064 return 0;
1065 }
1066
1067 if (ARRAY_FIELD_EX32(s->regs, STATUS_REGISTER, SNOOP)) {
1068 /* Snoop Mode: Just keep the data. no response back. */
1069 update_rx_fifo(s, frame);
1070 } else if ((ARRAY_FIELD_EX32(s->regs, STATUS_REGISTER, SLEEP))) {
1071 /*
1072 * XlnxZynqMPCAN is in sleep mode. Any data on bus will bring it to wake
1073 * up state.
1074 */
1075 can_exit_sleep_mode(s);
1076 update_rx_fifo(s, frame);
1077 } else if ((ARRAY_FIELD_EX32(s->regs, STATUS_REGISTER, SLEEP)) == 0) {
1078 update_rx_fifo(s, frame);
1079 } else {
1080 /*
1081 * XlnxZynqMPCAN will not participate in normal bus communication
1082 * and will not receive any messages transmitted by other CAN nodes.
1083 */
1084 trace_xlnx_can_rx_discard(s->regs[R_STATUS_REGISTER]);
1085 }
1086
1087 return 1;
1088 }
1089
1090 static CanBusClientInfo can_xilinx_bus_client_info = {
1091 .can_receive = xlnx_zynqmp_can_can_receive,
1092 .receive = xlnx_zynqmp_can_receive,
1093 };
1094
1095 static int xlnx_zynqmp_can_connect_to_bus(XlnxZynqMPCANState *s,
1096 CanBusState *bus)
1097 {
1098 s->bus_client.info = &can_xilinx_bus_client_info;
1099
1100 if (can_bus_insert_client(bus, &s->bus_client) < 0) {
1101 return -1;
1102 }
1103 return 0;
1104 }
1105
1106 static void xlnx_zynqmp_can_realize(DeviceState *dev, Error **errp)
1107 {
1108 XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(dev);
1109
1110 if (s->canbus) {
1111 if (xlnx_zynqmp_can_connect_to_bus(s, s->canbus) < 0) {
1112 g_autofree char *path = object_get_canonical_path(OBJECT(s));
1113
1114 error_setg(errp, "%s: xlnx_zynqmp_can_connect_to_bus"
1115 " failed.", path);
1116 return;
1117 }
1118 }
1119
1120 /* Create RX FIFO, TXFIFO, TXHPB storage. */
1121 fifo32_create(&s->rx_fifo, RXFIFO_SIZE);
1122 fifo32_create(&s->tx_fifo, RXFIFO_SIZE);
1123 fifo32_create(&s->txhpb_fifo, CAN_FRAME_SIZE);
1124
1125 /* Allocate a new timer. */
1126 s->can_timer = ptimer_init(xlnx_zynqmp_can_ptimer_cb, s,
1127 PTIMER_POLICY_LEGACY);
1128
1129 ptimer_transaction_begin(s->can_timer);
1130
1131 ptimer_set_freq(s->can_timer, s->cfg.ext_clk_freq);
1132 ptimer_set_limit(s->can_timer, CAN_TIMER_MAX, 1);
1133 ptimer_run(s->can_timer, 0);
1134 ptimer_transaction_commit(s->can_timer);
1135 }
1136
1137 static void xlnx_zynqmp_can_init(Object *obj)
1138 {
1139 XlnxZynqMPCANState *s = XLNX_ZYNQMP_CAN(obj);
1140 SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
1141
1142 RegisterInfoArray *reg_array;
1143
1144 memory_region_init(&s->iomem, obj, TYPE_XLNX_ZYNQMP_CAN,
1145 XLNX_ZYNQMP_CAN_R_MAX * 4);
1146 reg_array = register_init_block32(DEVICE(obj), can_regs_info,
1147 ARRAY_SIZE(can_regs_info),
1148 s->reg_info, s->regs,
1149 &can_ops,
1150 XLNX_ZYNQMP_CAN_ERR_DEBUG,
1151 XLNX_ZYNQMP_CAN_R_MAX * 4);
1152
1153 memory_region_add_subregion(&s->iomem, 0x00, &reg_array->mem);
1154 sysbus_init_mmio(sbd, &s->iomem);
1155 sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->irq);
1156 }
1157
1158 static const VMStateDescription vmstate_can = {
1159 .name = TYPE_XLNX_ZYNQMP_CAN,
1160 .version_id = 1,
1161 .minimum_version_id = 1,
1162 .fields = (const VMStateField[]) {
1163 VMSTATE_FIFO32(rx_fifo, XlnxZynqMPCANState),
1164 VMSTATE_FIFO32(tx_fifo, XlnxZynqMPCANState),
1165 VMSTATE_FIFO32(txhpb_fifo, XlnxZynqMPCANState),
1166 VMSTATE_UINT32_ARRAY(regs, XlnxZynqMPCANState, XLNX_ZYNQMP_CAN_R_MAX),
1167 VMSTATE_PTIMER(can_timer, XlnxZynqMPCANState),
1168 VMSTATE_END_OF_LIST(),
1169 }
1170 };
1171
1172 static Property xlnx_zynqmp_can_properties[] = {
1173 DEFINE_PROP_UINT32("ext_clk_freq", XlnxZynqMPCANState, cfg.ext_clk_freq,
1174 CAN_DEFAULT_CLOCK),
1175 DEFINE_PROP_LINK("canbus", XlnxZynqMPCANState, canbus, TYPE_CAN_BUS,
1176 CanBusState *),
1177 DEFINE_PROP_END_OF_LIST(),
1178 };
1179
1180 static void xlnx_zynqmp_can_class_init(ObjectClass *klass, void *data)
1181 {
1182 DeviceClass *dc = DEVICE_CLASS(klass);
1183 ResettableClass *rc = RESETTABLE_CLASS(klass);
1184
1185 rc->phases.enter = xlnx_zynqmp_can_reset_init;
1186 rc->phases.hold = xlnx_zynqmp_can_reset_hold;
1187 dc->realize = xlnx_zynqmp_can_realize;
1188 device_class_set_props(dc, xlnx_zynqmp_can_properties);
1189 dc->vmsd = &vmstate_can;
1190 }
1191
1192 static const TypeInfo can_info = {
1193 .name = TYPE_XLNX_ZYNQMP_CAN,
1194 .parent = TYPE_SYS_BUS_DEVICE,
1195 .instance_size = sizeof(XlnxZynqMPCANState),
1196 .class_init = xlnx_zynqmp_can_class_init,
1197 .instance_init = xlnx_zynqmp_can_init,
1198 };
1199
1200 static void can_register_types(void)
1201 {
1202 type_register_static(&can_info);
1203 }
1204
1205 type_init(can_register_types)