Lines Matching +full:virtio +full:- +full:pci

1 // SPDX-License-Identifier: GPL-2.0-only
2 #include <linux/virtio.h>
10 /* Unique numbering for virtio devices. */
17 return sprintf(buf, "0x%04x\n", dev->id.device); in device_show()
25 return sprintf(buf, "0x%04x\n", dev->id.vendor); in vendor_show()
33 return sprintf(buf, "0x%08x\n", dev->config->get_status(dev)); in status_show()
41 return sprintf(buf, "virtio:d%08Xv%08X\n", in modalias_show()
42 dev->id.device, dev->id.vendor); in modalias_show()
55 for (i = 0; i < sizeof(dev->features)*8; i++) in features_show()
76 if (id->device != dev->id.device && id->device != VIRTIO_DEV_ANY_ID) in virtio_id_match()
79 return id->vendor == VIRTIO_DEV_ANY_ID || id->vendor == dev->id.vendor; in virtio_id_match()
90 ids = drv_to_virtio(_dr)->id_table; in virtio_dev_match()
101 return add_uevent_var(env, "MODALIAS=virtio:d%08Xv%08X", in virtio_uevent()
102 dev->id.device, dev->id.vendor); in virtio_uevent()
109 struct virtio_driver *drv = drv_to_virtio(vdev->dev.driver); in virtio_check_driver_offered_feature()
111 for (i = 0; i < drv->feature_table_size; i++) in virtio_check_driver_offered_feature()
112 if (drv->feature_table[i] == fbit) in virtio_check_driver_offered_feature()
115 if (drv->feature_table_legacy) { in virtio_check_driver_offered_feature()
116 for (i = 0; i < drv->feature_table_size_legacy; i++) in virtio_check_driver_offered_feature()
117 if (drv->feature_table_legacy[i] == fbit) in virtio_check_driver_offered_feature()
127 struct virtio_driver *drv = drv_to_virtio(dev->dev.driver); in __virtio_config_changed()
129 if (!dev->config_enabled) in __virtio_config_changed()
130 dev->config_change_pending = true; in __virtio_config_changed()
131 else if (drv && drv->config_changed) in __virtio_config_changed()
132 drv->config_changed(dev); in __virtio_config_changed()
139 spin_lock_irqsave(&dev->config_lock, flags); in virtio_config_changed()
141 spin_unlock_irqrestore(&dev->config_lock, flags); in virtio_config_changed()
147 spin_lock_irq(&dev->config_lock); in virtio_config_disable()
148 dev->config_enabled = false; in virtio_config_disable()
149 spin_unlock_irq(&dev->config_lock); in virtio_config_disable()
154 spin_lock_irq(&dev->config_lock); in virtio_config_enable()
155 dev->config_enabled = true; in virtio_config_enable()
156 if (dev->config_change_pending) in virtio_config_enable()
158 dev->config_change_pending = false; in virtio_config_enable()
159 spin_unlock_irq(&dev->config_lock); in virtio_config_enable()
165 dev->config->set_status(dev, dev->config->get_status(dev) | status); in virtio_add_status()
171 int ret = dev->config->finalize_features(dev); in virtio_finalize_features()
181 dev_warn(&dev->dev, in virtio_finalize_features()
183 return -ENODEV; in virtio_finalize_features()
187 dev_warn(&dev->dev, in virtio_finalize_features()
189 return -ENODEV; in virtio_finalize_features()
197 status = dev->config->get_status(dev); in virtio_finalize_features()
199 dev_err(&dev->dev, "virtio: device refuses features: %x\n", in virtio_finalize_features()
201 return -ENODEV; in virtio_finalize_features()
211 struct virtio_driver *drv = drv_to_virtio(dev->dev.driver); in virtio_dev_probe()
220 device_features = dev->config->get_features(dev); in virtio_dev_probe()
224 for (i = 0; i < drv->feature_table_size; i++) { in virtio_dev_probe()
225 unsigned int f = drv->feature_table[i]; in virtio_dev_probe()
230 /* Some drivers have a separate feature table for virtio v1.0 */ in virtio_dev_probe()
231 if (drv->feature_table_legacy) { in virtio_dev_probe()
233 for (i = 0; i < drv->feature_table_size_legacy; i++) { in virtio_dev_probe()
234 unsigned int f = drv->feature_table_legacy[i]; in virtio_dev_probe()
247 if (drv->validate && !virtio_legacy_is_little_endian() in virtio_dev_probe()
249 dev->features = BIT_ULL(VIRTIO_F_VERSION_1); in virtio_dev_probe()
250 dev->config->finalize_features(dev); in virtio_dev_probe()
254 dev->features = driver_features & device_features; in virtio_dev_probe()
256 dev->features = driver_features_legacy & device_features; in virtio_dev_probe()
263 if (drv->validate) { in virtio_dev_probe()
264 err = drv->validate(dev); in virtio_dev_probe()
273 err = drv->probe(dev); in virtio_dev_probe()
278 if (!(dev->config->get_status(dev) & VIRTIO_CONFIG_S_DRIVER_OK)) in virtio_dev_probe()
281 if (drv->scan) in virtio_dev_probe()
282 drv->scan(dev); in virtio_dev_probe()
296 struct virtio_driver *drv = drv_to_virtio(dev->dev.driver); in virtio_dev_remove()
300 drv->remove(dev); in virtio_dev_remove()
303 WARN_ON_ONCE(dev->config->get_status(dev)); in virtio_dev_remove()
308 of_node_put(dev->dev.of_node); in virtio_dev_remove()
312 .name = "virtio",
323 BUG_ON(driver->feature_table_size && !driver->feature_table); in register_virtio_driver()
324 driver->driver.bus = &virtio_bus; in register_virtio_driver()
325 return driver_register(&driver->driver); in register_virtio_driver()
331 driver_unregister(&driver->driver); in unregister_virtio_driver()
337 struct device_node *np, *pnode = dev_of_node(dev->dev.parent); in virtio_device_of_init()
338 char compat[] = "virtio,deviceXXXXXXXX"; in virtio_device_of_init()
350 return -EINVAL; in virtio_device_of_init()
354 return -ENODEV; in virtio_device_of_init()
356 ret = snprintf(compat, sizeof(compat), "virtio,device%x", dev->id.device); in virtio_device_of_init()
360 * On powerpc/pseries virtio devices are PCI devices so PCI in virtio_device_of_init()
369 dev->dev.of_node = np; in virtio_device_of_init()
378 * register_virtio_device - register virtio device
379 * @dev : virtio device to be registered
381 * On error, the caller must call put_device on &@dev->dev (and not kfree),
384 * Returns: 0 on suceess, -error on failure
390 dev->dev.bus = &virtio_bus; in register_virtio_device()
391 device_initialize(&dev->dev); in register_virtio_device()
398 dev->index = err; in register_virtio_device()
399 dev_set_name(&dev->dev, "virtio%u", dev->index); in register_virtio_device()
405 spin_lock_init(&dev->config_lock); in register_virtio_device()
406 dev->config_enabled = false; in register_virtio_device()
407 dev->config_change_pending = false; in register_virtio_device()
411 dev->config->reset(dev); in register_virtio_device()
416 INIT_LIST_HEAD(&dev->vqs); in register_virtio_device()
417 spin_lock_init(&dev->vqs_list_lock); in register_virtio_device()
423 err = device_add(&dev->dev); in register_virtio_device()
430 of_node_put(dev->dev.of_node); in register_virtio_device()
432 ida_simple_remove(&virtio_index_ida, dev->index); in register_virtio_device()
441 return dev->bus == &virtio_bus; in is_virtio_device()
447 int index = dev->index; /* save for after device release */ in unregister_virtio_device()
449 device_unregister(&dev->dev); in unregister_virtio_device()
457 struct virtio_driver *drv = drv_to_virtio(dev->dev.driver); in virtio_device_freeze()
461 dev->failed = dev->config->get_status(dev) & VIRTIO_CONFIG_S_FAILED; in virtio_device_freeze()
463 if (drv && drv->freeze) in virtio_device_freeze()
464 return drv->freeze(dev); in virtio_device_freeze()
472 struct virtio_driver *drv = drv_to_virtio(dev->dev.driver); in virtio_device_restore()
477 dev->config->reset(dev); in virtio_device_restore()
484 if (dev->failed) in virtio_device_restore()
497 if (drv->restore) { in virtio_device_restore()
498 ret = drv->restore(dev); in virtio_device_restore()
520 panic("virtio bus registration failed"); in virtio_init()