1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright (C) 2007 Google, Inc.
4 * Copyright (C) 2012 Intel, Inc.
5 * Copyright (C) 2017 Imagination Technologies Ltd.
8 #include <linux/console.h>
9 #include <linux/interrupt.h>
10 #include <linux/platform_device.h>
11 #include <linux/tty.h>
12 #include <linux/tty_flip.h>
13 #include <linux/slab.h>
15 #include <linux/module.h>
16 #include <linux/mod_devicetable.h>
17 #include <linux/goldfish.h>
19 #include <linux/dma-mapping.h>
20 #include <linux/serial_core.h>
22 /* Goldfish tty register's offsets */
23 #define GOLDFISH_TTY_REG_BYTES_READY 0x04
24 #define GOLDFISH_TTY_REG_CMD 0x08
25 #define GOLDFISH_TTY_REG_DATA_PTR 0x10
26 #define GOLDFISH_TTY_REG_DATA_LEN 0x14
27 #define GOLDFISH_TTY_REG_DATA_PTR_HIGH 0x18
28 #define GOLDFISH_TTY_REG_VERSION 0x20
30 /* Goldfish tty commands */
31 #define GOLDFISH_TTY_CMD_INT_DISABLE 0
32 #define GOLDFISH_TTY_CMD_INT_ENABLE 1
33 #define GOLDFISH_TTY_CMD_WRITE_BUFFER 2
34 #define GOLDFISH_TTY_CMD_READ_BUFFER 3
42 struct console console
;
47 static DEFINE_MUTEX(goldfish_tty_lock
);
48 static struct tty_driver
*goldfish_tty_driver
;
49 static u32 goldfish_tty_line_count
= 8;
50 static u32 goldfish_tty_current_line_count
;
51 static struct goldfish_tty
*goldfish_ttys
;
53 static void do_rw_io(struct goldfish_tty
*qtty
, unsigned long address
,
54 size_t count
, bool is_write
)
56 unsigned long irq_flags
;
57 void __iomem
*base
= qtty
->base
;
59 spin_lock_irqsave(&qtty
->lock
, irq_flags
);
60 gf_write_ptr((void *)address
, base
+ GOLDFISH_TTY_REG_DATA_PTR
,
61 base
+ GOLDFISH_TTY_REG_DATA_PTR_HIGH
);
62 gf_iowrite32(count
, base
+ GOLDFISH_TTY_REG_DATA_LEN
);
65 gf_iowrite32(GOLDFISH_TTY_CMD_WRITE_BUFFER
,
66 base
+ GOLDFISH_TTY_REG_CMD
);
68 gf_iowrite32(GOLDFISH_TTY_CMD_READ_BUFFER
,
69 base
+ GOLDFISH_TTY_REG_CMD
);
71 spin_unlock_irqrestore(&qtty
->lock
, irq_flags
);
74 static void goldfish_tty_rw(struct goldfish_tty
*qtty
, unsigned long addr
,
75 size_t count
, bool is_write
)
77 dma_addr_t dma_handle
;
78 enum dma_data_direction dma_dir
;
80 dma_dir
= (is_write
? DMA_TO_DEVICE
: DMA_FROM_DEVICE
);
81 if (qtty
->version
> 0) {
83 * Goldfish TTY for Ranchu platform uses
84 * physical addresses and DMA for read/write operations
86 unsigned long addr_end
= addr
+ count
;
88 while (addr
< addr_end
) {
89 unsigned long pg_end
= (addr
& PAGE_MASK
) + PAGE_SIZE
;
91 pg_end
< addr_end
? pg_end
: addr_end
;
92 unsigned long avail
= next
- addr
;
95 * Map the buffer's virtual address to the DMA address
96 * so the buffer can be accessed by the device.
98 dma_handle
= dma_map_single(qtty
->dev
, (void *)addr
,
101 if (dma_mapping_error(qtty
->dev
, dma_handle
)) {
102 dev_err(qtty
->dev
, "tty: DMA mapping error.\n");
105 do_rw_io(qtty
, dma_handle
, avail
, is_write
);
108 * Unmap the previously mapped region after
109 * the completion of the read/write operation.
111 dma_unmap_single(qtty
->dev
, dma_handle
, avail
, dma_dir
);
117 * Old style Goldfish TTY used on the Goldfish platform
118 * uses virtual addresses.
120 do_rw_io(qtty
, addr
, count
, is_write
);
124 static void goldfish_tty_do_write(int line
, const u8
*buf
, size_t count
)
126 struct goldfish_tty
*qtty
= &goldfish_ttys
[line
];
128 goldfish_tty_rw(qtty
, (unsigned long)buf
, count
, true);
131 static irqreturn_t
goldfish_tty_interrupt(int irq
, void *dev_id
)
133 struct goldfish_tty
*qtty
= dev_id
;
134 void __iomem
*base
= qtty
->base
;
138 count
= gf_ioread32(base
+ GOLDFISH_TTY_REG_BYTES_READY
);
142 count
= tty_prepare_flip_string(&qtty
->port
, &buf
, count
);
144 goldfish_tty_rw(qtty
, (unsigned long)buf
, count
, false);
146 tty_flip_buffer_push(&qtty
->port
);
150 static int goldfish_tty_activate(struct tty_port
*port
, struct tty_struct
*tty
)
152 struct goldfish_tty
*qtty
= container_of(port
, struct goldfish_tty
,
154 gf_iowrite32(GOLDFISH_TTY_CMD_INT_ENABLE
, qtty
->base
+ GOLDFISH_TTY_REG_CMD
);
158 static void goldfish_tty_shutdown(struct tty_port
*port
)
160 struct goldfish_tty
*qtty
= container_of(port
, struct goldfish_tty
,
162 gf_iowrite32(GOLDFISH_TTY_CMD_INT_DISABLE
, qtty
->base
+ GOLDFISH_TTY_REG_CMD
);
165 static int goldfish_tty_open(struct tty_struct
*tty
, struct file
*filp
)
167 struct goldfish_tty
*qtty
= &goldfish_ttys
[tty
->index
];
168 return tty_port_open(&qtty
->port
, tty
, filp
);
171 static void goldfish_tty_close(struct tty_struct
*tty
, struct file
*filp
)
173 tty_port_close(tty
->port
, tty
, filp
);
176 static void goldfish_tty_hangup(struct tty_struct
*tty
)
178 tty_port_hangup(tty
->port
);
181 static ssize_t
goldfish_tty_write(struct tty_struct
*tty
, const u8
*buf
,
184 goldfish_tty_do_write(tty
->index
, buf
, count
);
188 static unsigned int goldfish_tty_write_room(struct tty_struct
*tty
)
193 static unsigned int goldfish_tty_chars_in_buffer(struct tty_struct
*tty
)
195 struct goldfish_tty
*qtty
= &goldfish_ttys
[tty
->index
];
196 void __iomem
*base
= qtty
->base
;
197 return gf_ioread32(base
+ GOLDFISH_TTY_REG_BYTES_READY
);
200 static void goldfish_tty_console_write(struct console
*co
, const char *b
,
203 goldfish_tty_do_write(co
->index
, b
, count
);
206 static struct tty_driver
*goldfish_tty_console_device(struct console
*c
,
210 return goldfish_tty_driver
;
213 static int goldfish_tty_console_setup(struct console
*co
, char *options
)
215 if ((unsigned)co
->index
>= goldfish_tty_line_count
)
217 if (!goldfish_ttys
[co
->index
].base
)
222 static const struct tty_port_operations goldfish_port_ops
= {
223 .activate
= goldfish_tty_activate
,
224 .shutdown
= goldfish_tty_shutdown
227 static const struct tty_operations goldfish_tty_ops
= {
228 .open
= goldfish_tty_open
,
229 .close
= goldfish_tty_close
,
230 .hangup
= goldfish_tty_hangup
,
231 .write
= goldfish_tty_write
,
232 .write_room
= goldfish_tty_write_room
,
233 .chars_in_buffer
= goldfish_tty_chars_in_buffer
,
236 static int goldfish_tty_create_driver(void)
239 struct tty_driver
*tty
;
241 goldfish_ttys
= kcalloc(goldfish_tty_line_count
,
242 sizeof(*goldfish_ttys
),
244 if (goldfish_ttys
== NULL
) {
246 goto err_alloc_goldfish_ttys_failed
;
248 tty
= tty_alloc_driver(goldfish_tty_line_count
,
249 TTY_DRIVER_RESET_TERMIOS
| TTY_DRIVER_REAL_RAW
|
250 TTY_DRIVER_DYNAMIC_DEV
);
253 goto err_tty_alloc_driver_failed
;
255 tty
->driver_name
= "goldfish";
257 tty
->type
= TTY_DRIVER_TYPE_SERIAL
;
258 tty
->subtype
= SERIAL_TYPE_NORMAL
;
259 tty
->init_termios
= tty_std_termios
;
260 tty_set_operations(tty
, &goldfish_tty_ops
);
261 ret
= tty_register_driver(tty
);
263 goto err_tty_register_driver_failed
;
265 goldfish_tty_driver
= tty
;
268 err_tty_register_driver_failed
:
269 tty_driver_kref_put(tty
);
270 err_tty_alloc_driver_failed
:
271 kfree(goldfish_ttys
);
272 goldfish_ttys
= NULL
;
273 err_alloc_goldfish_ttys_failed
:
277 static void goldfish_tty_delete_driver(void)
279 tty_unregister_driver(goldfish_tty_driver
);
280 tty_driver_kref_put(goldfish_tty_driver
);
281 goldfish_tty_driver
= NULL
;
282 kfree(goldfish_ttys
);
283 goldfish_ttys
= NULL
;
286 static int goldfish_tty_probe(struct platform_device
*pdev
)
288 struct goldfish_tty
*qtty
;
291 struct device
*ttydev
;
296 r
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
298 pr_err("goldfish_tty: No MEM resource available!\n");
302 base
= ioremap(r
->start
, 0x1000);
304 pr_err("goldfish_tty: Unable to ioremap base!\n");
308 irq
= platform_get_irq(pdev
, 0);
314 mutex_lock(&goldfish_tty_lock
);
316 if (pdev
->id
== PLATFORM_DEVID_NONE
)
317 line
= goldfish_tty_current_line_count
;
321 if (line
>= goldfish_tty_line_count
) {
322 pr_err("goldfish_tty: Reached maximum tty number of %d.\n",
323 goldfish_tty_current_line_count
);
328 if (goldfish_tty_current_line_count
== 0) {
329 ret
= goldfish_tty_create_driver();
333 goldfish_tty_current_line_count
++;
335 qtty
= &goldfish_ttys
[line
];
336 spin_lock_init(&qtty
->lock
);
337 tty_port_init(&qtty
->port
);
338 qtty
->port
.ops
= &goldfish_port_ops
;
341 qtty
->dev
= &pdev
->dev
;
344 * Goldfish TTY device used by the Goldfish emulator
345 * should identify itself with 0, forcing the driver
346 * to use virtual addresses. Goldfish TTY device
347 * on Ranchu emulator (qemu2) returns 1 here and
348 * driver will use physical addresses.
350 qtty
->version
= gf_ioread32(base
+ GOLDFISH_TTY_REG_VERSION
);
353 * Goldfish TTY device on Ranchu emulator (qemu2)
354 * will use DMA for read/write IO operations.
356 if (qtty
->version
> 0) {
358 * Initialize dma_mask to 32-bits.
360 if (!pdev
->dev
.dma_mask
)
361 pdev
->dev
.dma_mask
= &pdev
->dev
.coherent_dma_mask
;
362 ret
= dma_set_mask(&pdev
->dev
, DMA_BIT_MASK(32));
364 dev_err(&pdev
->dev
, "No suitable DMA available.\n");
365 goto err_dec_line_count
;
369 gf_iowrite32(GOLDFISH_TTY_CMD_INT_DISABLE
, base
+ GOLDFISH_TTY_REG_CMD
);
371 ret
= request_irq(irq
, goldfish_tty_interrupt
, IRQF_SHARED
,
372 "goldfish_tty", qtty
);
374 pr_err("goldfish_tty: No IRQ available!\n");
375 goto err_dec_line_count
;
378 ttydev
= tty_port_register_device(&qtty
->port
, goldfish_tty_driver
,
380 if (IS_ERR(ttydev
)) {
381 ret
= PTR_ERR(ttydev
);
382 goto err_tty_register_device_failed
;
385 strcpy(qtty
->console
.name
, "ttyGF");
386 qtty
->console
.write
= goldfish_tty_console_write
;
387 qtty
->console
.device
= goldfish_tty_console_device
;
388 qtty
->console
.setup
= goldfish_tty_console_setup
;
389 qtty
->console
.flags
= CON_PRINTBUFFER
;
390 qtty
->console
.index
= line
;
391 register_console(&qtty
->console
);
392 platform_set_drvdata(pdev
, qtty
);
394 mutex_unlock(&goldfish_tty_lock
);
397 err_tty_register_device_failed
:
400 tty_port_destroy(&qtty
->port
);
401 goldfish_tty_current_line_count
--;
402 if (goldfish_tty_current_line_count
== 0)
403 goldfish_tty_delete_driver();
405 mutex_unlock(&goldfish_tty_lock
);
411 static void goldfish_tty_remove(struct platform_device
*pdev
)
413 struct goldfish_tty
*qtty
= platform_get_drvdata(pdev
);
415 mutex_lock(&goldfish_tty_lock
);
417 unregister_console(&qtty
->console
);
418 tty_unregister_device(goldfish_tty_driver
, qtty
->console
.index
);
421 free_irq(qtty
->irq
, qtty
);
422 tty_port_destroy(&qtty
->port
);
423 goldfish_tty_current_line_count
--;
424 if (goldfish_tty_current_line_count
== 0)
425 goldfish_tty_delete_driver();
426 mutex_unlock(&goldfish_tty_lock
);
429 #ifdef CONFIG_GOLDFISH_TTY_EARLY_CONSOLE
430 static void gf_early_console_putchar(struct uart_port
*port
, unsigned char ch
)
432 gf_iowrite32(ch
, port
->membase
);
435 static void gf_early_write(struct console
*con
, const char *s
, unsigned int n
)
437 struct earlycon_device
*dev
= con
->data
;
439 uart_console_write(&dev
->port
, s
, n
, gf_early_console_putchar
);
442 static int __init
gf_earlycon_setup(struct earlycon_device
*device
,
445 if (!device
->port
.membase
)
448 device
->con
->write
= gf_early_write
;
452 OF_EARLYCON_DECLARE(early_gf_tty
, "google,goldfish-tty", gf_earlycon_setup
);
455 static const struct of_device_id goldfish_tty_of_match
[] = {
456 { .compatible
= "google,goldfish-tty", },
460 MODULE_DEVICE_TABLE(of
, goldfish_tty_of_match
);
462 static struct platform_driver goldfish_tty_platform_driver
= {
463 .probe
= goldfish_tty_probe
,
464 .remove
= goldfish_tty_remove
,
466 .name
= "goldfish_tty",
467 .of_match_table
= goldfish_tty_of_match
,
471 module_platform_driver(goldfish_tty_platform_driver
);
473 MODULE_DESCRIPTION("Goldfish TTY Driver");
474 MODULE_LICENSE("GPL v2");