linux/drivers/tty/hvc/hvc_console.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2001 Anton Blanchard <anton@au.ibm.com>, IBM
   3 * Copyright (C) 2001 Paul Mackerras <paulus@au.ibm.com>, IBM
   4 * Copyright (C) 2004 Benjamin Herrenschmidt <benh@kernel.crashing.org>, IBM Corp.
   5 * Copyright (C) 2004 IBM Corporation
   6 *
   7 * Additional Author(s):
   8 *  Ryan S. Arnold <rsa@us.ibm.com>
   9 *
  10 * This program is free software; you can redistribute it and/or modify
  11 * it under the terms of the GNU General Public License as published by
  12 * the Free Software Foundation; either version 2 of the License, or
  13 * (at your option) any later version.
  14 * 
  15 * This program is distributed in the hope that it will be useful,
  16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18 * GNU General Public License for more details.
  19 * 
  20 * You should have received a copy of the GNU General Public License
  21 * along with this program; if not, write to the Free Software
  22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  23 */
  24
  25#include <linux/console.h>
  26#include <linux/cpumask.h>
  27#include <linux/init.h>
  28#include <linux/kbd_kern.h>
  29#include <linux/kernel.h>
  30#include <linux/kthread.h>
  31#include <linux/list.h>
  32#include <linux/major.h>
  33#include <linux/atomic.h>
  34#include <linux/sysrq.h>
  35#include <linux/tty.h>
  36#include <linux/tty_flip.h>
  37#include <linux/sched.h>
  38#include <linux/spinlock.h>
  39#include <linux/delay.h>
  40#include <linux/freezer.h>
  41#include <linux/slab.h>
  42#include <linux/serial_core.h>
  43
  44#include <linux/uaccess.h>
  45
  46#include "hvc_console.h"
  47
  48#define HVC_MAJOR       229
  49#define HVC_MINOR       0
  50
  51/*
  52 * Wait this long per iteration while trying to push buffered data to the
  53 * hypervisor before allowing the tty to complete a close operation.
  54 */
  55#define HVC_CLOSE_WAIT (HZ/100) /* 1/10 of a second */
  56
  57/*
  58 * These sizes are most efficient for vio, because they are the
  59 * native transfer size. We could make them selectable in the
  60 * future to better deal with backends that want other buffer sizes.
  61 */
  62#define N_OUTBUF        16
  63#define N_INBUF         16
  64
  65#define __ALIGNED__ __attribute__((__aligned__(sizeof(long))))
  66
  67static struct tty_driver *hvc_driver;
  68static struct task_struct *hvc_task;
  69
  70/* Picks up late kicks after list walk but before schedule() */
  71static int hvc_kicked;
  72
  73/* hvc_init is triggered from hvc_alloc, i.e. only when actually used */
  74static atomic_t hvc_needs_init __read_mostly = ATOMIC_INIT(-1);
  75
  76static int hvc_init(void);
  77
  78#ifdef CONFIG_MAGIC_SYSRQ
  79static int sysrq_pressed;
  80#endif
  81
  82/* dynamic list of hvc_struct instances */
  83static LIST_HEAD(hvc_structs);
  84
  85/*
  86 * Protect the list of hvc_struct instances from inserts and removals during
  87 * list traversal.
  88 */
  89static DEFINE_SPINLOCK(hvc_structs_lock);
  90
  91/*
  92 * This value is used to assign a tty->index value to a hvc_struct based
  93 * upon order of exposure via hvc_probe(), when we can not match it to
  94 * a console candidate registered with hvc_instantiate().
  95 */
  96static int last_hvc = -1;
  97
  98/*
  99 * Do not call this function with either the hvc_structs_lock or the hvc_struct
 100 * lock held.  If successful, this function increments the kref reference
 101 * count against the target hvc_struct so it should be released when finished.
 102 */
 103static struct hvc_struct *hvc_get_by_index(int index)
 104{
 105        struct hvc_struct *hp;
 106        unsigned long flags;
 107
 108        spin_lock(&hvc_structs_lock);
 109
 110        list_for_each_entry(hp, &hvc_structs, next) {
 111                spin_lock_irqsave(&hp->lock, flags);
 112                if (hp->index == index) {
 113                        tty_port_get(&hp->port);
 114                        spin_unlock_irqrestore(&hp->lock, flags);
 115                        spin_unlock(&hvc_structs_lock);
 116                        return hp;
 117                }
 118                spin_unlock_irqrestore(&hp->lock, flags);
 119        }
 120        hp = NULL;
 121
 122        spin_unlock(&hvc_structs_lock);
 123        return hp;
 124}
 125
 126
 127/*
 128 * Initial console vtermnos for console API usage prior to full console
 129 * initialization.  Any vty adapter outside this range will not have usable
 130 * console interfaces but can still be used as a tty device.  This has to be
 131 * static because kmalloc will not work during early console init.
 132 */
 133static const struct hv_ops *cons_ops[MAX_NR_HVC_CONSOLES];
 134static uint32_t vtermnos[MAX_NR_HVC_CONSOLES] =
 135        {[0 ... MAX_NR_HVC_CONSOLES - 1] = -1};
 136
 137/*
 138 * Console APIs, NOT TTY.  These APIs are available immediately when
 139 * hvc_console_setup() finds adapters.
 140 */
 141
 142static void hvc_console_print(struct console *co, const char *b,
 143                              unsigned count)
 144{
 145        char c[N_OUTBUF] __ALIGNED__;
 146        unsigned i = 0, n = 0;
 147        int r, donecr = 0, index = co->index;
 148
 149        /* Console access attempt outside of acceptable console range. */
 150        if (index >= MAX_NR_HVC_CONSOLES)
 151                return;
 152
 153        /* This console adapter was removed so it is not usable. */
 154        if (vtermnos[index] == -1)
 155                return;
 156
 157        while (count > 0 || i > 0) {
 158                if (count > 0 && i < sizeof(c)) {
 159                        if (b[n] == '\n' && !donecr) {
 160                                c[i++] = '\r';
 161                                donecr = 1;
 162                        } else {
 163                                c[i++] = b[n++];
 164                                donecr = 0;
 165                                --count;
 166                        }
 167                } else {
 168                        r = cons_ops[index]->put_chars(vtermnos[index], c, i);
 169                        if (r <= 0) {
 170                                /* throw away characters on error
 171                                 * but spin in case of -EAGAIN */
 172                                if (r != -EAGAIN)
 173                                        i = 0;
 174                        } else if (r > 0) {
 175                                i -= r;
 176                                if (i > 0)
 177                                        memmove(c, c+r, i);
 178                        }
 179                }
 180        }
 181}
 182
 183static struct tty_driver *hvc_console_device(struct console *c, int *index)
 184{
 185        if (vtermnos[c->index] == -1)
 186                return NULL;
 187
 188        *index = c->index;
 189        return hvc_driver;
 190}
 191
 192static int hvc_console_setup(struct console *co, char *options)
 193{       
 194        if (co->index < 0 || co->index >= MAX_NR_HVC_CONSOLES)
 195                return -ENODEV;
 196
 197        if (vtermnos[co->index] == -1)
 198                return -ENODEV;
 199
 200        return 0;
 201}
 202
 203static struct console hvc_console = {
 204        .name           = "hvc",
 205        .write          = hvc_console_print,
 206        .device         = hvc_console_device,
 207        .setup          = hvc_console_setup,
 208        .flags          = CON_PRINTBUFFER,
 209        .index          = -1,
 210};
 211
 212/*
 213 * Early console initialization.  Precedes driver initialization.
 214 *
 215 * (1) we are first, and the user specified another driver
 216 * -- index will remain -1
 217 * (2) we are first and the user specified no driver
 218 * -- index will be set to 0, then we will fail setup.
 219 * (3)  we are first and the user specified our driver
 220 * -- index will be set to user specified driver, and we will fail
 221 * (4) we are after driver, and this initcall will register us
 222 * -- if the user didn't specify a driver then the console will match
 223 *
 224 * Note that for cases 2 and 3, we will match later when the io driver
 225 * calls hvc_instantiate() and call register again.
 226 */
 227static int __init hvc_console_init(void)
 228{
 229        register_console(&hvc_console);
 230        return 0;
 231}
 232console_initcall(hvc_console_init);
 233
 234/* callback when the kboject ref count reaches zero. */
 235static void hvc_port_destruct(struct tty_port *port)
 236{
 237        struct hvc_struct *hp = container_of(port, struct hvc_struct, port);
 238        unsigned long flags;
 239
 240        spin_lock(&hvc_structs_lock);
 241
 242        spin_lock_irqsave(&hp->lock, flags);
 243        list_del(&(hp->next));
 244        spin_unlock_irqrestore(&hp->lock, flags);
 245
 246        spin_unlock(&hvc_structs_lock);
 247
 248        kfree(hp);
 249}
 250
 251static void hvc_check_console(int index)
 252{
 253        /* Already enabled, bail out */
 254        if (hvc_console.flags & CON_ENABLED)
 255                return;
 256
 257        /* If this index is what the user requested, then register
 258         * now (setup won't fail at this point).  It's ok to just
 259         * call register again if previously .setup failed.
 260         */
 261        if (index == hvc_console.index)
 262                register_console(&hvc_console);
 263}
 264
 265/*
 266 * hvc_instantiate() is an early console discovery method which locates
 267 * consoles * prior to the vio subsystem discovering them.  Hotplugged
 268 * vty adapters do NOT get an hvc_instantiate() callback since they
 269 * appear after early console init.
 270 */
 271int hvc_instantiate(uint32_t vtermno, int index, const struct hv_ops *ops)
 272{
 273        struct hvc_struct *hp;
 274
 275        if (index < 0 || index >= MAX_NR_HVC_CONSOLES)
 276                return -1;
 277
 278        if (vtermnos[index] != -1)
 279                return -1;
 280
 281        /* make sure no no tty has been registered in this index */
 282        hp = hvc_get_by_index(index);
 283        if (hp) {
 284                tty_port_put(&hp->port);
 285                return -1;
 286        }
 287
 288        vtermnos[index] = vtermno;
 289        cons_ops[index] = ops;
 290
 291        /* reserve all indices up to and including this index */
 292        if (last_hvc < index)
 293                last_hvc = index;
 294
 295        /* check if we need to re-register the kernel console */
 296        hvc_check_console(index);
 297
 298        return 0;
 299}
 300EXPORT_SYMBOL_GPL(hvc_instantiate);
 301
 302/* Wake the sleeping khvcd */
 303void hvc_kick(void)
 304{
 305        hvc_kicked = 1;
 306        wake_up_process(hvc_task);
 307}
 308EXPORT_SYMBOL_GPL(hvc_kick);
 309
 310static void hvc_unthrottle(struct tty_struct *tty)
 311{
 312        hvc_kick();
 313}
 314
 315static int hvc_install(struct tty_driver *driver, struct tty_struct *tty)
 316{
 317        struct hvc_struct *hp;
 318        int rc;
 319
 320        /* Auto increments kref reference if found. */
 321        hp = hvc_get_by_index(tty->index);
 322        if (!hp)
 323                return -ENODEV;
 324
 325        tty->driver_data = hp;
 326
 327        rc = tty_port_install(&hp->port, driver, tty);
 328        if (rc)
 329                tty_port_put(&hp->port);
 330        return rc;
 331}
 332
 333/*
 334 * The TTY interface won't be used until after the vio layer has exposed the vty
 335 * adapter to the kernel.
 336 */
 337static int hvc_open(struct tty_struct *tty, struct file * filp)
 338{
 339        struct hvc_struct *hp = tty->driver_data;
 340        unsigned long flags;
 341        int rc = 0;
 342
 343        spin_lock_irqsave(&hp->port.lock, flags);
 344        /* Check and then increment for fast path open. */
 345        if (hp->port.count++ > 0) {
 346                spin_unlock_irqrestore(&hp->port.lock, flags);
 347                hvc_kick();
 348                return 0;
 349        } /* else count == 0 */
 350        spin_unlock_irqrestore(&hp->port.lock, flags);
 351
 352        tty_port_tty_set(&hp->port, tty);
 353
 354        if (hp->ops->notifier_add)
 355                rc = hp->ops->notifier_add(hp, hp->data);
 356
 357        /*
 358         * If the notifier fails we return an error.  The tty layer
 359         * will call hvc_close() after a failed open but we don't want to clean
 360         * up there so we'll clean up here and clear out the previously set
 361         * tty fields and return the kref reference.
 362         */
 363        if (rc) {
 364                tty_port_tty_set(&hp->port, NULL);
 365                tty->driver_data = NULL;
 366                tty_port_put(&hp->port);
 367                printk(KERN_ERR "hvc_open: request_irq failed with rc %d.\n", rc);
 368        } else
 369                /* We are ready... raise DTR/RTS */
 370                if (C_BAUD(tty))
 371                        if (hp->ops->dtr_rts)
 372                                hp->ops->dtr_rts(hp, 1);
 373
 374        /* Force wakeup of the polling thread */
 375        hvc_kick();
 376
 377        return rc;
 378}
 379
 380static void hvc_close(struct tty_struct *tty, struct file * filp)
 381{
 382        struct hvc_struct *hp;
 383        unsigned long flags;
 384
 385        if (tty_hung_up_p(filp))
 386                return;
 387
 388        /*
 389         * No driver_data means that this close was issued after a failed
 390         * hvc_open by the tty layer's release_dev() function and we can just
 391         * exit cleanly because the kref reference wasn't made.
 392         */
 393        if (!tty->driver_data)
 394                return;
 395
 396        hp = tty->driver_data;
 397
 398        spin_lock_irqsave(&hp->port.lock, flags);
 399
 400        if (--hp->port.count == 0) {
 401                spin_unlock_irqrestore(&hp->port.lock, flags);
 402                /* We are done with the tty pointer now. */
 403                tty_port_tty_set(&hp->port, NULL);
 404
 405                if (C_HUPCL(tty))
 406                        if (hp->ops->dtr_rts)
 407                                hp->ops->dtr_rts(hp, 0);
 408
 409                if (hp->ops->notifier_del)
 410                        hp->ops->notifier_del(hp, hp->data);
 411
 412                /* cancel pending tty resize work */
 413                cancel_work_sync(&hp->tty_resize);
 414
 415                /*
 416                 * Chain calls chars_in_buffer() and returns immediately if
 417                 * there is no buffered data otherwise sleeps on a wait queue
 418                 * waking periodically to check chars_in_buffer().
 419                 */
 420                tty_wait_until_sent(tty, HVC_CLOSE_WAIT);
 421        } else {
 422                if (hp->port.count < 0)
 423                        printk(KERN_ERR "hvc_close %X: oops, count is %d\n",
 424                                hp->vtermno, hp->port.count);
 425                spin_unlock_irqrestore(&hp->port.lock, flags);
 426        }
 427}
 428
 429static void hvc_cleanup(struct tty_struct *tty)
 430{
 431        struct hvc_struct *hp = tty->driver_data;
 432
 433        tty_port_put(&hp->port);
 434}
 435
 436static void hvc_hangup(struct tty_struct *tty)
 437{
 438        struct hvc_struct *hp = tty->driver_data;
 439        unsigned long flags;
 440
 441        if (!hp)
 442                return;
 443
 444        /* cancel pending tty resize work */
 445        cancel_work_sync(&hp->tty_resize);
 446
 447        spin_lock_irqsave(&hp->port.lock, flags);
 448
 449        /*
 450         * The N_TTY line discipline has problems such that in a close vs
 451         * open->hangup case this can be called after the final close so prevent
 452         * that from happening for now.
 453         */
 454        if (hp->port.count <= 0) {
 455                spin_unlock_irqrestore(&hp->port.lock, flags);
 456                return;
 457        }
 458
 459        hp->port.count = 0;
 460        spin_unlock_irqrestore(&hp->port.lock, flags);
 461        tty_port_tty_set(&hp->port, NULL);
 462
 463        hp->n_outbuf = 0;
 464
 465        if (hp->ops->notifier_hangup)
 466                hp->ops->notifier_hangup(hp, hp->data);
 467}
 468
 469/*
 470 * Push buffered characters whether they were just recently buffered or waiting
 471 * on a blocked hypervisor.  Call this function with hp->lock held.
 472 */
 473static int hvc_push(struct hvc_struct *hp)
 474{
 475        int n;
 476
 477        n = hp->ops->put_chars(hp->vtermno, hp->outbuf, hp->n_outbuf);
 478        if (n <= 0) {
 479                if (n == 0 || n == -EAGAIN) {
 480                        hp->do_wakeup = 1;
 481                        return 0;
 482                }
 483                /* throw away output on error; this happens when
 484                   there is no session connected to the vterm. */
 485                hp->n_outbuf = 0;
 486        } else
 487                hp->n_outbuf -= n;
 488        if (hp->n_outbuf > 0)
 489                memmove(hp->outbuf, hp->outbuf + n, hp->n_outbuf);
 490        else
 491                hp->do_wakeup = 1;
 492
 493        return n;
 494}
 495
 496static int hvc_write(struct tty_struct *tty, const unsigned char *buf, int count)
 497{
 498        struct hvc_struct *hp = tty->driver_data;
 499        unsigned long flags;
 500        int rsize, written = 0;
 501
 502        /* This write was probably executed during a tty close. */
 503        if (!hp)
 504                return -EPIPE;
 505
 506        /* FIXME what's this (unprotected) check for? */
 507        if (hp->port.count <= 0)
 508                return -EIO;
 509
 510        spin_lock_irqsave(&hp->lock, flags);
 511
 512        /* Push pending writes */
 513        if (hp->n_outbuf > 0)
 514                hvc_push(hp);
 515
 516        while (count > 0 && (rsize = hp->outbuf_size - hp->n_outbuf) > 0) {
 517                if (rsize > count)
 518                        rsize = count;
 519                memcpy(hp->outbuf + hp->n_outbuf, buf, rsize);
 520                count -= rsize;
 521                buf += rsize;
 522                hp->n_outbuf += rsize;
 523                written += rsize;
 524                hvc_push(hp);
 525        }
 526        spin_unlock_irqrestore(&hp->lock, flags);
 527
 528        /*
 529         * Racy, but harmless, kick thread if there is still pending data.
 530         */
 531        if (hp->n_outbuf)
 532                hvc_kick();
 533
 534        return written;
 535}
 536
 537/**
 538 * hvc_set_winsz() - Resize the hvc tty terminal window.
 539 * @work:       work structure.
 540 *
 541 * The routine shall not be called within an atomic context because it
 542 * might sleep.
 543 *
 544 * Locking:     hp->lock
 545 */
 546static void hvc_set_winsz(struct work_struct *work)
 547{
 548        struct hvc_struct *hp;
 549        unsigned long hvc_flags;
 550        struct tty_struct *tty;
 551        struct winsize ws;
 552
 553        hp = container_of(work, struct hvc_struct, tty_resize);
 554
 555        tty = tty_port_tty_get(&hp->port);
 556        if (!tty)
 557                return;
 558
 559        spin_lock_irqsave(&hp->lock, hvc_flags);
 560        ws = hp->ws;
 561        spin_unlock_irqrestore(&hp->lock, hvc_flags);
 562
 563        tty_do_resize(tty, &ws);
 564        tty_kref_put(tty);
 565}
 566
 567/*
 568 * This is actually a contract between the driver and the tty layer outlining
 569 * how much write room the driver can guarantee will be sent OR BUFFERED.  This
 570 * driver MUST honor the return value.
 571 */
 572static int hvc_write_room(struct tty_struct *tty)
 573{
 574        struct hvc_struct *hp = tty->driver_data;
 575
 576        if (!hp)
 577                return 0;
 578
 579        return hp->outbuf_size - hp->n_outbuf;
 580}
 581
 582static int hvc_chars_in_buffer(struct tty_struct *tty)
 583{
 584        struct hvc_struct *hp = tty->driver_data;
 585
 586        if (!hp)
 587                return 0;
 588        return hp->n_outbuf;
 589}
 590
 591/*
 592 * timeout will vary between the MIN and MAX values defined here.  By default
 593 * and during console activity we will use a default MIN_TIMEOUT of 10.  When
 594 * the console is idle, we increase the timeout value on each pass through
 595 * msleep until we reach the max.  This may be noticeable as a brief (average
 596 * one second) delay on the console before the console responds to input when
 597 * there has been no input for some time.
 598 */
 599#define MIN_TIMEOUT             (10)
 600#define MAX_TIMEOUT             (2000)
 601static u32 timeout = MIN_TIMEOUT;
 602
 603#define HVC_POLL_READ   0x00000001
 604#define HVC_POLL_WRITE  0x00000002
 605
 606int hvc_poll(struct hvc_struct *hp)
 607{
 608        struct tty_struct *tty;
 609        int i, n, poll_mask = 0;
 610        char buf[N_INBUF] __ALIGNED__;
 611        unsigned long flags;
 612        int read_total = 0;
 613        int written_total = 0;
 614
 615        spin_lock_irqsave(&hp->lock, flags);
 616
 617        /* Push pending writes */
 618        if (hp->n_outbuf > 0)
 619                written_total = hvc_push(hp);
 620
 621        /* Reschedule us if still some write pending */
 622        if (hp->n_outbuf > 0) {
 623                poll_mask |= HVC_POLL_WRITE;
 624                /* If hvc_push() was not able to write, sleep a few msecs */
 625                timeout = (written_total) ? 0 : MIN_TIMEOUT;
 626        }
 627
 628        /* No tty attached, just skip */
 629        tty = tty_port_tty_get(&hp->port);
 630        if (tty == NULL)
 631                goto bail;
 632
 633        /* Now check if we can get data (are we throttled ?) */
 634        if (tty_throttled(tty))
 635                goto throttled;
 636
 637        /* If we aren't notifier driven and aren't throttled, we always
 638         * request a reschedule
 639         */
 640        if (!hp->irq_requested)
 641                poll_mask |= HVC_POLL_READ;
 642
 643        /* Read data if any */
 644        for (;;) {
 645                int count = tty_buffer_request_room(&hp->port, N_INBUF);
 646
 647                /* If flip is full, just reschedule a later read */
 648                if (count == 0) {
 649                        poll_mask |= HVC_POLL_READ;
 650                        break;
 651                }
 652
 653                n = hp->ops->get_chars(hp->vtermno, buf, count);
 654                if (n <= 0) {
 655                        /* Hangup the tty when disconnected from host */
 656                        if (n == -EPIPE) {
 657                                spin_unlock_irqrestore(&hp->lock, flags);
 658                                tty_hangup(tty);
 659                                spin_lock_irqsave(&hp->lock, flags);
 660                        } else if ( n == -EAGAIN ) {
 661                                /*
 662                                 * Some back-ends can only ensure a certain min
 663                                 * num of bytes read, which may be > 'count'.
 664                                 * Let the tty clear the flip buff to make room.
 665                                 */
 666                                poll_mask |= HVC_POLL_READ;
 667                        }
 668                        break;
 669                }
 670                for (i = 0; i < n; ++i) {
 671#ifdef CONFIG_MAGIC_SYSRQ
 672                        if (hp->index == hvc_console.index) {
 673                                /* Handle the SysRq Hack */
 674                                /* XXX should support a sequence */
 675                                if (buf[i] == '\x0f') { /* ^O */
 676                                        /* if ^O is pressed again, reset
 677                                         * sysrq_pressed and flip ^O char */
 678                                        sysrq_pressed = !sysrq_pressed;
 679                                        if (sysrq_pressed)
 680                                                continue;
 681                                } else if (sysrq_pressed) {
 682                                        handle_sysrq(buf[i]);
 683                                        sysrq_pressed = 0;
 684                                        continue;
 685                                }
 686                        }
 687#endif /* CONFIG_MAGIC_SYSRQ */
 688                        tty_insert_flip_char(&hp->port, buf[i], 0);
 689                }
 690
 691                read_total += n;
 692        }
 693 throttled:
 694        /* Wakeup write queue if necessary */
 695        if (hp->do_wakeup) {
 696                hp->do_wakeup = 0;
 697                tty_wakeup(tty);
 698        }
 699 bail:
 700        spin_unlock_irqrestore(&hp->lock, flags);
 701
 702        if (read_total) {
 703                /* Activity is occurring, so reset the polling backoff value to
 704                   a minimum for performance. */
 705                timeout = MIN_TIMEOUT;
 706
 707                tty_flip_buffer_push(&hp->port);
 708        }
 709        tty_kref_put(tty);
 710
 711        return poll_mask;
 712}
 713EXPORT_SYMBOL_GPL(hvc_poll);
 714
 715/**
 716 * __hvc_resize() - Update terminal window size information.
 717 * @hp:         HVC console pointer
 718 * @ws:         Terminal window size structure
 719 *
 720 * Stores the specified window size information in the hvc structure of @hp.
 721 * The function schedule the tty resize update.
 722 *
 723 * Locking:     Locking free; the function MUST be called holding hp->lock
 724 */
 725void __hvc_resize(struct hvc_struct *hp, struct winsize ws)
 726{
 727        hp->ws = ws;
 728        schedule_work(&hp->tty_resize);
 729}
 730EXPORT_SYMBOL_GPL(__hvc_resize);
 731
 732/*
 733 * This kthread is either polling or interrupt driven.  This is determined by
 734 * calling hvc_poll() who determines whether a console adapter support
 735 * interrupts.
 736 */
 737static int khvcd(void *unused)
 738{
 739        int poll_mask;
 740        struct hvc_struct *hp;
 741
 742        set_freezable();
 743        do {
 744                poll_mask = 0;
 745                hvc_kicked = 0;
 746                try_to_freeze();
 747                wmb();
 748                if (!cpus_are_in_xmon()) {
 749                        spin_lock(&hvc_structs_lock);
 750                        list_for_each_entry(hp, &hvc_structs, next) {
 751                                poll_mask |= hvc_poll(hp);
 752                        }
 753                        spin_unlock(&hvc_structs_lock);
 754                } else
 755                        poll_mask |= HVC_POLL_READ;
 756                if (hvc_kicked)
 757                        continue;
 758                set_current_state(TASK_INTERRUPTIBLE);
 759                if (!hvc_kicked) {
 760                        if (poll_mask == 0)
 761                                schedule();
 762                        else {
 763                                unsigned long j_timeout;
 764
 765                                if (timeout < MAX_TIMEOUT)
 766                                        timeout += (timeout >> 6) + 1;
 767
 768                                /*
 769                                 * We don't use msleep_interruptible otherwise
 770                                 * "kick" will fail to wake us up
 771                                 */
 772                                j_timeout = msecs_to_jiffies(timeout) + 1;
 773                                schedule_timeout_interruptible(j_timeout);
 774                        }
 775                }
 776                __set_current_state(TASK_RUNNING);
 777        } while (!kthread_should_stop());
 778
 779        return 0;
 780}
 781
 782static int hvc_tiocmget(struct tty_struct *tty)
 783{
 784        struct hvc_struct *hp = tty->driver_data;
 785
 786        if (!hp || !hp->ops->tiocmget)
 787                return -EINVAL;
 788        return hp->ops->tiocmget(hp);
 789}
 790
 791static int hvc_tiocmset(struct tty_struct *tty,
 792                        unsigned int set, unsigned int clear)
 793{
 794        struct hvc_struct *hp = tty->driver_data;
 795
 796        if (!hp || !hp->ops->tiocmset)
 797                return -EINVAL;
 798        return hp->ops->tiocmset(hp, set, clear);
 799}
 800
 801#ifdef CONFIG_CONSOLE_POLL
 802static int hvc_poll_init(struct tty_driver *driver, int line, char *options)
 803{
 804        return 0;
 805}
 806
 807static int hvc_poll_get_char(struct tty_driver *driver, int line)
 808{
 809        struct tty_struct *tty = driver->ttys[0];
 810        struct hvc_struct *hp = tty->driver_data;
 811        int n;
 812        char ch;
 813
 814        n = hp->ops->get_chars(hp->vtermno, &ch, 1);
 815
 816        if (n <= 0)
 817                return NO_POLL_CHAR;
 818
 819        return ch;
 820}
 821
 822static void hvc_poll_put_char(struct tty_driver *driver, int line, char ch)
 823{
 824        struct tty_struct *tty = driver->ttys[0];
 825        struct hvc_struct *hp = tty->driver_data;
 826        int n;
 827
 828        do {
 829                n = hp->ops->put_chars(hp->vtermno, &ch, 1);
 830        } while (n <= 0);
 831}
 832#endif
 833
 834static const struct tty_operations hvc_ops = {
 835        .install = hvc_install,
 836        .open = hvc_open,
 837        .close = hvc_close,
 838        .cleanup = hvc_cleanup,
 839        .write = hvc_write,
 840        .hangup = hvc_hangup,
 841        .unthrottle = hvc_unthrottle,
 842        .write_room = hvc_write_room,
 843        .chars_in_buffer = hvc_chars_in_buffer,
 844        .tiocmget = hvc_tiocmget,
 845        .tiocmset = hvc_tiocmset,
 846#ifdef CONFIG_CONSOLE_POLL
 847        .poll_init = hvc_poll_init,
 848        .poll_get_char = hvc_poll_get_char,
 849        .poll_put_char = hvc_poll_put_char,
 850#endif
 851};
 852
 853static const struct tty_port_operations hvc_port_ops = {
 854        .destruct = hvc_port_destruct,
 855};
 856
 857struct hvc_struct *hvc_alloc(uint32_t vtermno, int data,
 858                             const struct hv_ops *ops,
 859                             int outbuf_size)
 860{
 861        struct hvc_struct *hp;
 862        int i;
 863
 864        /* We wait until a driver actually comes along */
 865        if (atomic_inc_not_zero(&hvc_needs_init)) {
 866                int err = hvc_init();
 867                if (err)
 868                        return ERR_PTR(err);
 869        }
 870
 871        hp = kzalloc(ALIGN(sizeof(*hp), sizeof(long)) + outbuf_size,
 872                        GFP_KERNEL);
 873        if (!hp)
 874                return ERR_PTR(-ENOMEM);
 875
 876        hp->vtermno = vtermno;
 877        hp->data = data;
 878        hp->ops = ops;
 879        hp->outbuf_size = outbuf_size;
 880        hp->outbuf = &((char *)hp)[ALIGN(sizeof(*hp), sizeof(long))];
 881
 882        tty_port_init(&hp->port);
 883        hp->port.ops = &hvc_port_ops;
 884
 885        INIT_WORK(&hp->tty_resize, hvc_set_winsz);
 886        spin_lock_init(&hp->lock);
 887        spin_lock(&hvc_structs_lock);
 888
 889        /*
 890         * find index to use:
 891         * see if this vterm id matches one registered for console.
 892         */
 893        for (i=0; i < MAX_NR_HVC_CONSOLES; i++)
 894                if (vtermnos[i] == hp->vtermno &&
 895                    cons_ops[i] == hp->ops)
 896                        break;
 897
 898        /* no matching slot, just use a counter */
 899        if (i >= MAX_NR_HVC_CONSOLES)
 900                i = ++last_hvc;
 901
 902        hp->index = i;
 903        cons_ops[i] = ops;
 904        vtermnos[i] = vtermno;
 905
 906        list_add_tail(&(hp->next), &hvc_structs);
 907        spin_unlock(&hvc_structs_lock);
 908
 909        /* check if we need to re-register the kernel console */
 910        hvc_check_console(i);
 911
 912        return hp;
 913}
 914EXPORT_SYMBOL_GPL(hvc_alloc);
 915
 916int hvc_remove(struct hvc_struct *hp)
 917{
 918        unsigned long flags;
 919        struct tty_struct *tty;
 920
 921        tty = tty_port_tty_get(&hp->port);
 922
 923        console_lock();
 924        spin_lock_irqsave(&hp->lock, flags);
 925        if (hp->index < MAX_NR_HVC_CONSOLES) {
 926                vtermnos[hp->index] = -1;
 927                cons_ops[hp->index] = NULL;
 928        }
 929
 930        /* Don't whack hp->irq because tty_hangup() will need to free the irq. */
 931
 932        spin_unlock_irqrestore(&hp->lock, flags);
 933        console_unlock();
 934
 935        /*
 936         * We 'put' the instance that was grabbed when the kref instance
 937         * was initialized using kref_init().  Let the last holder of this
 938         * kref cause it to be removed, which will probably be the tty_vhangup
 939         * below.
 940         */
 941        tty_port_put(&hp->port);
 942
 943        /*
 944         * This function call will auto chain call hvc_hangup.
 945         */
 946        if (tty) {
 947                tty_vhangup(tty);
 948                tty_kref_put(tty);
 949        }
 950        return 0;
 951}
 952EXPORT_SYMBOL_GPL(hvc_remove);
 953
 954/* Driver initialization: called as soon as someone uses hvc_alloc(). */
 955static int hvc_init(void)
 956{
 957        struct tty_driver *drv;
 958        int err;
 959
 960        /* We need more than hvc_count adapters due to hotplug additions. */
 961        drv = alloc_tty_driver(HVC_ALLOC_TTY_ADAPTERS);
 962        if (!drv) {
 963                err = -ENOMEM;
 964                goto out;
 965        }
 966
 967        drv->driver_name = "hvc";
 968        drv->name = "hvc";
 969        drv->major = HVC_MAJOR;
 970        drv->minor_start = HVC_MINOR;
 971        drv->type = TTY_DRIVER_TYPE_SYSTEM;
 972        drv->init_termios = tty_std_termios;
 973        drv->flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_RESET_TERMIOS;
 974        tty_set_operations(drv, &hvc_ops);
 975
 976        /* Always start the kthread because there can be hotplug vty adapters
 977         * added later. */
 978        hvc_task = kthread_run(khvcd, NULL, "khvcd");
 979        if (IS_ERR(hvc_task)) {
 980                printk(KERN_ERR "Couldn't create kthread for console.\n");
 981                err = PTR_ERR(hvc_task);
 982                goto put_tty;
 983        }
 984
 985        err = tty_register_driver(drv);
 986        if (err) {
 987                printk(KERN_ERR "Couldn't register hvc console driver\n");
 988                goto stop_thread;
 989        }
 990
 991        /*
 992         * Make sure tty is fully registered before allowing it to be
 993         * found by hvc_console_device.
 994         */
 995        smp_mb();
 996        hvc_driver = drv;
 997        return 0;
 998
 999stop_thread:
1000        kthread_stop(hvc_task);
1001        hvc_task = NULL;
1002put_tty:
1003        put_tty_driver(drv);
1004out:
1005        return err;
1006}
1007