Lines Matching +full:device +full:- +full:version
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Virtio memory mapped device driver
5 * Copyright 2011-2014, ARM Ltd.
8 * platform device.
10 * The guest device(s) may be instantiated in one of three equivalent ways:
12 * 1. Static platform device in board's code, eg.:
15 * .name = "virtio-mmio",
16 * .id = -1,
31 * 2. Device Tree node, eg.:
39 * 3. Kernel module (or command line) parameter. Can be used more than once -
40 * one device will be created for each one. Syntax:
42 * [virtio_mmio.]device=<size>@<baseaddr>:<irq>[:<id>]
47 * <id> := (optional) platform device id
49 * virtio_mmio.device=0x100@0x100b0000:48 \
50 * virtio_mmio.device=1K@0x1001e000:74
55 #define pr_fmt(fmt) "virtio-mmio: " fmt
58 #include <linux/dma-mapping.h>
90 unsigned long version; member
114 writel(1, vm_dev->base + VIRTIO_MMIO_DEVICE_FEATURES_SEL); in vm_get_features()
115 features = readl(vm_dev->base + VIRTIO_MMIO_DEVICE_FEATURES); in vm_get_features()
118 writel(0, vm_dev->base + VIRTIO_MMIO_DEVICE_FEATURES_SEL); in vm_get_features()
119 features |= readl(vm_dev->base + VIRTIO_MMIO_DEVICE_FEATURES); in vm_get_features()
132 if (vm_dev->version == 2 && in vm_finalize_features()
134 …dev_err(&vdev->dev, "New virtio-mmio devices (version 2) must provide VIRTIO_F_VERSION_1 feature!\… in vm_finalize_features()
135 return -EINVAL; in vm_finalize_features()
138 writel(1, vm_dev->base + VIRTIO_MMIO_DRIVER_FEATURES_SEL); in vm_finalize_features()
139 writel((u32)(vdev->features >> 32), in vm_finalize_features()
140 vm_dev->base + VIRTIO_MMIO_DRIVER_FEATURES); in vm_finalize_features()
142 writel(0, vm_dev->base + VIRTIO_MMIO_DRIVER_FEATURES_SEL); in vm_finalize_features()
143 writel((u32)vdev->features, in vm_finalize_features()
144 vm_dev->base + VIRTIO_MMIO_DRIVER_FEATURES); in vm_finalize_features()
153 void __iomem *base = vm_dev->base + VIRTIO_MMIO_CONFIG; in vm_get()
158 if (vm_dev->version == 1) { in vm_get()
195 void __iomem *base = vm_dev->base + VIRTIO_MMIO_CONFIG; in vm_set()
200 if (vm_dev->version == 1) { in vm_set()
238 if (vm_dev->version == 1) in vm_generation()
241 return readl(vm_dev->base + VIRTIO_MMIO_CONFIG_GENERATION); in vm_generation()
248 return readl(vm_dev->base + VIRTIO_MMIO_STATUS) & 0xff; in vm_get_status()
259 * Per memory-barriers.txt, wmb() is not needed to guarantee in vm_set_status()
263 writel(status, vm_dev->base + VIRTIO_MMIO_STATUS); in vm_set_status()
271 writel(0, vm_dev->base + VIRTIO_MMIO_STATUS); in vm_reset()
281 struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vq->vdev); in vm_notify()
285 writel(vq->index, vm_dev->base + VIRTIO_MMIO_QUEUE_NOTIFY); in vm_notify()
291 struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vq->vdev); in vm_notify_with_data()
294 writel(data, vm_dev->base + VIRTIO_MMIO_QUEUE_NOTIFY); in vm_notify_with_data()
309 status = readl(vm_dev->base + VIRTIO_MMIO_INTERRUPT_STATUS); in vm_interrupt()
310 writel(status, vm_dev->base + VIRTIO_MMIO_INTERRUPT_ACK); in vm_interrupt()
313 virtio_config_changed(&vm_dev->vdev); in vm_interrupt()
318 spin_lock_irqsave(&vm_dev->lock, flags); in vm_interrupt()
319 list_for_each_entry(info, &vm_dev->virtqueues, node) in vm_interrupt()
320 ret |= vring_interrupt(irq, info->vq); in vm_interrupt()
321 spin_unlock_irqrestore(&vm_dev->lock, flags); in vm_interrupt()
331 struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vq->vdev); in vm_del_vq()
332 struct virtio_mmio_vq_info *info = vq->priv; in vm_del_vq()
334 unsigned int index = vq->index; in vm_del_vq()
336 spin_lock_irqsave(&vm_dev->lock, flags); in vm_del_vq()
337 list_del(&info->node); in vm_del_vq()
338 spin_unlock_irqrestore(&vm_dev->lock, flags); in vm_del_vq()
341 writel(index, vm_dev->base + VIRTIO_MMIO_QUEUE_SEL); in vm_del_vq()
342 if (vm_dev->version == 1) { in vm_del_vq()
343 writel(0, vm_dev->base + VIRTIO_MMIO_QUEUE_PFN); in vm_del_vq()
345 writel(0, vm_dev->base + VIRTIO_MMIO_QUEUE_READY); in vm_del_vq()
346 WARN_ON(readl(vm_dev->base + VIRTIO_MMIO_QUEUE_READY)); in vm_del_vq()
359 list_for_each_entry_safe(vq, n, &vdev->vqs, list) in vm_del_vqs()
362 free_irq(platform_get_irq(vm_dev->pdev, 0), vm_dev); in vm_del_vqs()
369 synchronize_irq(platform_get_irq(vm_dev->pdev, 0)); in vm_synchronize_cbs()
393 writel(index, vm_dev->base + VIRTIO_MMIO_QUEUE_SEL); in vm_setup_vq()
396 if (readl(vm_dev->base + (vm_dev->version == 1 ? in vm_setup_vq()
398 err = -ENOENT; in vm_setup_vq()
405 err = -ENOMEM; in vm_setup_vq()
409 num = readl(vm_dev->base + VIRTIO_MMIO_QUEUE_NUM_MAX); in vm_setup_vq()
411 err = -ENOENT; in vm_setup_vq()
419 err = -ENOMEM; in vm_setup_vq()
423 vq->num_max = num; in vm_setup_vq()
426 writel(virtqueue_get_vring_size(vq), vm_dev->base + VIRTIO_MMIO_QUEUE_NUM); in vm_setup_vq()
427 if (vm_dev->version == 1) { in vm_setup_vq()
431 * virtio-mmio v1 uses a 32bit QUEUE PFN. If we have something in vm_setup_vq()
436 dev_err(&vdev->dev, in vm_setup_vq()
437 "platform bug: legacy virtio-mmio must not be used with RAM above 0x%llxGB\n", in vm_setup_vq()
438 0x1ULL << (32 + PAGE_SHIFT - 30)); in vm_setup_vq()
439 err = -E2BIG; in vm_setup_vq()
443 writel(PAGE_SIZE, vm_dev->base + VIRTIO_MMIO_QUEUE_ALIGN); in vm_setup_vq()
444 writel(q_pfn, vm_dev->base + VIRTIO_MMIO_QUEUE_PFN); in vm_setup_vq()
449 writel((u32)addr, vm_dev->base + VIRTIO_MMIO_QUEUE_DESC_LOW); in vm_setup_vq()
451 vm_dev->base + VIRTIO_MMIO_QUEUE_DESC_HIGH); in vm_setup_vq()
454 writel((u32)addr, vm_dev->base + VIRTIO_MMIO_QUEUE_AVAIL_LOW); in vm_setup_vq()
456 vm_dev->base + VIRTIO_MMIO_QUEUE_AVAIL_HIGH); in vm_setup_vq()
459 writel((u32)addr, vm_dev->base + VIRTIO_MMIO_QUEUE_USED_LOW); in vm_setup_vq()
461 vm_dev->base + VIRTIO_MMIO_QUEUE_USED_HIGH); in vm_setup_vq()
463 writel(1, vm_dev->base + VIRTIO_MMIO_QUEUE_READY); in vm_setup_vq()
466 vq->priv = info; in vm_setup_vq()
467 info->vq = vq; in vm_setup_vq()
469 spin_lock_irqsave(&vm_dev->lock, flags); in vm_setup_vq()
470 list_add(&info->node, &vm_dev->virtqueues); in vm_setup_vq()
471 spin_unlock_irqrestore(&vm_dev->lock, flags); in vm_setup_vq()
478 if (vm_dev->version == 1) { in vm_setup_vq()
479 writel(0, vm_dev->base + VIRTIO_MMIO_QUEUE_PFN); in vm_setup_vq()
481 writel(0, vm_dev->base + VIRTIO_MMIO_QUEUE_READY); in vm_setup_vq()
482 WARN_ON(readl(vm_dev->base + VIRTIO_MMIO_QUEUE_READY)); in vm_setup_vq()
496 int irq = platform_get_irq(vm_dev->pdev, 0); in vm_find_vqs()
503 dev_name(&vdev->dev), vm_dev); in vm_find_vqs()
507 if (of_property_read_bool(vm_dev->pdev->dev.of_node, "wakeup-source")) in vm_find_vqs()
513 if (!vqi->name) { in vm_find_vqs()
518 vqs[i] = vm_setup_vq(vdev, queue_idx++, vqi->callback, in vm_find_vqs()
519 vqi->name, vqi->ctx); in vm_find_vqs()
533 return vm_dev->pdev->name; in vm_bus_name()
543 writel(id, vm_dev->base + VIRTIO_MMIO_SHM_SEL); in vm_get_shm_region()
546 len = (u64) readl(vm_dev->base + VIRTIO_MMIO_SHM_LEN_LOW); in vm_get_shm_region()
547 len |= (u64) readl(vm_dev->base + VIRTIO_MMIO_SHM_LEN_HIGH) << 32; in vm_get_shm_region()
549 region->len = len; in vm_get_shm_region()
551 /* Check if region length is -1. If that's the case, the shared memory in vm_get_shm_region()
558 addr = (u64) readl(vm_dev->base + VIRTIO_MMIO_SHM_BASE_LOW); in vm_get_shm_region()
559 addr |= (u64) readl(vm_dev->base + VIRTIO_MMIO_SHM_BASE_HIGH) << 32; in vm_get_shm_region()
561 region->addr = addr; in vm_get_shm_region()
583 static int virtio_mmio_freeze(struct device *dev) in virtio_mmio_freeze()
587 return virtio_device_freeze(&vm_dev->vdev); in virtio_mmio_freeze()
590 static int virtio_mmio_restore(struct device *dev) in virtio_mmio_restore()
594 if (vm_dev->version == 1) in virtio_mmio_restore()
595 writel(PAGE_SIZE, vm_dev->base + VIRTIO_MMIO_GUEST_PAGE_SIZE); in virtio_mmio_restore()
597 return virtio_device_restore(&vm_dev->vdev); in virtio_mmio_restore()
605 static void virtio_mmio_release_dev(struct device *_d) in virtio_mmio_release_dev()
614 /* Platform device */
624 return -ENOMEM; in virtio_mmio_probe()
626 vm_dev->vdev.dev.parent = &pdev->dev; in virtio_mmio_probe()
627 vm_dev->vdev.dev.release = virtio_mmio_release_dev; in virtio_mmio_probe()
628 vm_dev->vdev.config = &virtio_mmio_config_ops; in virtio_mmio_probe()
629 vm_dev->pdev = pdev; in virtio_mmio_probe()
630 INIT_LIST_HEAD(&vm_dev->virtqueues); in virtio_mmio_probe()
631 spin_lock_init(&vm_dev->lock); in virtio_mmio_probe()
633 vm_dev->base = devm_platform_ioremap_resource(pdev, 0); in virtio_mmio_probe()
634 if (IS_ERR(vm_dev->base)) { in virtio_mmio_probe()
635 rc = PTR_ERR(vm_dev->base); in virtio_mmio_probe()
640 magic = readl(vm_dev->base + VIRTIO_MMIO_MAGIC_VALUE); in virtio_mmio_probe()
642 dev_warn(&pdev->dev, "Wrong magic value 0x%08lx!\n", magic); in virtio_mmio_probe()
643 rc = -ENODEV; in virtio_mmio_probe()
647 /* Check device version */ in virtio_mmio_probe()
648 vm_dev->version = readl(vm_dev->base + VIRTIO_MMIO_VERSION); in virtio_mmio_probe()
649 if (vm_dev->version < 1 || vm_dev->version > 2) { in virtio_mmio_probe()
650 dev_err(&pdev->dev, "Version %ld not supported!\n", in virtio_mmio_probe()
651 vm_dev->version); in virtio_mmio_probe()
652 rc = -ENXIO; in virtio_mmio_probe()
656 vm_dev->vdev.id.device = readl(vm_dev->base + VIRTIO_MMIO_DEVICE_ID); in virtio_mmio_probe()
657 if (vm_dev->vdev.id.device == 0) { in virtio_mmio_probe()
659 * virtio-mmio device with an ID 0 is a (dummy) placeholder in virtio_mmio_probe()
662 rc = -ENODEV; in virtio_mmio_probe()
665 vm_dev->vdev.id.vendor = readl(vm_dev->base + VIRTIO_MMIO_VENDOR_ID); in virtio_mmio_probe()
667 if (vm_dev->version == 1) { in virtio_mmio_probe()
668 writel(PAGE_SIZE, vm_dev->base + VIRTIO_MMIO_GUEST_PAGE_SIZE); in virtio_mmio_probe()
670 rc = dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)); in virtio_mmio_probe()
672 * In the legacy case, ensure our coherently-allocated virtio in virtio_mmio_probe()
673 * ring will be at an address expressable as a 32-bit PFN. in virtio_mmio_probe()
676 dma_set_coherent_mask(&pdev->dev, in virtio_mmio_probe()
679 rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); in virtio_mmio_probe()
682 rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); in virtio_mmio_probe()
684 …dev_warn(&pdev->dev, "Failed to enable 64-bit or 32-bit DMA. Trying to continue, but this might n… in virtio_mmio_probe()
688 rc = register_virtio_device(&vm_dev->vdev); in virtio_mmio_probe()
690 put_device(&vm_dev->vdev.dev); in virtio_mmio_probe()
702 unregister_virtio_device(&vm_dev->vdev); in virtio_mmio_remove()
711 static struct device vm_cmdline_parent = {
712 .init_name = "virtio-mmio-cmdline",
718 static int vm_cmdline_set(const char *device, in vm_cmdline_set() argument
730 size = memparse(device, &str); in vm_cmdline_set()
743 return -EINVAL; in vm_cmdline_set()
747 resources[0].end = base + size - 1; in vm_cmdline_set()
756 pr_err("Failed to register parent device!\n"); in vm_cmdline_set()
762 pr_info("Registering device virtio-mmio.%d at 0x%llx-0x%llx, IRQ %d.\n", in vm_cmdline_set()
769 "virtio-mmio", vm_cmdline_id++, in vm_cmdline_set()
775 static int vm_cmdline_get_device(struct device *dev, void *data) in vm_cmdline_get_device()
781 snprintf(buffer + len, PAGE_SIZE - len, "0x%llx@0x%llx:%llu:%d\n", in vm_cmdline_get_device()
782 pdev->resource[0].end - pdev->resource[0].start + 1ULL, in vm_cmdline_get_device()
783 (unsigned long long)pdev->resource[0].start, in vm_cmdline_get_device()
784 (unsigned long long)pdev->resource[1].start, in vm_cmdline_get_device()
785 pdev->id); in vm_cmdline_get_device()
802 device_param_cb(device, &vm_cmdline_param_ops, NULL, S_IRUSR);
804 static int vm_unregister_cmdline_device(struct device *dev, in vm_unregister_cmdline_device()
850 .name = "virtio-mmio",