xref: /qemu/hw/char/imx_serial.c (revision 2c4815590f9ea399bc87f727dd1c883b0d701bb8)
1 /*
2  * IMX31 UARTS
3  *
4  * Copyright (c) 2008 OKL
5  * Originally Written by Hans Jiang
6  * Copyright (c) 2011 NICTA Pty Ltd.
7  * Updated by Jean-Christophe Dubois <jcd@tribudubois.net>
8  *
9  * This work is licensed under the terms of the GNU GPL, version 2 or later.
10  * See the COPYING file in the top-level directory.
11  *
12  * This is a `bare-bones' implementation of the IMX series serial ports.
13  * TODO:
14  *  -- implement FIFOs.  The real hardware has 32 word transmit
15  *                       and receive FIFOs; we currently use a 1-char buffer
16  *  -- implement DMA
17  *  -- implement BAUD-rate and modem lines, for when the backend
18  *     is a real serial device.
19  */
20 
21 #include "qemu/osdep.h"
22 #include "hw/char/imx_serial.h"
23 #include "hw/irq.h"
24 #include "hw/qdev-properties.h"
25 #include "hw/qdev-properties-system.h"
26 #include "migration/vmstate.h"
27 #include "qemu/log.h"
28 #include "qemu/module.h"
29 #include "qemu/fifo32.h"
30 #include "trace.h"
31 
32 #ifndef DEBUG_IMX_UART
33 #define DEBUG_IMX_UART 0
34 #endif
35 
36 #define DPRINTF(fmt, args...) \
37     do { \
38         if (DEBUG_IMX_UART) { \
39             fprintf(stderr, "[%s]%s: " fmt , TYPE_IMX_SERIAL, \
40                                              __func__, ##args); \
41         } \
42     } while (0)
43 
44 static const VMStateDescription vmstate_imx_serial = {
45     .name = TYPE_IMX_SERIAL,
46     .version_id = 3,
47     .minimum_version_id = 3,
48     .fields = (const VMStateField[]) {
49         VMSTATE_FIFO32(rx_fifo, IMXSerialState),
50         VMSTATE_TIMER(ageing_timer, IMXSerialState),
51         VMSTATE_UINT32(usr1, IMXSerialState),
52         VMSTATE_UINT32(usr2, IMXSerialState),
53         VMSTATE_UINT32(ucr1, IMXSerialState),
54         VMSTATE_UINT32(uts1, IMXSerialState),
55         VMSTATE_UINT32(onems, IMXSerialState),
56         VMSTATE_UINT32(ufcr, IMXSerialState),
57         VMSTATE_UINT32(ubmr, IMXSerialState),
58         VMSTATE_UINT32(ubrc, IMXSerialState),
59         VMSTATE_UINT32(ucr3, IMXSerialState),
60         VMSTATE_UINT32(ucr4, IMXSerialState),
61         VMSTATE_END_OF_LIST()
62     },
63 };
64 
65 static void imx_update(IMXSerialState *s)
66 {
67     uint32_t usr1;
68     uint32_t usr2;
69     uint32_t mask;
70 
71     /*
72      * Lucky for us TRDY and RRDY has the same offset in both USR1 and
73      * UCR1, so we can get away with something as simple as the
74      * following:
75      */
76     usr1 = s->usr1 & s->ucr1 & (USR1_TRDY | USR1_RRDY);
77     /*
78      * Interrupt if AGTIM is set (ageing timer interrupt in RxFIFO)
79      */
80     usr1 |= (s->ucr2 & UCR2_ATEN) ? (s->usr1 & USR1_AGTIM) : 0;
81     /*
82      * Bits that we want in USR2 are not as conveniently laid out,
83      * unfortunately.
84      */
85     mask = (s->ucr1 & UCR1_TXMPTYEN) ? USR2_TXFE : 0;
86     /*
87      * TCEN and TXDC are both bit 3
88      * ORE and OREN are both bit 1
89      * RDR and DREN are both bit 0
90      */
91     mask |= s->ucr4 & (UCR4_WKEN | UCR4_TCEN | UCR4_DREN | UCR4_OREN);
92 
93     usr2 = s->usr2 & mask;
94 
95     qemu_set_irq(s->irq, usr1 || usr2);
96 }
97 
98 static void imx_serial_rx_fifo_push(IMXSerialState *s, uint32_t value)
99 {
100     uint32_t pushed_value = value;
101     if (fifo32_is_full(&s->rx_fifo)) {
102         /* Set ORE if FIFO is already full */
103         s->usr2 |= USR2_ORE;
104     } else {
105         if (fifo32_num_used(&s->rx_fifo) == FIFO_SIZE - 1) {
106             /* Set OVRRUN on 32nd character in FIFO */
107             pushed_value |= URXD_ERR | URXD_OVRRUN;
108         }
109         fifo32_push(&s->rx_fifo, pushed_value);
110     }
111 }
112 
113 static uint32_t imx_serial_rx_fifo_pop(IMXSerialState *s)
114 {
115     if (fifo32_is_empty(&s->rx_fifo)) {
116         return 0;
117     }
118     return fifo32_pop(&s->rx_fifo);
119 }
120 
121 static void imx_serial_rx_fifo_ageing_timer_int(void *opaque)
122 {
123     IMXSerialState *s = (IMXSerialState *) opaque;
124     s->usr1 |= USR1_AGTIM;
125     imx_update(s);
126 }
127 
128 static void imx_serial_rx_fifo_ageing_timer_restart(void *opaque)
129 {
130     /*
131      * Ageing timer starts ticking when
132      * RX FIFO is non empty and below trigger level.
133      * Timer is reset if new character is received or
134      * a FIFO read occurs.
135      * Timer triggers an interrupt when duration of
136      * 8 characters has passed (assuming 115200 baudrate).
137      */
138     IMXSerialState *s = (IMXSerialState *) opaque;
139 
140     if (!(s->usr1 & USR1_RRDY) && !(s->uts1 & UTS1_RXEMPTY)) {
141         timer_mod_ns(&s->ageing_timer,
142                      qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + AGE_DURATION_NS);
143     } else {
144         timer_del(&s->ageing_timer);
145     }
146 }
147 
148 static void imx_serial_reset(IMXSerialState *s)
149 {
150 
151     s->usr1 = USR1_TRDY | USR1_RXDS;
152     /*
153      * Fake attachment of a terminal: assert RTS.
154      */
155     s->usr1 |= USR1_RTSS;
156     s->usr2 = USR2_TXFE | USR2_TXDC | USR2_DCDIN;
157     s->uts1 = UTS1_RXEMPTY | UTS1_TXEMPTY;
158     s->ucr1 = 0;
159     s->ucr2 = UCR2_SRST;
160     s->ucr3 = 0x700;
161     s->ubmr = 0;
162     s->ubrc = 4;
163 
164     fifo32_reset(&s->rx_fifo);
165     timer_del(&s->ageing_timer);
166 }
167 
168 static void imx_serial_reset_at_boot(DeviceState *dev)
169 {
170     IMXSerialState *s = IMX_SERIAL(dev);
171 
172     imx_serial_reset(s);
173 
174     /*
175      * enable the uart on boot, so messages from the linux decompressor
176      * are visible.  On real hardware this is done by the boot rom
177      * before anything else is loaded.
178      */
179     s->ucr1 = UCR1_UARTEN;
180     s->ucr2 = UCR2_TXEN;
181 
182 }
183 
184 static uint64_t imx_serial_read(void *opaque, hwaddr offset,
185                                 unsigned size)
186 {
187     IMXSerialState *s = (IMXSerialState *)opaque;
188     Chardev *chr = qemu_chr_fe_get_driver(&s->chr);
189     uint32_t c, rx_used;
190     uint8_t rxtl = s->ufcr & TL_MASK;
191     uint64_t value;
192 
193     switch (offset >> 2) {
194     case 0x0: /* URXD */
195         c = imx_serial_rx_fifo_pop(s);
196         if (!(s->uts1 & UTS1_RXEMPTY)) {
197             /* Character is valid */
198             c |= URXD_CHARRDY;
199             rx_used = fifo32_num_used(&s->rx_fifo);
200             /* Clear RRDY if below threshold */
201             if (rx_used < rxtl) {
202                 s->usr1 &= ~USR1_RRDY;
203             }
204             if (rx_used == 0) {
205                 s->usr2 &= ~USR2_RDR;
206                 s->uts1 |= UTS1_RXEMPTY;
207             }
208             imx_update(s);
209             imx_serial_rx_fifo_ageing_timer_restart(s);
210             qemu_chr_fe_accept_input(&s->chr);
211         }
212         value = c;
213         break;
214 
215     case 0x20: /* UCR1 */
216         value = s->ucr1;
217         break;
218 
219     case 0x21: /* UCR2 */
220         value = s->ucr2;
221         break;
222 
223     case 0x25: /* USR1 */
224         value = s->usr1;
225         break;
226 
227     case 0x26: /* USR2 */
228         value = s->usr2;
229         break;
230 
231     case 0x2A: /* BRM Modulator */
232         value = s->ubmr;
233         break;
234 
235     case 0x2B: /* Baud Rate Count */
236         value = s->ubrc;
237         break;
238 
239     case 0x2d: /* Test register */
240         value = s->uts1;
241         break;
242 
243     case 0x24: /* UFCR */
244         value = s->ufcr;
245         break;
246 
247     case 0x2c:
248         value = s->onems;
249         break;
250 
251     case 0x22: /* UCR3 */
252         value = s->ucr3;
253         break;
254 
255     case 0x23: /* UCR4 */
256         value = s->ucr4;
257         break;
258 
259     case 0x29: /* BRM Incremental */
260         value = 0x0; /* TODO */
261         break;
262 
263     default:
264         qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Bad register at offset 0x%"
265                       HWADDR_PRIx "\n", TYPE_IMX_SERIAL, __func__, offset);
266         value = 0;
267         break;
268     }
269 
270     trace_imx_serial_read(chr ? chr->label : "NODEV", offset, value);
271 
272     return value;
273 }
274 
275 static void imx_serial_write(void *opaque, hwaddr offset,
276                              uint64_t value, unsigned size)
277 {
278     IMXSerialState *s = (IMXSerialState *)opaque;
279     Chardev *chr = qemu_chr_fe_get_driver(&s->chr);
280     unsigned char ch;
281 
282     trace_imx_serial_write(chr ? chr->label : "NODEV", offset, value);
283 
284     switch (offset >> 2) {
285     case 0x10: /* UTXD */
286         ch = value;
287         if (s->ucr2 & UCR2_TXEN) {
288             /* XXX this blocks entire thread. Rewrite to use
289              * qemu_chr_fe_write and background I/O callbacks */
290             qemu_chr_fe_write_all(&s->chr, &ch, 1);
291             s->usr1 &= ~USR1_TRDY;
292             s->usr2 &= ~USR2_TXDC;
293             imx_update(s);
294             s->usr1 |= USR1_TRDY;
295             s->usr2 |= USR2_TXDC;
296             imx_update(s);
297         }
298         break;
299 
300     case 0x20: /* UCR1 */
301         s->ucr1 = value & 0xffff;
302 
303         DPRINTF("write(ucr1=%x)\n", (unsigned int)value);
304 
305         imx_update(s);
306         break;
307 
308     case 0x21: /* UCR2 */
309         /*
310          * Only a few bits in control register 2 are implemented as yet.
311          * If it's intended to use a real serial device as a back-end, this
312          * register will have to be implemented more fully.
313          */
314         if (!(value & UCR2_SRST)) {
315             imx_serial_reset(s);
316             imx_update(s);
317             value |= UCR2_SRST;
318         }
319         if (value & UCR2_RXEN) {
320             if (!(s->ucr2 & UCR2_RXEN)) {
321                 qemu_chr_fe_accept_input(&s->chr);
322             }
323         }
324         s->ucr2 = value & 0xffff;
325         break;
326 
327     case 0x25: /* USR1 */
328         value &= USR1_AWAKE | USR1_AIRINT | USR1_DTRD | USR1_AGTIM |
329                  USR1_FRAMERR | USR1_ESCF | USR1_RTSD | USR1_PARTYER;
330         s->usr1 &= ~value;
331         break;
332 
333     case 0x26: /* USR2 */
334         /*
335          * Writing 1 to some bits clears them; all other
336          * values are ignored
337          */
338         value &= USR2_ADET | USR2_DTRF | USR2_IDLE | USR2_ACST |
339                  USR2_RIDELT | USR2_IRINT | USR2_WAKE |
340                  USR2_DCDDELT | USR2_RTSF | USR2_BRCD | USR2_ORE;
341         s->usr2 &= ~value;
342         break;
343 
344     /*
345      * Linux expects to see what it writes to these registers
346      * We don't currently alter the baud rate
347      */
348     case 0x29: /* UBIR */
349         s->ubrc = value & 0xffff;
350         break;
351 
352     case 0x2a: /* UBMR */
353         s->ubmr = value & 0xffff;
354         break;
355 
356     case 0x2c: /* One ms reg */
357         s->onems = value & 0xffff;
358         break;
359 
360     case 0x24: /* FIFO control register */
361         s->ufcr = value & 0xffff;
362         break;
363 
364     case 0x22: /* UCR3 */
365         s->ucr3 = value & 0xffff;
366         break;
367 
368     case 0x23: /* UCR4 */
369         s->ucr4 = value & 0xffff;
370         imx_update(s);
371         break;
372 
373     case 0x2d: /* UTS1 */
374         qemu_log_mask(LOG_UNIMP, "[%s]%s: Unimplemented reg 0x%"
375                       HWADDR_PRIx "\n", TYPE_IMX_SERIAL, __func__, offset);
376         /* TODO */
377         break;
378 
379     default:
380         qemu_log_mask(LOG_GUEST_ERROR, "[%s]%s: Bad register at offset 0x%"
381                       HWADDR_PRIx "\n", TYPE_IMX_SERIAL, __func__, offset);
382     }
383 }
384 
385 static int imx_can_receive(void *opaque)
386 {
387     IMXSerialState *s = (IMXSerialState *)opaque;
388     return s->ucr2 & UCR2_RXEN && fifo32_num_used(&s->rx_fifo) < FIFO_SIZE;
389 }
390 
391 static void imx_put_data(void *opaque, uint32_t value)
392 {
393     IMXSerialState *s = (IMXSerialState *)opaque;
394     Chardev *chr = qemu_chr_fe_get_driver(&s->chr);
395     uint8_t rxtl = s->ufcr & TL_MASK;
396 
397     trace_imx_serial_put_data(chr ? chr->label : "NODEV", value);
398 
399     imx_serial_rx_fifo_push(s, value);
400     if (fifo32_num_used(&s->rx_fifo) >= rxtl) {
401         s->usr1 |= USR1_RRDY;
402     }
403 
404     imx_serial_rx_fifo_ageing_timer_restart(s);
405 
406     s->usr2 |= USR2_RDR;
407     s->uts1 &= ~UTS1_RXEMPTY;
408     if (value & URXD_BRK) {
409         s->usr2 |= USR2_BRCD;
410     }
411     imx_update(s);
412 }
413 
414 static void imx_receive(void *opaque, const uint8_t *buf, int size)
415 {
416     IMXSerialState *s = (IMXSerialState *)opaque;
417 
418     s->usr2 |= USR2_WAKE;
419     imx_put_data(opaque, *buf);
420 }
421 
422 static void imx_event(void *opaque, QEMUChrEvent event)
423 {
424     if (event == CHR_EVENT_BREAK) {
425         imx_put_data(opaque, URXD_BRK | URXD_FRMERR | URXD_ERR);
426     }
427 }
428 
429 
430 static const struct MemoryRegionOps imx_serial_ops = {
431     .read = imx_serial_read,
432     .write = imx_serial_write,
433     .endianness = DEVICE_NATIVE_ENDIAN,
434 };
435 
436 static void imx_serial_realize(DeviceState *dev, Error **errp)
437 {
438     IMXSerialState *s = IMX_SERIAL(dev);
439 
440     fifo32_create(&s->rx_fifo, FIFO_SIZE);
441     timer_init_ns(&s->ageing_timer, QEMU_CLOCK_VIRTUAL,
442                   imx_serial_rx_fifo_ageing_timer_int, s);
443 
444     DPRINTF("char dev for uart: %p\n", qemu_chr_fe_get_driver(&s->chr));
445 
446     qemu_chr_fe_set_handlers(&s->chr, imx_can_receive, imx_receive,
447                              imx_event, NULL, s, NULL, true);
448 }
449 
450 static void imx_serial_init(Object *obj)
451 {
452     SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
453     IMXSerialState *s = IMX_SERIAL(obj);
454 
455     memory_region_init_io(&s->iomem, obj, &imx_serial_ops, s,
456                           TYPE_IMX_SERIAL, 0x1000);
457     sysbus_init_mmio(sbd, &s->iomem);
458     sysbus_init_irq(sbd, &s->irq);
459 }
460 
461 static const Property imx_serial_properties[] = {
462     DEFINE_PROP_CHR("chardev", IMXSerialState, chr),
463 };
464 
465 static void imx_serial_class_init(ObjectClass *klass, void *data)
466 {
467     DeviceClass *dc = DEVICE_CLASS(klass);
468 
469     dc->realize = imx_serial_realize;
470     dc->vmsd = &vmstate_imx_serial;
471     device_class_set_legacy_reset(dc, imx_serial_reset_at_boot);
472     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
473     dc->desc = "i.MX series UART";
474     device_class_set_props(dc, imx_serial_properties);
475 }
476 
477 static const TypeInfo imx_serial_info = {
478     .name           = TYPE_IMX_SERIAL,
479     .parent         = TYPE_SYS_BUS_DEVICE,
480     .instance_size  = sizeof(IMXSerialState),
481     .instance_init  = imx_serial_init,
482     .class_init     = imx_serial_class_init,
483 };
484 
485 static void imx_serial_register_types(void)
486 {
487     type_register_static(&imx_serial_info);
488 }
489 
490 type_init(imx_serial_register_types)
491