virtio: console: Introduce a send_buf function for a common path for sending data...
[safe/jmp/linux-2.6] / drivers / char / virtio_console.c
1 /*
2  * Copyright (C) 2006, 2007, 2009 Rusty Russell, IBM Corporation
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18 #include <linux/err.h>
19 #include <linux/init.h>
20 #include <linux/list.h>
21 #include <linux/spinlock.h>
22 #include <linux/virtio.h>
23 #include <linux/virtio_console.h>
24 #include "hvc_console.h"
25
26 /*
27  * This is a global struct for storing common data for all the devices
28  * this driver handles.
29  *
30  * Mainly, it has a linked list for all the consoles in one place so
31  * that callbacks from hvc for get_chars(), put_chars() work properly
32  * across multiple devices and multiple ports per device.
33  */
34 struct ports_driver_data {
35         /*
36          * This is used to keep track of the number of hvc consoles
37          * spawned by this driver.  This number is given as the first
38          * argument to hvc_alloc().  To correctly map an initial
39          * console spawned via hvc_instantiate to the console being
40          * hooked up via hvc_alloc, we need to pass the same vtermno.
41          *
42          * We also just assume the first console being initialised was
43          * the first one that got used as the initial console.
44          */
45         unsigned int next_vtermno;
46
47         /* All the console devices handled by this driver */
48         struct list_head consoles;
49 };
50 static struct ports_driver_data pdrvdata;
51
52 DEFINE_SPINLOCK(pdrvdata_lock);
53
54 /* This struct holds information that's relevant only for console ports */
55 struct console {
56         /* We'll place all consoles in a list in the pdrvdata struct */
57         struct list_head list;
58
59         /* The hvc device associated with this console port */
60         struct hvc_struct *hvc;
61
62         /*
63          * This number identifies the number that we used to register
64          * with hvc in hvc_instantiate() and hvc_alloc(); this is the
65          * number passed on by the hvc callbacks to us to
66          * differentiate between the other console ports handled by
67          * this driver
68          */
69         u32 vtermno;
70 };
71
72 /*
73  * This is a per-device struct that stores data common to all the
74  * ports for that device (vdev->priv).
75  */
76 struct ports_device {
77         /* Array of per-port IO virtqueues */
78         struct virtqueue **in_vqs, **out_vqs;
79
80         struct virtio_device *vdev;
81 };
82
83 struct port_buffer {
84         char *buf;
85
86         /* size of the buffer in *buf above */
87         size_t size;
88
89         /* used length of the buffer */
90         size_t len;
91         /* offset in the buf from which to consume data */
92         size_t offset;
93 };
94
95 /* This struct holds the per-port data */
96 struct port {
97         /* Pointer to the parent virtio_console device */
98         struct ports_device *portdev;
99
100         /* The current buffer from which data has to be fed to readers */
101         struct port_buffer *inbuf;
102
103         /*
104          * To protect the operations on the in_vq associated with this
105          * port.  Has to be a spinlock because it can be called from
106          * interrupt context (get_char()).
107          */
108         spinlock_t inbuf_lock;
109
110         /* The IO vqs for this port */
111         struct virtqueue *in_vq, *out_vq;
112
113         /*
114          * The entries in this struct will be valid if this port is
115          * hooked up to an hvc console
116          */
117         struct console cons;
118 };
119
120 /* This is the very early arch-specified put chars function. */
121 static int (*early_put_chars)(u32, const char *, int);
122
123 static struct port *find_port_by_vtermno(u32 vtermno)
124 {
125         struct port *port;
126         struct console *cons;
127         unsigned long flags;
128
129         spin_lock_irqsave(&pdrvdata_lock, flags);
130         list_for_each_entry(cons, &pdrvdata.consoles, list) {
131                 if (cons->vtermno == vtermno) {
132                         port = container_of(cons, struct port, cons);
133                         goto out;
134                 }
135         }
136         port = NULL;
137 out:
138         spin_unlock_irqrestore(&pdrvdata_lock, flags);
139         return port;
140 }
141
142 static struct port *find_port_by_vq(struct ports_device *portdev,
143                                     struct virtqueue *vq)
144 {
145         struct port *port;
146         struct console *cons;
147         unsigned long flags;
148
149         spin_lock_irqsave(&pdrvdata_lock, flags);
150         list_for_each_entry(cons, &pdrvdata.consoles, list) {
151                 port = container_of(cons, struct port, cons);
152                 if (port->in_vq == vq || port->out_vq == vq)
153                         goto out;
154         }
155         port = NULL;
156 out:
157         spin_unlock_irqrestore(&pdrvdata_lock, flags);
158         return port;
159 }
160
161 static void free_buf(struct port_buffer *buf)
162 {
163         kfree(buf->buf);
164         kfree(buf);
165 }
166
167 static struct port_buffer *alloc_buf(size_t buf_size)
168 {
169         struct port_buffer *buf;
170
171         buf = kmalloc(sizeof(*buf), GFP_KERNEL);
172         if (!buf)
173                 goto fail;
174         buf->buf = kzalloc(buf_size, GFP_KERNEL);
175         if (!buf->buf)
176                 goto free_buf;
177         buf->len = 0;
178         buf->offset = 0;
179         buf->size = buf_size;
180         return buf;
181
182 free_buf:
183         kfree(buf);
184 fail:
185         return NULL;
186 }
187
188 /* Callers should take appropriate locks */
189 static void *get_inbuf(struct port *port)
190 {
191         struct port_buffer *buf;
192         struct virtqueue *vq;
193         unsigned int len;
194
195         vq = port->in_vq;
196         buf = vq->vq_ops->get_buf(vq, &len);
197         if (buf) {
198                 buf->len = len;
199                 buf->offset = 0;
200         }
201         return buf;
202 }
203
204 /*
205  * Create a scatter-gather list representing our input buffer and put
206  * it in the queue.
207  *
208  * Callers should take appropriate locks.
209  */
210 static int add_inbuf(struct virtqueue *vq, struct port_buffer *buf)
211 {
212         struct scatterlist sg[1];
213         int ret;
214
215         sg_init_one(sg, buf->buf, buf->size);
216
217         ret = vq->vq_ops->add_buf(vq, sg, 0, 1, buf);
218         vq->vq_ops->kick(vq);
219         return ret;
220 }
221
222 static bool port_has_data(struct port *port)
223 {
224         unsigned long flags;
225         bool ret;
226
227         ret = false;
228         spin_lock_irqsave(&port->inbuf_lock, flags);
229         if (port->inbuf)
230                 ret = true;
231         spin_unlock_irqrestore(&port->inbuf_lock, flags);
232
233         return ret;
234 }
235
236 static ssize_t send_buf(struct port *port, void *in_buf, size_t in_count)
237 {
238         struct scatterlist sg[1];
239         struct virtqueue *out_vq;
240         ssize_t ret;
241         unsigned int len;
242
243         out_vq = port->out_vq;
244
245         sg_init_one(sg, in_buf, in_count);
246         ret = out_vq->vq_ops->add_buf(out_vq, sg, 1, 0, in_buf);
247
248         /* Tell Host to go! */
249         out_vq->vq_ops->kick(out_vq);
250
251         if (ret < 0) {
252                 len = 0;
253                 goto fail;
254         }
255
256         /*
257          * Wait till the host acknowledges it pushed out the data we
258          * sent. Also ensure we return to userspace the number of
259          * bytes that were successfully consumed by the host.
260          */
261         while (!out_vq->vq_ops->get_buf(out_vq, &len))
262                 cpu_relax();
263 fail:
264         /* We're expected to return the amount of data we wrote */
265         return len;
266 }
267
268 /*
269  * Give out the data that's requested from the buffer that we have
270  * queued up.
271  */
272 static ssize_t fill_readbuf(struct port *port, char *out_buf, size_t out_count)
273 {
274         struct port_buffer *buf;
275         unsigned long flags;
276
277         if (!out_count || !port_has_data(port))
278                 return 0;
279
280         buf = port->inbuf;
281         if (out_count > buf->len - buf->offset)
282                 out_count = buf->len - buf->offset;
283
284         memcpy(out_buf, buf->buf + buf->offset, out_count);
285
286         /* Return the number of bytes actually copied */
287         buf->offset += out_count;
288
289         if (buf->offset == buf->len) {
290                 /*
291                  * We're done using all the data in this buffer.
292                  * Re-queue so that the Host can send us more data.
293                  */
294                 spin_lock_irqsave(&port->inbuf_lock, flags);
295                 port->inbuf = NULL;
296
297                 if (add_inbuf(port->in_vq, buf) < 0)
298                         dev_warn(&port->portdev->vdev->dev, "failed add_buf\n");
299
300                 spin_unlock_irqrestore(&port->inbuf_lock, flags);
301         }
302         return out_count;
303 }
304
305 /*
306  * The put_chars() callback is pretty straightforward.
307  *
308  * We turn the characters into a scatter-gather list, add it to the
309  * output queue and then kick the Host.  Then we sit here waiting for
310  * it to finish: inefficient in theory, but in practice
311  * implementations will do it immediately (lguest's Launcher does).
312  */
313 static int put_chars(u32 vtermno, const char *buf, int count)
314 {
315         struct port *port;
316
317         port = find_port_by_vtermno(vtermno);
318         if (!port)
319                 return 0;
320
321         if (unlikely(early_put_chars))
322                 return early_put_chars(vtermno, buf, count);
323
324         return send_buf(port, (void *)buf, count);
325 }
326
327 /*
328  * get_chars() is the callback from the hvc_console infrastructure
329  * when an interrupt is received.
330  *
331  * We call out to fill_readbuf that gets us the required data from the
332  * buffers that are queued up.
333  */
334 static int get_chars(u32 vtermno, char *buf, int count)
335 {
336         struct port *port;
337
338         port = find_port_by_vtermno(vtermno);
339         if (!port)
340                 return 0;
341
342         /* If we don't have an input queue yet, we can't get input. */
343         BUG_ON(!port->in_vq);
344
345         return fill_readbuf(port, buf, count);
346 }
347
348 static void resize_console(struct port *port)
349 {
350         struct virtio_device *vdev;
351         struct winsize ws;
352
353         vdev = port->portdev->vdev;
354         if (virtio_has_feature(vdev, VIRTIO_CONSOLE_F_SIZE)) {
355                 vdev->config->get(vdev,
356                                   offsetof(struct virtio_console_config, cols),
357                                   &ws.ws_col, sizeof(u16));
358                 vdev->config->get(vdev,
359                                   offsetof(struct virtio_console_config, rows),
360                                   &ws.ws_row, sizeof(u16));
361                 hvc_resize(port->cons.hvc, ws);
362         }
363 }
364
365 static void virtcons_apply_config(struct virtio_device *vdev)
366 {
367         resize_console(find_port_by_vtermno(0));
368 }
369
370 /* We set the configuration at this point, since we now have a tty */
371 static int notifier_add_vio(struct hvc_struct *hp, int data)
372 {
373         struct port *port;
374
375         port = find_port_by_vtermno(hp->vtermno);
376         if (!port)
377                 return -EINVAL;
378
379         hp->irq_requested = 1;
380         resize_console(port);
381
382         return 0;
383 }
384
385 static void notifier_del_vio(struct hvc_struct *hp, int data)
386 {
387         hp->irq_requested = 0;
388 }
389
390 static void hvc_handle_input(struct virtqueue *vq)
391 {
392         struct port *port;
393         unsigned long flags;
394
395         port = find_port_by_vq(vq->vdev->priv, vq);
396         if (!port)
397                 return;
398
399         spin_lock_irqsave(&port->inbuf_lock, flags);
400         port->inbuf = get_inbuf(port);
401         spin_unlock_irqrestore(&port->inbuf_lock, flags);
402
403         if (hvc_poll(port->cons.hvc))
404                 hvc_kick();
405 }
406
407 /* The operations for the console. */
408 static const struct hv_ops hv_ops = {
409         .get_chars = get_chars,
410         .put_chars = put_chars,
411         .notifier_add = notifier_add_vio,
412         .notifier_del = notifier_del_vio,
413         .notifier_hangup = notifier_del_vio,
414 };
415
416 /*
417  * Console drivers are initialized very early so boot messages can go
418  * out, so we do things slightly differently from the generic virtio
419  * initialization of the net and block drivers.
420  *
421  * At this stage, the console is output-only.  It's too early to set
422  * up a virtqueue, so we let the drivers do some boutique early-output
423  * thing.
424  */
425 int __init virtio_cons_early_init(int (*put_chars)(u32, const char *, int))
426 {
427         early_put_chars = put_chars;
428         return hvc_instantiate(0, 0, &hv_ops);
429 }
430
431 int __devinit init_port_console(struct port *port)
432 {
433         int ret;
434
435         /*
436          * The Host's telling us this port is a console port.  Hook it
437          * up with an hvc console.
438          *
439          * To set up and manage our virtual console, we call
440          * hvc_alloc().
441          *
442          * The first argument of hvc_alloc() is the virtual console
443          * number.  The second argument is the parameter for the
444          * notification mechanism (like irq number).  We currently
445          * leave this as zero, virtqueues have implicit notifications.
446          *
447          * The third argument is a "struct hv_ops" containing the
448          * put_chars() get_chars(), notifier_add() and notifier_del()
449          * pointers.  The final argument is the output buffer size: we
450          * can do any size, so we put PAGE_SIZE here.
451          */
452         port->cons.vtermno = pdrvdata.next_vtermno;
453
454         port->cons.hvc = hvc_alloc(port->cons.vtermno, 0, &hv_ops, PAGE_SIZE);
455         if (IS_ERR(port->cons.hvc)) {
456                 ret = PTR_ERR(port->cons.hvc);
457                 port->cons.hvc = NULL;
458                 return ret;
459         }
460         spin_lock_irq(&pdrvdata_lock);
461         pdrvdata.next_vtermno++;
462         list_add_tail(&port->cons.list, &pdrvdata.consoles);
463         spin_unlock_irq(&pdrvdata_lock);
464
465         return 0;
466 }
467
468 static int __devinit add_port(struct ports_device *portdev)
469 {
470         struct port *port;
471         struct port_buffer *inbuf;
472         int err;
473
474         port = kmalloc(sizeof(*port), GFP_KERNEL);
475         if (!port) {
476                 err = -ENOMEM;
477                 goto fail;
478         }
479
480         port->portdev = portdev;
481
482         port->inbuf = NULL;
483
484         port->in_vq = portdev->in_vqs[0];
485         port->out_vq = portdev->out_vqs[0];
486
487         spin_lock_init(&port->inbuf_lock);
488
489         inbuf = alloc_buf(PAGE_SIZE);
490         if (!inbuf) {
491                 err = -ENOMEM;
492                 goto free_port;
493         }
494
495         /* Register the input buffer the first time. */
496         add_inbuf(port->in_vq, inbuf);
497
498         err = init_port_console(port);
499         if (err)
500                 goto free_inbuf;
501
502         return 0;
503
504 free_inbuf:
505         free_buf(inbuf);
506 free_port:
507         kfree(port);
508 fail:
509         return err;
510 }
511
512 static int init_vqs(struct ports_device *portdev)
513 {
514         vq_callback_t **io_callbacks;
515         char **io_names;
516         struct virtqueue **vqs;
517         u32 nr_ports, nr_queues;
518         int err;
519
520         /* We currently only have one port and two queues for that port */
521         nr_ports = 1;
522         nr_queues = 2;
523
524         vqs = kmalloc(nr_queues * sizeof(struct virtqueue *), GFP_KERNEL);
525         if (!vqs) {
526                 err = -ENOMEM;
527                 goto fail;
528         }
529         io_callbacks = kmalloc(nr_queues * sizeof(vq_callback_t *), GFP_KERNEL);
530         if (!io_callbacks) {
531                 err = -ENOMEM;
532                 goto free_vqs;
533         }
534         io_names = kmalloc(nr_queues * sizeof(char *), GFP_KERNEL);
535         if (!io_names) {
536                 err = -ENOMEM;
537                 goto free_callbacks;
538         }
539         portdev->in_vqs = kmalloc(nr_ports * sizeof(struct virtqueue *),
540                                   GFP_KERNEL);
541         if (!portdev->in_vqs) {
542                 err = -ENOMEM;
543                 goto free_names;
544         }
545         portdev->out_vqs = kmalloc(nr_ports * sizeof(struct virtqueue *),
546                                    GFP_KERNEL);
547         if (!portdev->out_vqs) {
548                 err = -ENOMEM;
549                 goto free_invqs;
550         }
551
552         io_callbacks[0] = hvc_handle_input;
553         io_callbacks[1] = NULL;
554         io_names[0] = "input";
555         io_names[1] = "output";
556
557         /* Find the queues. */
558         err = portdev->vdev->config->find_vqs(portdev->vdev, nr_queues, vqs,
559                                               io_callbacks,
560                                               (const char **)io_names);
561         if (err)
562                 goto free_outvqs;
563
564         portdev->in_vqs[0] = vqs[0];
565         portdev->out_vqs[0] = vqs[1];
566
567         kfree(io_callbacks);
568         kfree(io_names);
569         kfree(vqs);
570
571         return 0;
572
573 free_names:
574         kfree(io_names);
575 free_callbacks:
576         kfree(io_callbacks);
577 free_outvqs:
578         kfree(portdev->out_vqs);
579 free_invqs:
580         kfree(portdev->in_vqs);
581 free_vqs:
582         kfree(vqs);
583 fail:
584         return err;
585 }
586
587 /*
588  * Once we're further in boot, we get probed like any other virtio
589  * device.
590  */
591 static int __devinit virtcons_probe(struct virtio_device *vdev)
592 {
593         struct ports_device *portdev;
594         int err;
595
596         portdev = kmalloc(sizeof(*portdev), GFP_KERNEL);
597         if (!portdev) {
598                 err = -ENOMEM;
599                 goto fail;
600         }
601
602         /* Attach this portdev to this virtio_device, and vice-versa. */
603         portdev->vdev = vdev;
604         vdev->priv = portdev;
605
606         err = init_vqs(portdev);
607         if (err < 0) {
608                 dev_err(&vdev->dev, "Error %d initializing vqs\n", err);
609                 goto free;
610         }
611
612         /* We only have one port. */
613         err = add_port(portdev);
614         if (err)
615                 goto free_vqs;
616
617         /* Start using the new console output. */
618         early_put_chars = NULL;
619         return 0;
620
621 free_vqs:
622         vdev->config->del_vqs(vdev);
623         kfree(portdev->in_vqs);
624         kfree(portdev->out_vqs);
625 free:
626         kfree(portdev);
627 fail:
628         return err;
629 }
630
631 static struct virtio_device_id id_table[] = {
632         { VIRTIO_ID_CONSOLE, VIRTIO_DEV_ANY_ID },
633         { 0 },
634 };
635
636 static unsigned int features[] = {
637         VIRTIO_CONSOLE_F_SIZE,
638 };
639
640 static struct virtio_driver virtio_console = {
641         .feature_table = features,
642         .feature_table_size = ARRAY_SIZE(features),
643         .driver.name =  KBUILD_MODNAME,
644         .driver.owner = THIS_MODULE,
645         .id_table =     id_table,
646         .probe =        virtcons_probe,
647         .config_changed = virtcons_apply_config,
648 };
649
650 static int __init init(void)
651 {
652         INIT_LIST_HEAD(&pdrvdata.consoles);
653
654         return register_virtio_driver(&virtio_console);
655 }
656 module_init(init);
657
658 MODULE_DEVICE_TABLE(virtio, id_table);
659 MODULE_DESCRIPTION("Virtio console driver");
660 MODULE_LICENSE("GPL");