Lines Matching +full:virtio +full:- +full:device
1 // SPDX-License-Identifier: GPL-2.0-only
2 #include <linux/virtio.h>
11 /* Unique numbering for virtio devices. */
14 static ssize_t device_show(struct device *_d, in device_show()
18 return sysfs_emit(buf, "0x%04x\n", dev->id.device); in device_show()
20 static DEVICE_ATTR_RO(device);
22 static ssize_t vendor_show(struct device *_d, in vendor_show()
26 return sysfs_emit(buf, "0x%04x\n", dev->id.vendor); in vendor_show()
30 static ssize_t status_show(struct device *_d, in status_show()
34 return sysfs_emit(buf, "0x%08x\n", dev->config->get_status(dev)); in status_show()
38 static ssize_t modalias_show(struct device *_d, in modalias_show()
42 return sysfs_emit(buf, "virtio:d%08Xv%08X\n", in modalias_show()
43 dev->id.device, dev->id.vendor); in modalias_show()
47 static ssize_t features_show(struct device *_d, in features_show()
56 for (i = 0; i < sizeof(dev->features)*8; i++) in features_show()
77 if (id->device != dev->id.device && id->device != VIRTIO_DEV_ANY_ID) in virtio_id_match()
80 return id->vendor == VIRTIO_DEV_ANY_ID || id->vendor == dev->id.vendor; in virtio_id_match()
85 static int virtio_dev_match(struct device *_dv, struct device_driver *_dr) in virtio_dev_match()
91 ids = drv_to_virtio(_dr)->id_table; in virtio_dev_match()
92 for (i = 0; ids[i].device; i++) in virtio_dev_match()
98 static int virtio_uevent(const struct device *_dv, struct kobj_uevent_env *env) in virtio_uevent()
102 return add_uevent_var(env, "MODALIAS=virtio:d%08Xv%08X", in virtio_uevent()
103 dev->id.device, dev->id.vendor); in virtio_uevent()
110 struct virtio_driver *drv = drv_to_virtio(vdev->dev.driver); in virtio_check_driver_offered_feature()
112 for (i = 0; i < drv->feature_table_size; i++) in virtio_check_driver_offered_feature()
113 if (drv->feature_table[i] == fbit) in virtio_check_driver_offered_feature()
116 if (drv->feature_table_legacy) { in virtio_check_driver_offered_feature()
117 for (i = 0; i < drv->feature_table_size_legacy; i++) in virtio_check_driver_offered_feature()
118 if (drv->feature_table_legacy[i] == fbit) in virtio_check_driver_offered_feature()
128 struct virtio_driver *drv = drv_to_virtio(dev->dev.driver); in __virtio_config_changed()
130 if (!dev->config_enabled) in __virtio_config_changed()
131 dev->config_change_pending = true; in __virtio_config_changed()
132 else if (drv && drv->config_changed) in __virtio_config_changed()
133 drv->config_changed(dev); in __virtio_config_changed()
140 spin_lock_irqsave(&dev->config_lock, flags); in virtio_config_changed()
142 spin_unlock_irqrestore(&dev->config_lock, flags); in virtio_config_changed()
148 spin_lock_irq(&dev->config_lock); in virtio_config_disable()
149 dev->config_enabled = false; in virtio_config_disable()
150 spin_unlock_irq(&dev->config_lock); in virtio_config_disable()
155 spin_lock_irq(&dev->config_lock); in virtio_config_enable()
156 dev->config_enabled = true; in virtio_config_enable()
157 if (dev->config_change_pending) in virtio_config_enable()
159 dev->config_change_pending = false; in virtio_config_enable()
160 spin_unlock_irq(&dev->config_lock); in virtio_config_enable()
166 dev->config->set_status(dev, dev->config->get_status(dev) | status); in virtio_add_status()
179 dev_warn(&dev->dev, in virtio_features_ok()
180 "device must provide VIRTIO_F_VERSION_1\n"); in virtio_features_ok()
181 return -ENODEV; in virtio_features_ok()
185 dev_warn(&dev->dev, in virtio_features_ok()
186 "device must provide VIRTIO_F_ACCESS_PLATFORM\n"); in virtio_features_ok()
187 return -ENODEV; in virtio_features_ok()
195 status = dev->config->get_status(dev); in virtio_features_ok()
197 dev_err(&dev->dev, "virtio: device refuses features: %x\n", in virtio_features_ok()
199 return -ENODEV; in virtio_features_ok()
205 * virtio_reset_device - quiesce device for removal
206 * @dev: the device to reset
208 * Prevents device from sending interrupts and accessing memory.
210 * Generally used for cleanup during driver / device removal.
227 * vq->broken as true. in virtio_reset_device()
233 dev->config->reset(dev); in virtio_reset_device()
237 static int virtio_dev_probe(struct device *_d) in virtio_dev_probe()
241 struct virtio_driver *drv = drv_to_virtio(dev->dev.driver); in virtio_dev_probe()
249 /* Figure out what features the device supports. */ in virtio_dev_probe()
250 device_features = dev->config->get_features(dev); in virtio_dev_probe()
254 for (i = 0; i < drv->feature_table_size; i++) { in virtio_dev_probe()
255 unsigned int f = drv->feature_table[i]; in virtio_dev_probe()
260 /* Some drivers have a separate feature table for virtio v1.0 */ in virtio_dev_probe()
261 if (drv->feature_table_legacy) { in virtio_dev_probe()
263 for (i = 0; i < drv->feature_table_size_legacy; i++) { in virtio_dev_probe()
264 unsigned int f = drv->feature_table_legacy[i]; in virtio_dev_probe()
273 dev->features = driver_features & device_features; in virtio_dev_probe()
275 dev->features = driver_features_legacy & device_features; in virtio_dev_probe()
282 err = dev->config->finalize_features(dev); in virtio_dev_probe()
286 if (drv->validate) { in virtio_dev_probe()
287 u64 features = dev->features; in virtio_dev_probe()
289 err = drv->validate(dev); in virtio_dev_probe()
294 if (features != dev->features) { in virtio_dev_probe()
295 err = dev->config->finalize_features(dev); in virtio_dev_probe()
305 if (dev->config->create_avq) { in virtio_dev_probe()
306 err = dev->config->create_avq(dev); in virtio_dev_probe()
311 err = drv->probe(dev); in virtio_dev_probe()
315 /* If probe didn't do it, mark device DRIVER_OK ourselves. */ in virtio_dev_probe()
316 if (!(dev->config->get_status(dev) & VIRTIO_CONFIG_S_DRIVER_OK)) in virtio_dev_probe()
319 if (drv->scan) in virtio_dev_probe()
320 drv->scan(dev); in virtio_dev_probe()
327 if (dev->config->destroy_avq) in virtio_dev_probe()
328 dev->config->destroy_avq(dev); in virtio_dev_probe()
335 static void virtio_dev_remove(struct device *_d) in virtio_dev_remove()
338 struct virtio_driver *drv = drv_to_virtio(dev->dev.driver); in virtio_dev_remove()
342 drv->remove(dev); in virtio_dev_remove()
344 if (dev->config->destroy_avq) in virtio_dev_remove()
345 dev->config->destroy_avq(dev); in virtio_dev_remove()
347 /* Driver should have reset device. */ in virtio_dev_remove()
348 WARN_ON_ONCE(dev->config->get_status(dev)); in virtio_dev_remove()
350 /* Acknowledge the device's existence again. */ in virtio_dev_remove()
353 of_node_put(dev->dev.of_node); in virtio_dev_remove()
357 .name = "virtio",
368 BUG_ON(driver->feature_table_size && !driver->feature_table); in register_virtio_driver()
369 driver->driver.bus = &virtio_bus; in register_virtio_driver()
370 return driver_register(&driver->driver); in register_virtio_driver()
376 driver_unregister(&driver->driver); in unregister_virtio_driver()
382 struct device_node *np, *pnode = dev_of_node(dev->dev.parent); in virtio_device_of_init()
383 char compat[] = "virtio,deviceXXXXXXXX"; in virtio_device_of_init()
395 return -EINVAL; in virtio_device_of_init()
399 return -ENODEV; in virtio_device_of_init()
401 ret = snprintf(compat, sizeof(compat), "virtio,device%x", dev->id.device); in virtio_device_of_init()
405 * On powerpc/pseries virtio devices are PCI devices so PCI in virtio_device_of_init()
406 * vendor/device ids play the role of the "compatible" property. in virtio_device_of_init()
414 dev->dev.of_node = np; in virtio_device_of_init()
423 * register_virtio_device - register virtio device
424 * @dev : virtio device to be registered
426 * On error, the caller must call put_device on &@dev->dev (and not kfree),
429 * Returns: 0 on suceess, -error on failure
435 dev->dev.bus = &virtio_bus; in register_virtio_device()
436 device_initialize(&dev->dev); in register_virtio_device()
438 /* Assign a unique device index and hence name. */ in register_virtio_device()
443 dev->index = err; in register_virtio_device()
444 err = dev_set_name(&dev->dev, "virtio%u", dev->index); in register_virtio_device()
452 spin_lock_init(&dev->config_lock); in register_virtio_device()
453 dev->config_enabled = false; in register_virtio_device()
454 dev->config_change_pending = false; in register_virtio_device()
456 INIT_LIST_HEAD(&dev->vqs); in register_virtio_device()
457 spin_lock_init(&dev->vqs_list_lock); in register_virtio_device()
459 /* We always start by resetting the device, in case a previous in register_virtio_device()
463 /* Acknowledge that we've seen the device. */ in register_virtio_device()
470 err = device_add(&dev->dev); in register_virtio_device()
477 of_node_put(dev->dev.of_node); in register_virtio_device()
479 ida_free(&virtio_index_ida, dev->index); in register_virtio_device()
486 bool is_virtio_device(struct device *dev) in is_virtio_device()
488 return dev->bus == &virtio_bus; in is_virtio_device()
494 int index = dev->index; /* save for after device release */ in unregister_virtio_device()
496 device_unregister(&dev->dev); in unregister_virtio_device()
504 struct virtio_driver *drv = drv_to_virtio(dev->dev.driver); in virtio_device_freeze()
509 dev->failed = dev->config->get_status(dev) & VIRTIO_CONFIG_S_FAILED; in virtio_device_freeze()
511 if (drv && drv->freeze) { in virtio_device_freeze()
512 ret = drv->freeze(dev); in virtio_device_freeze()
517 if (dev->config->destroy_avq) in virtio_device_freeze()
518 dev->config->destroy_avq(dev); in virtio_device_freeze()
526 struct virtio_driver *drv = drv_to_virtio(dev->dev.driver); in virtio_device_restore()
529 /* We always start by resetting the device, in case a previous in virtio_device_restore()
533 /* Acknowledge that we've seen the device. */ in virtio_device_restore()
538 if (dev->failed) in virtio_device_restore()
547 ret = dev->config->finalize_features(dev); in virtio_device_restore()
555 if (dev->config->create_avq) { in virtio_device_restore()
556 ret = dev->config->create_avq(dev); in virtio_device_restore()
561 if (drv->restore) { in virtio_device_restore()
562 ret = drv->restore(dev); in virtio_device_restore()
567 /* If restore didn't do it, mark device DRIVER_OK ourselves. */ in virtio_device_restore()
568 if (!(dev->config->get_status(dev) & VIRTIO_CONFIG_S_DRIVER_OK)) in virtio_device_restore()
576 if (dev->config->destroy_avq) in virtio_device_restore()
577 dev->config->destroy_avq(dev); in virtio_device_restore()
588 panic("virtio bus registration failed"); in virtio_init()