Lines Matching +full:device +full:- +full:id +full:- +full:base
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>]
45 * <baseaddr> := physical base address
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>
88 void __iomem *base; member
99 writel(1, vm_dev->base + VIRTIO_MMIO_DEVICE_FEATURES_SEL); in vm_get_features()
100 features = readl(vm_dev->base + VIRTIO_MMIO_DEVICE_FEATURES); in vm_get_features()
103 writel(0, vm_dev->base + VIRTIO_MMIO_DEVICE_FEATURES_SEL); in vm_get_features()
104 features |= readl(vm_dev->base + VIRTIO_MMIO_DEVICE_FEATURES); in vm_get_features()
117 if (vm_dev->version == 2 && in vm_finalize_features()
119 …dev_err(&vdev->dev, "New virtio-mmio devices (version 2) must provide VIRTIO_F_VERSION_1 feature!\… in vm_finalize_features()
120 return -EINVAL; in vm_finalize_features()
123 writel(1, vm_dev->base + VIRTIO_MMIO_DRIVER_FEATURES_SEL); in vm_finalize_features()
124 writel((u32)(vdev->features >> 32), in vm_finalize_features()
125 vm_dev->base + VIRTIO_MMIO_DRIVER_FEATURES); in vm_finalize_features()
127 writel(0, vm_dev->base + VIRTIO_MMIO_DRIVER_FEATURES_SEL); in vm_finalize_features()
128 writel((u32)vdev->features, in vm_finalize_features()
129 vm_dev->base + VIRTIO_MMIO_DRIVER_FEATURES); in vm_finalize_features()
138 void __iomem *base = vm_dev->base + VIRTIO_MMIO_CONFIG; in vm_get() local
143 if (vm_dev->version == 1) { in vm_get()
148 ptr[i] = readb(base + offset + i); in vm_get()
154 b = readb(base + offset); in vm_get()
158 w = cpu_to_le16(readw(base + offset)); in vm_get()
162 l = cpu_to_le32(readl(base + offset)); in vm_get()
166 l = cpu_to_le32(readl(base + offset)); in vm_get()
168 l = cpu_to_le32(ioread32(base + offset + sizeof l)); in vm_get()
180 void __iomem *base = vm_dev->base + VIRTIO_MMIO_CONFIG; in vm_set() local
185 if (vm_dev->version == 1) { in vm_set()
190 writeb(ptr[i], base + offset + i); in vm_set()
198 writeb(b, base + offset); in vm_set()
202 writew(le16_to_cpu(w), base + offset); in vm_set()
206 writel(le32_to_cpu(l), base + offset); in vm_set()
210 writel(le32_to_cpu(l), base + offset); in vm_set()
212 writel(le32_to_cpu(l), base + offset + sizeof l); in vm_set()
223 if (vm_dev->version == 1) in vm_generation()
226 return readl(vm_dev->base + VIRTIO_MMIO_CONFIG_GENERATION); in vm_generation()
233 return readl(vm_dev->base + VIRTIO_MMIO_STATUS) & 0xff; in vm_get_status()
244 * Per memory-barriers.txt, wmb() is not needed to guarantee in vm_set_status()
248 writel(status, vm_dev->base + VIRTIO_MMIO_STATUS); in vm_set_status()
256 writel(0, vm_dev->base + VIRTIO_MMIO_STATUS); in vm_reset()
266 struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vq->vdev); in vm_notify()
270 writel(vq->index, vm_dev->base + VIRTIO_MMIO_QUEUE_NOTIFY); in vm_notify()
276 struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vq->vdev); in vm_notify_with_data()
279 writel(data, vm_dev->base + VIRTIO_MMIO_QUEUE_NOTIFY); in vm_notify_with_data()
293 status = readl(vm_dev->base + VIRTIO_MMIO_INTERRUPT_STATUS); in vm_interrupt()
294 writel(status, vm_dev->base + VIRTIO_MMIO_INTERRUPT_ACK); in vm_interrupt()
297 virtio_config_changed(&vm_dev->vdev); in vm_interrupt()
302 virtio_device_for_each_vq(&vm_dev->vdev, vq) in vm_interrupt()
313 struct virtio_mmio_device *vm_dev = to_virtio_mmio_device(vq->vdev); in vm_del_vq()
314 unsigned int index = vq->index; in vm_del_vq()
317 writel(index, vm_dev->base + VIRTIO_MMIO_QUEUE_SEL); in vm_del_vq()
318 if (vm_dev->version == 1) { in vm_del_vq()
319 writel(0, vm_dev->base + VIRTIO_MMIO_QUEUE_PFN); in vm_del_vq()
321 writel(0, vm_dev->base + VIRTIO_MMIO_QUEUE_READY); in vm_del_vq()
322 WARN_ON(readl(vm_dev->base + VIRTIO_MMIO_QUEUE_READY)); in vm_del_vq()
333 list_for_each_entry_safe(vq, n, &vdev->vqs, list) in vm_del_vqs()
336 free_irq(platform_get_irq(vm_dev->pdev, 0), vm_dev); in vm_del_vqs()
343 synchronize_irq(platform_get_irq(vm_dev->pdev, 0)); in vm_synchronize_cbs()
365 writel(index, vm_dev->base + VIRTIO_MMIO_QUEUE_SEL); in vm_setup_vq()
368 if (readl(vm_dev->base + (vm_dev->version == 1 ? in vm_setup_vq()
370 err = -ENOENT; in vm_setup_vq()
374 num = readl(vm_dev->base + VIRTIO_MMIO_QUEUE_NUM_MAX); in vm_setup_vq()
376 err = -ENOENT; in vm_setup_vq()
384 err = -ENOMEM; in vm_setup_vq()
388 vq->num_max = num; in vm_setup_vq()
391 writel(virtqueue_get_vring_size(vq), vm_dev->base + VIRTIO_MMIO_QUEUE_NUM); in vm_setup_vq()
392 if (vm_dev->version == 1) { in vm_setup_vq()
396 * virtio-mmio v1 uses a 32bit QUEUE PFN. If we have something in vm_setup_vq()
401 dev_err(&vdev->dev, in vm_setup_vq()
402 "platform bug: legacy virtio-mmio must not be used with RAM above 0x%llxGB\n", in vm_setup_vq()
403 0x1ULL << (32 + PAGE_SHIFT - 30)); in vm_setup_vq()
404 err = -E2BIG; in vm_setup_vq()
408 writel(PAGE_SIZE, vm_dev->base + VIRTIO_MMIO_QUEUE_ALIGN); in vm_setup_vq()
409 writel(q_pfn, vm_dev->base + VIRTIO_MMIO_QUEUE_PFN); in vm_setup_vq()
414 writel((u32)addr, vm_dev->base + VIRTIO_MMIO_QUEUE_DESC_LOW); in vm_setup_vq()
416 vm_dev->base + VIRTIO_MMIO_QUEUE_DESC_HIGH); in vm_setup_vq()
419 writel((u32)addr, vm_dev->base + VIRTIO_MMIO_QUEUE_AVAIL_LOW); in vm_setup_vq()
421 vm_dev->base + VIRTIO_MMIO_QUEUE_AVAIL_HIGH); in vm_setup_vq()
424 writel((u32)addr, vm_dev->base + VIRTIO_MMIO_QUEUE_USED_LOW); in vm_setup_vq()
426 vm_dev->base + VIRTIO_MMIO_QUEUE_USED_HIGH); in vm_setup_vq()
428 writel(1, vm_dev->base + VIRTIO_MMIO_QUEUE_READY); in vm_setup_vq()
436 if (vm_dev->version == 1) { in vm_setup_vq()
437 writel(0, vm_dev->base + VIRTIO_MMIO_QUEUE_PFN); in vm_setup_vq()
439 writel(0, vm_dev->base + VIRTIO_MMIO_QUEUE_READY); in vm_setup_vq()
440 WARN_ON(readl(vm_dev->base + VIRTIO_MMIO_QUEUE_READY)); in vm_setup_vq()
452 int irq = platform_get_irq(vm_dev->pdev, 0); in vm_find_vqs()
459 dev_name(&vdev->dev), vm_dev); in vm_find_vqs()
463 if (of_property_read_bool(vm_dev->pdev->dev.of_node, "wakeup-source")) in vm_find_vqs()
469 if (!vqi->name) { in vm_find_vqs()
474 vqs[i] = vm_setup_vq(vdev, queue_idx++, vqi->callback, in vm_find_vqs()
475 vqi->name, vqi->ctx); in vm_find_vqs()
489 return vm_dev->pdev->name; in vm_bus_name()
493 struct virtio_shm_region *region, u8 id) in vm_get_shm_region() argument
499 writel(id, vm_dev->base + VIRTIO_MMIO_SHM_SEL); in vm_get_shm_region()
502 len = (u64) readl(vm_dev->base + VIRTIO_MMIO_SHM_LEN_LOW); in vm_get_shm_region()
503 len |= (u64) readl(vm_dev->base + VIRTIO_MMIO_SHM_LEN_HIGH) << 32; in vm_get_shm_region()
505 region->len = len; in vm_get_shm_region()
507 /* Check if region length is -1. If that's the case, the shared memory in vm_get_shm_region()
513 /* Read the region base address */ in vm_get_shm_region()
514 addr = (u64) readl(vm_dev->base + VIRTIO_MMIO_SHM_BASE_LOW); in vm_get_shm_region()
515 addr |= (u64) readl(vm_dev->base + VIRTIO_MMIO_SHM_BASE_HIGH) << 32; in vm_get_shm_region()
517 region->addr = addr; in vm_get_shm_region()
539 static int virtio_mmio_freeze(struct device *dev) in virtio_mmio_freeze()
543 return virtio_device_freeze(&vm_dev->vdev); in virtio_mmio_freeze()
546 static int virtio_mmio_restore(struct device *dev) in virtio_mmio_restore()
550 if (vm_dev->version == 1) in virtio_mmio_restore()
551 writel(PAGE_SIZE, vm_dev->base + VIRTIO_MMIO_GUEST_PAGE_SIZE); in virtio_mmio_restore()
553 return virtio_device_restore(&vm_dev->vdev); in virtio_mmio_restore()
561 static void virtio_mmio_release_dev(struct device *_d) in virtio_mmio_release_dev()
570 /* Platform device */
580 return -ENOMEM; in virtio_mmio_probe()
582 vm_dev->vdev.dev.parent = &pdev->dev; in virtio_mmio_probe()
583 vm_dev->vdev.dev.release = virtio_mmio_release_dev; in virtio_mmio_probe()
584 vm_dev->vdev.config = &virtio_mmio_config_ops; in virtio_mmio_probe()
585 vm_dev->pdev = pdev; in virtio_mmio_probe()
587 vm_dev->base = devm_platform_ioremap_resource(pdev, 0); in virtio_mmio_probe()
588 if (IS_ERR(vm_dev->base)) { in virtio_mmio_probe()
589 rc = PTR_ERR(vm_dev->base); in virtio_mmio_probe()
594 magic = readl(vm_dev->base + VIRTIO_MMIO_MAGIC_VALUE); in virtio_mmio_probe()
596 dev_warn(&pdev->dev, "Wrong magic value 0x%08lx!\n", magic); in virtio_mmio_probe()
597 rc = -ENODEV; in virtio_mmio_probe()
601 /* Check device version */ in virtio_mmio_probe()
602 vm_dev->version = readl(vm_dev->base + VIRTIO_MMIO_VERSION); in virtio_mmio_probe()
603 if (vm_dev->version < 1 || vm_dev->version > 2) { in virtio_mmio_probe()
604 dev_err(&pdev->dev, "Version %ld not supported!\n", in virtio_mmio_probe()
605 vm_dev->version); in virtio_mmio_probe()
606 rc = -ENXIO; in virtio_mmio_probe()
610 vm_dev->vdev.id.device = readl(vm_dev->base + VIRTIO_MMIO_DEVICE_ID); in virtio_mmio_probe()
611 if (vm_dev->vdev.id.device == 0) { in virtio_mmio_probe()
613 * virtio-mmio device with an ID 0 is a (dummy) placeholder in virtio_mmio_probe()
616 rc = -ENODEV; in virtio_mmio_probe()
619 vm_dev->vdev.id.vendor = readl(vm_dev->base + VIRTIO_MMIO_VENDOR_ID); in virtio_mmio_probe()
621 if (vm_dev->version == 1) { in virtio_mmio_probe()
622 writel(PAGE_SIZE, vm_dev->base + VIRTIO_MMIO_GUEST_PAGE_SIZE); in virtio_mmio_probe()
624 rc = dma_set_mask(&pdev->dev, DMA_BIT_MASK(64)); in virtio_mmio_probe()
626 * In the legacy case, ensure our coherently-allocated virtio in virtio_mmio_probe()
627 * ring will be at an address expressable as a 32-bit PFN. in virtio_mmio_probe()
630 dma_set_coherent_mask(&pdev->dev, in virtio_mmio_probe()
633 rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); in virtio_mmio_probe()
636 rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32)); in virtio_mmio_probe()
638 …dev_warn(&pdev->dev, "Failed to enable 64-bit or 32-bit DMA. Trying to continue, but this might n… in virtio_mmio_probe()
642 rc = register_virtio_device(&vm_dev->vdev); in virtio_mmio_probe()
644 put_device(&vm_dev->vdev.dev); in virtio_mmio_probe()
656 unregister_virtio_device(&vm_dev->vdev); in virtio_mmio_remove()
665 static struct device vm_cmdline_parent = {
666 .init_name = "virtio-mmio-cmdline",
672 static int vm_cmdline_set(const char *device, in vm_cmdline_set() argument
678 long long base, size; in vm_cmdline_set() local
684 size = memparse(device, &str); in vm_cmdline_set()
686 /* Get "@<base>:<irq>[:<id>]" chunks */ in vm_cmdline_set()
688 &base, &irq, &consumed, in vm_cmdline_set()
697 return -EINVAL; in vm_cmdline_set()
700 resources[0].start = base; in vm_cmdline_set()
701 resources[0].end = base + size - 1; in vm_cmdline_set()
710 pr_err("Failed to register parent device!\n"); in vm_cmdline_set()
716 pr_info("Registering device virtio-mmio.%d at 0x%llx-0x%llx, IRQ %d.\n", in vm_cmdline_set()
723 "virtio-mmio", vm_cmdline_id++, in vm_cmdline_set()
729 static int vm_cmdline_get_device(struct device *dev, void *data) in vm_cmdline_get_device()
735 snprintf(buffer + len, PAGE_SIZE - len, "0x%llx@0x%llx:%llu:%d\n", in vm_cmdline_get_device()
736 pdev->resource[0].end - pdev->resource[0].start + 1ULL, in vm_cmdline_get_device()
737 (unsigned long long)pdev->resource[0].start, in vm_cmdline_get_device()
738 (unsigned long long)pdev->resource[1].start, in vm_cmdline_get_device()
739 pdev->id); in vm_cmdline_get_device()
756 device_param_cb(device, &vm_cmdline_param_ops, NULL, S_IRUSR);
758 static int vm_unregister_cmdline_device(struct device *dev, in vm_unregister_cmdline_device()
804 .name = "virtio-mmio",