LCOV - code coverage report
Current view: top level - drivers/char - virtio_console.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 12 955 1.3 %
Date: 2022-04-01 14:35:51 Functions: 1 57 1.8 %
Branches: 4 471 0.8 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0-or-later
       2                 :            : /*
       3                 :            :  * Copyright (C) 2006, 2007, 2009 Rusty Russell, IBM Corporation
       4                 :            :  * Copyright (C) 2009, 2010, 2011 Red Hat, Inc.
       5                 :            :  * Copyright (C) 2009, 2010, 2011 Amit Shah <amit.shah@redhat.com>
       6                 :            :  */
       7                 :            : #include <linux/cdev.h>
       8                 :            : #include <linux/debugfs.h>
       9                 :            : #include <linux/completion.h>
      10                 :            : #include <linux/device.h>
      11                 :            : #include <linux/err.h>
      12                 :            : #include <linux/freezer.h>
      13                 :            : #include <linux/fs.h>
      14                 :            : #include <linux/splice.h>
      15                 :            : #include <linux/pagemap.h>
      16                 :            : #include <linux/init.h>
      17                 :            : #include <linux/list.h>
      18                 :            : #include <linux/poll.h>
      19                 :            : #include <linux/sched.h>
      20                 :            : #include <linux/slab.h>
      21                 :            : #include <linux/spinlock.h>
      22                 :            : #include <linux/virtio.h>
      23                 :            : #include <linux/virtio_console.h>
      24                 :            : #include <linux/wait.h>
      25                 :            : #include <linux/workqueue.h>
      26                 :            : #include <linux/module.h>
      27                 :            : #include <linux/dma-mapping.h>
      28                 :            : #include "../tty/hvc/hvc_console.h"
      29                 :            : 
      30                 :            : #define is_rproc_enabled IS_ENABLED(CONFIG_REMOTEPROC)
      31                 :            : 
      32                 :            : /*
      33                 :            :  * This is a global struct for storing common data for all the devices
      34                 :            :  * this driver handles.
      35                 :            :  *
      36                 :            :  * Mainly, it has a linked list for all the consoles in one place so
      37                 :            :  * that callbacks from hvc for get_chars(), put_chars() work properly
      38                 :            :  * across multiple devices and multiple ports per device.
      39                 :            :  */
      40                 :            : struct ports_driver_data {
      41                 :            :         /* Used for registering chardevs */
      42                 :            :         struct class *class;
      43                 :            : 
      44                 :            :         /* Used for exporting per-port information to debugfs */
      45                 :            :         struct dentry *debugfs_dir;
      46                 :            : 
      47                 :            :         /* List of all the devices we're handling */
      48                 :            :         struct list_head portdevs;
      49                 :            : 
      50                 :            :         /*
      51                 :            :          * This is used to keep track of the number of hvc consoles
      52                 :            :          * spawned by this driver.  This number is given as the first
      53                 :            :          * argument to hvc_alloc().  To correctly map an initial
      54                 :            :          * console spawned via hvc_instantiate to the console being
      55                 :            :          * hooked up via hvc_alloc, we need to pass the same vtermno.
      56                 :            :          *
      57                 :            :          * We also just assume the first console being initialised was
      58                 :            :          * the first one that got used as the initial console.
      59                 :            :          */
      60                 :            :         unsigned int next_vtermno;
      61                 :            : 
      62                 :            :         /* All the console devices handled by this driver */
      63                 :            :         struct list_head consoles;
      64                 :            : };
      65                 :            : static struct ports_driver_data pdrvdata = { .next_vtermno = 1};
      66                 :            : 
      67                 :            : static DEFINE_SPINLOCK(pdrvdata_lock);
      68                 :            : static DECLARE_COMPLETION(early_console_added);
      69                 :            : 
      70                 :            : /* This struct holds information that's relevant only for console ports */
      71                 :            : struct console {
      72                 :            :         /* We'll place all consoles in a list in the pdrvdata struct */
      73                 :            :         struct list_head list;
      74                 :            : 
      75                 :            :         /* The hvc device associated with this console port */
      76                 :            :         struct hvc_struct *hvc;
      77                 :            : 
      78                 :            :         /* The size of the console */
      79                 :            :         struct winsize ws;
      80                 :            : 
      81                 :            :         /*
      82                 :            :          * This number identifies the number that we used to register
      83                 :            :          * with hvc in hvc_instantiate() and hvc_alloc(); this is the
      84                 :            :          * number passed on by the hvc callbacks to us to
      85                 :            :          * differentiate between the other console ports handled by
      86                 :            :          * this driver
      87                 :            :          */
      88                 :            :         u32 vtermno;
      89                 :            : };
      90                 :            : 
      91                 :            : struct port_buffer {
      92                 :            :         char *buf;
      93                 :            : 
      94                 :            :         /* size of the buffer in *buf above */
      95                 :            :         size_t size;
      96                 :            : 
      97                 :            :         /* used length of the buffer */
      98                 :            :         size_t len;
      99                 :            :         /* offset in the buf from which to consume data */
     100                 :            :         size_t offset;
     101                 :            : 
     102                 :            :         /* DMA address of buffer */
     103                 :            :         dma_addr_t dma;
     104                 :            : 
     105                 :            :         /* Device we got DMA memory from */
     106                 :            :         struct device *dev;
     107                 :            : 
     108                 :            :         /* List of pending dma buffers to free */
     109                 :            :         struct list_head list;
     110                 :            : 
     111                 :            :         /* If sgpages == 0 then buf is used */
     112                 :            :         unsigned int sgpages;
     113                 :            : 
     114                 :            :         /* sg is used if spages > 0. sg must be the last in is struct */
     115                 :            :         struct scatterlist sg[0];
     116                 :            : };
     117                 :            : 
     118                 :            : /*
     119                 :            :  * This is a per-device struct that stores data common to all the
     120                 :            :  * ports for that device (vdev->priv).
     121                 :            :  */
     122                 :            : struct ports_device {
     123                 :            :         /* Next portdev in the list, head is in the pdrvdata struct */
     124                 :            :         struct list_head list;
     125                 :            : 
     126                 :            :         /*
     127                 :            :          * Workqueue handlers where we process deferred work after
     128                 :            :          * notification
     129                 :            :          */
     130                 :            :         struct work_struct control_work;
     131                 :            :         struct work_struct config_work;
     132                 :            : 
     133                 :            :         struct list_head ports;
     134                 :            : 
     135                 :            :         /* To protect the list of ports */
     136                 :            :         spinlock_t ports_lock;
     137                 :            : 
     138                 :            :         /* To protect the vq operations for the control channel */
     139                 :            :         spinlock_t c_ivq_lock;
     140                 :            :         spinlock_t c_ovq_lock;
     141                 :            : 
     142                 :            :         /* max. number of ports this device can hold */
     143                 :            :         u32 max_nr_ports;
     144                 :            : 
     145                 :            :         /* The virtio device we're associated with */
     146                 :            :         struct virtio_device *vdev;
     147                 :            : 
     148                 :            :         /*
     149                 :            :          * A couple of virtqueues for the control channel: one for
     150                 :            :          * guest->host transfers, one for host->guest transfers
     151                 :            :          */
     152                 :            :         struct virtqueue *c_ivq, *c_ovq;
     153                 :            : 
     154                 :            :         /*
     155                 :            :          * A control packet buffer for guest->host requests, protected
     156                 :            :          * by c_ovq_lock.
     157                 :            :          */
     158                 :            :         struct virtio_console_control cpkt;
     159                 :            : 
     160                 :            :         /* Array of per-port IO virtqueues */
     161                 :            :         struct virtqueue **in_vqs, **out_vqs;
     162                 :            : 
     163                 :            :         /* Major number for this device.  Ports will be created as minors. */
     164                 :            :         int chr_major;
     165                 :            : };
     166                 :            : 
     167                 :            : struct port_stats {
     168                 :            :         unsigned long bytes_sent, bytes_received, bytes_discarded;
     169                 :            : };
     170                 :            : 
     171                 :            : /* This struct holds the per-port data */
     172                 :            : struct port {
     173                 :            :         /* Next port in the list, head is in the ports_device */
     174                 :            :         struct list_head list;
     175                 :            : 
     176                 :            :         /* Pointer to the parent virtio_console device */
     177                 :            :         struct ports_device *portdev;
     178                 :            : 
     179                 :            :         /* The current buffer from which data has to be fed to readers */
     180                 :            :         struct port_buffer *inbuf;
     181                 :            : 
     182                 :            :         /*
     183                 :            :          * To protect the operations on the in_vq associated with this
     184                 :            :          * port.  Has to be a spinlock because it can be called from
     185                 :            :          * interrupt context (get_char()).
     186                 :            :          */
     187                 :            :         spinlock_t inbuf_lock;
     188                 :            : 
     189                 :            :         /* Protect the operations on the out_vq. */
     190                 :            :         spinlock_t outvq_lock;
     191                 :            : 
     192                 :            :         /* The IO vqs for this port */
     193                 :            :         struct virtqueue *in_vq, *out_vq;
     194                 :            : 
     195                 :            :         /* File in the debugfs directory that exposes this port's information */
     196                 :            :         struct dentry *debugfs_file;
     197                 :            : 
     198                 :            :         /*
     199                 :            :          * Keep count of the bytes sent, received and discarded for
     200                 :            :          * this port for accounting and debugging purposes.  These
     201                 :            :          * counts are not reset across port open / close events.
     202                 :            :          */
     203                 :            :         struct port_stats stats;
     204                 :            : 
     205                 :            :         /*
     206                 :            :          * The entries in this struct will be valid if this port is
     207                 :            :          * hooked up to an hvc console
     208                 :            :          */
     209                 :            :         struct console cons;
     210                 :            : 
     211                 :            :         /* Each port associates with a separate char device */
     212                 :            :         struct cdev *cdev;
     213                 :            :         struct device *dev;
     214                 :            : 
     215                 :            :         /* Reference-counting to handle port hot-unplugs and file operations */
     216                 :            :         struct kref kref;
     217                 :            : 
     218                 :            :         /* A waitqueue for poll() or blocking read operations */
     219                 :            :         wait_queue_head_t waitqueue;
     220                 :            : 
     221                 :            :         /* The 'name' of the port that we expose via sysfs properties */
     222                 :            :         char *name;
     223                 :            : 
     224                 :            :         /* We can notify apps of host connect / disconnect events via SIGIO */
     225                 :            :         struct fasync_struct *async_queue;
     226                 :            : 
     227                 :            :         /* The 'id' to identify the port with the Host */
     228                 :            :         u32 id;
     229                 :            : 
     230                 :            :         bool outvq_full;
     231                 :            : 
     232                 :            :         /* Is the host device open */
     233                 :            :         bool host_connected;
     234                 :            : 
     235                 :            :         /* We should allow only one process to open a port */
     236                 :            :         bool guest_connected;
     237                 :            : };
     238                 :            : 
     239                 :            : /* This is the very early arch-specified put chars function. */
     240                 :            : static int (*early_put_chars)(u32, const char *, int);
     241                 :            : 
     242                 :          0 : static struct port *find_port_by_vtermno(u32 vtermno)
     243                 :            : {
     244                 :          0 :         struct port *port;
     245                 :          0 :         struct console *cons;
     246                 :          0 :         unsigned long flags;
     247                 :            : 
     248                 :          0 :         spin_lock_irqsave(&pdrvdata_lock, flags);
     249         [ #  # ]:          0 :         list_for_each_entry(cons, &pdrvdata.consoles, list) {
     250         [ #  # ]:          0 :                 if (cons->vtermno == vtermno) {
     251                 :          0 :                         port = container_of(cons, struct port, cons);
     252                 :          0 :                         goto out;
     253                 :            :                 }
     254                 :            :         }
     255                 :            :         port = NULL;
     256                 :          0 : out:
     257                 :          0 :         spin_unlock_irqrestore(&pdrvdata_lock, flags);
     258                 :          0 :         return port;
     259                 :            : }
     260                 :            : 
     261                 :          0 : static struct port *find_port_by_devt_in_portdev(struct ports_device *portdev,
     262                 :            :                                                  dev_t dev)
     263                 :            : {
     264                 :          0 :         struct port *port;
     265                 :          0 :         unsigned long flags;
     266                 :            : 
     267                 :          0 :         spin_lock_irqsave(&portdev->ports_lock, flags);
     268         [ #  # ]:          0 :         list_for_each_entry(port, &portdev->ports, list) {
     269         [ #  # ]:          0 :                 if (port->cdev->dev == dev) {
     270                 :          0 :                         kref_get(&port->kref);
     271                 :          0 :                         goto out;
     272                 :            :                 }
     273                 :            :         }
     274                 :            :         port = NULL;
     275                 :          0 : out:
     276                 :          0 :         spin_unlock_irqrestore(&portdev->ports_lock, flags);
     277                 :            : 
     278                 :          0 :         return port;
     279                 :            : }
     280                 :            : 
     281                 :          0 : static struct port *find_port_by_devt(dev_t dev)
     282                 :            : {
     283                 :          0 :         struct ports_device *portdev;
     284                 :          0 :         struct port *port;
     285                 :          0 :         unsigned long flags;
     286                 :            : 
     287                 :          0 :         spin_lock_irqsave(&pdrvdata_lock, flags);
     288         [ #  # ]:          0 :         list_for_each_entry(portdev, &pdrvdata.portdevs, list) {
     289                 :          0 :                 port = find_port_by_devt_in_portdev(portdev, dev);
     290         [ #  # ]:          0 :                 if (port)
     291                 :          0 :                         goto out;
     292                 :            :         }
     293                 :            :         port = NULL;
     294                 :          0 : out:
     295                 :          0 :         spin_unlock_irqrestore(&pdrvdata_lock, flags);
     296                 :          0 :         return port;
     297                 :            : }
     298                 :            : 
     299                 :          0 : static struct port *find_port_by_id(struct ports_device *portdev, u32 id)
     300                 :            : {
     301                 :          0 :         struct port *port;
     302                 :          0 :         unsigned long flags;
     303                 :            : 
     304                 :          0 :         spin_lock_irqsave(&portdev->ports_lock, flags);
     305         [ #  # ]:          0 :         list_for_each_entry(port, &portdev->ports, list)
     306         [ #  # ]:          0 :                 if (port->id == id)
     307                 :          0 :                         goto out;
     308                 :            :         port = NULL;
     309                 :          0 : out:
     310                 :          0 :         spin_unlock_irqrestore(&portdev->ports_lock, flags);
     311                 :            : 
     312                 :          0 :         return port;
     313                 :            : }
     314                 :            : 
     315                 :          0 : static struct port *find_port_by_vq(struct ports_device *portdev,
     316                 :            :                                     struct virtqueue *vq)
     317                 :            : {
     318                 :          0 :         struct port *port;
     319                 :          0 :         unsigned long flags;
     320                 :            : 
     321                 :          0 :         spin_lock_irqsave(&portdev->ports_lock, flags);
     322         [ #  # ]:          0 :         list_for_each_entry(port, &portdev->ports, list)
     323   [ #  #  #  # ]:          0 :                 if (port->in_vq == vq || port->out_vq == vq)
     324                 :          0 :                         goto out;
     325                 :            :         port = NULL;
     326                 :          0 : out:
     327                 :          0 :         spin_unlock_irqrestore(&portdev->ports_lock, flags);
     328                 :          0 :         return port;
     329                 :            : }
     330                 :            : 
     331                 :          0 : static bool is_console_port(struct port *port)
     332                 :            : {
     333                 :          0 :         if (port->cons.hvc)
     334                 :          0 :                 return true;
     335                 :            :         return false;
     336                 :            : }
     337                 :            : 
     338                 :          0 : static bool is_rproc_serial(const struct virtio_device *vdev)
     339                 :            : {
     340                 :          0 :         return is_rproc_enabled && vdev->id.device == VIRTIO_ID_RPROC_SERIAL;
     341                 :            : }
     342                 :            : 
     343                 :          0 : static inline bool use_multiport(struct ports_device *portdev)
     344                 :            : {
     345                 :            :         /*
     346                 :            :          * This condition can be true when put_chars is called from
     347                 :            :          * early_init
     348                 :            :          */
     349                 :          0 :         if (!portdev->vdev)
     350                 :            :                 return false;
     351   [ #  #  #  #  :          0 :         return __virtio_test_bit(portdev->vdev, VIRTIO_CONSOLE_F_MULTIPORT);
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                #  #  # ]
     352                 :            : }
     353                 :            : 
     354                 :            : static DEFINE_SPINLOCK(dma_bufs_lock);
     355                 :            : static LIST_HEAD(pending_free_dma_bufs);
     356                 :            : 
     357                 :          0 : static void free_buf(struct port_buffer *buf, bool can_sleep)
     358                 :            : {
     359                 :          0 :         unsigned int i;
     360                 :            : 
     361         [ #  # ]:          0 :         for (i = 0; i < buf->sgpages; i++) {
     362         [ #  # ]:          0 :                 struct page *page = sg_page(&buf->sg[i]);
     363         [ #  # ]:          0 :                 if (!page)
     364                 :            :                         break;
     365                 :          0 :                 put_page(page);
     366                 :            :         }
     367                 :            : 
     368         [ #  # ]:          0 :         if (!buf->dev) {
     369                 :          0 :                 kfree(buf->buf);
     370                 :          0 :         } else if (is_rproc_enabled) {
     371                 :          0 :                 unsigned long flags;
     372                 :            : 
     373                 :            :                 /* dma_free_coherent requires interrupts to be enabled. */
     374         [ #  # ]:          0 :                 if (!can_sleep) {
     375                 :            :                         /* queue up dma-buffers to be freed later */
     376                 :          0 :                         spin_lock_irqsave(&dma_bufs_lock, flags);
     377                 :          0 :                         list_add_tail(&buf->list, &pending_free_dma_bufs);
     378                 :          0 :                         spin_unlock_irqrestore(&dma_bufs_lock, flags);
     379                 :          0 :                         return;
     380                 :            :                 }
     381                 :          0 :                 dma_free_coherent(buf->dev, buf->size, buf->buf, buf->dma);
     382                 :            : 
     383                 :            :                 /* Release device refcnt and allow it to be freed */
     384                 :          0 :                 put_device(buf->dev);
     385                 :            :         }
     386                 :            : 
     387                 :          0 :         kfree(buf);
     388                 :            : }
     389                 :            : 
     390                 :          0 : static void reclaim_dma_bufs(void)
     391                 :            : {
     392                 :          0 :         unsigned long flags;
     393                 :          0 :         struct port_buffer *buf, *tmp;
     394                 :          0 :         LIST_HEAD(tmp_list);
     395                 :            : 
     396         [ #  # ]:          0 :         if (list_empty(&pending_free_dma_bufs))
     397                 :          0 :                 return;
     398                 :            : 
     399                 :            :         /* Create a copy of the pending_free_dma_bufs while holding the lock */
     400                 :          0 :         spin_lock_irqsave(&dma_bufs_lock, flags);
     401                 :          0 :         list_cut_position(&tmp_list, &pending_free_dma_bufs,
     402                 :            :                           pending_free_dma_bufs.prev);
     403                 :          0 :         spin_unlock_irqrestore(&dma_bufs_lock, flags);
     404                 :            : 
     405                 :            :         /* Release the dma buffers, without irqs enabled */
     406         [ #  # ]:          0 :         list_for_each_entry_safe(buf, tmp, &tmp_list, list) {
     407                 :          0 :                 list_del(&buf->list);
     408                 :          0 :                 free_buf(buf, true);
     409                 :            :         }
     410                 :            : }
     411                 :            : 
     412                 :          0 : static struct port_buffer *alloc_buf(struct virtio_device *vdev, size_t buf_size,
     413                 :            :                                      int pages)
     414                 :            : {
     415                 :          0 :         struct port_buffer *buf;
     416                 :            : 
     417                 :          0 :         reclaim_dma_bufs();
     418                 :            : 
     419                 :            :         /*
     420                 :            :          * Allocate buffer and the sg list. The sg list array is allocated
     421                 :            :          * directly after the port_buffer struct.
     422                 :            :          */
     423         [ #  # ]:          0 :         buf = kmalloc(struct_size(buf, sg, pages), GFP_KERNEL);
     424         [ #  # ]:          0 :         if (!buf)
     425                 :          0 :                 goto fail;
     426                 :            : 
     427                 :          0 :         buf->sgpages = pages;
     428         [ #  # ]:          0 :         if (pages > 0) {
     429                 :          0 :                 buf->dev = NULL;
     430                 :          0 :                 buf->buf = NULL;
     431                 :          0 :                 return buf;
     432                 :            :         }
     433                 :            : 
     434         [ #  # ]:          0 :         if (is_rproc_serial(vdev)) {
     435                 :            :                 /*
     436                 :            :                  * Allocate DMA memory from ancestor. When a virtio
     437                 :            :                  * device is created by remoteproc, the DMA memory is
     438                 :            :                  * associated with the grandparent device:
     439                 :            :                  * vdev => rproc => platform-dev.
     440                 :            :                  */
     441   [ #  #  #  # ]:          0 :                 if (!vdev->dev.parent || !vdev->dev.parent->parent)
     442                 :          0 :                         goto free_buf;
     443                 :          0 :                 buf->dev = vdev->dev.parent->parent;
     444                 :            : 
     445                 :            :                 /* Increase device refcnt to avoid freeing it */
     446                 :          0 :                 get_device(buf->dev);
     447                 :          0 :                 buf->buf = dma_alloc_coherent(buf->dev, buf_size, &buf->dma,
     448                 :            :                                               GFP_KERNEL);
     449                 :            :         } else {
     450                 :          0 :                 buf->dev = NULL;
     451         [ #  # ]:          0 :                 buf->buf = kmalloc(buf_size, GFP_KERNEL);
     452                 :            :         }
     453                 :            : 
     454         [ #  # ]:          0 :         if (!buf->buf)
     455                 :          0 :                 goto free_buf;
     456                 :          0 :         buf->len = 0;
     457                 :          0 :         buf->offset = 0;
     458                 :          0 :         buf->size = buf_size;
     459                 :          0 :         return buf;
     460                 :            : 
     461                 :          0 : free_buf:
     462                 :          0 :         kfree(buf);
     463                 :            : fail:
     464                 :            :         return NULL;
     465                 :            : }
     466                 :            : 
     467                 :            : /* Callers should take appropriate locks */
     468                 :          0 : static struct port_buffer *get_inbuf(struct port *port)
     469                 :            : {
     470                 :          0 :         struct port_buffer *buf;
     471                 :          0 :         unsigned int len;
     472                 :            : 
     473         [ #  # ]:          0 :         if (port->inbuf)
     474                 :            :                 return port->inbuf;
     475                 :            : 
     476                 :          0 :         buf = virtqueue_get_buf(port->in_vq, &len);
     477         [ #  # ]:          0 :         if (buf) {
     478                 :          0 :                 buf->len = len;
     479                 :          0 :                 buf->offset = 0;
     480                 :          0 :                 port->stats.bytes_received += len;
     481                 :            :         }
     482                 :            :         return buf;
     483                 :            : }
     484                 :            : 
     485                 :            : /*
     486                 :            :  * Create a scatter-gather list representing our input buffer and put
     487                 :            :  * it in the queue.
     488                 :            :  *
     489                 :            :  * Callers should take appropriate locks.
     490                 :            :  */
     491                 :          0 : static int add_inbuf(struct virtqueue *vq, struct port_buffer *buf)
     492                 :            : {
     493                 :          0 :         struct scatterlist sg[1];
     494                 :          0 :         int ret;
     495                 :            : 
     496                 :          0 :         sg_init_one(sg, buf->buf, buf->size);
     497                 :            : 
     498                 :          0 :         ret = virtqueue_add_inbuf(vq, sg, 1, buf, GFP_ATOMIC);
     499                 :          0 :         virtqueue_kick(vq);
     500         [ #  # ]:          0 :         if (!ret)
     501                 :          0 :                 ret = vq->num_free;
     502                 :          0 :         return ret;
     503                 :            : }
     504                 :            : 
     505                 :            : /* Discard any unread data this port has. Callers lockers. */
     506                 :          0 : static void discard_port_data(struct port *port)
     507                 :            : {
     508                 :          0 :         struct port_buffer *buf;
     509                 :          0 :         unsigned int err;
     510                 :            : 
     511         [ #  # ]:          0 :         if (!port->portdev) {
     512                 :            :                 /* Device has been unplugged.  vqs are already gone. */
     513                 :            :                 return;
     514                 :            :         }
     515                 :          0 :         buf = get_inbuf(port);
     516                 :            : 
     517                 :          0 :         err = 0;
     518         [ #  # ]:          0 :         while (buf) {
     519                 :          0 :                 port->stats.bytes_discarded += buf->len - buf->offset;
     520         [ #  # ]:          0 :                 if (add_inbuf(port->in_vq, buf) < 0) {
     521                 :          0 :                         err++;
     522                 :          0 :                         free_buf(buf, false);
     523                 :            :                 }
     524                 :          0 :                 port->inbuf = NULL;
     525                 :          0 :                 buf = get_inbuf(port);
     526                 :            :         }
     527         [ #  # ]:          0 :         if (err)
     528                 :          0 :                 dev_warn(port->dev, "Errors adding %d buffers back to vq\n",
     529                 :            :                          err);
     530                 :            : }
     531                 :            : 
     532                 :          0 : static bool port_has_data(struct port *port)
     533                 :            : {
     534                 :          0 :         unsigned long flags;
     535                 :          0 :         bool ret;
     536                 :            : 
     537                 :          0 :         ret = false;
     538                 :          0 :         spin_lock_irqsave(&port->inbuf_lock, flags);
     539                 :          0 :         port->inbuf = get_inbuf(port);
     540         [ #  # ]:          0 :         if (port->inbuf)
     541                 :          0 :                 ret = true;
     542                 :            : 
     543                 :          0 :         spin_unlock_irqrestore(&port->inbuf_lock, flags);
     544                 :          0 :         return ret;
     545                 :            : }
     546                 :            : 
     547                 :          0 : static ssize_t __send_control_msg(struct ports_device *portdev, u32 port_id,
     548                 :            :                                   unsigned int event, unsigned int value)
     549                 :            : {
     550                 :          0 :         struct scatterlist sg[1];
     551                 :          0 :         struct virtqueue *vq;
     552                 :          0 :         unsigned int len;
     553                 :            : 
     554   [ #  #  #  # ]:          0 :         if (!use_multiport(portdev))
     555                 :            :                 return 0;
     556                 :            : 
     557                 :          0 :         vq = portdev->c_ovq;
     558                 :            : 
     559                 :          0 :         spin_lock(&portdev->c_ovq_lock);
     560                 :            : 
     561                 :          0 :         portdev->cpkt.id = cpu_to_virtio32(portdev->vdev, port_id);
     562                 :          0 :         portdev->cpkt.event = cpu_to_virtio16(portdev->vdev, event);
     563                 :          0 :         portdev->cpkt.value = cpu_to_virtio16(portdev->vdev, value);
     564                 :            : 
     565                 :          0 :         sg_init_one(sg, &portdev->cpkt, sizeof(struct virtio_console_control));
     566                 :            : 
     567         [ #  # ]:          0 :         if (virtqueue_add_outbuf(vq, sg, 1, &portdev->cpkt, GFP_ATOMIC) == 0) {
     568                 :          0 :                 virtqueue_kick(vq);
     569         [ #  # ]:          0 :                 while (!virtqueue_get_buf(vq, &len)
     570         [ #  # ]:          0 :                         && !virtqueue_is_broken(vq))
     571                 :          0 :                         cpu_relax();
     572                 :            :         }
     573                 :            : 
     574                 :          0 :         spin_unlock(&portdev->c_ovq_lock);
     575                 :          0 :         return 0;
     576                 :            : }
     577                 :            : 
     578                 :          0 : static ssize_t send_control_msg(struct port *port, unsigned int event,
     579                 :            :                                 unsigned int value)
     580                 :            : {
     581                 :            :         /* Did the port get unplugged before userspace closed it? */
     582                 :          0 :         if (port->portdev)
     583                 :          0 :                 return __send_control_msg(port->portdev, port->id, event, value);
     584                 :            :         return 0;
     585                 :            : }
     586                 :            : 
     587                 :            : 
     588                 :            : /* Callers must take the port->outvq_lock */
     589                 :          0 : static void reclaim_consumed_buffers(struct port *port)
     590                 :            : {
     591                 :          0 :         struct port_buffer *buf;
     592                 :          0 :         unsigned int len;
     593                 :            : 
     594         [ #  # ]:          0 :         if (!port->portdev) {
     595                 :            :                 /* Device has been unplugged.  vqs are already gone. */
     596                 :          0 :                 return;
     597                 :            :         }
     598         [ #  # ]:          0 :         while ((buf = virtqueue_get_buf(port->out_vq, &len))) {
     599                 :          0 :                 free_buf(buf, false);
     600                 :          0 :                 port->outvq_full = false;
     601                 :            :         }
     602                 :            : }
     603                 :            : 
     604                 :          0 : static ssize_t __send_to_port(struct port *port, struct scatterlist *sg,
     605                 :            :                               int nents, size_t in_count,
     606                 :            :                               void *data, bool nonblock)
     607                 :            : {
     608                 :          0 :         struct virtqueue *out_vq;
     609                 :          0 :         int err;
     610                 :          0 :         unsigned long flags;
     611                 :          0 :         unsigned int len;
     612                 :            : 
     613                 :          0 :         out_vq = port->out_vq;
     614                 :            : 
     615                 :          0 :         spin_lock_irqsave(&port->outvq_lock, flags);
     616                 :            : 
     617                 :          0 :         reclaim_consumed_buffers(port);
     618                 :            : 
     619                 :          0 :         err = virtqueue_add_outbuf(out_vq, sg, nents, data, GFP_ATOMIC);
     620                 :            : 
     621                 :            :         /* Tell Host to go! */
     622                 :          0 :         virtqueue_kick(out_vq);
     623                 :            : 
     624         [ #  # ]:          0 :         if (err) {
     625                 :          0 :                 in_count = 0;
     626                 :          0 :                 goto done;
     627                 :            :         }
     628                 :            : 
     629         [ #  # ]:          0 :         if (out_vq->num_free == 0)
     630                 :          0 :                 port->outvq_full = true;
     631                 :            : 
     632         [ #  # ]:          0 :         if (nonblock)
     633                 :          0 :                 goto done;
     634                 :            : 
     635                 :            :         /*
     636                 :            :          * Wait till the host acknowledges it pushed out the data we
     637                 :            :          * sent.  This is done for data from the hvc_console; the tty
     638                 :            :          * operations are performed with spinlocks held so we can't
     639                 :            :          * sleep here.  An alternative would be to copy the data to a
     640                 :            :          * buffer and relax the spinning requirement.  The downside is
     641                 :            :          * we need to kmalloc a GFP_ATOMIC buffer each time the
     642                 :            :          * console driver writes something out.
     643                 :            :          */
     644         [ #  # ]:          0 :         while (!virtqueue_get_buf(out_vq, &len)
     645         [ #  # ]:          0 :                 && !virtqueue_is_broken(out_vq))
     646                 :          0 :                 cpu_relax();
     647                 :          0 : done:
     648                 :          0 :         spin_unlock_irqrestore(&port->outvq_lock, flags);
     649                 :            : 
     650                 :          0 :         port->stats.bytes_sent += in_count;
     651                 :            :         /*
     652                 :            :          * We're expected to return the amount of data we wrote -- all
     653                 :            :          * of it
     654                 :            :          */
     655                 :          0 :         return in_count;
     656                 :            : }
     657                 :            : 
     658                 :            : /*
     659                 :            :  * Give out the data that's requested from the buffer that we have
     660                 :            :  * queued up.
     661                 :            :  */
     662                 :          0 : static ssize_t fill_readbuf(struct port *port, char __user *out_buf,
     663                 :            :                             size_t out_count, bool to_user)
     664                 :            : {
     665                 :          0 :         struct port_buffer *buf;
     666                 :          0 :         unsigned long flags;
     667                 :            : 
     668   [ #  #  #  # ]:          0 :         if (!out_count || !port_has_data(port))
     669                 :          0 :                 return 0;
     670                 :            : 
     671                 :          0 :         buf = port->inbuf;
     672                 :          0 :         out_count = min(out_count, buf->len - buf->offset);
     673                 :            : 
     674         [ #  # ]:          0 :         if (to_user) {
     675                 :          0 :                 ssize_t ret;
     676                 :            : 
     677         [ #  # ]:          0 :                 ret = copy_to_user(out_buf, buf->buf + buf->offset, out_count);
     678         [ #  # ]:          0 :                 if (ret)
     679                 :            :                         return -EFAULT;
     680                 :            :         } else {
     681                 :          0 :                 memcpy((__force char *)out_buf, buf->buf + buf->offset,
     682                 :            :                        out_count);
     683                 :            :         }
     684                 :            : 
     685                 :          0 :         buf->offset += out_count;
     686                 :            : 
     687         [ #  # ]:          0 :         if (buf->offset == buf->len) {
     688                 :            :                 /*
     689                 :            :                  * We're done using all the data in this buffer.
     690                 :            :                  * Re-queue so that the Host can send us more data.
     691                 :            :                  */
     692                 :          0 :                 spin_lock_irqsave(&port->inbuf_lock, flags);
     693                 :          0 :                 port->inbuf = NULL;
     694                 :            : 
     695         [ #  # ]:          0 :                 if (add_inbuf(port->in_vq, buf) < 0)
     696                 :          0 :                         dev_warn(port->dev, "failed add_buf\n");
     697                 :            : 
     698                 :          0 :                 spin_unlock_irqrestore(&port->inbuf_lock, flags);
     699                 :            :         }
     700                 :            :         /* Return the number of bytes actually copied */
     701                 :          0 :         return out_count;
     702                 :            : }
     703                 :            : 
     704                 :            : /* The condition that must be true for polling to end */
     705                 :          0 : static bool will_read_block(struct port *port)
     706                 :            : {
     707                 :          0 :         if (!port->guest_connected) {
     708                 :            :                 /* Port got hot-unplugged. Let's exit. */
     709                 :            :                 return false;
     710                 :            :         }
     711   [ #  #  #  #  :          0 :         return !port_has_data(port) && port->host_connected;
          #  #  #  #  #  
                #  #  # ]
     712                 :            : }
     713                 :            : 
     714                 :          0 : static bool will_write_block(struct port *port)
     715                 :            : {
     716                 :          0 :         bool ret;
     717                 :            : 
     718         [ #  # ]:          0 :         if (!port->guest_connected) {
     719                 :            :                 /* Port got hot-unplugged. Let's exit. */
     720                 :            :                 return false;
     721                 :            :         }
     722         [ #  # ]:          0 :         if (!port->host_connected)
     723                 :            :                 return true;
     724                 :            : 
     725                 :          0 :         spin_lock_irq(&port->outvq_lock);
     726                 :            :         /*
     727                 :            :          * Check if the Host has consumed any buffers since we last
     728                 :            :          * sent data (this is only applicable for nonblocking ports).
     729                 :            :          */
     730                 :          0 :         reclaim_consumed_buffers(port);
     731                 :          0 :         ret = port->outvq_full;
     732                 :          0 :         spin_unlock_irq(&port->outvq_lock);
     733                 :            : 
     734                 :          0 :         return ret;
     735                 :            : }
     736                 :            : 
     737                 :          0 : static ssize_t port_fops_read(struct file *filp, char __user *ubuf,
     738                 :            :                               size_t count, loff_t *offp)
     739                 :            : {
     740                 :          0 :         struct port *port;
     741                 :          0 :         ssize_t ret;
     742                 :            : 
     743                 :          0 :         port = filp->private_data;
     744                 :            : 
     745                 :            :         /* Port is hot-unplugged. */
     746         [ #  # ]:          0 :         if (!port->guest_connected)
     747                 :            :                 return -ENODEV;
     748                 :            : 
     749         [ #  # ]:          0 :         if (!port_has_data(port)) {
     750                 :            :                 /*
     751                 :            :                  * If nothing's connected on the host just return 0 in
     752                 :            :                  * case of list_empty; this tells the userspace app
     753                 :            :                  * that there's no connection
     754                 :            :                  */
     755         [ #  # ]:          0 :                 if (!port->host_connected)
     756                 :            :                         return 0;
     757         [ #  # ]:          0 :                 if (filp->f_flags & O_NONBLOCK)
     758                 :            :                         return -EAGAIN;
     759                 :            : 
     760   [ #  #  #  #  :          0 :                 ret = wait_event_freezable(port->waitqueue,
          #  #  #  #  #  
                      # ]
     761                 :            :                                            !will_read_block(port));
     762         [ #  # ]:          0 :                 if (ret < 0)
     763                 :            :                         return ret;
     764                 :            :         }
     765                 :            :         /* Port got hot-unplugged while we were waiting above. */
     766         [ #  # ]:          0 :         if (!port->guest_connected)
     767                 :            :                 return -ENODEV;
     768                 :            :         /*
     769                 :            :          * We could've received a disconnection message while we were
     770                 :            :          * waiting for more data.
     771                 :            :          *
     772                 :            :          * This check is not clubbed in the if() statement above as we
     773                 :            :          * might receive some data as well as the host could get
     774                 :            :          * disconnected after we got woken up from our wait.  So we
     775                 :            :          * really want to give off whatever data we have and only then
     776                 :            :          * check for host_connected.
     777                 :            :          */
     778   [ #  #  #  # ]:          0 :         if (!port_has_data(port) && !port->host_connected)
     779                 :            :                 return 0;
     780                 :            : 
     781                 :          0 :         return fill_readbuf(port, ubuf, count, true);
     782                 :            : }
     783                 :            : 
     784                 :          0 : static int wait_port_writable(struct port *port, bool nonblock)
     785                 :            : {
     786                 :          0 :         int ret;
     787                 :            : 
     788         [ #  # ]:          0 :         if (will_write_block(port)) {
     789         [ #  # ]:          0 :                 if (nonblock)
     790                 :            :                         return -EAGAIN;
     791                 :            : 
     792   [ #  #  #  #  :          0 :                 ret = wait_event_freezable(port->waitqueue,
                   #  # ]
     793                 :            :                                            !will_write_block(port));
     794         [ #  # ]:          0 :                 if (ret < 0)
     795                 :            :                         return ret;
     796                 :            :         }
     797                 :            :         /* Port got hot-unplugged. */
     798         [ #  # ]:          0 :         if (!port->guest_connected)
     799                 :          0 :                 return -ENODEV;
     800                 :            : 
     801                 :            :         return 0;
     802                 :            : }
     803                 :            : 
     804                 :          0 : static ssize_t port_fops_write(struct file *filp, const char __user *ubuf,
     805                 :            :                                size_t count, loff_t *offp)
     806                 :            : {
     807                 :          0 :         struct port *port;
     808                 :          0 :         struct port_buffer *buf;
     809                 :          0 :         ssize_t ret;
     810                 :          0 :         bool nonblock;
     811                 :          0 :         struct scatterlist sg[1];
     812                 :            : 
     813                 :            :         /* Userspace could be out to fool us */
     814         [ #  # ]:          0 :         if (!count)
     815                 :            :                 return 0;
     816                 :            : 
     817                 :          0 :         port = filp->private_data;
     818                 :            : 
     819                 :          0 :         nonblock = filp->f_flags & O_NONBLOCK;
     820                 :            : 
     821                 :          0 :         ret = wait_port_writable(port, nonblock);
     822         [ #  # ]:          0 :         if (ret < 0)
     823                 :            :                 return ret;
     824                 :            : 
     825                 :          0 :         count = min((size_t)(32 * 1024), count);
     826                 :            : 
     827                 :          0 :         buf = alloc_buf(port->portdev->vdev, count, 0);
     828         [ #  # ]:          0 :         if (!buf)
     829                 :            :                 return -ENOMEM;
     830                 :            : 
     831         [ #  # ]:          0 :         ret = copy_from_user(buf->buf, ubuf, count);
     832         [ #  # ]:          0 :         if (ret) {
     833                 :          0 :                 ret = -EFAULT;
     834                 :          0 :                 goto free_buf;
     835                 :            :         }
     836                 :            : 
     837                 :            :         /*
     838                 :            :          * We now ask send_buf() to not spin for generic ports -- we
     839                 :            :          * can re-use the same code path that non-blocking file
     840                 :            :          * descriptors take for blocking file descriptors since the
     841                 :            :          * wait is already done and we're certain the write will go
     842                 :            :          * through to the host.
     843                 :            :          */
     844                 :          0 :         nonblock = true;
     845                 :          0 :         sg_init_one(sg, buf->buf, count);
     846                 :          0 :         ret = __send_to_port(port, sg, 1, count, buf, nonblock);
     847                 :            : 
     848         [ #  # ]:          0 :         if (nonblock && ret > 0)
     849                 :          0 :                 goto out;
     850                 :            : 
     851                 :          0 : free_buf:
     852                 :          0 :         free_buf(buf, true);
     853                 :            : out:
     854                 :            :         return ret;
     855                 :            : }
     856                 :            : 
     857                 :            : struct sg_list {
     858                 :            :         unsigned int n;
     859                 :            :         unsigned int size;
     860                 :            :         size_t len;
     861                 :            :         struct scatterlist *sg;
     862                 :            : };
     863                 :            : 
     864                 :          0 : static int pipe_to_sg(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
     865                 :            :                         struct splice_desc *sd)
     866                 :            : {
     867                 :          0 :         struct sg_list *sgl = sd->u.data;
     868                 :          0 :         unsigned int offset, len;
     869                 :            : 
     870         [ #  # ]:          0 :         if (sgl->n == sgl->size)
     871                 :            :                 return 0;
     872                 :            : 
     873                 :            :         /* Try lock this page */
     874         [ #  # ]:          0 :         if (pipe_buf_steal(pipe, buf) == 0) {
     875                 :            :                 /* Get reference and unlock page for moving */
     876         [ #  # ]:          0 :                 get_page(buf->page);
     877                 :          0 :                 unlock_page(buf->page);
     878                 :            : 
     879                 :          0 :                 len = min(buf->len, sd->len);
     880         [ #  # ]:          0 :                 sg_set_page(&(sgl->sg[sgl->n]), buf->page, len, buf->offset);
     881                 :            :         } else {
     882                 :            :                 /* Failback to copying a page */
     883                 :          0 :                 struct page *page = alloc_page(GFP_KERNEL);
     884                 :          0 :                 char *src;
     885                 :            : 
     886         [ #  # ]:          0 :                 if (!page)
     887                 :            :                         return -ENOMEM;
     888                 :            : 
     889                 :          0 :                 offset = sd->pos & ~PAGE_MASK;
     890                 :            : 
     891                 :          0 :                 len = sd->len;
     892         [ #  # ]:          0 :                 if (len + offset > PAGE_SIZE)
     893                 :          0 :                         len = PAGE_SIZE - offset;
     894                 :            : 
     895                 :          0 :                 src = kmap_atomic(buf->page);
     896                 :          0 :                 memcpy(page_address(page) + offset, src + buf->offset, len);
     897                 :          0 :                 kunmap_atomic(src);
     898                 :            : 
     899         [ #  # ]:          0 :                 sg_set_page(&(sgl->sg[sgl->n]), page, len, offset);
     900                 :            :         }
     901                 :          0 :         sgl->n++;
     902                 :          0 :         sgl->len += len;
     903                 :            : 
     904                 :          0 :         return len;
     905                 :            : }
     906                 :            : 
     907                 :            : /* Faster zero-copy write by splicing */
     908                 :          0 : static ssize_t port_fops_splice_write(struct pipe_inode_info *pipe,
     909                 :            :                                       struct file *filp, loff_t *ppos,
     910                 :            :                                       size_t len, unsigned int flags)
     911                 :            : {
     912                 :          0 :         struct port *port = filp->private_data;
     913                 :          0 :         struct sg_list sgl;
     914                 :          0 :         ssize_t ret;
     915                 :          0 :         struct port_buffer *buf;
     916                 :          0 :         struct splice_desc sd = {
     917                 :            :                 .total_len = len,
     918                 :            :                 .flags = flags,
     919                 :          0 :                 .pos = *ppos,
     920                 :            :                 .u.data = &sgl,
     921                 :            :         };
     922                 :          0 :         unsigned int occupancy;
     923                 :            : 
     924                 :            :         /*
     925                 :            :          * Rproc_serial does not yet support splice. To support splice
     926                 :            :          * pipe_to_sg() must allocate dma-buffers and copy content from
     927                 :            :          * regular pages to dma pages. And alloc_buf and free_buf must
     928                 :            :          * support allocating and freeing such a list of dma-buffers.
     929                 :            :          */
     930         [ #  # ]:          0 :         if (is_rproc_serial(port->out_vq->vdev))
     931                 :            :                 return -EINVAL;
     932                 :            : 
     933                 :          0 :         pipe_lock(pipe);
     934                 :          0 :         ret = 0;
     935         [ #  # ]:          0 :         if (pipe_empty(pipe->head, pipe->tail))
     936                 :          0 :                 goto error_out;
     937                 :            : 
     938                 :          0 :         ret = wait_port_writable(port, filp->f_flags & O_NONBLOCK);
     939         [ #  # ]:          0 :         if (ret < 0)
     940                 :          0 :                 goto error_out;
     941                 :            : 
     942                 :          0 :         occupancy = pipe_occupancy(pipe->head, pipe->tail);
     943                 :          0 :         buf = alloc_buf(port->portdev->vdev, 0, occupancy);
     944                 :            : 
     945         [ #  # ]:          0 :         if (!buf) {
     946                 :          0 :                 ret = -ENOMEM;
     947                 :          0 :                 goto error_out;
     948                 :            :         }
     949                 :            : 
     950                 :          0 :         sgl.n = 0;
     951                 :          0 :         sgl.len = 0;
     952                 :          0 :         sgl.size = occupancy;
     953                 :          0 :         sgl.sg = buf->sg;
     954                 :          0 :         sg_init_table(sgl.sg, sgl.size);
     955                 :          0 :         ret = __splice_from_pipe(pipe, &sd, pipe_to_sg);
     956                 :          0 :         pipe_unlock(pipe);
     957         [ #  # ]:          0 :         if (likely(ret > 0))
     958                 :          0 :                 ret = __send_to_port(port, buf->sg, sgl.n, sgl.len, buf, true);
     959                 :            : 
     960         [ #  # ]:          0 :         if (unlikely(ret <= 0))
     961                 :          0 :                 free_buf(buf, true);
     962                 :            :         return ret;
     963                 :            : 
     964                 :          0 : error_out:
     965                 :          0 :         pipe_unlock(pipe);
     966                 :          0 :         return ret;
     967                 :            : }
     968                 :            : 
     969                 :          0 : static __poll_t port_fops_poll(struct file *filp, poll_table *wait)
     970                 :            : {
     971                 :          0 :         struct port *port;
     972                 :          0 :         __poll_t ret;
     973                 :            : 
     974                 :          0 :         port = filp->private_data;
     975         [ #  # ]:          0 :         poll_wait(filp, &port->waitqueue, wait);
     976                 :            : 
     977         [ #  # ]:          0 :         if (!port->guest_connected) {
     978                 :            :                 /* Port got unplugged */
     979                 :            :                 return EPOLLHUP;
     980                 :            :         }
     981                 :          0 :         ret = 0;
     982         [ #  # ]:          0 :         if (!will_read_block(port))
     983                 :            :                 ret |= EPOLLIN | EPOLLRDNORM;
     984         [ #  # ]:          0 :         if (!will_write_block(port))
     985                 :          0 :                 ret |= EPOLLOUT;
     986         [ #  # ]:          0 :         if (!port->host_connected)
     987                 :          0 :                 ret |= EPOLLHUP;
     988                 :            : 
     989                 :            :         return ret;
     990                 :            : }
     991                 :            : 
     992                 :            : static void remove_port(struct kref *kref);
     993                 :            : 
     994                 :          0 : static int port_fops_release(struct inode *inode, struct file *filp)
     995                 :            : {
     996                 :          0 :         struct port *port;
     997                 :            : 
     998                 :          0 :         port = filp->private_data;
     999                 :            : 
    1000                 :            :         /* Notify host of port being closed */
    1001         [ #  # ]:          0 :         send_control_msg(port, VIRTIO_CONSOLE_PORT_OPEN, 0);
    1002                 :            : 
    1003                 :          0 :         spin_lock_irq(&port->inbuf_lock);
    1004                 :          0 :         port->guest_connected = false;
    1005                 :            : 
    1006                 :          0 :         discard_port_data(port);
    1007                 :            : 
    1008                 :          0 :         spin_unlock_irq(&port->inbuf_lock);
    1009                 :            : 
    1010                 :          0 :         spin_lock_irq(&port->outvq_lock);
    1011                 :          0 :         reclaim_consumed_buffers(port);
    1012                 :          0 :         spin_unlock_irq(&port->outvq_lock);
    1013                 :            : 
    1014                 :          0 :         reclaim_dma_bufs();
    1015                 :            :         /*
    1016                 :            :          * Locks aren't necessary here as a port can't be opened after
    1017                 :            :          * unplug, and if a port isn't unplugged, a kref would already
    1018                 :            :          * exist for the port.  Plus, taking ports_lock here would
    1019                 :            :          * create a dependency on other locks taken by functions
    1020                 :            :          * inside remove_port if we're the last holder of the port,
    1021                 :            :          * creating many problems.
    1022                 :            :          */
    1023                 :          0 :         kref_put(&port->kref, remove_port);
    1024                 :            : 
    1025                 :          0 :         return 0;
    1026                 :            : }
    1027                 :            : 
    1028                 :          0 : static int port_fops_open(struct inode *inode, struct file *filp)
    1029                 :            : {
    1030                 :          0 :         struct cdev *cdev = inode->i_cdev;
    1031                 :          0 :         struct port *port;
    1032                 :          0 :         int ret;
    1033                 :            : 
    1034                 :            :         /* We get the port with a kref here */
    1035                 :          0 :         port = find_port_by_devt(cdev->dev);
    1036         [ #  # ]:          0 :         if (!port) {
    1037                 :            :                 /* Port was unplugged before we could proceed */
    1038                 :            :                 return -ENXIO;
    1039                 :            :         }
    1040                 :          0 :         filp->private_data = port;
    1041                 :            : 
    1042                 :            :         /*
    1043                 :            :          * Don't allow opening of console port devices -- that's done
    1044                 :            :          * via /dev/hvc
    1045                 :            :          */
    1046         [ #  # ]:          0 :         if (is_console_port(port)) {
    1047                 :          0 :                 ret = -ENXIO;
    1048                 :          0 :                 goto out;
    1049                 :            :         }
    1050                 :            : 
    1051                 :            :         /* Allow only one process to open a particular port at a time */
    1052                 :          0 :         spin_lock_irq(&port->inbuf_lock);
    1053         [ #  # ]:          0 :         if (port->guest_connected) {
    1054                 :          0 :                 spin_unlock_irq(&port->inbuf_lock);
    1055                 :          0 :                 ret = -EBUSY;
    1056                 :          0 :                 goto out;
    1057                 :            :         }
    1058                 :            : 
    1059                 :          0 :         port->guest_connected = true;
    1060                 :          0 :         spin_unlock_irq(&port->inbuf_lock);
    1061                 :            : 
    1062                 :          0 :         spin_lock_irq(&port->outvq_lock);
    1063                 :            :         /*
    1064                 :            :          * There might be a chance that we missed reclaiming a few
    1065                 :            :          * buffers in the window of the port getting previously closed
    1066                 :            :          * and opening now.
    1067                 :            :          */
    1068                 :          0 :         reclaim_consumed_buffers(port);
    1069                 :          0 :         spin_unlock_irq(&port->outvq_lock);
    1070                 :            : 
    1071                 :          0 :         nonseekable_open(inode, filp);
    1072                 :            : 
    1073                 :            :         /* Notify host of port being opened */
    1074         [ #  # ]:          0 :         send_control_msg(filp->private_data, VIRTIO_CONSOLE_PORT_OPEN, 1);
    1075                 :            : 
    1076                 :            :         return 0;
    1077                 :          0 : out:
    1078                 :          0 :         kref_put(&port->kref, remove_port);
    1079                 :            :         return ret;
    1080                 :            : }
    1081                 :            : 
    1082                 :          0 : static int port_fops_fasync(int fd, struct file *filp, int mode)
    1083                 :            : {
    1084                 :          0 :         struct port *port;
    1085                 :            : 
    1086                 :          0 :         port = filp->private_data;
    1087                 :          0 :         return fasync_helper(fd, filp, mode, &port->async_queue);
    1088                 :            : }
    1089                 :            : 
    1090                 :            : /*
    1091                 :            :  * The file operations that we support: programs in the guest can open
    1092                 :            :  * a console device, read from it, write to it, poll for data and
    1093                 :            :  * close it.  The devices are at
    1094                 :            :  *   /dev/vport<device number>p<port number>
    1095                 :            :  */
    1096                 :            : static const struct file_operations port_fops = {
    1097                 :            :         .owner = THIS_MODULE,
    1098                 :            :         .open  = port_fops_open,
    1099                 :            :         .read  = port_fops_read,
    1100                 :            :         .write = port_fops_write,
    1101                 :            :         .splice_write = port_fops_splice_write,
    1102                 :            :         .poll  = port_fops_poll,
    1103                 :            :         .release = port_fops_release,
    1104                 :            :         .fasync = port_fops_fasync,
    1105                 :            :         .llseek = no_llseek,
    1106                 :            : };
    1107                 :            : 
    1108                 :            : /*
    1109                 :            :  * The put_chars() callback is pretty straightforward.
    1110                 :            :  *
    1111                 :            :  * We turn the characters into a scatter-gather list, add it to the
    1112                 :            :  * output queue and then kick the Host.  Then we sit here waiting for
    1113                 :            :  * it to finish: inefficient in theory, but in practice
    1114                 :            :  * implementations will do it immediately.
    1115                 :            :  */
    1116                 :          0 : static int put_chars(u32 vtermno, const char *buf, int count)
    1117                 :            : {
    1118                 :          0 :         struct port *port;
    1119                 :          0 :         struct scatterlist sg[1];
    1120                 :          0 :         void *data;
    1121                 :          0 :         int ret;
    1122                 :            : 
    1123         [ #  # ]:          0 :         if (unlikely(early_put_chars))
    1124                 :          0 :                 return early_put_chars(vtermno, buf, count);
    1125                 :            : 
    1126                 :          0 :         port = find_port_by_vtermno(vtermno);
    1127         [ #  # ]:          0 :         if (!port)
    1128                 :            :                 return -EPIPE;
    1129                 :            : 
    1130                 :          0 :         data = kmemdup(buf, count, GFP_ATOMIC);
    1131         [ #  # ]:          0 :         if (!data)
    1132                 :            :                 return -ENOMEM;
    1133                 :            : 
    1134                 :          0 :         sg_init_one(sg, data, count);
    1135                 :          0 :         ret = __send_to_port(port, sg, 1, count, data, false);
    1136                 :          0 :         kfree(data);
    1137                 :          0 :         return ret;
    1138                 :            : }
    1139                 :            : 
    1140                 :            : /*
    1141                 :            :  * get_chars() is the callback from the hvc_console infrastructure
    1142                 :            :  * when an interrupt is received.
    1143                 :            :  *
    1144                 :            :  * We call out to fill_readbuf that gets us the required data from the
    1145                 :            :  * buffers that are queued up.
    1146                 :            :  */
    1147                 :          0 : static int get_chars(u32 vtermno, char *buf, int count)
    1148                 :            : {
    1149                 :          0 :         struct port *port;
    1150                 :            : 
    1151                 :            :         /* If we've not set up the port yet, we have no input to give. */
    1152         [ #  # ]:          0 :         if (unlikely(early_put_chars))
    1153                 :            :                 return 0;
    1154                 :            : 
    1155                 :          0 :         port = find_port_by_vtermno(vtermno);
    1156         [ #  # ]:          0 :         if (!port)
    1157                 :            :                 return -EPIPE;
    1158                 :            : 
    1159                 :            :         /* If we don't have an input queue yet, we can't get input. */
    1160         [ #  # ]:          0 :         BUG_ON(!port->in_vq);
    1161                 :            : 
    1162                 :          0 :         return fill_readbuf(port, (__force char __user *)buf, count, false);
    1163                 :            : }
    1164                 :            : 
    1165                 :          0 : static void resize_console(struct port *port)
    1166                 :            : {
    1167                 :          0 :         struct virtio_device *vdev;
    1168                 :            : 
    1169                 :            :         /* The port could have been hot-unplugged */
    1170   [ #  #  #  # ]:          0 :         if (!port || !is_console_port(port))
    1171                 :            :                 return;
    1172                 :            : 
    1173                 :          0 :         vdev = port->portdev->vdev;
    1174                 :            : 
    1175                 :            :         /* Don't test F_SIZE at all if we're rproc: not a valid feature! */
    1176   [ #  #  #  # ]:          0 :         if (!is_rproc_serial(vdev) &&
    1177                 :            :             virtio_has_feature(vdev, VIRTIO_CONSOLE_F_SIZE))
    1178                 :          0 :                 hvc_resize(port->cons.hvc, port->cons.ws);
    1179                 :            : }
    1180                 :            : 
    1181                 :            : /* We set the configuration at this point, since we now have a tty */
    1182                 :          0 : static int notifier_add_vio(struct hvc_struct *hp, int data)
    1183                 :            : {
    1184                 :          0 :         struct port *port;
    1185                 :            : 
    1186                 :          0 :         port = find_port_by_vtermno(hp->vtermno);
    1187         [ #  # ]:          0 :         if (!port)
    1188                 :            :                 return -EINVAL;
    1189                 :            : 
    1190                 :          0 :         hp->irq_requested = 1;
    1191                 :          0 :         resize_console(port);
    1192                 :            : 
    1193                 :          0 :         return 0;
    1194                 :            : }
    1195                 :            : 
    1196                 :          0 : static void notifier_del_vio(struct hvc_struct *hp, int data)
    1197                 :            : {
    1198                 :          0 :         hp->irq_requested = 0;
    1199                 :          0 : }
    1200                 :            : 
    1201                 :            : /* The operations for console ports. */
    1202                 :            : static const struct hv_ops hv_ops = {
    1203                 :            :         .get_chars = get_chars,
    1204                 :            :         .put_chars = put_chars,
    1205                 :            :         .notifier_add = notifier_add_vio,
    1206                 :            :         .notifier_del = notifier_del_vio,
    1207                 :            :         .notifier_hangup = notifier_del_vio,
    1208                 :            : };
    1209                 :            : 
    1210                 :            : /*
    1211                 :            :  * Console drivers are initialized very early so boot messages can go
    1212                 :            :  * out, so we do things slightly differently from the generic virtio
    1213                 :            :  * initialization of the net and block drivers.
    1214                 :            :  *
    1215                 :            :  * At this stage, the console is output-only.  It's too early to set
    1216                 :            :  * up a virtqueue, so we let the drivers do some boutique early-output
    1217                 :            :  * thing.
    1218                 :            :  */
    1219                 :          0 : int __init virtio_cons_early_init(int (*put_chars)(u32, const char *, int))
    1220                 :            : {
    1221                 :          0 :         early_put_chars = put_chars;
    1222                 :          0 :         return hvc_instantiate(0, 0, &hv_ops);
    1223                 :            : }
    1224                 :            : 
    1225                 :          0 : static int init_port_console(struct port *port)
    1226                 :            : {
    1227                 :          0 :         int ret;
    1228                 :            : 
    1229                 :            :         /*
    1230                 :            :          * The Host's telling us this port is a console port.  Hook it
    1231                 :            :          * up with an hvc console.
    1232                 :            :          *
    1233                 :            :          * To set up and manage our virtual console, we call
    1234                 :            :          * hvc_alloc().
    1235                 :            :          *
    1236                 :            :          * The first argument of hvc_alloc() is the virtual console
    1237                 :            :          * number.  The second argument is the parameter for the
    1238                 :            :          * notification mechanism (like irq number).  We currently
    1239                 :            :          * leave this as zero, virtqueues have implicit notifications.
    1240                 :            :          *
    1241                 :            :          * The third argument is a "struct hv_ops" containing the
    1242                 :            :          * put_chars() get_chars(), notifier_add() and notifier_del()
    1243                 :            :          * pointers.  The final argument is the output buffer size: we
    1244                 :            :          * can do any size, so we put PAGE_SIZE here.
    1245                 :            :          */
    1246                 :          0 :         port->cons.vtermno = pdrvdata.next_vtermno;
    1247                 :            : 
    1248                 :          0 :         port->cons.hvc = hvc_alloc(port->cons.vtermno, 0, &hv_ops, PAGE_SIZE);
    1249         [ #  # ]:          0 :         if (IS_ERR(port->cons.hvc)) {
    1250                 :          0 :                 ret = PTR_ERR(port->cons.hvc);
    1251                 :          0 :                 dev_err(port->dev,
    1252                 :            :                         "error %d allocating hvc for port\n", ret);
    1253                 :          0 :                 port->cons.hvc = NULL;
    1254                 :          0 :                 return ret;
    1255                 :            :         }
    1256                 :          0 :         spin_lock_irq(&pdrvdata_lock);
    1257                 :          0 :         pdrvdata.next_vtermno++;
    1258                 :          0 :         list_add_tail(&port->cons.list, &pdrvdata.consoles);
    1259                 :          0 :         spin_unlock_irq(&pdrvdata_lock);
    1260                 :          0 :         port->guest_connected = true;
    1261                 :            : 
    1262                 :            :         /*
    1263                 :            :          * Start using the new console output if this is the first
    1264                 :            :          * console to come up.
    1265                 :            :          */
    1266         [ #  # ]:          0 :         if (early_put_chars)
    1267                 :          0 :                 early_put_chars = NULL;
    1268                 :            : 
    1269                 :            :         /* Notify host of port being opened */
    1270         [ #  # ]:          0 :         send_control_msg(port, VIRTIO_CONSOLE_PORT_OPEN, 1);
    1271                 :            : 
    1272                 :            :         return 0;
    1273                 :            : }
    1274                 :            : 
    1275                 :          0 : static ssize_t show_port_name(struct device *dev,
    1276                 :            :                               struct device_attribute *attr, char *buffer)
    1277                 :            : {
    1278                 :          0 :         struct port *port;
    1279                 :            : 
    1280                 :          0 :         port = dev_get_drvdata(dev);
    1281                 :            : 
    1282                 :          0 :         return sprintf(buffer, "%s\n", port->name);
    1283                 :            : }
    1284                 :            : 
    1285                 :            : static DEVICE_ATTR(name, S_IRUGO, show_port_name, NULL);
    1286                 :            : 
    1287                 :            : static struct attribute *port_sysfs_entries[] = {
    1288                 :            :         &dev_attr_name.attr,
    1289                 :            :         NULL
    1290                 :            : };
    1291                 :            : 
    1292                 :            : static const struct attribute_group port_attribute_group = {
    1293                 :            :         .name = NULL,           /* put in device directory */
    1294                 :            :         .attrs = port_sysfs_entries,
    1295                 :            : };
    1296                 :            : 
    1297                 :          0 : static int port_debugfs_show(struct seq_file *s, void *data)
    1298                 :            : {
    1299                 :          0 :         struct port *port = s->private;
    1300                 :            : 
    1301         [ #  # ]:          0 :         seq_printf(s, "name: %s\n", port->name ? port->name : "");
    1302                 :          0 :         seq_printf(s, "guest_connected: %d\n", port->guest_connected);
    1303                 :          0 :         seq_printf(s, "host_connected: %d\n", port->host_connected);
    1304                 :          0 :         seq_printf(s, "outvq_full: %d\n", port->outvq_full);
    1305                 :          0 :         seq_printf(s, "bytes_sent: %lu\n", port->stats.bytes_sent);
    1306                 :          0 :         seq_printf(s, "bytes_received: %lu\n", port->stats.bytes_received);
    1307                 :          0 :         seq_printf(s, "bytes_discarded: %lu\n", port->stats.bytes_discarded);
    1308                 :          0 :         seq_printf(s, "is_console: %s\n",
    1309         [ #  # ]:          0 :                    is_console_port(port) ? "yes" : "no");
    1310                 :          0 :         seq_printf(s, "console_vtermno: %u\n", port->cons.vtermno);
    1311                 :            : 
    1312                 :          0 :         return 0;
    1313                 :            : }
    1314                 :            : 
    1315                 :          0 : DEFINE_SHOW_ATTRIBUTE(port_debugfs);
    1316                 :            : 
    1317                 :          0 : static void set_console_size(struct port *port, u16 rows, u16 cols)
    1318                 :            : {
    1319         [ #  # ]:          0 :         if (!port || !is_console_port(port))
    1320                 :            :                 return;
    1321                 :            : 
    1322                 :          0 :         port->cons.ws.ws_row = rows;
    1323                 :          0 :         port->cons.ws.ws_col = cols;
    1324                 :            : }
    1325                 :            : 
    1326                 :          0 : static int fill_queue(struct virtqueue *vq, spinlock_t *lock)
    1327                 :            : {
    1328                 :          0 :         struct port_buffer *buf;
    1329                 :          0 :         int nr_added_bufs;
    1330                 :          0 :         int ret;
    1331                 :            : 
    1332                 :          0 :         nr_added_bufs = 0;
    1333                 :          0 :         do {
    1334                 :          0 :                 buf = alloc_buf(vq->vdev, PAGE_SIZE, 0);
    1335         [ #  # ]:          0 :                 if (!buf)
    1336                 :            :                         return -ENOMEM;
    1337                 :            : 
    1338                 :          0 :                 spin_lock_irq(lock);
    1339                 :          0 :                 ret = add_inbuf(vq, buf);
    1340         [ #  # ]:          0 :                 if (ret < 0) {
    1341                 :          0 :                         spin_unlock_irq(lock);
    1342                 :          0 :                         free_buf(buf, true);
    1343                 :          0 :                         return ret;
    1344                 :            :                 }
    1345                 :          0 :                 nr_added_bufs++;
    1346                 :          0 :                 spin_unlock_irq(lock);
    1347         [ #  # ]:          0 :         } while (ret > 0);
    1348                 :            : 
    1349                 :            :         return nr_added_bufs;
    1350                 :            : }
    1351                 :            : 
    1352                 :          0 : static void send_sigio_to_port(struct port *port)
    1353                 :            : {
    1354   [ #  #  #  # ]:          0 :         if (port->async_queue && port->guest_connected)
    1355                 :          0 :                 kill_fasync(&port->async_queue, SIGIO, POLL_OUT);
    1356                 :            : }
    1357                 :            : 
    1358                 :          0 : static int add_port(struct ports_device *portdev, u32 id)
    1359                 :            : {
    1360                 :          0 :         char debugfs_name[16];
    1361                 :          0 :         struct port *port;
    1362                 :          0 :         dev_t devt;
    1363                 :          0 :         int err;
    1364                 :            : 
    1365                 :          0 :         port = kmalloc(sizeof(*port), GFP_KERNEL);
    1366         [ #  # ]:          0 :         if (!port) {
    1367                 :          0 :                 err = -ENOMEM;
    1368                 :          0 :                 goto fail;
    1369                 :            :         }
    1370                 :          0 :         kref_init(&port->kref);
    1371                 :            : 
    1372                 :          0 :         port->portdev = portdev;
    1373                 :          0 :         port->id = id;
    1374                 :            : 
    1375                 :          0 :         port->name = NULL;
    1376                 :          0 :         port->inbuf = NULL;
    1377                 :          0 :         port->cons.hvc = NULL;
    1378                 :          0 :         port->async_queue = NULL;
    1379                 :            : 
    1380                 :          0 :         port->cons.ws.ws_row = port->cons.ws.ws_col = 0;
    1381                 :          0 :         port->cons.vtermno = 0;
    1382                 :            : 
    1383                 :          0 :         port->host_connected = port->guest_connected = false;
    1384                 :          0 :         port->stats = (struct port_stats) { 0 };
    1385                 :            : 
    1386                 :          0 :         port->outvq_full = false;
    1387                 :            : 
    1388                 :          0 :         port->in_vq = portdev->in_vqs[port->id];
    1389                 :          0 :         port->out_vq = portdev->out_vqs[port->id];
    1390                 :            : 
    1391                 :          0 :         port->cdev = cdev_alloc();
    1392         [ #  # ]:          0 :         if (!port->cdev) {
    1393                 :          0 :                 dev_err(&port->portdev->vdev->dev, "Error allocating cdev\n");
    1394                 :          0 :                 err = -ENOMEM;
    1395                 :          0 :                 goto free_port;
    1396                 :            :         }
    1397                 :          0 :         port->cdev->ops = &port_fops;
    1398                 :            : 
    1399                 :          0 :         devt = MKDEV(portdev->chr_major, id);
    1400                 :          0 :         err = cdev_add(port->cdev, devt, 1);
    1401         [ #  # ]:          0 :         if (err < 0) {
    1402                 :          0 :                 dev_err(&port->portdev->vdev->dev,
    1403                 :            :                         "Error %d adding cdev for port %u\n", err, id);
    1404                 :          0 :                 goto free_cdev;
    1405                 :            :         }
    1406                 :          0 :         port->dev = device_create(pdrvdata.class, &port->portdev->vdev->dev,
    1407                 :            :                                   devt, port, "vport%up%u",
    1408                 :          0 :                                   port->portdev->vdev->index, id);
    1409         [ #  # ]:          0 :         if (IS_ERR(port->dev)) {
    1410                 :          0 :                 err = PTR_ERR(port->dev);
    1411                 :          0 :                 dev_err(&port->portdev->vdev->dev,
    1412                 :            :                         "Error %d creating device for port %u\n",
    1413                 :            :                         err, id);
    1414                 :          0 :                 goto free_cdev;
    1415                 :            :         }
    1416                 :            : 
    1417                 :          0 :         spin_lock_init(&port->inbuf_lock);
    1418                 :          0 :         spin_lock_init(&port->outvq_lock);
    1419                 :          0 :         init_waitqueue_head(&port->waitqueue);
    1420                 :            : 
    1421                 :            :         /* We can safely ignore ENOSPC because it means
    1422                 :            :          * the queue already has buffers. Buffers are removed
    1423                 :            :          * only by virtcons_remove(), not by unplug_port()
    1424                 :            :          */
    1425                 :          0 :         err = fill_queue(port->in_vq, &port->inbuf_lock);
    1426         [ #  # ]:          0 :         if (err < 0 && err != -ENOSPC) {
    1427                 :          0 :                 dev_err(port->dev, "Error allocating inbufs\n");
    1428                 :          0 :                 goto free_device;
    1429                 :            :         }
    1430                 :            : 
    1431         [ #  # ]:          0 :         if (is_rproc_serial(port->portdev->vdev))
    1432                 :            :                 /*
    1433                 :            :                  * For rproc_serial assume remote processor is connected.
    1434                 :            :                  * rproc_serial does not want the console port, only
    1435                 :            :                  * the generic port implementation.
    1436                 :            :                  */
    1437                 :          0 :                 port->host_connected = true;
    1438   [ #  #  #  # ]:          0 :         else if (!use_multiport(port->portdev)) {
    1439                 :            :                 /*
    1440                 :            :                  * If we're not using multiport support,
    1441                 :            :                  * this has to be a console port.
    1442                 :            :                  */
    1443                 :          0 :                 err = init_port_console(port);
    1444         [ #  # ]:          0 :                 if (err)
    1445                 :          0 :                         goto free_inbufs;
    1446                 :            :         }
    1447                 :            : 
    1448                 :          0 :         spin_lock_irq(&portdev->ports_lock);
    1449                 :          0 :         list_add_tail(&port->list, &port->portdev->ports);
    1450                 :          0 :         spin_unlock_irq(&portdev->ports_lock);
    1451                 :            : 
    1452                 :            :         /*
    1453                 :            :          * Tell the Host we're set so that it can send us various
    1454                 :            :          * configuration parameters for this port (eg, port name,
    1455                 :            :          * caching, whether this is a console port, etc.)
    1456                 :            :          */
    1457         [ #  # ]:          0 :         send_control_msg(port, VIRTIO_CONSOLE_PORT_READY, 1);
    1458                 :            : 
    1459         [ #  # ]:          0 :         if (pdrvdata.debugfs_dir) {
    1460                 :            :                 /*
    1461                 :            :                  * Finally, create the debugfs file that we can use to
    1462                 :            :                  * inspect a port's state at any time
    1463                 :            :                  */
    1464                 :          0 :                 snprintf(debugfs_name, sizeof(debugfs_name), "vport%up%u",
    1465                 :          0 :                          port->portdev->vdev->index, id);
    1466                 :          0 :                 port->debugfs_file = debugfs_create_file(debugfs_name, 0444,
    1467                 :            :                                                          pdrvdata.debugfs_dir,
    1468                 :            :                                                          port,
    1469                 :            :                                                          &port_debugfs_fops);
    1470                 :            :         }
    1471                 :            :         return 0;
    1472                 :            : 
    1473                 :          0 : free_inbufs:
    1474                 :          0 : free_device:
    1475                 :          0 :         device_destroy(pdrvdata.class, port->dev->devt);
    1476                 :          0 : free_cdev:
    1477                 :          0 :         cdev_del(port->cdev);
    1478                 :          0 : free_port:
    1479                 :          0 :         kfree(port);
    1480                 :          0 : fail:
    1481                 :            :         /* The host might want to notify management sw about port add failure */
    1482                 :          0 :         __send_control_msg(portdev, id, VIRTIO_CONSOLE_PORT_READY, 0);
    1483                 :          0 :         return err;
    1484                 :            : }
    1485                 :            : 
    1486                 :            : /* No users remain, remove all port-specific data. */
    1487                 :          0 : static void remove_port(struct kref *kref)
    1488                 :            : {
    1489                 :          0 :         struct port *port;
    1490                 :            : 
    1491                 :          0 :         port = container_of(kref, struct port, kref);
    1492                 :            : 
    1493                 :          0 :         kfree(port);
    1494                 :          0 : }
    1495                 :            : 
    1496                 :          0 : static void remove_port_data(struct port *port)
    1497                 :            : {
    1498                 :          0 :         spin_lock_irq(&port->inbuf_lock);
    1499                 :            :         /* Remove unused data this port might have received. */
    1500                 :          0 :         discard_port_data(port);
    1501                 :          0 :         spin_unlock_irq(&port->inbuf_lock);
    1502                 :            : 
    1503                 :          0 :         spin_lock_irq(&port->outvq_lock);
    1504                 :          0 :         reclaim_consumed_buffers(port);
    1505                 :          0 :         spin_unlock_irq(&port->outvq_lock);
    1506                 :          0 : }
    1507                 :            : 
    1508                 :            : /*
    1509                 :            :  * Port got unplugged.  Remove port from portdev's list and drop the
    1510                 :            :  * kref reference.  If no userspace has this port opened, it will
    1511                 :            :  * result in immediate removal the port.
    1512                 :            :  */
    1513                 :          0 : static void unplug_port(struct port *port)
    1514                 :            : {
    1515                 :          0 :         spin_lock_irq(&port->portdev->ports_lock);
    1516                 :          0 :         list_del(&port->list);
    1517                 :          0 :         spin_unlock_irq(&port->portdev->ports_lock);
    1518                 :            : 
    1519                 :          0 :         spin_lock_irq(&port->inbuf_lock);
    1520         [ #  # ]:          0 :         if (port->guest_connected) {
    1521                 :            :                 /* Let the app know the port is going down. */
    1522         [ #  # ]:          0 :                 send_sigio_to_port(port);
    1523                 :            : 
    1524                 :            :                 /* Do this after sigio is actually sent */
    1525                 :          0 :                 port->guest_connected = false;
    1526                 :          0 :                 port->host_connected = false;
    1527                 :            : 
    1528                 :          0 :                 wake_up_interruptible(&port->waitqueue);
    1529                 :            :         }
    1530                 :          0 :         spin_unlock_irq(&port->inbuf_lock);
    1531                 :            : 
    1532         [ #  # ]:          0 :         if (is_console_port(port)) {
    1533                 :          0 :                 spin_lock_irq(&pdrvdata_lock);
    1534                 :          0 :                 list_del(&port->cons.list);
    1535                 :          0 :                 spin_unlock_irq(&pdrvdata_lock);
    1536                 :          0 :                 hvc_remove(port->cons.hvc);
    1537                 :            :         }
    1538                 :            : 
    1539                 :          0 :         remove_port_data(port);
    1540                 :            : 
    1541                 :            :         /*
    1542                 :            :          * We should just assume the device itself has gone off --
    1543                 :            :          * else a close on an open port later will try to send out a
    1544                 :            :          * control message.
    1545                 :            :          */
    1546                 :          0 :         port->portdev = NULL;
    1547                 :            : 
    1548                 :          0 :         sysfs_remove_group(&port->dev->kobj, &port_attribute_group);
    1549                 :          0 :         device_destroy(pdrvdata.class, port->dev->devt);
    1550                 :          0 :         cdev_del(port->cdev);
    1551                 :            : 
    1552                 :          0 :         debugfs_remove(port->debugfs_file);
    1553                 :          0 :         kfree(port->name);
    1554                 :            : 
    1555                 :            :         /*
    1556                 :            :          * Locks around here are not necessary - a port can't be
    1557                 :            :          * opened after we removed the port struct from ports_list
    1558                 :            :          * above.
    1559                 :            :          */
    1560                 :          0 :         kref_put(&port->kref, remove_port);
    1561                 :          0 : }
    1562                 :            : 
    1563                 :            : /* Any private messages that the Host and Guest want to share */
    1564                 :          0 : static void handle_control_message(struct virtio_device *vdev,
    1565                 :            :                                    struct ports_device *portdev,
    1566                 :            :                                    struct port_buffer *buf)
    1567                 :            : {
    1568                 :          0 :         struct virtio_console_control *cpkt;
    1569                 :          0 :         struct port *port;
    1570                 :          0 :         size_t name_size;
    1571                 :          0 :         int err;
    1572                 :            : 
    1573                 :          0 :         cpkt = (struct virtio_console_control *)(buf->buf + buf->offset);
    1574                 :            : 
    1575                 :          0 :         port = find_port_by_id(portdev, virtio32_to_cpu(vdev, cpkt->id));
    1576   [ #  #  #  # ]:          0 :         if (!port &&
    1577                 :          0 :             cpkt->event != cpu_to_virtio16(vdev, VIRTIO_CONSOLE_PORT_ADD)) {
    1578                 :            :                 /* No valid header at start of buffer.  Drop it. */
    1579                 :            :                 dev_dbg(&portdev->vdev->dev,
    1580                 :            :                         "Invalid index %u in control packet\n", cpkt->id);
    1581                 :            :                 return;
    1582                 :            :         }
    1583                 :            : 
    1584   [ #  #  #  #  :          0 :         switch (virtio16_to_cpu(vdev, cpkt->event)) {
                #  #  # ]
    1585                 :          0 :         case VIRTIO_CONSOLE_PORT_ADD:
    1586         [ #  # ]:          0 :                 if (port) {
    1587                 :          0 :                         dev_dbg(&portdev->vdev->dev,
    1588                 :            :                                 "Port %u already added\n", port->id);
    1589         [ #  # ]:          0 :                         send_control_msg(port, VIRTIO_CONSOLE_PORT_READY, 1);
    1590                 :            :                         break;
    1591                 :            :                 }
    1592                 :          0 :                 if (virtio32_to_cpu(vdev, cpkt->id) >=
    1593         [ #  # ]:          0 :                     portdev->max_nr_ports) {
    1594                 :          0 :                         dev_warn(&portdev->vdev->dev,
    1595                 :            :                                 "Request for adding port with "
    1596                 :            :                                 "out-of-bound id %u, max. supported id: %u\n",
    1597                 :            :                                 cpkt->id, portdev->max_nr_ports - 1);
    1598                 :          0 :                         break;
    1599                 :            :                 }
    1600                 :          0 :                 add_port(portdev, virtio32_to_cpu(vdev, cpkt->id));
    1601                 :          0 :                 break;
    1602                 :          0 :         case VIRTIO_CONSOLE_PORT_REMOVE:
    1603                 :          0 :                 unplug_port(port);
    1604                 :          0 :                 break;
    1605                 :          0 :         case VIRTIO_CONSOLE_CONSOLE_PORT:
    1606         [ #  # ]:          0 :                 if (!cpkt->value)
    1607                 :            :                         break;
    1608         [ #  # ]:          0 :                 if (is_console_port(port))
    1609                 :            :                         break;
    1610                 :            : 
    1611                 :          0 :                 init_port_console(port);
    1612                 :          0 :                 complete(&early_console_added);
    1613                 :            :                 /*
    1614                 :            :                  * Could remove the port here in case init fails - but
    1615                 :            :                  * have to notify the host first.
    1616                 :            :                  */
    1617                 :          0 :                 break;
    1618                 :          0 :         case VIRTIO_CONSOLE_RESIZE: {
    1619                 :          0 :                 struct {
    1620                 :            :                         __u16 rows;
    1621                 :            :                         __u16 cols;
    1622                 :            :                 } size;
    1623                 :            : 
    1624         [ #  # ]:          0 :                 if (!is_console_port(port))
    1625                 :            :                         break;
    1626                 :            : 
    1627                 :          0 :                 memcpy(&size, buf->buf + buf->offset + sizeof(*cpkt),
    1628                 :            :                        sizeof(size));
    1629         [ #  # ]:          0 :                 set_console_size(port, size.rows, size.cols);
    1630                 :            : 
    1631                 :          0 :                 port->cons.hvc->irq_requested = 1;
    1632                 :          0 :                 resize_console(port);
    1633                 :          0 :                 break;
    1634                 :            :         }
    1635                 :          0 :         case VIRTIO_CONSOLE_PORT_OPEN:
    1636                 :          0 :                 port->host_connected = virtio16_to_cpu(vdev, cpkt->value);
    1637                 :          0 :                 wake_up_interruptible(&port->waitqueue);
    1638                 :            :                 /*
    1639                 :            :                  * If the host port got closed and the host had any
    1640                 :            :                  * unconsumed buffers, we'll be able to reclaim them
    1641                 :            :                  * now.
    1642                 :            :                  */
    1643                 :          0 :                 spin_lock_irq(&port->outvq_lock);
    1644                 :          0 :                 reclaim_consumed_buffers(port);
    1645                 :          0 :                 spin_unlock_irq(&port->outvq_lock);
    1646                 :            : 
    1647                 :            :                 /*
    1648                 :            :                  * If the guest is connected, it'll be interested in
    1649                 :            :                  * knowing the host connection state changed.
    1650                 :            :                  */
    1651                 :          0 :                 spin_lock_irq(&port->inbuf_lock);
    1652         [ #  # ]:          0 :                 send_sigio_to_port(port);
    1653                 :          0 :                 spin_unlock_irq(&port->inbuf_lock);
    1654                 :            :                 break;
    1655                 :          0 :         case VIRTIO_CONSOLE_PORT_NAME:
    1656                 :            :                 /*
    1657                 :            :                  * If we woke up after hibernation, we can get this
    1658                 :            :                  * again.  Skip it in that case.
    1659                 :            :                  */
    1660         [ #  # ]:          0 :                 if (port->name)
    1661                 :            :                         break;
    1662                 :            : 
    1663                 :            :                 /*
    1664                 :            :                  * Skip the size of the header and the cpkt to get the size
    1665                 :            :                  * of the name that was sent
    1666                 :            :                  */
    1667                 :          0 :                 name_size = buf->len - buf->offset - sizeof(*cpkt) + 1;
    1668                 :            : 
    1669         [ #  # ]:          0 :                 port->name = kmalloc(name_size, GFP_KERNEL);
    1670         [ #  # ]:          0 :                 if (!port->name) {
    1671                 :          0 :                         dev_err(port->dev,
    1672                 :            :                                 "Not enough space to store port name\n");
    1673                 :          0 :                         break;
    1674                 :            :                 }
    1675                 :          0 :                 strncpy(port->name, buf->buf + buf->offset + sizeof(*cpkt),
    1676                 :            :                         name_size - 1);
    1677                 :          0 :                 port->name[name_size - 1] = 0;
    1678                 :            : 
    1679                 :            :                 /*
    1680                 :            :                  * Since we only have one sysfs attribute, 'name',
    1681                 :            :                  * create it only if we have a name for the port.
    1682                 :            :                  */
    1683                 :          0 :                 err = sysfs_create_group(&port->dev->kobj,
    1684                 :            :                                          &port_attribute_group);
    1685         [ #  # ]:          0 :                 if (err) {
    1686                 :          0 :                         dev_err(port->dev,
    1687                 :            :                                 "Error %d creating sysfs device attributes\n",
    1688                 :            :                                 err);
    1689                 :            :                 } else {
    1690                 :            :                         /*
    1691                 :            :                          * Generate a udev event so that appropriate
    1692                 :            :                          * symlinks can be created based on udev
    1693                 :            :                          * rules.
    1694                 :            :                          */
    1695                 :          0 :                         kobject_uevent(&port->dev->kobj, KOBJ_CHANGE);
    1696                 :            :                 }
    1697                 :            :                 break;
    1698                 :            :         }
    1699                 :          0 : }
    1700                 :            : 
    1701                 :          0 : static void control_work_handler(struct work_struct *work)
    1702                 :            : {
    1703                 :          0 :         struct ports_device *portdev;
    1704                 :          0 :         struct virtqueue *vq;
    1705                 :          0 :         struct port_buffer *buf;
    1706                 :          0 :         unsigned int len;
    1707                 :            : 
    1708                 :          0 :         portdev = container_of(work, struct ports_device, control_work);
    1709                 :          0 :         vq = portdev->c_ivq;
    1710                 :            : 
    1711                 :          0 :         spin_lock(&portdev->c_ivq_lock);
    1712         [ #  # ]:          0 :         while ((buf = virtqueue_get_buf(vq, &len))) {
    1713                 :          0 :                 spin_unlock(&portdev->c_ivq_lock);
    1714                 :            : 
    1715                 :          0 :                 buf->len = len;
    1716                 :          0 :                 buf->offset = 0;
    1717                 :            : 
    1718                 :          0 :                 handle_control_message(vq->vdev, portdev, buf);
    1719                 :            : 
    1720                 :          0 :                 spin_lock(&portdev->c_ivq_lock);
    1721         [ #  # ]:          0 :                 if (add_inbuf(portdev->c_ivq, buf) < 0) {
    1722                 :          0 :                         dev_warn(&portdev->vdev->dev,
    1723                 :            :                                  "Error adding buffer to queue\n");
    1724                 :          0 :                         free_buf(buf, false);
    1725                 :            :                 }
    1726                 :            :         }
    1727                 :          0 :         spin_unlock(&portdev->c_ivq_lock);
    1728                 :          0 : }
    1729                 :            : 
    1730                 :          0 : static void flush_bufs(struct virtqueue *vq, bool can_sleep)
    1731                 :            : {
    1732                 :          0 :         struct port_buffer *buf;
    1733                 :          0 :         unsigned int len;
    1734                 :            : 
    1735         [ #  # ]:          0 :         while ((buf = virtqueue_get_buf(vq, &len)))
    1736                 :          0 :                 free_buf(buf, can_sleep);
    1737                 :          0 : }
    1738                 :            : 
    1739                 :          0 : static void out_intr(struct virtqueue *vq)
    1740                 :            : {
    1741                 :          0 :         struct port *port;
    1742                 :            : 
    1743                 :          0 :         port = find_port_by_vq(vq->vdev->priv, vq);
    1744         [ #  # ]:          0 :         if (!port) {
    1745                 :          0 :                 flush_bufs(vq, false);
    1746                 :          0 :                 return;
    1747                 :            :         }
    1748                 :            : 
    1749                 :          0 :         wake_up_interruptible(&port->waitqueue);
    1750                 :            : }
    1751                 :            : 
    1752                 :          0 : static void in_intr(struct virtqueue *vq)
    1753                 :            : {
    1754                 :          0 :         struct port *port;
    1755                 :          0 :         unsigned long flags;
    1756                 :            : 
    1757                 :          0 :         port = find_port_by_vq(vq->vdev->priv, vq);
    1758         [ #  # ]:          0 :         if (!port) {
    1759                 :          0 :                 flush_bufs(vq, false);
    1760                 :          0 :                 return;
    1761                 :            :         }
    1762                 :            : 
    1763                 :          0 :         spin_lock_irqsave(&port->inbuf_lock, flags);
    1764                 :          0 :         port->inbuf = get_inbuf(port);
    1765                 :            : 
    1766                 :            :         /*
    1767                 :            :          * Normally the port should not accept data when the port is
    1768                 :            :          * closed. For generic serial ports, the host won't (shouldn't)
    1769                 :            :          * send data till the guest is connected. But this condition
    1770                 :            :          * can be reached when a console port is not yet connected (no
    1771                 :            :          * tty is spawned) and the other side sends out data over the
    1772                 :            :          * vring, or when a remote devices start sending data before
    1773                 :            :          * the ports are opened.
    1774                 :            :          *
    1775                 :            :          * A generic serial port will discard data if not connected,
    1776                 :            :          * while console ports and rproc-serial ports accepts data at
    1777                 :            :          * any time. rproc-serial is initiated with guest_connected to
    1778                 :            :          * false because port_fops_open expects this. Console ports are
    1779                 :            :          * hooked up with an HVC console and is initialized with
    1780                 :            :          * guest_connected to true.
    1781                 :            :          */
    1782                 :            : 
    1783   [ #  #  #  # ]:          0 :         if (!port->guest_connected && !is_rproc_serial(port->portdev->vdev))
    1784                 :          0 :                 discard_port_data(port);
    1785                 :            : 
    1786                 :            :         /* Send a SIGIO indicating new data in case the process asked for it */
    1787         [ #  # ]:          0 :         send_sigio_to_port(port);
    1788                 :            : 
    1789                 :          0 :         spin_unlock_irqrestore(&port->inbuf_lock, flags);
    1790                 :            : 
    1791                 :          0 :         wake_up_interruptible(&port->waitqueue);
    1792                 :            : 
    1793   [ #  #  #  # ]:          0 :         if (is_console_port(port) && hvc_poll(port->cons.hvc))
    1794                 :          0 :                 hvc_kick();
    1795                 :            : }
    1796                 :            : 
    1797                 :          0 : static void control_intr(struct virtqueue *vq)
    1798                 :            : {
    1799                 :          0 :         struct ports_device *portdev;
    1800                 :            : 
    1801                 :          0 :         portdev = vq->vdev->priv;
    1802                 :          0 :         schedule_work(&portdev->control_work);
    1803                 :          0 : }
    1804                 :            : 
    1805                 :          0 : static void config_intr(struct virtio_device *vdev)
    1806                 :            : {
    1807                 :          0 :         struct ports_device *portdev;
    1808                 :            : 
    1809                 :          0 :         portdev = vdev->priv;
    1810                 :            : 
    1811   [ #  #  #  # ]:          0 :         if (!use_multiport(portdev))
    1812                 :          0 :                 schedule_work(&portdev->config_work);
    1813                 :          0 : }
    1814                 :            : 
    1815                 :          0 : static void config_work_handler(struct work_struct *work)
    1816                 :            : {
    1817                 :          0 :         struct ports_device *portdev;
    1818                 :            : 
    1819                 :          0 :         portdev = container_of(work, struct ports_device, config_work);
    1820   [ #  #  #  # ]:          0 :         if (!use_multiport(portdev)) {
    1821                 :          0 :                 struct virtio_device *vdev;
    1822                 :          0 :                 struct port *port;
    1823                 :          0 :                 u16 rows, cols;
    1824                 :            : 
    1825                 :          0 :                 vdev = portdev->vdev;
    1826                 :          0 :                 virtio_cread(vdev, struct virtio_console_config, cols, &cols);
    1827                 :          0 :                 virtio_cread(vdev, struct virtio_console_config, rows, &rows);
    1828                 :            : 
    1829                 :          0 :                 port = find_port_by_id(portdev, 0);
    1830         [ #  # ]:          0 :                 set_console_size(port, rows, cols);
    1831                 :            : 
    1832                 :            :                 /*
    1833                 :            :                  * We'll use this way of resizing only for legacy
    1834                 :            :                  * support.  For newer userspace
    1835                 :            :                  * (VIRTIO_CONSOLE_F_MULTPORT+), use control messages
    1836                 :            :                  * to indicate console size changes so that it can be
    1837                 :            :                  * done per-port.
    1838                 :            :                  */
    1839                 :          0 :                 resize_console(port);
    1840                 :            :         }
    1841                 :          0 : }
    1842                 :            : 
    1843                 :          0 : static int init_vqs(struct ports_device *portdev)
    1844                 :            : {
    1845                 :          0 :         vq_callback_t **io_callbacks;
    1846                 :          0 :         char **io_names;
    1847                 :          0 :         struct virtqueue **vqs;
    1848                 :          0 :         u32 i, j, nr_ports, nr_queues;
    1849                 :          0 :         int err;
    1850                 :            : 
    1851                 :          0 :         nr_ports = portdev->max_nr_ports;
    1852   [ #  #  #  # ]:          0 :         nr_queues = use_multiport(portdev) ? (nr_ports + 1) * 2 : 2;
    1853                 :            : 
    1854                 :          0 :         vqs = kmalloc_array(nr_queues, sizeof(struct virtqueue *), GFP_KERNEL);
    1855                 :          0 :         io_callbacks = kmalloc_array(nr_queues, sizeof(vq_callback_t *),
    1856                 :            :                                      GFP_KERNEL);
    1857                 :          0 :         io_names = kmalloc_array(nr_queues, sizeof(char *), GFP_KERNEL);
    1858                 :          0 :         portdev->in_vqs = kmalloc_array(nr_ports, sizeof(struct virtqueue *),
    1859                 :            :                                         GFP_KERNEL);
    1860                 :          0 :         portdev->out_vqs = kmalloc_array(nr_ports, sizeof(struct virtqueue *),
    1861                 :            :                                          GFP_KERNEL);
    1862   [ #  #  #  #  :          0 :         if (!vqs || !io_callbacks || !io_names || !portdev->in_vqs ||
             #  #  #  # ]
    1863                 :            :             !portdev->out_vqs) {
    1864                 :          0 :                 err = -ENOMEM;
    1865                 :          0 :                 goto free;
    1866                 :            :         }
    1867                 :            : 
    1868                 :            :         /*
    1869                 :            :          * For backward compat (newer host but older guest), the host
    1870                 :            :          * spawns a console port first and also inits the vqs for port
    1871                 :            :          * 0 before others.
    1872                 :            :          */
    1873                 :          0 :         j = 0;
    1874                 :          0 :         io_callbacks[j] = in_intr;
    1875                 :          0 :         io_callbacks[j + 1] = out_intr;
    1876                 :          0 :         io_names[j] = "input";
    1877                 :          0 :         io_names[j + 1] = "output";
    1878                 :          0 :         j += 2;
    1879                 :            : 
    1880   [ #  #  #  # ]:          0 :         if (use_multiport(portdev)) {
    1881                 :          0 :                 io_callbacks[j] = control_intr;
    1882                 :          0 :                 io_callbacks[j + 1] = NULL;
    1883                 :          0 :                 io_names[j] = "control-i";
    1884                 :          0 :                 io_names[j + 1] = "control-o";
    1885                 :            : 
    1886         [ #  # ]:          0 :                 for (i = 1; i < nr_ports; i++) {
    1887                 :          0 :                         j += 2;
    1888                 :          0 :                         io_callbacks[j] = in_intr;
    1889                 :          0 :                         io_callbacks[j + 1] = out_intr;
    1890                 :          0 :                         io_names[j] = "input";
    1891                 :          0 :                         io_names[j + 1] = "output";
    1892                 :            :                 }
    1893                 :            :         }
    1894                 :            :         /* Find the queues. */
    1895                 :          0 :         err = virtio_find_vqs(portdev->vdev, nr_queues, vqs,
    1896                 :            :                               io_callbacks,
    1897                 :            :                               (const char **)io_names, NULL);
    1898         [ #  # ]:          0 :         if (err)
    1899                 :          0 :                 goto free;
    1900                 :            : 
    1901                 :          0 :         j = 0;
    1902                 :          0 :         portdev->in_vqs[0] = vqs[0];
    1903                 :          0 :         portdev->out_vqs[0] = vqs[1];
    1904                 :          0 :         j += 2;
    1905   [ #  #  #  # ]:          0 :         if (use_multiport(portdev)) {
    1906                 :          0 :                 portdev->c_ivq = vqs[j];
    1907                 :          0 :                 portdev->c_ovq = vqs[j + 1];
    1908                 :            : 
    1909         [ #  # ]:          0 :                 for (i = 1; i < nr_ports; i++) {
    1910                 :          0 :                         j += 2;
    1911                 :          0 :                         portdev->in_vqs[i] = vqs[j];
    1912                 :          0 :                         portdev->out_vqs[i] = vqs[j + 1];
    1913                 :            :                 }
    1914                 :            :         }
    1915                 :          0 :         kfree(io_names);
    1916                 :          0 :         kfree(io_callbacks);
    1917                 :          0 :         kfree(vqs);
    1918                 :            : 
    1919                 :          0 :         return 0;
    1920                 :            : 
    1921                 :          0 : free:
    1922                 :          0 :         kfree(portdev->out_vqs);
    1923                 :          0 :         kfree(portdev->in_vqs);
    1924                 :          0 :         kfree(io_names);
    1925                 :          0 :         kfree(io_callbacks);
    1926                 :          0 :         kfree(vqs);
    1927                 :            : 
    1928                 :          0 :         return err;
    1929                 :            : }
    1930                 :            : 
    1931                 :            : static const struct file_operations portdev_fops = {
    1932                 :            :         .owner = THIS_MODULE,
    1933                 :            : };
    1934                 :            : 
    1935                 :          0 : static void remove_vqs(struct ports_device *portdev)
    1936                 :            : {
    1937                 :          0 :         struct virtqueue *vq;
    1938                 :            : 
    1939         [ #  # ]:          0 :         virtio_device_for_each_vq(portdev->vdev, vq) {
    1940                 :          0 :                 struct port_buffer *buf;
    1941                 :            : 
    1942                 :          0 :                 flush_bufs(vq, true);
    1943         [ #  # ]:          0 :                 while ((buf = virtqueue_detach_unused_buf(vq)))
    1944                 :          0 :                         free_buf(buf, true);
    1945                 :            :         }
    1946                 :          0 :         portdev->vdev->config->del_vqs(portdev->vdev);
    1947                 :          0 :         kfree(portdev->in_vqs);
    1948                 :          0 :         kfree(portdev->out_vqs);
    1949                 :          0 : }
    1950                 :            : 
    1951                 :          0 : static void virtcons_remove(struct virtio_device *vdev)
    1952                 :            : {
    1953                 :          0 :         struct ports_device *portdev;
    1954                 :          0 :         struct port *port, *port2;
    1955                 :            : 
    1956                 :          0 :         portdev = vdev->priv;
    1957                 :            : 
    1958                 :          0 :         spin_lock_irq(&pdrvdata_lock);
    1959                 :          0 :         list_del(&portdev->list);
    1960                 :          0 :         spin_unlock_irq(&pdrvdata_lock);
    1961                 :            : 
    1962                 :            :         /* Disable interrupts for vqs */
    1963                 :          0 :         vdev->config->reset(vdev);
    1964                 :            :         /* Finish up work that's lined up */
    1965   [ #  #  #  # ]:          0 :         if (use_multiport(portdev))
    1966                 :          0 :                 cancel_work_sync(&portdev->control_work);
    1967                 :            :         else
    1968                 :          0 :                 cancel_work_sync(&portdev->config_work);
    1969                 :            : 
    1970         [ #  # ]:          0 :         list_for_each_entry_safe(port, port2, &portdev->ports, list)
    1971                 :          0 :                 unplug_port(port);
    1972                 :            : 
    1973                 :          0 :         unregister_chrdev(portdev->chr_major, "virtio-portsdev");
    1974                 :            : 
    1975                 :            :         /*
    1976                 :            :          * When yanking out a device, we immediately lose the
    1977                 :            :          * (device-side) queues.  So there's no point in keeping the
    1978                 :            :          * guest side around till we drop our final reference.  This
    1979                 :            :          * also means that any ports which are in an open state will
    1980                 :            :          * have to just stop using the port, as the vqs are going
    1981                 :            :          * away.
    1982                 :            :          */
    1983                 :          0 :         remove_vqs(portdev);
    1984                 :          0 :         kfree(portdev);
    1985                 :          0 : }
    1986                 :            : 
    1987                 :            : /*
    1988                 :            :  * Once we're further in boot, we get probed like any other virtio
    1989                 :            :  * device.
    1990                 :            :  *
    1991                 :            :  * If the host also supports multiple console ports, we check the
    1992                 :            :  * config space to see how many ports the host has spawned.  We
    1993                 :            :  * initialize each port found.
    1994                 :            :  */
    1995                 :          0 : static int virtcons_probe(struct virtio_device *vdev)
    1996                 :            : {
    1997                 :          0 :         struct ports_device *portdev;
    1998                 :          0 :         int err;
    1999                 :          0 :         bool multiport;
    2000                 :          0 :         bool early = early_put_chars != NULL;
    2001                 :            : 
    2002                 :            :         /* We only need a config space if features are offered */
    2003   [ #  #  #  # ]:          0 :         if (!vdev->config->get &&
    2004                 :            :             (virtio_has_feature(vdev, VIRTIO_CONSOLE_F_SIZE)
    2005         [ #  # ]:          0 :              || virtio_has_feature(vdev, VIRTIO_CONSOLE_F_MULTIPORT))) {
    2006                 :          0 :                 dev_err(&vdev->dev, "%s failure: config access disabled\n",
    2007                 :            :                         __func__);
    2008                 :          0 :                 return -EINVAL;
    2009                 :            :         }
    2010                 :            : 
    2011                 :            :         /* Ensure to read early_put_chars now */
    2012                 :          0 :         barrier();
    2013                 :            : 
    2014                 :          0 :         portdev = kmalloc(sizeof(*portdev), GFP_KERNEL);
    2015         [ #  # ]:          0 :         if (!portdev) {
    2016                 :          0 :                 err = -ENOMEM;
    2017                 :          0 :                 goto fail;
    2018                 :            :         }
    2019                 :            : 
    2020                 :            :         /* Attach this portdev to this virtio_device, and vice-versa. */
    2021                 :          0 :         portdev->vdev = vdev;
    2022                 :          0 :         vdev->priv = portdev;
    2023                 :            : 
    2024                 :          0 :         portdev->chr_major = register_chrdev(0, "virtio-portsdev",
    2025                 :            :                                              &portdev_fops);
    2026         [ #  # ]:          0 :         if (portdev->chr_major < 0) {
    2027                 :          0 :                 dev_err(&vdev->dev,
    2028                 :            :                         "Error %d registering chrdev for device %u\n",
    2029                 :            :                         portdev->chr_major, vdev->index);
    2030                 :          0 :                 err = portdev->chr_major;
    2031                 :          0 :                 goto free;
    2032                 :            :         }
    2033                 :            : 
    2034                 :          0 :         multiport = false;
    2035                 :          0 :         portdev->max_nr_ports = 1;
    2036                 :            : 
    2037                 :            :         /* Don't test MULTIPORT at all if we're rproc: not a valid feature! */
    2038         [ #  # ]:          0 :         if (!is_rproc_serial(vdev) &&
    2039         [ #  # ]:          0 :             virtio_cread_feature(vdev, VIRTIO_CONSOLE_F_MULTIPORT,
    2040                 :            :                                  struct virtio_console_config, max_nr_ports,
    2041                 :            :                                  &portdev->max_nr_ports) == 0) {
    2042                 :            :                 multiport = true;
    2043                 :            :         }
    2044                 :            : 
    2045                 :          0 :         err = init_vqs(portdev);
    2046         [ #  # ]:          0 :         if (err < 0) {
    2047                 :          0 :                 dev_err(&vdev->dev, "Error %d initializing vqs\n", err);
    2048                 :          0 :                 goto free_chrdev;
    2049                 :            :         }
    2050                 :            : 
    2051                 :          0 :         spin_lock_init(&portdev->ports_lock);
    2052                 :          0 :         INIT_LIST_HEAD(&portdev->ports);
    2053                 :          0 :         INIT_LIST_HEAD(&portdev->list);
    2054                 :            : 
    2055                 :          0 :         virtio_device_ready(portdev->vdev);
    2056                 :            : 
    2057         [ #  # ]:          0 :         INIT_WORK(&portdev->config_work, &config_work_handler);
    2058                 :          0 :         INIT_WORK(&portdev->control_work, &control_work_handler);
    2059                 :            : 
    2060         [ #  # ]:          0 :         if (multiport) {
    2061                 :          0 :                 spin_lock_init(&portdev->c_ivq_lock);
    2062                 :          0 :                 spin_lock_init(&portdev->c_ovq_lock);
    2063                 :            : 
    2064                 :          0 :                 err = fill_queue(portdev->c_ivq, &portdev->c_ivq_lock);
    2065         [ #  # ]:          0 :                 if (err < 0) {
    2066                 :          0 :                         dev_err(&vdev->dev,
    2067                 :            :                                 "Error allocating buffers for control queue\n");
    2068                 :            :                         /*
    2069                 :            :                          * The host might want to notify mgmt sw about device
    2070                 :            :                          * add failure.
    2071                 :            :                          */
    2072                 :          0 :                         __send_control_msg(portdev, VIRTIO_CONSOLE_BAD_ID,
    2073                 :            :                                            VIRTIO_CONSOLE_DEVICE_READY, 0);
    2074                 :            :                         /* Device was functional: we need full cleanup. */
    2075                 :          0 :                         virtcons_remove(vdev);
    2076                 :          0 :                         return err;
    2077                 :            :                 }
    2078                 :            :         } else {
    2079                 :            :                 /*
    2080                 :            :                  * For backward compatibility: Create a console port
    2081                 :            :                  * if we're running on older host.
    2082                 :            :                  */
    2083                 :          0 :                 add_port(portdev, 0);
    2084                 :            :         }
    2085                 :            : 
    2086                 :          0 :         spin_lock_irq(&pdrvdata_lock);
    2087                 :          0 :         list_add_tail(&portdev->list, &pdrvdata.portdevs);
    2088                 :          0 :         spin_unlock_irq(&pdrvdata_lock);
    2089                 :            : 
    2090                 :          0 :         __send_control_msg(portdev, VIRTIO_CONSOLE_BAD_ID,
    2091                 :            :                            VIRTIO_CONSOLE_DEVICE_READY, 1);
    2092                 :            : 
    2093                 :            :         /*
    2094                 :            :          * If there was an early virtio console, assume that there are no
    2095                 :            :          * other consoles. We need to wait until the hvc_alloc matches the
    2096                 :            :          * hvc_instantiate, otherwise tty_open will complain, resulting in
    2097                 :            :          * a "Warning: unable to open an initial console" boot failure.
    2098                 :            :          * Without multiport this is done in add_port above. With multiport
    2099                 :            :          * this might take some host<->guest communication - thus we have to
    2100                 :            :          * wait.
    2101                 :            :          */
    2102         [ #  # ]:          0 :         if (multiport && early)
    2103                 :          0 :                 wait_for_completion(&early_console_added);
    2104                 :            : 
    2105                 :            :         return 0;
    2106                 :            : 
    2107                 :            : free_chrdev:
    2108                 :          0 :         unregister_chrdev(portdev->chr_major, "virtio-portsdev");
    2109                 :          0 : free:
    2110                 :          0 :         kfree(portdev);
    2111                 :            : fail:
    2112                 :            :         return err;
    2113                 :            : }
    2114                 :            : 
    2115                 :            : static struct virtio_device_id id_table[] = {
    2116                 :            :         { VIRTIO_ID_CONSOLE, VIRTIO_DEV_ANY_ID },
    2117                 :            :         { 0 },
    2118                 :            : };
    2119                 :            : 
    2120                 :            : static unsigned int features[] = {
    2121                 :            :         VIRTIO_CONSOLE_F_SIZE,
    2122                 :            :         VIRTIO_CONSOLE_F_MULTIPORT,
    2123                 :            : };
    2124                 :            : 
    2125                 :            : static struct virtio_device_id rproc_serial_id_table[] = {
    2126                 :            : #if IS_ENABLED(CONFIG_REMOTEPROC)
    2127                 :            :         { VIRTIO_ID_RPROC_SERIAL, VIRTIO_DEV_ANY_ID },
    2128                 :            : #endif
    2129                 :            :         { 0 },
    2130                 :            : };
    2131                 :            : 
    2132                 :            : static unsigned int rproc_serial_features[] = {
    2133                 :            : };
    2134                 :            : 
    2135                 :            : #ifdef CONFIG_PM_SLEEP
    2136                 :          0 : static int virtcons_freeze(struct virtio_device *vdev)
    2137                 :            : {
    2138                 :          0 :         struct ports_device *portdev;
    2139                 :          0 :         struct port *port;
    2140                 :            : 
    2141                 :          0 :         portdev = vdev->priv;
    2142                 :            : 
    2143                 :          0 :         vdev->config->reset(vdev);
    2144                 :            : 
    2145   [ #  #  #  # ]:          0 :         if (use_multiport(portdev))
    2146                 :          0 :                 virtqueue_disable_cb(portdev->c_ivq);
    2147                 :          0 :         cancel_work_sync(&portdev->control_work);
    2148                 :          0 :         cancel_work_sync(&portdev->config_work);
    2149                 :            :         /*
    2150                 :            :          * Once more: if control_work_handler() was running, it would
    2151                 :            :          * enable the cb as the last step.
    2152                 :            :          */
    2153   [ #  #  #  # ]:          0 :         if (use_multiport(portdev))
    2154                 :          0 :                 virtqueue_disable_cb(portdev->c_ivq);
    2155                 :            : 
    2156         [ #  # ]:          0 :         list_for_each_entry(port, &portdev->ports, list) {
    2157                 :          0 :                 virtqueue_disable_cb(port->in_vq);
    2158                 :          0 :                 virtqueue_disable_cb(port->out_vq);
    2159                 :            :                 /*
    2160                 :            :                  * We'll ask the host later if the new invocation has
    2161                 :            :                  * the port opened or closed.
    2162                 :            :                  */
    2163                 :          0 :                 port->host_connected = false;
    2164                 :          0 :                 remove_port_data(port);
    2165                 :            :         }
    2166                 :          0 :         remove_vqs(portdev);
    2167                 :            : 
    2168                 :          0 :         return 0;
    2169                 :            : }
    2170                 :            : 
    2171                 :          0 : static int virtcons_restore(struct virtio_device *vdev)
    2172                 :            : {
    2173                 :          0 :         struct ports_device *portdev;
    2174                 :          0 :         struct port *port;
    2175                 :          0 :         int ret;
    2176                 :            : 
    2177                 :          0 :         portdev = vdev->priv;
    2178                 :            : 
    2179                 :          0 :         ret = init_vqs(portdev);
    2180         [ #  # ]:          0 :         if (ret)
    2181                 :            :                 return ret;
    2182                 :            : 
    2183                 :          0 :         virtio_device_ready(portdev->vdev);
    2184                 :            : 
    2185   [ #  #  #  # ]:          0 :         if (use_multiport(portdev))
    2186                 :          0 :                 fill_queue(portdev->c_ivq, &portdev->c_ivq_lock);
    2187                 :            : 
    2188         [ #  # ]:          0 :         list_for_each_entry(port, &portdev->ports, list) {
    2189                 :          0 :                 port->in_vq = portdev->in_vqs[port->id];
    2190                 :          0 :                 port->out_vq = portdev->out_vqs[port->id];
    2191                 :            : 
    2192                 :          0 :                 fill_queue(port->in_vq, &port->inbuf_lock);
    2193                 :            : 
    2194                 :            :                 /* Get port open/close status on the host */
    2195         [ #  # ]:          0 :                 send_control_msg(port, VIRTIO_CONSOLE_PORT_READY, 1);
    2196                 :            : 
    2197                 :            :                 /*
    2198                 :            :                  * If a port was open at the time of suspending, we
    2199                 :            :                  * have to let the host know that it's still open.
    2200                 :            :                  */
    2201         [ #  # ]:          0 :                 if (port->guest_connected)
    2202         [ #  # ]:          0 :                         send_control_msg(port, VIRTIO_CONSOLE_PORT_OPEN, 1);
    2203                 :            :         }
    2204                 :            :         return 0;
    2205                 :            : }
    2206                 :            : #endif
    2207                 :            : 
    2208                 :            : static struct virtio_driver virtio_console = {
    2209                 :            :         .feature_table = features,
    2210                 :            :         .feature_table_size = ARRAY_SIZE(features),
    2211                 :            :         .driver.name =  KBUILD_MODNAME,
    2212                 :            :         .driver.owner = THIS_MODULE,
    2213                 :            :         .id_table =     id_table,
    2214                 :            :         .probe =        virtcons_probe,
    2215                 :            :         .remove =       virtcons_remove,
    2216                 :            :         .config_changed = config_intr,
    2217                 :            : #ifdef CONFIG_PM_SLEEP
    2218                 :            :         .freeze =       virtcons_freeze,
    2219                 :            :         .restore =      virtcons_restore,
    2220                 :            : #endif
    2221                 :            : };
    2222                 :            : 
    2223                 :            : static struct virtio_driver virtio_rproc_serial = {
    2224                 :            :         .feature_table = rproc_serial_features,
    2225                 :            :         .feature_table_size = ARRAY_SIZE(rproc_serial_features),
    2226                 :            :         .driver.name =  "virtio_rproc_serial",
    2227                 :            :         .driver.owner = THIS_MODULE,
    2228                 :            :         .id_table =     rproc_serial_id_table,
    2229                 :            :         .probe =        virtcons_probe,
    2230                 :            :         .remove =       virtcons_remove,
    2231                 :            : };
    2232                 :            : 
    2233                 :         21 : static int __init init(void)
    2234                 :            : {
    2235                 :         21 :         int err;
    2236                 :            : 
    2237                 :         21 :         pdrvdata.class = class_create(THIS_MODULE, "virtio-ports");
    2238         [ -  + ]:         21 :         if (IS_ERR(pdrvdata.class)) {
    2239                 :          0 :                 err = PTR_ERR(pdrvdata.class);
    2240                 :          0 :                 pr_err("Error %d creating virtio-ports class\n", err);
    2241                 :          0 :                 return err;
    2242                 :            :         }
    2243                 :            : 
    2244                 :         21 :         pdrvdata.debugfs_dir = debugfs_create_dir("virtio-ports", NULL);
    2245         [ -  + ]:         21 :         if (!pdrvdata.debugfs_dir)
    2246                 :          0 :                 pr_warn("Error creating debugfs dir for virtio-ports\n");
    2247                 :         21 :         INIT_LIST_HEAD(&pdrvdata.consoles);
    2248                 :         21 :         INIT_LIST_HEAD(&pdrvdata.portdevs);
    2249                 :            : 
    2250                 :         21 :         err = register_virtio_driver(&virtio_console);
    2251         [ -  + ]:         21 :         if (err < 0) {
    2252                 :          0 :                 pr_err("Error %d registering virtio driver\n", err);
    2253                 :          0 :                 goto free;
    2254                 :            :         }
    2255                 :         21 :         err = register_virtio_driver(&virtio_rproc_serial);
    2256         [ -  + ]:         21 :         if (err < 0) {
    2257                 :          0 :                 pr_err("Error %d registering virtio rproc serial driver\n",
    2258                 :            :                        err);
    2259                 :          0 :                 goto unregister;
    2260                 :            :         }
    2261                 :            :         return 0;
    2262                 :            : unregister:
    2263                 :          0 :         unregister_virtio_driver(&virtio_console);
    2264                 :          0 : free:
    2265                 :          0 :         debugfs_remove_recursive(pdrvdata.debugfs_dir);
    2266                 :          0 :         class_destroy(pdrvdata.class);
    2267                 :          0 :         return err;
    2268                 :            : }
    2269                 :            : 
    2270                 :          0 : static void __exit fini(void)
    2271                 :            : {
    2272                 :          0 :         reclaim_dma_bufs();
    2273                 :            : 
    2274                 :          0 :         unregister_virtio_driver(&virtio_console);
    2275                 :          0 :         unregister_virtio_driver(&virtio_rproc_serial);
    2276                 :            : 
    2277                 :          0 :         class_destroy(pdrvdata.class);
    2278                 :          0 :         debugfs_remove_recursive(pdrvdata.debugfs_dir);
    2279                 :          0 : }
    2280                 :            : module_init(init);
    2281                 :            : module_exit(fini);
    2282                 :            : 
    2283                 :            : MODULE_DEVICE_TABLE(virtio, id_table);
    2284                 :            : MODULE_DESCRIPTION("Virtio console driver");
    2285                 :            : MODULE_LICENSE("GPL");

Generated by: LCOV version 1.14