LCOV - code coverage report
Current view: top level - drivers/virtio - virtio.c (source / functions) Hit Total Coverage
Test: combined.info Lines: 7 205 3.4 %
Date: 2022-03-28 13:20:08 Functions: 2 23 8.7 %
Branches: 4 102 3.9 %

           Branch data     Line data    Source code
       1                 :            : // SPDX-License-Identifier: GPL-2.0-only
       2                 :            : #include <linux/virtio.h>
       3                 :            : #include <linux/spinlock.h>
       4                 :            : #include <linux/virtio_config.h>
       5                 :            : #include <linux/module.h>
       6                 :            : #include <linux/idr.h>
       7                 :            : #include <uapi/linux/virtio_ids.h>
       8                 :            : 
       9                 :            : /* Unique numbering for virtio devices. */
      10                 :            : static DEFINE_IDA(virtio_index_ida);
      11                 :            : 
      12                 :          0 : static ssize_t device_show(struct device *_d,
      13                 :            :                            struct device_attribute *attr, char *buf)
      14                 :            : {
      15                 :          0 :         struct virtio_device *dev = dev_to_virtio(_d);
      16                 :          0 :         return sprintf(buf, "0x%04x\n", dev->id.device);
      17                 :            : }
      18                 :            : static DEVICE_ATTR_RO(device);
      19                 :            : 
      20                 :          0 : static ssize_t vendor_show(struct device *_d,
      21                 :            :                            struct device_attribute *attr, char *buf)
      22                 :            : {
      23                 :          0 :         struct virtio_device *dev = dev_to_virtio(_d);
      24                 :          0 :         return sprintf(buf, "0x%04x\n", dev->id.vendor);
      25                 :            : }
      26                 :            : static DEVICE_ATTR_RO(vendor);
      27                 :            : 
      28                 :          0 : static ssize_t status_show(struct device *_d,
      29                 :            :                            struct device_attribute *attr, char *buf)
      30                 :            : {
      31                 :          0 :         struct virtio_device *dev = dev_to_virtio(_d);
      32                 :          0 :         return sprintf(buf, "0x%08x\n", dev->config->get_status(dev));
      33                 :            : }
      34                 :            : static DEVICE_ATTR_RO(status);
      35                 :            : 
      36                 :          0 : static ssize_t modalias_show(struct device *_d,
      37                 :            :                              struct device_attribute *attr, char *buf)
      38                 :            : {
      39                 :          0 :         struct virtio_device *dev = dev_to_virtio(_d);
      40                 :          0 :         return sprintf(buf, "virtio:d%08Xv%08X\n",
      41                 :            :                        dev->id.device, dev->id.vendor);
      42                 :            : }
      43                 :            : static DEVICE_ATTR_RO(modalias);
      44                 :            : 
      45                 :          0 : static ssize_t features_show(struct device *_d,
      46                 :            :                              struct device_attribute *attr, char *buf)
      47                 :            : {
      48                 :          0 :         struct virtio_device *dev = dev_to_virtio(_d);
      49                 :          0 :         unsigned int i;
      50                 :          0 :         ssize_t len = 0;
      51                 :            : 
      52                 :            :         /* We actually represent this as a bitstring, as it could be
      53                 :            :          * arbitrary length in future. */
      54         [ #  # ]:          0 :         for (i = 0; i < sizeof(dev->features)*8; i++)
      55         [ #  # ]:          0 :                 len += sprintf(buf+len, "%c",
      56                 :          0 :                                __virtio_test_bit(dev, i) ? '1' : '0');
      57                 :          0 :         len += sprintf(buf+len, "\n");
      58                 :          0 :         return len;
      59                 :            : }
      60                 :            : static DEVICE_ATTR_RO(features);
      61                 :            : 
      62                 :            : static struct attribute *virtio_dev_attrs[] = {
      63                 :            :         &dev_attr_device.attr,
      64                 :            :         &dev_attr_vendor.attr,
      65                 :            :         &dev_attr_status.attr,
      66                 :            :         &dev_attr_modalias.attr,
      67                 :            :         &dev_attr_features.attr,
      68                 :            :         NULL,
      69                 :            : };
      70                 :            : ATTRIBUTE_GROUPS(virtio_dev);
      71                 :            : 
      72                 :          0 : static inline int virtio_id_match(const struct virtio_device *dev,
      73                 :            :                                   const struct virtio_device_id *id)
      74                 :            : {
      75         [ #  # ]:          0 :         if (id->device != dev->id.device && id->device != VIRTIO_DEV_ANY_ID)
      76                 :            :                 return 0;
      77                 :            : 
      78   [ #  #  #  # ]:          0 :         return id->vendor == VIRTIO_DEV_ANY_ID || id->vendor == dev->id.vendor;
      79                 :            : }
      80                 :            : 
      81                 :            : /* This looks through all the IDs a driver claims to support.  If any of them
      82                 :            :  * match, we return 1 and the kernel will call virtio_dev_probe(). */
      83                 :          0 : static int virtio_dev_match(struct device *_dv, struct device_driver *_dr)
      84                 :            : {
      85                 :          0 :         unsigned int i;
      86                 :          0 :         struct virtio_device *dev = dev_to_virtio(_dv);
      87                 :          0 :         const struct virtio_device_id *ids;
      88                 :            : 
      89                 :          0 :         ids = drv_to_virtio(_dr)->id_table;
      90         [ #  # ]:          0 :         for (i = 0; ids[i].device; i++)
      91         [ #  # ]:          0 :                 if (virtio_id_match(dev, &ids[i]))
      92                 :            :                         return 1;
      93                 :            :         return 0;
      94                 :            : }
      95                 :            : 
      96                 :          0 : static int virtio_uevent(struct device *_dv, struct kobj_uevent_env *env)
      97                 :            : {
      98                 :          0 :         struct virtio_device *dev = dev_to_virtio(_dv);
      99                 :            : 
     100                 :          0 :         return add_uevent_var(env, "MODALIAS=virtio:d%08Xv%08X",
     101                 :            :                               dev->id.device, dev->id.vendor);
     102                 :            : }
     103                 :            : 
     104                 :          0 : void virtio_check_driver_offered_feature(const struct virtio_device *vdev,
     105                 :            :                                          unsigned int fbit)
     106                 :            : {
     107                 :          0 :         unsigned int i;
     108                 :          0 :         struct virtio_driver *drv = drv_to_virtio(vdev->dev.driver);
     109                 :            : 
     110         [ #  # ]:          0 :         for (i = 0; i < drv->feature_table_size; i++)
     111         [ #  # ]:          0 :                 if (drv->feature_table[i] == fbit)
     112                 :            :                         return;
     113                 :            : 
     114         [ #  # ]:          0 :         if (drv->feature_table_legacy) {
     115         [ #  # ]:          0 :                 for (i = 0; i < drv->feature_table_size_legacy; i++)
     116         [ #  # ]:          0 :                         if (drv->feature_table_legacy[i] == fbit)
     117                 :            :                                 return;
     118                 :            :         }
     119                 :            : 
     120                 :          0 :         BUG();
     121                 :            : }
     122                 :            : EXPORT_SYMBOL_GPL(virtio_check_driver_offered_feature);
     123                 :            : 
     124                 :          0 : static void __virtio_config_changed(struct virtio_device *dev)
     125                 :            : {
     126                 :          0 :         struct virtio_driver *drv = drv_to_virtio(dev->dev.driver);
     127                 :            : 
     128         [ #  # ]:          0 :         if (!dev->config_enabled)
     129                 :          0 :                 dev->config_change_pending = true;
     130   [ #  #  #  #  :          0 :         else if (drv && drv->config_changed)
             #  #  #  # ]
     131                 :          0 :                 drv->config_changed(dev);
     132                 :            : }
     133                 :            : 
     134                 :          0 : void virtio_config_changed(struct virtio_device *dev)
     135                 :            : {
     136                 :          0 :         unsigned long flags;
     137                 :            : 
     138                 :          0 :         spin_lock_irqsave(&dev->config_lock, flags);
     139         [ #  # ]:          0 :         __virtio_config_changed(dev);
     140                 :          0 :         spin_unlock_irqrestore(&dev->config_lock, flags);
     141                 :          0 : }
     142                 :            : EXPORT_SYMBOL_GPL(virtio_config_changed);
     143                 :            : 
     144                 :          0 : void virtio_config_disable(struct virtio_device *dev)
     145                 :            : {
     146                 :          0 :         spin_lock_irq(&dev->config_lock);
     147                 :          0 :         dev->config_enabled = false;
     148                 :          0 :         spin_unlock_irq(&dev->config_lock);
     149                 :          0 : }
     150                 :            : EXPORT_SYMBOL_GPL(virtio_config_disable);
     151                 :            : 
     152                 :          0 : void virtio_config_enable(struct virtio_device *dev)
     153                 :            : {
     154                 :          0 :         spin_lock_irq(&dev->config_lock);
     155                 :          0 :         dev->config_enabled = true;
     156         [ #  # ]:          0 :         if (dev->config_change_pending)
     157         [ #  # ]:          0 :                 __virtio_config_changed(dev);
     158                 :          0 :         dev->config_change_pending = false;
     159                 :          0 :         spin_unlock_irq(&dev->config_lock);
     160                 :          0 : }
     161                 :            : EXPORT_SYMBOL_GPL(virtio_config_enable);
     162                 :            : 
     163                 :          0 : void virtio_add_status(struct virtio_device *dev, unsigned int status)
     164                 :            : {
     165                 :          0 :         might_sleep();
     166                 :          0 :         dev->config->set_status(dev, dev->config->get_status(dev) | status);
     167                 :          0 : }
     168                 :            : EXPORT_SYMBOL_GPL(virtio_add_status);
     169                 :            : 
     170                 :          0 : int virtio_finalize_features(struct virtio_device *dev)
     171                 :            : {
     172                 :          0 :         int ret = dev->config->finalize_features(dev);
     173                 :          0 :         unsigned status;
     174                 :            : 
     175                 :          0 :         might_sleep();
     176         [ #  # ]:          0 :         if (ret)
     177                 :            :                 return ret;
     178                 :            : 
     179         [ #  # ]:          0 :         if (!virtio_has_feature(dev, VIRTIO_F_VERSION_1))
     180                 :            :                 return 0;
     181                 :            : 
     182                 :          0 :         virtio_add_status(dev, VIRTIO_CONFIG_S_FEATURES_OK);
     183                 :          0 :         status = dev->config->get_status(dev);
     184         [ #  # ]:          0 :         if (!(status & VIRTIO_CONFIG_S_FEATURES_OK)) {
     185                 :          0 :                 dev_err(&dev->dev, "virtio: device refuses features: %x\n",
     186                 :            :                         status);
     187                 :          0 :                 return -ENODEV;
     188                 :            :         }
     189                 :            :         return 0;
     190                 :            : }
     191                 :            : EXPORT_SYMBOL_GPL(virtio_finalize_features);
     192                 :            : 
     193                 :          0 : static int virtio_dev_probe(struct device *_d)
     194                 :            : {
     195                 :          0 :         int err, i;
     196                 :          0 :         struct virtio_device *dev = dev_to_virtio(_d);
     197                 :          0 :         struct virtio_driver *drv = drv_to_virtio(dev->dev.driver);
     198                 :          0 :         u64 device_features;
     199                 :          0 :         u64 driver_features;
     200                 :          0 :         u64 driver_features_legacy;
     201                 :            : 
     202                 :            :         /* We have a driver! */
     203                 :          0 :         virtio_add_status(dev, VIRTIO_CONFIG_S_DRIVER);
     204                 :            : 
     205                 :            :         /* Figure out what features the device supports. */
     206                 :          0 :         device_features = dev->config->get_features(dev);
     207                 :            : 
     208                 :            :         /* Figure out what features the driver supports. */
     209                 :          0 :         driver_features = 0;
     210         [ #  # ]:          0 :         for (i = 0; i < drv->feature_table_size; i++) {
     211                 :          0 :                 unsigned int f = drv->feature_table[i];
     212         [ #  # ]:          0 :                 BUG_ON(f >= 64);
     213                 :          0 :                 driver_features |= (1ULL << f);
     214                 :            :         }
     215                 :            : 
     216                 :            :         /* Some drivers have a separate feature table for virtio v1.0 */
     217         [ #  # ]:          0 :         if (drv->feature_table_legacy) {
     218                 :            :                 driver_features_legacy = 0;
     219         [ #  # ]:          0 :                 for (i = 0; i < drv->feature_table_size_legacy; i++) {
     220                 :          0 :                         unsigned int f = drv->feature_table_legacy[i];
     221         [ #  # ]:          0 :                         BUG_ON(f >= 64);
     222                 :          0 :                         driver_features_legacy |= (1ULL << f);
     223                 :            :                 }
     224                 :            :         } else {
     225                 :            :                 driver_features_legacy = driver_features;
     226                 :            :         }
     227                 :            : 
     228         [ #  # ]:          0 :         if (device_features & (1ULL << VIRTIO_F_VERSION_1))
     229                 :          0 :                 dev->features = driver_features & device_features;
     230                 :            :         else
     231                 :          0 :                 dev->features = driver_features_legacy & device_features;
     232                 :            : 
     233                 :            :         /* Transport features always preserved to pass to finalize_features. */
     234         [ #  # ]:          0 :         for (i = VIRTIO_TRANSPORT_F_START; i < VIRTIO_TRANSPORT_F_END; i++)
     235         [ #  # ]:          0 :                 if (device_features & (1ULL << i))
     236                 :          0 :                         __virtio_set_bit(dev, i);
     237                 :            : 
     238         [ #  # ]:          0 :         if (drv->validate) {
     239                 :          0 :                 err = drv->validate(dev);
     240         [ #  # ]:          0 :                 if (err)
     241                 :          0 :                         goto err;
     242                 :            :         }
     243                 :            : 
     244                 :          0 :         err = virtio_finalize_features(dev);
     245         [ #  # ]:          0 :         if (err)
     246                 :          0 :                 goto err;
     247                 :            : 
     248                 :          0 :         err = drv->probe(dev);
     249         [ #  # ]:          0 :         if (err)
     250                 :          0 :                 goto err;
     251                 :            : 
     252                 :            :         /* If probe didn't do it, mark device DRIVER_OK ourselves. */
     253         [ #  # ]:          0 :         if (!(dev->config->get_status(dev) & VIRTIO_CONFIG_S_DRIVER_OK))
     254                 :          0 :                 virtio_device_ready(dev);
     255                 :            : 
     256         [ #  # ]:          0 :         if (drv->scan)
     257                 :          0 :                 drv->scan(dev);
     258                 :            : 
     259                 :          0 :         virtio_config_enable(dev);
     260                 :            : 
     261                 :          0 :         return 0;
     262                 :          0 : err:
     263                 :          0 :         virtio_add_status(dev, VIRTIO_CONFIG_S_FAILED);
     264                 :          0 :         return err;
     265                 :            : 
     266                 :            : }
     267                 :            : 
     268                 :          0 : static int virtio_dev_remove(struct device *_d)
     269                 :            : {
     270                 :          0 :         struct virtio_device *dev = dev_to_virtio(_d);
     271                 :          0 :         struct virtio_driver *drv = drv_to_virtio(dev->dev.driver);
     272                 :            : 
     273                 :          0 :         virtio_config_disable(dev);
     274                 :            : 
     275                 :          0 :         drv->remove(dev);
     276                 :            : 
     277                 :            :         /* Driver should have reset device. */
     278         [ #  # ]:          0 :         WARN_ON_ONCE(dev->config->get_status(dev));
     279                 :            : 
     280                 :            :         /* Acknowledge the device's existence again. */
     281                 :          0 :         virtio_add_status(dev, VIRTIO_CONFIG_S_ACKNOWLEDGE);
     282                 :          0 :         return 0;
     283                 :            : }
     284                 :            : 
     285                 :            : static struct bus_type virtio_bus = {
     286                 :            :         .name  = "virtio",
     287                 :            :         .match = virtio_dev_match,
     288                 :            :         .dev_groups = virtio_dev_groups,
     289                 :            :         .uevent = virtio_uevent,
     290                 :            :         .probe = virtio_dev_probe,
     291                 :            :         .remove = virtio_dev_remove,
     292                 :            : };
     293                 :            : 
     294                 :        240 : int register_virtio_driver(struct virtio_driver *driver)
     295                 :            : {
     296                 :            :         /* Catch this early. */
     297   [ +  +  -  + ]:        240 :         BUG_ON(driver->feature_table_size && !driver->feature_table);
     298                 :        240 :         driver->driver.bus = &virtio_bus;
     299                 :        240 :         return driver_register(&driver->driver);
     300                 :            : }
     301                 :            : EXPORT_SYMBOL_GPL(register_virtio_driver);
     302                 :            : 
     303                 :          0 : void unregister_virtio_driver(struct virtio_driver *driver)
     304                 :            : {
     305                 :          0 :         driver_unregister(&driver->driver);
     306                 :          0 : }
     307                 :            : EXPORT_SYMBOL_GPL(unregister_virtio_driver);
     308                 :            : 
     309                 :            : /**
     310                 :            :  * register_virtio_device - register virtio device
     311                 :            :  * @dev        : virtio device to be registered
     312                 :            :  *
     313                 :            :  * On error, the caller must call put_device on &@dev->dev (and not kfree),
     314                 :            :  * as another code path may have obtained a reference to @dev.
     315                 :            :  *
     316                 :            :  * Returns: 0 on suceess, -error on failure
     317                 :            :  */
     318                 :          0 : int register_virtio_device(struct virtio_device *dev)
     319                 :            : {
     320                 :          0 :         int err;
     321                 :            : 
     322                 :          0 :         dev->dev.bus = &virtio_bus;
     323                 :          0 :         device_initialize(&dev->dev);
     324                 :            : 
     325                 :            :         /* Assign a unique device index and hence name. */
     326                 :          0 :         err = ida_simple_get(&virtio_index_ida, 0, 0, GFP_KERNEL);
     327         [ #  # ]:          0 :         if (err < 0)
     328                 :          0 :                 goto out;
     329                 :            : 
     330                 :          0 :         dev->index = err;
     331                 :          0 :         dev_set_name(&dev->dev, "virtio%u", dev->index);
     332                 :            : 
     333                 :          0 :         spin_lock_init(&dev->config_lock);
     334                 :          0 :         dev->config_enabled = false;
     335                 :          0 :         dev->config_change_pending = false;
     336                 :            : 
     337                 :            :         /* We always start by resetting the device, in case a previous
     338                 :            :          * driver messed it up.  This also tests that code path a little. */
     339                 :          0 :         dev->config->reset(dev);
     340                 :            : 
     341                 :            :         /* Acknowledge that we've seen the device. */
     342                 :          0 :         virtio_add_status(dev, VIRTIO_CONFIG_S_ACKNOWLEDGE);
     343                 :            : 
     344                 :          0 :         INIT_LIST_HEAD(&dev->vqs);
     345                 :            : 
     346                 :            :         /*
     347                 :            :          * device_add() causes the bus infrastructure to look for a matching
     348                 :            :          * driver.
     349                 :            :          */
     350                 :          0 :         err = device_add(&dev->dev);
     351         [ #  # ]:          0 :         if (err)
     352                 :          0 :                 ida_simple_remove(&virtio_index_ida, dev->index);
     353                 :          0 : out:
     354         [ #  # ]:          0 :         if (err)
     355                 :          0 :                 virtio_add_status(dev, VIRTIO_CONFIG_S_FAILED);
     356                 :          0 :         return err;
     357                 :            : }
     358                 :            : EXPORT_SYMBOL_GPL(register_virtio_device);
     359                 :            : 
     360                 :          0 : void unregister_virtio_device(struct virtio_device *dev)
     361                 :            : {
     362                 :          0 :         int index = dev->index; /* save for after device release */
     363                 :            : 
     364                 :          0 :         device_unregister(&dev->dev);
     365                 :          0 :         ida_simple_remove(&virtio_index_ida, index);
     366                 :          0 : }
     367                 :            : EXPORT_SYMBOL_GPL(unregister_virtio_device);
     368                 :            : 
     369                 :            : #ifdef CONFIG_PM_SLEEP
     370                 :          0 : int virtio_device_freeze(struct virtio_device *dev)
     371                 :            : {
     372                 :          0 :         struct virtio_driver *drv = drv_to_virtio(dev->dev.driver);
     373                 :            : 
     374                 :          0 :         virtio_config_disable(dev);
     375                 :            : 
     376                 :          0 :         dev->failed = dev->config->get_status(dev) & VIRTIO_CONFIG_S_FAILED;
     377                 :            : 
     378   [ #  #  #  # ]:          0 :         if (drv && drv->freeze)
     379                 :          0 :                 return drv->freeze(dev);
     380                 :            : 
     381                 :            :         return 0;
     382                 :            : }
     383                 :            : EXPORT_SYMBOL_GPL(virtio_device_freeze);
     384                 :            : 
     385                 :          0 : int virtio_device_restore(struct virtio_device *dev)
     386                 :            : {
     387                 :          0 :         struct virtio_driver *drv = drv_to_virtio(dev->dev.driver);
     388                 :          0 :         int ret;
     389                 :            : 
     390                 :            :         /* We always start by resetting the device, in case a previous
     391                 :            :          * driver messed it up. */
     392                 :          0 :         dev->config->reset(dev);
     393                 :            : 
     394                 :            :         /* Acknowledge that we've seen the device. */
     395                 :          0 :         virtio_add_status(dev, VIRTIO_CONFIG_S_ACKNOWLEDGE);
     396                 :            : 
     397                 :            :         /* Maybe driver failed before freeze.
     398                 :            :          * Restore the failed status, for debugging. */
     399         [ #  # ]:          0 :         if (dev->failed)
     400                 :          0 :                 virtio_add_status(dev, VIRTIO_CONFIG_S_FAILED);
     401                 :            : 
     402         [ #  # ]:          0 :         if (!drv)
     403                 :            :                 return 0;
     404                 :            : 
     405                 :            :         /* We have a driver! */
     406                 :          0 :         virtio_add_status(dev, VIRTIO_CONFIG_S_DRIVER);
     407                 :            : 
     408                 :          0 :         ret = virtio_finalize_features(dev);
     409         [ #  # ]:          0 :         if (ret)
     410                 :          0 :                 goto err;
     411                 :            : 
     412         [ #  # ]:          0 :         if (drv->restore) {
     413                 :          0 :                 ret = drv->restore(dev);
     414         [ #  # ]:          0 :                 if (ret)
     415                 :          0 :                         goto err;
     416                 :            :         }
     417                 :            : 
     418                 :            :         /* Finally, tell the device we're all set */
     419                 :          0 :         virtio_add_status(dev, VIRTIO_CONFIG_S_DRIVER_OK);
     420                 :            : 
     421                 :          0 :         virtio_config_enable(dev);
     422                 :            : 
     423                 :          0 :         return 0;
     424                 :            : 
     425                 :          0 : err:
     426                 :          0 :         virtio_add_status(dev, VIRTIO_CONFIG_S_FAILED);
     427                 :          0 :         return ret;
     428                 :            : }
     429                 :            : EXPORT_SYMBOL_GPL(virtio_device_restore);
     430                 :            : #endif
     431                 :            : 
     432                 :         30 : static int virtio_init(void)
     433                 :            : {
     434         [ -  + ]:         30 :         if (bus_register(&virtio_bus) != 0)
     435                 :          0 :                 panic("virtio bus registration failed");
     436                 :         30 :         return 0;
     437                 :            : }
     438                 :            : 
     439                 :          0 : static void __exit virtio_exit(void)
     440                 :            : {
     441                 :          0 :         bus_unregister(&virtio_bus);
     442                 :          0 :         ida_destroy(&virtio_index_ida);
     443                 :          0 : }
     444                 :            : core_initcall(virtio_init);
     445                 :            : module_exit(virtio_exit);
     446                 :            : 
     447                 :            : MODULE_LICENSE("GPL");

Generated by: LCOV version 1.14