1 // SPDX-License-Identifier: GPL-2.0
3 * Virtio driver for the paravirtualized IOMMU
5 * Copyright (C) 2019 Arm Limited
8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
10 #include <linux/amba/bus.h>
11 #include <linux/delay.h>
12 #include <linux/dma-iommu.h>
13 #include <linux/freezer.h>
14 #include <linux/interval_tree.h>
15 #include <linux/iommu.h>
16 #include <linux/module.h>
17 #include <linux/of_iommu.h>
18 #include <linux/of_platform.h>
19 #include <linux/pci.h>
20 #include <linux/platform_device.h>
21 #include <linux/virtio.h>
22 #include <linux/virtio_config.h>
23 #include <linux/virtio_ids.h>
24 #include <linux/wait.h>
26 #include <uapi/linux/virtio_iommu.h>
28 #define MSI_IOVA_BASE 0x8000000
29 #define MSI_IOVA_LENGTH 0x100000
31 #define VIOMMU_REQUEST_VQ 0
32 #define VIOMMU_EVENT_VQ 1
33 #define VIOMMU_NR_VQS 2
36 struct iommu_device iommu
;
38 struct virtio_device
*vdev
;
40 struct ida domain_ids
;
42 struct virtqueue
*vqs
[VIOMMU_NR_VQS
];
43 spinlock_t request_lock
;
44 struct list_head requests
;
47 /* Device configuration */
48 struct iommu_domain_geometry geometry
;
52 /* Supported MAP flags */
57 struct viommu_mapping
{
59 struct interval_tree_node iova
;
63 struct viommu_domain
{
64 struct iommu_domain domain
;
65 struct viommu_dev
*viommu
;
66 struct mutex mutex
; /* protects viommu pointer */
70 spinlock_t mappings_lock
;
71 struct rb_root_cached mappings
;
73 unsigned long nr_endpoints
;
76 struct viommu_endpoint
{
78 struct viommu_dev
*viommu
;
79 struct viommu_domain
*vdomain
;
80 struct list_head resv_regions
;
83 struct viommu_request
{
84 struct list_head list
;
86 unsigned int write_offset
;
91 #define VIOMMU_FAULT_RESV_MASK 0xffffff00
96 struct virtio_iommu_fault fault
;
100 #define to_viommu_domain(domain) \
101 container_of(domain, struct viommu_domain, domain)
103 static int viommu_get_req_errno(void *buf
, size_t len
)
105 struct virtio_iommu_req_tail
*tail
= buf
+ len
- sizeof(*tail
);
107 switch (tail
->status
) {
108 case VIRTIO_IOMMU_S_OK
:
110 case VIRTIO_IOMMU_S_UNSUPP
:
112 case VIRTIO_IOMMU_S_INVAL
:
114 case VIRTIO_IOMMU_S_RANGE
:
116 case VIRTIO_IOMMU_S_NOENT
:
118 case VIRTIO_IOMMU_S_FAULT
:
120 case VIRTIO_IOMMU_S_NOMEM
:
122 case VIRTIO_IOMMU_S_IOERR
:
123 case VIRTIO_IOMMU_S_DEVERR
:
129 static void viommu_set_req_status(void *buf
, size_t len
, int status
)
131 struct virtio_iommu_req_tail
*tail
= buf
+ len
- sizeof(*tail
);
133 tail
->status
= status
;
136 static off_t
viommu_get_write_desc_offset(struct viommu_dev
*viommu
,
137 struct virtio_iommu_req_head
*req
,
140 size_t tail_size
= sizeof(struct virtio_iommu_req_tail
);
142 if (req
->type
== VIRTIO_IOMMU_T_PROBE
)
143 return len
- viommu
->probe_size
- tail_size
;
145 return len
- tail_size
;
149 * __viommu_sync_req - Complete all in-flight requests
151 * Wait for all added requests to complete. When this function returns, all
152 * requests that were in-flight at the time of the call have completed.
154 static int __viommu_sync_req(struct viommu_dev
*viommu
)
158 struct viommu_request
*req
;
159 struct virtqueue
*vq
= viommu
->vqs
[VIOMMU_REQUEST_VQ
];
161 assert_spin_locked(&viommu
->request_lock
);
165 while (!list_empty(&viommu
->requests
)) {
167 req
= virtqueue_get_buf(vq
, &len
);
172 viommu_set_req_status(req
->buf
, req
->len
,
173 VIRTIO_IOMMU_S_IOERR
);
175 write_len
= req
->len
- req
->write_offset
;
176 if (req
->writeback
&& len
== write_len
)
177 memcpy(req
->writeback
, req
->buf
+ req
->write_offset
,
180 list_del(&req
->list
);
187 static int viommu_sync_req(struct viommu_dev
*viommu
)
192 spin_lock_irqsave(&viommu
->request_lock
, flags
);
193 ret
= __viommu_sync_req(viommu
);
195 dev_dbg(viommu
->dev
, "could not sync requests (%d)\n", ret
);
196 spin_unlock_irqrestore(&viommu
->request_lock
, flags
);
202 * __viommu_add_request - Add one request to the queue
203 * @buf: pointer to the request buffer
204 * @len: length of the request buffer
205 * @writeback: copy data back to the buffer when the request completes.
207 * Add a request to the queue. Only synchronize the queue if it's already full.
208 * Otherwise don't kick the queue nor wait for requests to complete.
210 * When @writeback is true, data written by the device, including the request
211 * status, is copied into @buf after the request completes. This is unsafe if
212 * the caller allocates @buf on stack and drops the lock between add_req() and
215 * Return 0 if the request was successfully added to the queue.
217 static int __viommu_add_req(struct viommu_dev
*viommu
, void *buf
, size_t len
,
222 struct viommu_request
*req
;
223 struct scatterlist top_sg
, bottom_sg
;
224 struct scatterlist
*sg
[2] = { &top_sg
, &bottom_sg
};
225 struct virtqueue
*vq
= viommu
->vqs
[VIOMMU_REQUEST_VQ
];
227 assert_spin_locked(&viommu
->request_lock
);
229 write_offset
= viommu_get_write_desc_offset(viommu
, buf
, len
);
230 if (write_offset
<= 0)
233 req
= kzalloc(sizeof(*req
) + len
, GFP_ATOMIC
);
239 req
->writeback
= buf
+ write_offset
;
240 req
->write_offset
= write_offset
;
242 memcpy(&req
->buf
, buf
, write_offset
);
244 sg_init_one(&top_sg
, req
->buf
, write_offset
);
245 sg_init_one(&bottom_sg
, req
->buf
+ write_offset
, len
- write_offset
);
247 ret
= virtqueue_add_sgs(vq
, sg
, 1, 1, req
, GFP_ATOMIC
);
248 if (ret
== -ENOSPC
) {
249 /* If the queue is full, sync and retry */
250 if (!__viommu_sync_req(viommu
))
251 ret
= virtqueue_add_sgs(vq
, sg
, 1, 1, req
, GFP_ATOMIC
);
256 list_add_tail(&req
->list
, &viommu
->requests
);
264 static int viommu_add_req(struct viommu_dev
*viommu
, void *buf
, size_t len
)
269 spin_lock_irqsave(&viommu
->request_lock
, flags
);
270 ret
= __viommu_add_req(viommu
, buf
, len
, false);
272 dev_dbg(viommu
->dev
, "could not add request: %d\n", ret
);
273 spin_unlock_irqrestore(&viommu
->request_lock
, flags
);
279 * Send a request and wait for it to complete. Return the request status (as an
282 static int viommu_send_req_sync(struct viommu_dev
*viommu
, void *buf
,
288 spin_lock_irqsave(&viommu
->request_lock
, flags
);
290 ret
= __viommu_add_req(viommu
, buf
, len
, true);
292 dev_dbg(viommu
->dev
, "could not add request (%d)\n", ret
);
296 ret
= __viommu_sync_req(viommu
);
298 dev_dbg(viommu
->dev
, "could not sync requests (%d)\n", ret
);
299 /* Fall-through (get the actual request status) */
302 ret
= viommu_get_req_errno(buf
, len
);
304 spin_unlock_irqrestore(&viommu
->request_lock
, flags
);
309 * viommu_add_mapping - add a mapping to the internal tree
311 * On success, return the new mapping. Otherwise return NULL.
313 static int viommu_add_mapping(struct viommu_domain
*vdomain
, unsigned long iova
,
314 phys_addr_t paddr
, size_t size
, u32 flags
)
316 unsigned long irqflags
;
317 struct viommu_mapping
*mapping
;
319 mapping
= kzalloc(sizeof(*mapping
), GFP_ATOMIC
);
323 mapping
->paddr
= paddr
;
324 mapping
->iova
.start
= iova
;
325 mapping
->iova
.last
= iova
+ size
- 1;
326 mapping
->flags
= flags
;
328 spin_lock_irqsave(&vdomain
->mappings_lock
, irqflags
);
329 interval_tree_insert(&mapping
->iova
, &vdomain
->mappings
);
330 spin_unlock_irqrestore(&vdomain
->mappings_lock
, irqflags
);
336 * viommu_del_mappings - remove mappings from the internal tree
338 * @vdomain: the domain
339 * @iova: start of the range
340 * @size: size of the range. A size of 0 corresponds to the entire address
343 * On success, returns the number of unmapped bytes (>= size)
345 static size_t viommu_del_mappings(struct viommu_domain
*vdomain
,
346 unsigned long iova
, size_t size
)
350 unsigned long last
= iova
+ size
- 1;
351 struct viommu_mapping
*mapping
= NULL
;
352 struct interval_tree_node
*node
, *next
;
354 spin_lock_irqsave(&vdomain
->mappings_lock
, flags
);
355 next
= interval_tree_iter_first(&vdomain
->mappings
, iova
, last
);
358 mapping
= container_of(node
, struct viommu_mapping
, iova
);
359 next
= interval_tree_iter_next(node
, iova
, last
);
361 /* Trying to split a mapping? */
362 if (mapping
->iova
.start
< iova
)
366 * Virtio-iommu doesn't allow UNMAP to split a mapping created
367 * with a single MAP request, so remove the full mapping.
369 unmapped
+= mapping
->iova
.last
- mapping
->iova
.start
+ 1;
371 interval_tree_remove(node
, &vdomain
->mappings
);
374 spin_unlock_irqrestore(&vdomain
->mappings_lock
, flags
);
380 * viommu_replay_mappings - re-send MAP requests
382 * When reattaching a domain that was previously detached from all endpoints,
383 * mappings were deleted from the device. Re-create the mappings available in
386 static int viommu_replay_mappings(struct viommu_domain
*vdomain
)
390 struct viommu_mapping
*mapping
;
391 struct interval_tree_node
*node
;
392 struct virtio_iommu_req_map map
;
394 spin_lock_irqsave(&vdomain
->mappings_lock
, flags
);
395 node
= interval_tree_iter_first(&vdomain
->mappings
, 0, -1UL);
397 mapping
= container_of(node
, struct viommu_mapping
, iova
);
398 map
= (struct virtio_iommu_req_map
) {
399 .head
.type
= VIRTIO_IOMMU_T_MAP
,
400 .domain
= cpu_to_le32(vdomain
->id
),
401 .virt_start
= cpu_to_le64(mapping
->iova
.start
),
402 .virt_end
= cpu_to_le64(mapping
->iova
.last
),
403 .phys_start
= cpu_to_le64(mapping
->paddr
),
404 .flags
= cpu_to_le32(mapping
->flags
),
407 ret
= viommu_send_req_sync(vdomain
->viommu
, &map
, sizeof(map
));
411 node
= interval_tree_iter_next(node
, 0, -1UL);
413 spin_unlock_irqrestore(&vdomain
->mappings_lock
, flags
);
418 static int viommu_add_resv_mem(struct viommu_endpoint
*vdev
,
419 struct virtio_iommu_probe_resv_mem
*mem
,
424 phys_addr_t start
, end
;
425 struct iommu_resv_region
*region
= NULL
;
426 unsigned long prot
= IOMMU_WRITE
| IOMMU_NOEXEC
| IOMMU_MMIO
;
428 start
= start64
= le64_to_cpu(mem
->start
);
429 end
= end64
= le64_to_cpu(mem
->end
);
430 size
= end64
- start64
+ 1;
432 /* Catch any overflow, including the unlikely end64 - start64 + 1 = 0 */
433 if (start
!= start64
|| end
!= end64
|| size
< end64
- start64
)
436 if (len
< sizeof(*mem
))
439 switch (mem
->subtype
) {
441 dev_warn(vdev
->dev
, "unknown resv mem subtype 0x%x\n",
444 case VIRTIO_IOMMU_RESV_MEM_T_RESERVED
:
445 region
= iommu_alloc_resv_region(start
, size
, 0,
446 IOMMU_RESV_RESERVED
);
448 case VIRTIO_IOMMU_RESV_MEM_T_MSI
:
449 region
= iommu_alloc_resv_region(start
, size
, prot
,
456 list_add(&vdev
->resv_regions
, ®ion
->list
);
460 static int viommu_probe_endpoint(struct viommu_dev
*viommu
, struct device
*dev
)
466 struct virtio_iommu_req_probe
*probe
;
467 struct virtio_iommu_probe_property
*prop
;
468 struct iommu_fwspec
*fwspec
= dev_iommu_fwspec_get(dev
);
469 struct viommu_endpoint
*vdev
= fwspec
->iommu_priv
;
471 if (!fwspec
->num_ids
)
474 probe_len
= sizeof(*probe
) + viommu
->probe_size
+
475 sizeof(struct virtio_iommu_req_tail
);
476 probe
= kzalloc(probe_len
, GFP_KERNEL
);
480 probe
->head
.type
= VIRTIO_IOMMU_T_PROBE
;
482 * For now, assume that properties of an endpoint that outputs multiple
483 * IDs are consistent. Only probe the first one.
485 probe
->endpoint
= cpu_to_le32(fwspec
->ids
[0]);
487 ret
= viommu_send_req_sync(viommu
, probe
, probe_len
);
491 prop
= (void *)probe
->properties
;
492 type
= le16_to_cpu(prop
->type
) & VIRTIO_IOMMU_PROBE_T_MASK
;
494 while (type
!= VIRTIO_IOMMU_PROBE_T_NONE
&&
495 cur
< viommu
->probe_size
) {
496 len
= le16_to_cpu(prop
->length
) + sizeof(*prop
);
499 case VIRTIO_IOMMU_PROBE_T_RESV_MEM
:
500 ret
= viommu_add_resv_mem(vdev
, (void *)prop
, len
);
503 dev_err(dev
, "unknown viommu prop 0x%x\n", type
);
507 dev_err(dev
, "failed to parse viommu prop 0x%x\n", type
);
510 if (cur
>= viommu
->probe_size
)
513 prop
= (void *)probe
->properties
+ cur
;
514 type
= le16_to_cpu(prop
->type
) & VIRTIO_IOMMU_PROBE_T_MASK
;
522 static int viommu_fault_handler(struct viommu_dev
*viommu
,
523 struct virtio_iommu_fault
*fault
)
527 u8 reason
= fault
->reason
;
528 u32 flags
= le32_to_cpu(fault
->flags
);
529 u32 endpoint
= le32_to_cpu(fault
->endpoint
);
530 u64 address
= le64_to_cpu(fault
->address
);
533 case VIRTIO_IOMMU_FAULT_R_DOMAIN
:
534 reason_str
= "domain";
536 case VIRTIO_IOMMU_FAULT_R_MAPPING
:
539 case VIRTIO_IOMMU_FAULT_R_UNKNOWN
:
541 reason_str
= "unknown";
545 /* TODO: find EP by ID and report_iommu_fault */
546 if (flags
& VIRTIO_IOMMU_FAULT_F_ADDRESS
)
547 dev_err_ratelimited(viommu
->dev
, "%s fault from EP %u at %#llx [%s%s%s]\n",
548 reason_str
, endpoint
, address
,
549 flags
& VIRTIO_IOMMU_FAULT_F_READ
? "R" : "",
550 flags
& VIRTIO_IOMMU_FAULT_F_WRITE
? "W" : "",
551 flags
& VIRTIO_IOMMU_FAULT_F_EXEC
? "X" : "");
553 dev_err_ratelimited(viommu
->dev
, "%s fault from EP %u\n",
554 reason_str
, endpoint
);
558 static void viommu_event_handler(struct virtqueue
*vq
)
562 struct scatterlist sg
[1];
563 struct viommu_event
*evt
;
564 struct viommu_dev
*viommu
= vq
->vdev
->priv
;
566 while ((evt
= virtqueue_get_buf(vq
, &len
)) != NULL
) {
567 if (len
> sizeof(*evt
)) {
569 "invalid event buffer (len %u != %zu)\n",
571 } else if (!(evt
->head
& VIOMMU_FAULT_RESV_MASK
)) {
572 viommu_fault_handler(viommu
, &evt
->fault
);
575 sg_init_one(sg
, evt
, sizeof(*evt
));
576 ret
= virtqueue_add_inbuf(vq
, sg
, 1, evt
, GFP_ATOMIC
);
578 dev_err(viommu
->dev
, "could not add event buffer\n");
586 static struct iommu_domain
*viommu_domain_alloc(unsigned type
)
588 struct viommu_domain
*vdomain
;
590 if (type
!= IOMMU_DOMAIN_UNMANAGED
&& type
!= IOMMU_DOMAIN_DMA
)
593 vdomain
= kzalloc(sizeof(*vdomain
), GFP_KERNEL
);
597 mutex_init(&vdomain
->mutex
);
598 spin_lock_init(&vdomain
->mappings_lock
);
599 vdomain
->mappings
= RB_ROOT_CACHED
;
601 if (type
== IOMMU_DOMAIN_DMA
&&
602 iommu_get_dma_cookie(&vdomain
->domain
)) {
607 return &vdomain
->domain
;
610 static int viommu_domain_finalise(struct viommu_dev
*viommu
,
611 struct iommu_domain
*domain
)
614 struct viommu_domain
*vdomain
= to_viommu_domain(domain
);
616 vdomain
->viommu
= viommu
;
617 vdomain
->map_flags
= viommu
->map_flags
;
619 domain
->pgsize_bitmap
= viommu
->pgsize_bitmap
;
620 domain
->geometry
= viommu
->geometry
;
622 ret
= ida_alloc_range(&viommu
->domain_ids
, viommu
->first_domain
,
623 viommu
->last_domain
, GFP_KERNEL
);
625 vdomain
->id
= (unsigned int)ret
;
627 return ret
> 0 ? 0 : ret
;
630 static void viommu_domain_free(struct iommu_domain
*domain
)
632 struct viommu_domain
*vdomain
= to_viommu_domain(domain
);
634 iommu_put_dma_cookie(domain
);
636 /* Free all remaining mappings (size 2^64) */
637 viommu_del_mappings(vdomain
, 0, 0);
640 ida_free(&vdomain
->viommu
->domain_ids
, vdomain
->id
);
645 static int viommu_attach_dev(struct iommu_domain
*domain
, struct device
*dev
)
649 struct virtio_iommu_req_attach req
;
650 struct iommu_fwspec
*fwspec
= dev_iommu_fwspec_get(dev
);
651 struct viommu_endpoint
*vdev
= fwspec
->iommu_priv
;
652 struct viommu_domain
*vdomain
= to_viommu_domain(domain
);
654 mutex_lock(&vdomain
->mutex
);
655 if (!vdomain
->viommu
) {
657 * Properly initialize the domain now that we know which viommu
660 ret
= viommu_domain_finalise(vdev
->viommu
, domain
);
661 } else if (vdomain
->viommu
!= vdev
->viommu
) {
662 dev_err(dev
, "cannot attach to foreign vIOMMU\n");
665 mutex_unlock(&vdomain
->mutex
);
671 * In the virtio-iommu device, when attaching the endpoint to a new
672 * domain, it is detached from the old one and, if as as a result the
673 * old domain isn't attached to any endpoint, all mappings are removed
674 * from the old domain and it is freed.
676 * In the driver the old domain still exists, and its mappings will be
677 * recreated if it gets reattached to an endpoint. Otherwise it will be
680 * vdev->vdomain is protected by group->mutex
683 vdev
->vdomain
->nr_endpoints
--;
685 req
= (struct virtio_iommu_req_attach
) {
686 .head
.type
= VIRTIO_IOMMU_T_ATTACH
,
687 .domain
= cpu_to_le32(vdomain
->id
),
690 for (i
= 0; i
< fwspec
->num_ids
; i
++) {
691 req
.endpoint
= cpu_to_le32(fwspec
->ids
[i
]);
693 ret
= viommu_send_req_sync(vdomain
->viommu
, &req
, sizeof(req
));
698 if (!vdomain
->nr_endpoints
) {
700 * This endpoint is the first to be attached to the domain.
701 * Replay existing mappings (e.g. SW MSI).
703 ret
= viommu_replay_mappings(vdomain
);
708 vdomain
->nr_endpoints
++;
709 vdev
->vdomain
= vdomain
;
714 static int viommu_map(struct iommu_domain
*domain
, unsigned long iova
,
715 phys_addr_t paddr
, size_t size
, int prot
, gfp_t gfp
)
719 struct virtio_iommu_req_map map
;
720 struct viommu_domain
*vdomain
= to_viommu_domain(domain
);
722 flags
= (prot
& IOMMU_READ
? VIRTIO_IOMMU_MAP_F_READ
: 0) |
723 (prot
& IOMMU_WRITE
? VIRTIO_IOMMU_MAP_F_WRITE
: 0) |
724 (prot
& IOMMU_MMIO
? VIRTIO_IOMMU_MAP_F_MMIO
: 0);
726 if (flags
& ~vdomain
->map_flags
)
729 ret
= viommu_add_mapping(vdomain
, iova
, paddr
, size
, flags
);
733 map
= (struct virtio_iommu_req_map
) {
734 .head
.type
= VIRTIO_IOMMU_T_MAP
,
735 .domain
= cpu_to_le32(vdomain
->id
),
736 .virt_start
= cpu_to_le64(iova
),
737 .phys_start
= cpu_to_le64(paddr
),
738 .virt_end
= cpu_to_le64(iova
+ size
- 1),
739 .flags
= cpu_to_le32(flags
),
742 if (!vdomain
->nr_endpoints
)
745 ret
= viommu_send_req_sync(vdomain
->viommu
, &map
, sizeof(map
));
747 viommu_del_mappings(vdomain
, iova
, size
);
752 static size_t viommu_unmap(struct iommu_domain
*domain
, unsigned long iova
,
753 size_t size
, struct iommu_iotlb_gather
*gather
)
757 struct virtio_iommu_req_unmap unmap
;
758 struct viommu_domain
*vdomain
= to_viommu_domain(domain
);
760 unmapped
= viommu_del_mappings(vdomain
, iova
, size
);
764 /* Device already removed all mappings after detach. */
765 if (!vdomain
->nr_endpoints
)
768 unmap
= (struct virtio_iommu_req_unmap
) {
769 .head
.type
= VIRTIO_IOMMU_T_UNMAP
,
770 .domain
= cpu_to_le32(vdomain
->id
),
771 .virt_start
= cpu_to_le64(iova
),
772 .virt_end
= cpu_to_le64(iova
+ unmapped
- 1),
775 ret
= viommu_add_req(vdomain
->viommu
, &unmap
, sizeof(unmap
));
776 return ret
? 0 : unmapped
;
779 static phys_addr_t
viommu_iova_to_phys(struct iommu_domain
*domain
,
784 struct viommu_mapping
*mapping
;
785 struct interval_tree_node
*node
;
786 struct viommu_domain
*vdomain
= to_viommu_domain(domain
);
788 spin_lock_irqsave(&vdomain
->mappings_lock
, flags
);
789 node
= interval_tree_iter_first(&vdomain
->mappings
, iova
, iova
);
791 mapping
= container_of(node
, struct viommu_mapping
, iova
);
792 paddr
= mapping
->paddr
+ (iova
- mapping
->iova
.start
);
794 spin_unlock_irqrestore(&vdomain
->mappings_lock
, flags
);
799 static void viommu_iotlb_sync(struct iommu_domain
*domain
,
800 struct iommu_iotlb_gather
*gather
)
802 struct viommu_domain
*vdomain
= to_viommu_domain(domain
);
804 viommu_sync_req(vdomain
->viommu
);
807 static void viommu_get_resv_regions(struct device
*dev
, struct list_head
*head
)
809 struct iommu_resv_region
*entry
, *new_entry
, *msi
= NULL
;
810 struct iommu_fwspec
*fwspec
= dev_iommu_fwspec_get(dev
);
811 struct viommu_endpoint
*vdev
= fwspec
->iommu_priv
;
812 int prot
= IOMMU_WRITE
| IOMMU_NOEXEC
| IOMMU_MMIO
;
814 list_for_each_entry(entry
, &vdev
->resv_regions
, list
) {
815 if (entry
->type
== IOMMU_RESV_MSI
)
818 new_entry
= kmemdup(entry
, sizeof(*entry
), GFP_KERNEL
);
821 list_add_tail(&new_entry
->list
, head
);
825 * If the device didn't register any bypass MSI window, add a
826 * software-mapped region.
829 msi
= iommu_alloc_resv_region(MSI_IOVA_BASE
, MSI_IOVA_LENGTH
,
830 prot
, IOMMU_RESV_SW_MSI
);
834 list_add_tail(&msi
->list
, head
);
837 iommu_dma_get_resv_regions(dev
, head
);
840 static struct iommu_ops viommu_ops
;
841 static struct virtio_driver virtio_iommu_drv
;
843 static int viommu_match_node(struct device
*dev
, const void *data
)
845 return dev
->parent
->fwnode
== data
;
848 static struct viommu_dev
*viommu_get_by_fwnode(struct fwnode_handle
*fwnode
)
850 struct device
*dev
= driver_find_device(&virtio_iommu_drv
.driver
, NULL
,
851 fwnode
, viommu_match_node
);
854 return dev
? dev_to_virtio(dev
)->priv
: NULL
;
857 static int viommu_add_device(struct device
*dev
)
860 struct iommu_group
*group
;
861 struct viommu_endpoint
*vdev
;
862 struct viommu_dev
*viommu
= NULL
;
863 struct iommu_fwspec
*fwspec
= dev_iommu_fwspec_get(dev
);
865 if (!fwspec
|| fwspec
->ops
!= &viommu_ops
)
868 viommu
= viommu_get_by_fwnode(fwspec
->iommu_fwnode
);
872 vdev
= kzalloc(sizeof(*vdev
), GFP_KERNEL
);
877 vdev
->viommu
= viommu
;
878 INIT_LIST_HEAD(&vdev
->resv_regions
);
879 fwspec
->iommu_priv
= vdev
;
881 if (viommu
->probe_size
) {
882 /* Get additional information for this endpoint */
883 ret
= viommu_probe_endpoint(viommu
, dev
);
888 ret
= iommu_device_link(&viommu
->iommu
, dev
);
893 * Last step creates a default domain and attaches to it. Everything
896 group
= iommu_group_get_for_dev(dev
);
898 ret
= PTR_ERR(group
);
902 iommu_group_put(group
);
904 return PTR_ERR_OR_ZERO(group
);
907 iommu_device_unlink(&viommu
->iommu
, dev
);
909 generic_iommu_put_resv_regions(dev
, &vdev
->resv_regions
);
915 static void viommu_remove_device(struct device
*dev
)
917 struct viommu_endpoint
*vdev
;
918 struct iommu_fwspec
*fwspec
= dev_iommu_fwspec_get(dev
);
920 if (!fwspec
|| fwspec
->ops
!= &viommu_ops
)
923 vdev
= fwspec
->iommu_priv
;
925 iommu_group_remove_device(dev
);
926 iommu_device_unlink(&vdev
->viommu
->iommu
, dev
);
927 generic_iommu_put_resv_regions(dev
, &vdev
->resv_regions
);
931 static struct iommu_group
*viommu_device_group(struct device
*dev
)
934 return pci_device_group(dev
);
936 return generic_device_group(dev
);
939 static int viommu_of_xlate(struct device
*dev
, struct of_phandle_args
*args
)
941 return iommu_fwspec_add_ids(dev
, args
->args
, 1);
944 static struct iommu_ops viommu_ops
= {
945 .domain_alloc
= viommu_domain_alloc
,
946 .domain_free
= viommu_domain_free
,
947 .attach_dev
= viommu_attach_dev
,
949 .unmap
= viommu_unmap
,
950 .iova_to_phys
= viommu_iova_to_phys
,
951 .iotlb_sync
= viommu_iotlb_sync
,
952 .add_device
= viommu_add_device
,
953 .remove_device
= viommu_remove_device
,
954 .device_group
= viommu_device_group
,
955 .get_resv_regions
= viommu_get_resv_regions
,
956 .put_resv_regions
= generic_iommu_put_resv_regions
,
957 .of_xlate
= viommu_of_xlate
,
960 static int viommu_init_vqs(struct viommu_dev
*viommu
)
962 struct virtio_device
*vdev
= dev_to_virtio(viommu
->dev
);
963 const char *names
[] = { "request", "event" };
964 vq_callback_t
*callbacks
[] = {
965 NULL
, /* No async requests */
966 viommu_event_handler
,
969 return virtio_find_vqs(vdev
, VIOMMU_NR_VQS
, viommu
->vqs
, callbacks
,
973 static int viommu_fill_evtq(struct viommu_dev
*viommu
)
976 struct scatterlist sg
[1];
977 struct viommu_event
*evts
;
978 struct virtqueue
*vq
= viommu
->vqs
[VIOMMU_EVENT_VQ
];
979 size_t nr_evts
= vq
->num_free
;
981 viommu
->evts
= evts
= devm_kmalloc_array(viommu
->dev
, nr_evts
,
982 sizeof(*evts
), GFP_KERNEL
);
986 for (i
= 0; i
< nr_evts
; i
++) {
987 sg_init_one(sg
, &evts
[i
], sizeof(*evts
));
988 ret
= virtqueue_add_inbuf(vq
, sg
, 1, &evts
[i
], GFP_KERNEL
);
996 static int viommu_probe(struct virtio_device
*vdev
)
998 struct device
*parent_dev
= vdev
->dev
.parent
;
999 struct viommu_dev
*viommu
= NULL
;
1000 struct device
*dev
= &vdev
->dev
;
1001 u64 input_start
= 0;
1002 u64 input_end
= -1UL;
1005 if (!virtio_has_feature(vdev
, VIRTIO_F_VERSION_1
) ||
1006 !virtio_has_feature(vdev
, VIRTIO_IOMMU_F_MAP_UNMAP
))
1009 viommu
= devm_kzalloc(dev
, sizeof(*viommu
), GFP_KERNEL
);
1013 spin_lock_init(&viommu
->request_lock
);
1014 ida_init(&viommu
->domain_ids
);
1016 viommu
->vdev
= vdev
;
1017 INIT_LIST_HEAD(&viommu
->requests
);
1019 ret
= viommu_init_vqs(viommu
);
1023 virtio_cread(vdev
, struct virtio_iommu_config
, page_size_mask
,
1024 &viommu
->pgsize_bitmap
);
1026 if (!viommu
->pgsize_bitmap
) {
1031 viommu
->map_flags
= VIRTIO_IOMMU_MAP_F_READ
| VIRTIO_IOMMU_MAP_F_WRITE
;
1032 viommu
->last_domain
= ~0U;
1034 /* Optional features */
1035 virtio_cread_feature(vdev
, VIRTIO_IOMMU_F_INPUT_RANGE
,
1036 struct virtio_iommu_config
, input_range
.start
,
1039 virtio_cread_feature(vdev
, VIRTIO_IOMMU_F_INPUT_RANGE
,
1040 struct virtio_iommu_config
, input_range
.end
,
1043 virtio_cread_feature(vdev
, VIRTIO_IOMMU_F_DOMAIN_RANGE
,
1044 struct virtio_iommu_config
, domain_range
.start
,
1045 &viommu
->first_domain
);
1047 virtio_cread_feature(vdev
, VIRTIO_IOMMU_F_DOMAIN_RANGE
,
1048 struct virtio_iommu_config
, domain_range
.end
,
1049 &viommu
->last_domain
);
1051 virtio_cread_feature(vdev
, VIRTIO_IOMMU_F_PROBE
,
1052 struct virtio_iommu_config
, probe_size
,
1053 &viommu
->probe_size
);
1055 viommu
->geometry
= (struct iommu_domain_geometry
) {
1056 .aperture_start
= input_start
,
1057 .aperture_end
= input_end
,
1058 .force_aperture
= true,
1061 if (virtio_has_feature(vdev
, VIRTIO_IOMMU_F_MMIO
))
1062 viommu
->map_flags
|= VIRTIO_IOMMU_MAP_F_MMIO
;
1064 viommu_ops
.pgsize_bitmap
= viommu
->pgsize_bitmap
;
1066 virtio_device_ready(vdev
);
1068 /* Populate the event queue with buffers */
1069 ret
= viommu_fill_evtq(viommu
);
1073 ret
= iommu_device_sysfs_add(&viommu
->iommu
, dev
, NULL
, "%s",
1074 virtio_bus_name(vdev
));
1078 iommu_device_set_ops(&viommu
->iommu
, &viommu_ops
);
1079 iommu_device_set_fwnode(&viommu
->iommu
, parent_dev
->fwnode
);
1081 iommu_device_register(&viommu
->iommu
);
1084 if (pci_bus_type
.iommu_ops
!= &viommu_ops
) {
1086 ret
= bus_set_iommu(&pci_bus_type
, &viommu_ops
);
1088 goto err_unregister
;
1091 #ifdef CONFIG_ARM_AMBA
1092 if (amba_bustype
.iommu_ops
!= &viommu_ops
) {
1093 ret
= bus_set_iommu(&amba_bustype
, &viommu_ops
);
1095 goto err_unregister
;
1098 if (platform_bus_type
.iommu_ops
!= &viommu_ops
) {
1099 ret
= bus_set_iommu(&platform_bus_type
, &viommu_ops
);
1101 goto err_unregister
;
1104 vdev
->priv
= viommu
;
1106 dev_info(dev
, "input address: %u bits\n",
1107 order_base_2(viommu
->geometry
.aperture_end
));
1108 dev_info(dev
, "page mask: %#llx\n", viommu
->pgsize_bitmap
);
1113 iommu_device_sysfs_remove(&viommu
->iommu
);
1114 iommu_device_unregister(&viommu
->iommu
);
1116 vdev
->config
->del_vqs(vdev
);
1121 static void viommu_remove(struct virtio_device
*vdev
)
1123 struct viommu_dev
*viommu
= vdev
->priv
;
1125 iommu_device_sysfs_remove(&viommu
->iommu
);
1126 iommu_device_unregister(&viommu
->iommu
);
1128 /* Stop all virtqueues */
1129 vdev
->config
->reset(vdev
);
1130 vdev
->config
->del_vqs(vdev
);
1132 dev_info(&vdev
->dev
, "device removed\n");
1135 static void viommu_config_changed(struct virtio_device
*vdev
)
1137 dev_warn(&vdev
->dev
, "config changed\n");
1140 static unsigned int features
[] = {
1141 VIRTIO_IOMMU_F_MAP_UNMAP
,
1142 VIRTIO_IOMMU_F_INPUT_RANGE
,
1143 VIRTIO_IOMMU_F_DOMAIN_RANGE
,
1144 VIRTIO_IOMMU_F_PROBE
,
1145 VIRTIO_IOMMU_F_MMIO
,
1148 static struct virtio_device_id id_table
[] = {
1149 { VIRTIO_ID_IOMMU
, VIRTIO_DEV_ANY_ID
},
1153 static struct virtio_driver virtio_iommu_drv
= {
1154 .driver
.name
= KBUILD_MODNAME
,
1155 .driver
.owner
= THIS_MODULE
,
1156 .id_table
= id_table
,
1157 .feature_table
= features
,
1158 .feature_table_size
= ARRAY_SIZE(features
),
1159 .probe
= viommu_probe
,
1160 .remove
= viommu_remove
,
1161 .config_changed
= viommu_config_changed
,
1164 module_virtio_driver(virtio_iommu_drv
);
1166 MODULE_DESCRIPTION("Virtio IOMMU driver");
1167 MODULE_AUTHOR("Jean-Philippe Brucker <jean-philippe.brucker@arm.com>");
1168 MODULE_LICENSE("GPL v2");