Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.8.
  1/*
  2 * Copyright (c) 2006, Intel Corporation.
  3 *
  4 * This program is free software; you can redistribute it and/or modify it
  5 * under the terms and conditions of the GNU General Public License,
  6 * version 2, as published by the Free Software Foundation.
  7 *
  8 * This program is distributed in the hope it will be useful, but WITHOUT
  9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 10 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 11 * more details.
 12 *
 13 * You should have received a copy of the GNU General Public License along with
 14 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
 15 * Place - Suite 330, Boston, MA 02111-1307 USA.
 16 *
 17 * Copyright (C) 2006-2008 Intel Corporation
 18 * Copyright IBM Corporation, 2008
 19 * Copyright 2010 Red Hat, Inc. and/or its affiliates.
 20 *
 21 * Author: Allen M. Kay <allen.m.kay@intel.com>
 22 * Author: Weidong Han <weidong.han@intel.com>
 23 * Author: Ben-Ami Yassour <benami@il.ibm.com>
 24 */
 25
 26#include <linux/list.h>
 27#include <linux/kvm_host.h>
 28#include <linux/module.h>
 29#include <linux/pci.h>
 30#include <linux/stat.h>
 31#include <linux/dmar.h>
 32#include <linux/iommu.h>
 33#include <linux/intel-iommu.h>
 34
 35static bool allow_unsafe_assigned_interrupts;
 36module_param_named(allow_unsafe_assigned_interrupts,
 37		   allow_unsafe_assigned_interrupts, bool, S_IRUGO | S_IWUSR);
 38MODULE_PARM_DESC(allow_unsafe_assigned_interrupts,
 39 "Enable device assignment on platforms without interrupt remapping support.");
 40
 41static int kvm_iommu_unmap_memslots(struct kvm *kvm);
 42static void kvm_iommu_put_pages(struct kvm *kvm,
 43				gfn_t base_gfn, unsigned long npages);
 44
 45static pfn_t kvm_pin_pages(struct kvm *kvm, struct kvm_memory_slot *slot,
 46			   gfn_t gfn, unsigned long size)
 47{
 48	gfn_t end_gfn;
 49	pfn_t pfn;
 50
 51	pfn     = gfn_to_pfn_memslot(kvm, slot, gfn);
 52	end_gfn = gfn + (size >> PAGE_SHIFT);
 53	gfn    += 1;
 54
 55	if (is_error_pfn(pfn))
 56		return pfn;
 57
 58	while (gfn < end_gfn)
 59		gfn_to_pfn_memslot(kvm, slot, gfn++);
 60
 61	return pfn;
 62}
 63
 64int kvm_iommu_map_pages(struct kvm *kvm, struct kvm_memory_slot *slot)
 65{
 66	gfn_t gfn, end_gfn;
 67	pfn_t pfn;
 68	int r = 0;
 69	struct iommu_domain *domain = kvm->arch.iommu_domain;
 70	int flags;
 71
 72	/* check if iommu exists and in use */
 73	if (!domain)
 74		return 0;
 75
 76	gfn     = slot->base_gfn;
 77	end_gfn = gfn + slot->npages;
 78
 79	flags = IOMMU_READ | IOMMU_WRITE;
 80	if (kvm->arch.iommu_flags & KVM_IOMMU_CACHE_COHERENCY)
 81		flags |= IOMMU_CACHE;
 82
 83
 84	while (gfn < end_gfn) {
 85		unsigned long page_size;
 86
 87		/* Check if already mapped */
 88		if (iommu_iova_to_phys(domain, gfn_to_gpa(gfn))) {
 89			gfn += 1;
 90			continue;
 91		}
 92
 93		/* Get the page size we could use to map */
 94		page_size = kvm_host_page_size(kvm, gfn);
 95
 96		/* Make sure the page_size does not exceed the memslot */
 97		while ((gfn + (page_size >> PAGE_SHIFT)) > end_gfn)
 98			page_size >>= 1;
 99
100		/* Make sure gfn is aligned to the page size we want to map */
101		while ((gfn << PAGE_SHIFT) & (page_size - 1))
102			page_size >>= 1;
103
104		/*
105		 * Pin all pages we are about to map in memory. This is
106		 * important because we unmap and unpin in 4kb steps later.
107		 */
108		pfn = kvm_pin_pages(kvm, slot, gfn, page_size);
109		if (is_error_pfn(pfn)) {
110			gfn += 1;
111			continue;
112		}
113
114		/* Map into IO address space */
115		r = iommu_map(domain, gfn_to_gpa(gfn), pfn_to_hpa(pfn),
116			      page_size, flags);
117		if (r) {
118			printk(KERN_ERR "kvm_iommu_map_address:"
119			       "iommu failed to map pfn=%llx\n", pfn);
120			goto unmap_pages;
121		}
122
123		gfn += page_size >> PAGE_SHIFT;
124
125
126	}
127
128	return 0;
129
130unmap_pages:
131	kvm_iommu_put_pages(kvm, slot->base_gfn, gfn);
132	return r;
133}
134
135static int kvm_iommu_map_memslots(struct kvm *kvm)
136{
137	int idx, r = 0;
138	struct kvm_memslots *slots;
139	struct kvm_memory_slot *memslot;
140
141	idx = srcu_read_lock(&kvm->srcu);
142	slots = kvm_memslots(kvm);
143
144	kvm_for_each_memslot(memslot, slots) {
145		r = kvm_iommu_map_pages(kvm, memslot);
146		if (r)
147			break;
148	}
149	srcu_read_unlock(&kvm->srcu, idx);
150
151	return r;
152}
153
154int kvm_assign_device(struct kvm *kvm,
155		      struct kvm_assigned_dev_kernel *assigned_dev)
156{
157	struct pci_dev *pdev = NULL;
158	struct iommu_domain *domain = kvm->arch.iommu_domain;
159	int r, last_flags;
160
161	/* check if iommu exists and in use */
162	if (!domain)
163		return 0;
164
165	pdev = assigned_dev->dev;
166	if (pdev == NULL)
167		return -ENODEV;
168
169	r = iommu_attach_device(domain, &pdev->dev);
170	if (r) {
171		printk(KERN_ERR "assign device %x:%x:%x.%x failed",
172			pci_domain_nr(pdev->bus),
173			pdev->bus->number,
174			PCI_SLOT(pdev->devfn),
175			PCI_FUNC(pdev->devfn));
176		return r;
177	}
178
179	last_flags = kvm->arch.iommu_flags;
180	if (iommu_domain_has_cap(kvm->arch.iommu_domain,
181				 IOMMU_CAP_CACHE_COHERENCY))
182		kvm->arch.iommu_flags |= KVM_IOMMU_CACHE_COHERENCY;
183
184	/* Check if need to update IOMMU page table for guest memory */
185	if ((last_flags ^ kvm->arch.iommu_flags) ==
186			KVM_IOMMU_CACHE_COHERENCY) {
187		kvm_iommu_unmap_memslots(kvm);
188		r = kvm_iommu_map_memslots(kvm);
189		if (r)
190			goto out_unmap;
191	}
192
193	pdev->dev_flags |= PCI_DEV_FLAGS_ASSIGNED;
194
195	printk(KERN_DEBUG "assign device %x:%x:%x.%x\n",
196		assigned_dev->host_segnr,
197		assigned_dev->host_busnr,
198		PCI_SLOT(assigned_dev->host_devfn),
199		PCI_FUNC(assigned_dev->host_devfn));
200
201	return 0;
202out_unmap:
203	kvm_iommu_unmap_memslots(kvm);
204	return r;
205}
206
207int kvm_deassign_device(struct kvm *kvm,
208			struct kvm_assigned_dev_kernel *assigned_dev)
209{
210	struct iommu_domain *domain = kvm->arch.iommu_domain;
211	struct pci_dev *pdev = NULL;
212
213	/* check if iommu exists and in use */
214	if (!domain)
215		return 0;
216
217	pdev = assigned_dev->dev;
218	if (pdev == NULL)
219		return -ENODEV;
220
221	iommu_detach_device(domain, &pdev->dev);
222
223	pdev->dev_flags &= ~PCI_DEV_FLAGS_ASSIGNED;
224
225	printk(KERN_DEBUG "deassign device %x:%x:%x.%x\n",
226		assigned_dev->host_segnr,
227		assigned_dev->host_busnr,
228		PCI_SLOT(assigned_dev->host_devfn),
229		PCI_FUNC(assigned_dev->host_devfn));
230
231	return 0;
232}
233
234int kvm_iommu_map_guest(struct kvm *kvm)
235{
236	int r;
237
238	if (!iommu_present(&pci_bus_type)) {
239		printk(KERN_ERR "%s: iommu not found\n", __func__);
240		return -ENODEV;
241	}
242
243	mutex_lock(&kvm->slots_lock);
244
245	kvm->arch.iommu_domain = iommu_domain_alloc(&pci_bus_type);
246	if (!kvm->arch.iommu_domain) {
247		r = -ENOMEM;
248		goto out_unlock;
249	}
250
251	if (!allow_unsafe_assigned_interrupts &&
252	    !iommu_domain_has_cap(kvm->arch.iommu_domain,
253				  IOMMU_CAP_INTR_REMAP)) {
254		printk(KERN_WARNING "%s: No interrupt remapping support,"
255		       " disallowing device assignment."
256		       " Re-enble with \"allow_unsafe_assigned_interrupts=1\""
257		       " module option.\n", __func__);
258		iommu_domain_free(kvm->arch.iommu_domain);
259		kvm->arch.iommu_domain = NULL;
260		r = -EPERM;
261		goto out_unlock;
262	}
263
264	r = kvm_iommu_map_memslots(kvm);
265	if (r)
266		kvm_iommu_unmap_memslots(kvm);
267
268out_unlock:
269	mutex_unlock(&kvm->slots_lock);
270	return r;
271}
272
273static void kvm_unpin_pages(struct kvm *kvm, pfn_t pfn, unsigned long npages)
274{
275	unsigned long i;
276
277	for (i = 0; i < npages; ++i)
278		kvm_release_pfn_clean(pfn + i);
279}
280
281static void kvm_iommu_put_pages(struct kvm *kvm,
282				gfn_t base_gfn, unsigned long npages)
283{
284	struct iommu_domain *domain;
285	gfn_t end_gfn, gfn;
286	pfn_t pfn;
287	u64 phys;
288
289	domain  = kvm->arch.iommu_domain;
290	end_gfn = base_gfn + npages;
291	gfn     = base_gfn;
292
293	/* check if iommu exists and in use */
294	if (!domain)
295		return;
296
297	while (gfn < end_gfn) {
298		unsigned long unmap_pages;
299		size_t size;
300
301		/* Get physical address */
302		phys = iommu_iova_to_phys(domain, gfn_to_gpa(gfn));
303		pfn  = phys >> PAGE_SHIFT;
304
305		/* Unmap address from IO address space */
306		size       = iommu_unmap(domain, gfn_to_gpa(gfn), PAGE_SIZE);
307		unmap_pages = 1ULL << get_order(size);
308
309		/* Unpin all pages we just unmapped to not leak any memory */
310		kvm_unpin_pages(kvm, pfn, unmap_pages);
311
312		gfn += unmap_pages;
313	}
314}
315
316void kvm_iommu_unmap_pages(struct kvm *kvm, struct kvm_memory_slot *slot)
317{
318	kvm_iommu_put_pages(kvm, slot->base_gfn, slot->npages);
319}
320
321static int kvm_iommu_unmap_memslots(struct kvm *kvm)
322{
323	int idx;
324	struct kvm_memslots *slots;
325	struct kvm_memory_slot *memslot;
326
327	idx = srcu_read_lock(&kvm->srcu);
328	slots = kvm_memslots(kvm);
329
330	kvm_for_each_memslot(memslot, slots)
331		kvm_iommu_unmap_pages(kvm, memslot);
332
333	srcu_read_unlock(&kvm->srcu, idx);
334
335	return 0;
336}
337
338int kvm_iommu_unmap_guest(struct kvm *kvm)
339{
340	struct iommu_domain *domain = kvm->arch.iommu_domain;
341
342	/* check if iommu exists and in use */
343	if (!domain)
344		return 0;
345
346	mutex_lock(&kvm->slots_lock);
347	kvm_iommu_unmap_memslots(kvm);
348	kvm->arch.iommu_domain = NULL;
349	mutex_unlock(&kvm->slots_lock);
350
351	iommu_domain_free(domain);
352	return 0;
353}