1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * IOMMU API for s390 PCI devices
4  *
5  * Copyright IBM Corp. 2015
6  * Author(s): Gerald Schaefer <gerald.schaefer@de.ibm.com>
7  */
8 
9 #include <linux/pci.h>
10 #include <linux/iommu.h>
11 #include <linux/iommu-helper.h>
12 #include <linux/sizes.h>
13 #include <linux/rculist.h>
14 #include <linux/rcupdate.h>
15 #include <asm/pci_dma.h>
16 
17 #include "dma-iommu.h"
18 
19 static const struct iommu_ops s390_iommu_ops;
20 
21 static struct kmem_cache *dma_region_table_cache;
22 static struct kmem_cache *dma_page_table_cache;
23 
24 static u64 s390_iommu_aperture;
25 static u32 s390_iommu_aperture_factor = 1;
26 
27 struct s390_domain {
28 	struct iommu_domain	domain;
29 	struct list_head	devices;
30 	struct zpci_iommu_ctrs	ctrs;
31 	unsigned long		*dma_table;
32 	spinlock_t		list_lock;
33 	struct rcu_head		rcu;
34 };
35 
calc_rtx(dma_addr_t ptr)36 static inline unsigned int calc_rtx(dma_addr_t ptr)
37 {
38 	return ((unsigned long)ptr >> ZPCI_RT_SHIFT) & ZPCI_INDEX_MASK;
39 }
40 
calc_sx(dma_addr_t ptr)41 static inline unsigned int calc_sx(dma_addr_t ptr)
42 {
43 	return ((unsigned long)ptr >> ZPCI_ST_SHIFT) & ZPCI_INDEX_MASK;
44 }
45 
calc_px(dma_addr_t ptr)46 static inline unsigned int calc_px(dma_addr_t ptr)
47 {
48 	return ((unsigned long)ptr >> PAGE_SHIFT) & ZPCI_PT_MASK;
49 }
50 
set_pt_pfaa(unsigned long * entry,phys_addr_t pfaa)51 static inline void set_pt_pfaa(unsigned long *entry, phys_addr_t pfaa)
52 {
53 	*entry &= ZPCI_PTE_FLAG_MASK;
54 	*entry |= (pfaa & ZPCI_PTE_ADDR_MASK);
55 }
56 
set_rt_sto(unsigned long * entry,phys_addr_t sto)57 static inline void set_rt_sto(unsigned long *entry, phys_addr_t sto)
58 {
59 	*entry &= ZPCI_RTE_FLAG_MASK;
60 	*entry |= (sto & ZPCI_RTE_ADDR_MASK);
61 	*entry |= ZPCI_TABLE_TYPE_RTX;
62 }
63 
set_st_pto(unsigned long * entry,phys_addr_t pto)64 static inline void set_st_pto(unsigned long *entry, phys_addr_t pto)
65 {
66 	*entry &= ZPCI_STE_FLAG_MASK;
67 	*entry |= (pto & ZPCI_STE_ADDR_MASK);
68 	*entry |= ZPCI_TABLE_TYPE_SX;
69 }
70 
validate_rt_entry(unsigned long * entry)71 static inline void validate_rt_entry(unsigned long *entry)
72 {
73 	*entry &= ~ZPCI_TABLE_VALID_MASK;
74 	*entry &= ~ZPCI_TABLE_OFFSET_MASK;
75 	*entry |= ZPCI_TABLE_VALID;
76 	*entry |= ZPCI_TABLE_LEN_RTX;
77 }
78 
validate_st_entry(unsigned long * entry)79 static inline void validate_st_entry(unsigned long *entry)
80 {
81 	*entry &= ~ZPCI_TABLE_VALID_MASK;
82 	*entry |= ZPCI_TABLE_VALID;
83 }
84 
invalidate_pt_entry(unsigned long * entry)85 static inline void invalidate_pt_entry(unsigned long *entry)
86 {
87 	WARN_ON_ONCE((*entry & ZPCI_PTE_VALID_MASK) == ZPCI_PTE_INVALID);
88 	*entry &= ~ZPCI_PTE_VALID_MASK;
89 	*entry |= ZPCI_PTE_INVALID;
90 }
91 
validate_pt_entry(unsigned long * entry)92 static inline void validate_pt_entry(unsigned long *entry)
93 {
94 	WARN_ON_ONCE((*entry & ZPCI_PTE_VALID_MASK) == ZPCI_PTE_VALID);
95 	*entry &= ~ZPCI_PTE_VALID_MASK;
96 	*entry |= ZPCI_PTE_VALID;
97 }
98 
entry_set_protected(unsigned long * entry)99 static inline void entry_set_protected(unsigned long *entry)
100 {
101 	*entry &= ~ZPCI_TABLE_PROT_MASK;
102 	*entry |= ZPCI_TABLE_PROTECTED;
103 }
104 
entry_clr_protected(unsigned long * entry)105 static inline void entry_clr_protected(unsigned long *entry)
106 {
107 	*entry &= ~ZPCI_TABLE_PROT_MASK;
108 	*entry |= ZPCI_TABLE_UNPROTECTED;
109 }
110 
reg_entry_isvalid(unsigned long entry)111 static inline int reg_entry_isvalid(unsigned long entry)
112 {
113 	return (entry & ZPCI_TABLE_VALID_MASK) == ZPCI_TABLE_VALID;
114 }
115 
pt_entry_isvalid(unsigned long entry)116 static inline int pt_entry_isvalid(unsigned long entry)
117 {
118 	return (entry & ZPCI_PTE_VALID_MASK) == ZPCI_PTE_VALID;
119 }
120 
get_rt_sto(unsigned long entry)121 static inline unsigned long *get_rt_sto(unsigned long entry)
122 {
123 	if ((entry & ZPCI_TABLE_TYPE_MASK) == ZPCI_TABLE_TYPE_RTX)
124 		return phys_to_virt(entry & ZPCI_RTE_ADDR_MASK);
125 	else
126 		return NULL;
127 }
128 
get_st_pto(unsigned long entry)129 static inline unsigned long *get_st_pto(unsigned long entry)
130 {
131 	if ((entry & ZPCI_TABLE_TYPE_MASK) == ZPCI_TABLE_TYPE_SX)
132 		return phys_to_virt(entry & ZPCI_STE_ADDR_MASK);
133 	else
134 		return NULL;
135 }
136 
dma_alloc_cpu_table_caches(void)137 static int __init dma_alloc_cpu_table_caches(void)
138 {
139 	dma_region_table_cache = kmem_cache_create("PCI_DMA_region_tables",
140 						   ZPCI_TABLE_SIZE,
141 						   ZPCI_TABLE_ALIGN,
142 						   0, NULL);
143 	if (!dma_region_table_cache)
144 		return -ENOMEM;
145 
146 	dma_page_table_cache = kmem_cache_create("PCI_DMA_page_tables",
147 						 ZPCI_PT_SIZE,
148 						 ZPCI_PT_ALIGN,
149 						 0, NULL);
150 	if (!dma_page_table_cache) {
151 		kmem_cache_destroy(dma_region_table_cache);
152 		return -ENOMEM;
153 	}
154 	return 0;
155 }
156 
dma_alloc_cpu_table(gfp_t gfp)157 static unsigned long *dma_alloc_cpu_table(gfp_t gfp)
158 {
159 	unsigned long *table, *entry;
160 
161 	table = kmem_cache_alloc(dma_region_table_cache, gfp);
162 	if (!table)
163 		return NULL;
164 
165 	for (entry = table; entry < table + ZPCI_TABLE_ENTRIES; entry++)
166 		*entry = ZPCI_TABLE_INVALID;
167 	return table;
168 }
169 
dma_free_cpu_table(void * table)170 static void dma_free_cpu_table(void *table)
171 {
172 	kmem_cache_free(dma_region_table_cache, table);
173 }
174 
dma_free_page_table(void * table)175 static void dma_free_page_table(void *table)
176 {
177 	kmem_cache_free(dma_page_table_cache, table);
178 }
179 
dma_free_seg_table(unsigned long entry)180 static void dma_free_seg_table(unsigned long entry)
181 {
182 	unsigned long *sto = get_rt_sto(entry);
183 	int sx;
184 
185 	for (sx = 0; sx < ZPCI_TABLE_ENTRIES; sx++)
186 		if (reg_entry_isvalid(sto[sx]))
187 			dma_free_page_table(get_st_pto(sto[sx]));
188 
189 	dma_free_cpu_table(sto);
190 }
191 
dma_cleanup_tables(unsigned long * table)192 static void dma_cleanup_tables(unsigned long *table)
193 {
194 	int rtx;
195 
196 	if (!table)
197 		return;
198 
199 	for (rtx = 0; rtx < ZPCI_TABLE_ENTRIES; rtx++)
200 		if (reg_entry_isvalid(table[rtx]))
201 			dma_free_seg_table(table[rtx]);
202 
203 	dma_free_cpu_table(table);
204 }
205 
dma_alloc_page_table(gfp_t gfp)206 static unsigned long *dma_alloc_page_table(gfp_t gfp)
207 {
208 	unsigned long *table, *entry;
209 
210 	table = kmem_cache_alloc(dma_page_table_cache, gfp);
211 	if (!table)
212 		return NULL;
213 
214 	for (entry = table; entry < table + ZPCI_PT_ENTRIES; entry++)
215 		*entry = ZPCI_PTE_INVALID;
216 	return table;
217 }
218 
dma_get_seg_table_origin(unsigned long * rtep,gfp_t gfp)219 static unsigned long *dma_get_seg_table_origin(unsigned long *rtep, gfp_t gfp)
220 {
221 	unsigned long old_rte, rte;
222 	unsigned long *sto;
223 
224 	rte = READ_ONCE(*rtep);
225 	if (reg_entry_isvalid(rte)) {
226 		sto = get_rt_sto(rte);
227 	} else {
228 		sto = dma_alloc_cpu_table(gfp);
229 		if (!sto)
230 			return NULL;
231 
232 		set_rt_sto(&rte, virt_to_phys(sto));
233 		validate_rt_entry(&rte);
234 		entry_clr_protected(&rte);
235 
236 		old_rte = cmpxchg(rtep, ZPCI_TABLE_INVALID, rte);
237 		if (old_rte != ZPCI_TABLE_INVALID) {
238 			/* Somone else was faster, use theirs */
239 			dma_free_cpu_table(sto);
240 			sto = get_rt_sto(old_rte);
241 		}
242 	}
243 	return sto;
244 }
245 
dma_get_page_table_origin(unsigned long * step,gfp_t gfp)246 static unsigned long *dma_get_page_table_origin(unsigned long *step, gfp_t gfp)
247 {
248 	unsigned long old_ste, ste;
249 	unsigned long *pto;
250 
251 	ste = READ_ONCE(*step);
252 	if (reg_entry_isvalid(ste)) {
253 		pto = get_st_pto(ste);
254 	} else {
255 		pto = dma_alloc_page_table(gfp);
256 		if (!pto)
257 			return NULL;
258 		set_st_pto(&ste, virt_to_phys(pto));
259 		validate_st_entry(&ste);
260 		entry_clr_protected(&ste);
261 
262 		old_ste = cmpxchg(step, ZPCI_TABLE_INVALID, ste);
263 		if (old_ste != ZPCI_TABLE_INVALID) {
264 			/* Somone else was faster, use theirs */
265 			dma_free_page_table(pto);
266 			pto = get_st_pto(old_ste);
267 		}
268 	}
269 	return pto;
270 }
271 
dma_walk_cpu_trans(unsigned long * rto,dma_addr_t dma_addr,gfp_t gfp)272 static unsigned long *dma_walk_cpu_trans(unsigned long *rto, dma_addr_t dma_addr, gfp_t gfp)
273 {
274 	unsigned long *sto, *pto;
275 	unsigned int rtx, sx, px;
276 
277 	rtx = calc_rtx(dma_addr);
278 	sto = dma_get_seg_table_origin(&rto[rtx], gfp);
279 	if (!sto)
280 		return NULL;
281 
282 	sx = calc_sx(dma_addr);
283 	pto = dma_get_page_table_origin(&sto[sx], gfp);
284 	if (!pto)
285 		return NULL;
286 
287 	px = calc_px(dma_addr);
288 	return &pto[px];
289 }
290 
dma_update_cpu_trans(unsigned long * ptep,phys_addr_t page_addr,int flags)291 static void dma_update_cpu_trans(unsigned long *ptep, phys_addr_t page_addr, int flags)
292 {
293 	unsigned long pte;
294 
295 	pte = READ_ONCE(*ptep);
296 	if (flags & ZPCI_PTE_INVALID) {
297 		invalidate_pt_entry(&pte);
298 	} else {
299 		set_pt_pfaa(&pte, page_addr);
300 		validate_pt_entry(&pte);
301 	}
302 
303 	if (flags & ZPCI_TABLE_PROTECTED)
304 		entry_set_protected(&pte);
305 	else
306 		entry_clr_protected(&pte);
307 
308 	xchg(ptep, pte);
309 }
310 
to_s390_domain(struct iommu_domain * dom)311 static struct s390_domain *to_s390_domain(struct iommu_domain *dom)
312 {
313 	return container_of(dom, struct s390_domain, domain);
314 }
315 
s390_iommu_capable(struct device * dev,enum iommu_cap cap)316 static bool s390_iommu_capable(struct device *dev, enum iommu_cap cap)
317 {
318 	struct zpci_dev *zdev = to_zpci_dev(dev);
319 
320 	switch (cap) {
321 	case IOMMU_CAP_CACHE_COHERENCY:
322 		return true;
323 	case IOMMU_CAP_DEFERRED_FLUSH:
324 		return zdev->pft != PCI_FUNC_TYPE_ISM;
325 	default:
326 		return false;
327 	}
328 }
329 
s390_domain_alloc_paging(struct device * dev)330 static struct iommu_domain *s390_domain_alloc_paging(struct device *dev)
331 {
332 	struct s390_domain *s390_domain;
333 
334 	s390_domain = kzalloc(sizeof(*s390_domain), GFP_KERNEL);
335 	if (!s390_domain)
336 		return NULL;
337 
338 	s390_domain->dma_table = dma_alloc_cpu_table(GFP_KERNEL);
339 	if (!s390_domain->dma_table) {
340 		kfree(s390_domain);
341 		return NULL;
342 	}
343 	s390_domain->domain.geometry.force_aperture = true;
344 	s390_domain->domain.geometry.aperture_start = 0;
345 	s390_domain->domain.geometry.aperture_end = ZPCI_TABLE_SIZE_RT - 1;
346 
347 	spin_lock_init(&s390_domain->list_lock);
348 	INIT_LIST_HEAD_RCU(&s390_domain->devices);
349 
350 	return &s390_domain->domain;
351 }
352 
s390_iommu_rcu_free_domain(struct rcu_head * head)353 static void s390_iommu_rcu_free_domain(struct rcu_head *head)
354 {
355 	struct s390_domain *s390_domain = container_of(head, struct s390_domain, rcu);
356 
357 	dma_cleanup_tables(s390_domain->dma_table);
358 	kfree(s390_domain);
359 }
360 
s390_domain_free(struct iommu_domain * domain)361 static void s390_domain_free(struct iommu_domain *domain)
362 {
363 	struct s390_domain *s390_domain = to_s390_domain(domain);
364 
365 	rcu_read_lock();
366 	WARN_ON(!list_empty(&s390_domain->devices));
367 	rcu_read_unlock();
368 
369 	call_rcu(&s390_domain->rcu, s390_iommu_rcu_free_domain);
370 }
371 
s390_iommu_detach_device(struct iommu_domain * domain,struct device * dev)372 static void s390_iommu_detach_device(struct iommu_domain *domain,
373 				     struct device *dev)
374 {
375 	struct s390_domain *s390_domain = to_s390_domain(domain);
376 	struct zpci_dev *zdev = to_zpci_dev(dev);
377 	unsigned long flags;
378 
379 	spin_lock_irqsave(&s390_domain->list_lock, flags);
380 	list_del_rcu(&zdev->iommu_list);
381 	spin_unlock_irqrestore(&s390_domain->list_lock, flags);
382 
383 	zpci_unregister_ioat(zdev, 0);
384 	zdev->s390_domain = NULL;
385 	zdev->dma_table = NULL;
386 }
387 
s390_iommu_attach_device(struct iommu_domain * domain,struct device * dev)388 static int s390_iommu_attach_device(struct iommu_domain *domain,
389 				    struct device *dev)
390 {
391 	struct s390_domain *s390_domain = to_s390_domain(domain);
392 	struct zpci_dev *zdev = to_zpci_dev(dev);
393 	unsigned long flags;
394 	u8 status;
395 	int cc;
396 
397 	if (!zdev)
398 		return -ENODEV;
399 
400 	if (WARN_ON(domain->geometry.aperture_start > zdev->end_dma ||
401 		domain->geometry.aperture_end < zdev->start_dma))
402 		return -EINVAL;
403 
404 	if (zdev->s390_domain)
405 		s390_iommu_detach_device(&zdev->s390_domain->domain, dev);
406 
407 	cc = zpci_register_ioat(zdev, 0, zdev->start_dma, zdev->end_dma,
408 				virt_to_phys(s390_domain->dma_table), &status);
409 	/*
410 	 * If the device is undergoing error recovery the reset code
411 	 * will re-establish the new domain.
412 	 */
413 	if (cc && status != ZPCI_PCI_ST_FUNC_NOT_AVAIL)
414 		return -EIO;
415 
416 	zdev->dma_table = s390_domain->dma_table;
417 	zdev->s390_domain = s390_domain;
418 
419 	spin_lock_irqsave(&s390_domain->list_lock, flags);
420 	list_add_rcu(&zdev->iommu_list, &s390_domain->devices);
421 	spin_unlock_irqrestore(&s390_domain->list_lock, flags);
422 
423 	return 0;
424 }
425 
s390_iommu_get_resv_regions(struct device * dev,struct list_head * list)426 static void s390_iommu_get_resv_regions(struct device *dev,
427 					struct list_head *list)
428 {
429 	struct zpci_dev *zdev = to_zpci_dev(dev);
430 	struct iommu_resv_region *region;
431 
432 	if (zdev->start_dma) {
433 		region = iommu_alloc_resv_region(0, zdev->start_dma, 0,
434 						 IOMMU_RESV_RESERVED, GFP_KERNEL);
435 		if (!region)
436 			return;
437 		list_add_tail(&region->list, list);
438 	}
439 
440 	if (zdev->end_dma < ZPCI_TABLE_SIZE_RT - 1) {
441 		region = iommu_alloc_resv_region(zdev->end_dma + 1,
442 						 ZPCI_TABLE_SIZE_RT - zdev->end_dma - 1,
443 						 0, IOMMU_RESV_RESERVED, GFP_KERNEL);
444 		if (!region)
445 			return;
446 		list_add_tail(&region->list, list);
447 	}
448 }
449 
s390_iommu_probe_device(struct device * dev)450 static struct iommu_device *s390_iommu_probe_device(struct device *dev)
451 {
452 	struct zpci_dev *zdev;
453 
454 	if (!dev_is_pci(dev))
455 		return ERR_PTR(-ENODEV);
456 
457 	zdev = to_zpci_dev(dev);
458 
459 	if (zdev->start_dma > zdev->end_dma ||
460 	    zdev->start_dma > ZPCI_TABLE_SIZE_RT - 1)
461 		return ERR_PTR(-EINVAL);
462 
463 	if (zdev->end_dma > ZPCI_TABLE_SIZE_RT - 1)
464 		zdev->end_dma = ZPCI_TABLE_SIZE_RT - 1;
465 
466 	if (zdev->tlb_refresh)
467 		dev->iommu->shadow_on_flush = 1;
468 
469 	return &zdev->iommu_dev;
470 }
471 
s390_iommu_release_device(struct device * dev)472 static void s390_iommu_release_device(struct device *dev)
473 {
474 	struct zpci_dev *zdev = to_zpci_dev(dev);
475 
476 	/*
477 	 * release_device is expected to detach any domain currently attached
478 	 * to the device, but keep it attached to other devices in the group.
479 	 */
480 	if (zdev)
481 		s390_iommu_detach_device(&zdev->s390_domain->domain, dev);
482 }
483 
zpci_refresh_all(struct zpci_dev * zdev)484 static int zpci_refresh_all(struct zpci_dev *zdev)
485 {
486 	return zpci_refresh_trans((u64)zdev->fh << 32, zdev->start_dma,
487 				  zdev->end_dma - zdev->start_dma + 1);
488 }
489 
s390_iommu_flush_iotlb_all(struct iommu_domain * domain)490 static void s390_iommu_flush_iotlb_all(struct iommu_domain *domain)
491 {
492 	struct s390_domain *s390_domain = to_s390_domain(domain);
493 	struct zpci_dev *zdev;
494 
495 	rcu_read_lock();
496 	list_for_each_entry_rcu(zdev, &s390_domain->devices, iommu_list) {
497 		atomic64_inc(&s390_domain->ctrs.global_rpcits);
498 		zpci_refresh_all(zdev);
499 	}
500 	rcu_read_unlock();
501 }
502 
s390_iommu_iotlb_sync(struct iommu_domain * domain,struct iommu_iotlb_gather * gather)503 static void s390_iommu_iotlb_sync(struct iommu_domain *domain,
504 				  struct iommu_iotlb_gather *gather)
505 {
506 	struct s390_domain *s390_domain = to_s390_domain(domain);
507 	size_t size = gather->end - gather->start + 1;
508 	struct zpci_dev *zdev;
509 
510 	/* If gather was never added to there is nothing to flush */
511 	if (!gather->end)
512 		return;
513 
514 	rcu_read_lock();
515 	list_for_each_entry_rcu(zdev, &s390_domain->devices, iommu_list) {
516 		atomic64_inc(&s390_domain->ctrs.sync_rpcits);
517 		zpci_refresh_trans((u64)zdev->fh << 32, gather->start,
518 				   size);
519 	}
520 	rcu_read_unlock();
521 }
522 
s390_iommu_iotlb_sync_map(struct iommu_domain * domain,unsigned long iova,size_t size)523 static int s390_iommu_iotlb_sync_map(struct iommu_domain *domain,
524 				     unsigned long iova, size_t size)
525 {
526 	struct s390_domain *s390_domain = to_s390_domain(domain);
527 	struct zpci_dev *zdev;
528 	int ret = 0;
529 
530 	rcu_read_lock();
531 	list_for_each_entry_rcu(zdev, &s390_domain->devices, iommu_list) {
532 		if (!zdev->tlb_refresh)
533 			continue;
534 		atomic64_inc(&s390_domain->ctrs.sync_map_rpcits);
535 		ret = zpci_refresh_trans((u64)zdev->fh << 32,
536 					 iova, size);
537 		/*
538 		 * let the hypervisor discover invalidated entries
539 		 * allowing it to free IOVAs and unpin pages
540 		 */
541 		if (ret == -ENOMEM) {
542 			ret = zpci_refresh_all(zdev);
543 			if (ret)
544 				break;
545 		}
546 	}
547 	rcu_read_unlock();
548 
549 	return ret;
550 }
551 
s390_iommu_validate_trans(struct s390_domain * s390_domain,phys_addr_t pa,dma_addr_t dma_addr,unsigned long nr_pages,int flags,gfp_t gfp)552 static int s390_iommu_validate_trans(struct s390_domain *s390_domain,
553 				     phys_addr_t pa, dma_addr_t dma_addr,
554 				     unsigned long nr_pages, int flags,
555 				     gfp_t gfp)
556 {
557 	phys_addr_t page_addr = pa & PAGE_MASK;
558 	unsigned long *entry;
559 	unsigned long i;
560 	int rc;
561 
562 	for (i = 0; i < nr_pages; i++) {
563 		entry = dma_walk_cpu_trans(s390_domain->dma_table, dma_addr,
564 					   gfp);
565 		if (unlikely(!entry)) {
566 			rc = -ENOMEM;
567 			goto undo_cpu_trans;
568 		}
569 		dma_update_cpu_trans(entry, page_addr, flags);
570 		page_addr += PAGE_SIZE;
571 		dma_addr += PAGE_SIZE;
572 	}
573 
574 	return 0;
575 
576 undo_cpu_trans:
577 	while (i-- > 0) {
578 		dma_addr -= PAGE_SIZE;
579 		entry = dma_walk_cpu_trans(s390_domain->dma_table,
580 					   dma_addr, gfp);
581 		if (!entry)
582 			break;
583 		dma_update_cpu_trans(entry, 0, ZPCI_PTE_INVALID);
584 	}
585 
586 	return rc;
587 }
588 
s390_iommu_invalidate_trans(struct s390_domain * s390_domain,dma_addr_t dma_addr,unsigned long nr_pages)589 static int s390_iommu_invalidate_trans(struct s390_domain *s390_domain,
590 				       dma_addr_t dma_addr, unsigned long nr_pages)
591 {
592 	unsigned long *entry;
593 	unsigned long i;
594 	int rc = 0;
595 
596 	for (i = 0; i < nr_pages; i++) {
597 		entry = dma_walk_cpu_trans(s390_domain->dma_table, dma_addr,
598 					   GFP_ATOMIC);
599 		if (unlikely(!entry)) {
600 			rc = -EINVAL;
601 			break;
602 		}
603 		dma_update_cpu_trans(entry, 0, ZPCI_PTE_INVALID);
604 		dma_addr += PAGE_SIZE;
605 	}
606 
607 	return rc;
608 }
609 
s390_iommu_map_pages(struct iommu_domain * domain,unsigned long iova,phys_addr_t paddr,size_t pgsize,size_t pgcount,int prot,gfp_t gfp,size_t * mapped)610 static int s390_iommu_map_pages(struct iommu_domain *domain,
611 				unsigned long iova, phys_addr_t paddr,
612 				size_t pgsize, size_t pgcount,
613 				int prot, gfp_t gfp, size_t *mapped)
614 {
615 	struct s390_domain *s390_domain = to_s390_domain(domain);
616 	size_t size = pgcount << __ffs(pgsize);
617 	int flags = ZPCI_PTE_VALID, rc = 0;
618 
619 	if (pgsize != SZ_4K)
620 		return -EINVAL;
621 
622 	if (iova < s390_domain->domain.geometry.aperture_start ||
623 	    (iova + size - 1) > s390_domain->domain.geometry.aperture_end)
624 		return -EINVAL;
625 
626 	if (!IS_ALIGNED(iova | paddr, pgsize))
627 		return -EINVAL;
628 
629 	if (!(prot & IOMMU_WRITE))
630 		flags |= ZPCI_TABLE_PROTECTED;
631 
632 	rc = s390_iommu_validate_trans(s390_domain, paddr, iova,
633 				     pgcount, flags, gfp);
634 	if (!rc) {
635 		*mapped = size;
636 		atomic64_add(pgcount, &s390_domain->ctrs.mapped_pages);
637 	}
638 
639 	return rc;
640 }
641 
s390_iommu_iova_to_phys(struct iommu_domain * domain,dma_addr_t iova)642 static phys_addr_t s390_iommu_iova_to_phys(struct iommu_domain *domain,
643 					   dma_addr_t iova)
644 {
645 	struct s390_domain *s390_domain = to_s390_domain(domain);
646 	unsigned long *rto, *sto, *pto;
647 	unsigned long ste, pte, rte;
648 	unsigned int rtx, sx, px;
649 	phys_addr_t phys = 0;
650 
651 	if (iova < domain->geometry.aperture_start ||
652 	    iova > domain->geometry.aperture_end)
653 		return 0;
654 
655 	rtx = calc_rtx(iova);
656 	sx = calc_sx(iova);
657 	px = calc_px(iova);
658 	rto = s390_domain->dma_table;
659 
660 	rte = READ_ONCE(rto[rtx]);
661 	if (reg_entry_isvalid(rte)) {
662 		sto = get_rt_sto(rte);
663 		ste = READ_ONCE(sto[sx]);
664 		if (reg_entry_isvalid(ste)) {
665 			pto = get_st_pto(ste);
666 			pte = READ_ONCE(pto[px]);
667 			if (pt_entry_isvalid(pte))
668 				phys = pte & ZPCI_PTE_ADDR_MASK;
669 		}
670 	}
671 
672 	return phys;
673 }
674 
s390_iommu_unmap_pages(struct iommu_domain * domain,unsigned long iova,size_t pgsize,size_t pgcount,struct iommu_iotlb_gather * gather)675 static size_t s390_iommu_unmap_pages(struct iommu_domain *domain,
676 				     unsigned long iova,
677 				     size_t pgsize, size_t pgcount,
678 				     struct iommu_iotlb_gather *gather)
679 {
680 	struct s390_domain *s390_domain = to_s390_domain(domain);
681 	size_t size = pgcount << __ffs(pgsize);
682 	int rc;
683 
684 	if (WARN_ON(iova < s390_domain->domain.geometry.aperture_start ||
685 	    (iova + size - 1) > s390_domain->domain.geometry.aperture_end))
686 		return 0;
687 
688 	rc = s390_iommu_invalidate_trans(s390_domain, iova, pgcount);
689 	if (rc)
690 		return 0;
691 
692 	iommu_iotlb_gather_add_range(gather, iova, size);
693 	atomic64_add(pgcount, &s390_domain->ctrs.unmapped_pages);
694 
695 	return size;
696 }
697 
zpci_get_iommu_ctrs(struct zpci_dev * zdev)698 struct zpci_iommu_ctrs *zpci_get_iommu_ctrs(struct zpci_dev *zdev)
699 {
700 	if (!zdev || !zdev->s390_domain)
701 		return NULL;
702 	return &zdev->s390_domain->ctrs;
703 }
704 
zpci_init_iommu(struct zpci_dev * zdev)705 int zpci_init_iommu(struct zpci_dev *zdev)
706 {
707 	u64 aperture_size;
708 	int rc = 0;
709 
710 	rc = iommu_device_sysfs_add(&zdev->iommu_dev, NULL, NULL,
711 				    "s390-iommu.%08x", zdev->fid);
712 	if (rc)
713 		goto out_err;
714 
715 	rc = iommu_device_register(&zdev->iommu_dev, &s390_iommu_ops, NULL);
716 	if (rc)
717 		goto out_sysfs;
718 
719 	zdev->start_dma = PAGE_ALIGN(zdev->start_dma);
720 	aperture_size = min3(s390_iommu_aperture,
721 			     ZPCI_TABLE_SIZE_RT - zdev->start_dma,
722 			     zdev->end_dma - zdev->start_dma + 1);
723 	zdev->end_dma = zdev->start_dma + aperture_size - 1;
724 
725 	return 0;
726 
727 out_sysfs:
728 	iommu_device_sysfs_remove(&zdev->iommu_dev);
729 
730 out_err:
731 	return rc;
732 }
733 
zpci_destroy_iommu(struct zpci_dev * zdev)734 void zpci_destroy_iommu(struct zpci_dev *zdev)
735 {
736 	iommu_device_unregister(&zdev->iommu_dev);
737 	iommu_device_sysfs_remove(&zdev->iommu_dev);
738 }
739 
s390_iommu_setup(char * str)740 static int __init s390_iommu_setup(char *str)
741 {
742 	if (!strcmp(str, "strict")) {
743 		pr_warn("s390_iommu=strict deprecated; use iommu.strict=1 instead\n");
744 		iommu_set_dma_strict();
745 	}
746 	return 1;
747 }
748 
749 __setup("s390_iommu=", s390_iommu_setup);
750 
s390_iommu_aperture_setup(char * str)751 static int __init s390_iommu_aperture_setup(char *str)
752 {
753 	if (kstrtou32(str, 10, &s390_iommu_aperture_factor))
754 		s390_iommu_aperture_factor = 1;
755 	return 1;
756 }
757 
758 __setup("s390_iommu_aperture=", s390_iommu_aperture_setup);
759 
s390_iommu_init(void)760 static int __init s390_iommu_init(void)
761 {
762 	int rc;
763 
764 	iommu_dma_forcedac = true;
765 	s390_iommu_aperture = (u64)virt_to_phys(high_memory);
766 	if (!s390_iommu_aperture_factor)
767 		s390_iommu_aperture = ULONG_MAX;
768 	else
769 		s390_iommu_aperture *= s390_iommu_aperture_factor;
770 
771 	rc = dma_alloc_cpu_table_caches();
772 	if (rc)
773 		return rc;
774 
775 	return rc;
776 }
777 subsys_initcall(s390_iommu_init);
778 
779 static const struct iommu_ops s390_iommu_ops = {
780 	.capable = s390_iommu_capable,
781 	.domain_alloc_paging = s390_domain_alloc_paging,
782 	.probe_device = s390_iommu_probe_device,
783 	.release_device = s390_iommu_release_device,
784 	.device_group = generic_device_group,
785 	.pgsize_bitmap = SZ_4K,
786 	.get_resv_regions = s390_iommu_get_resv_regions,
787 	.default_domain_ops = &(const struct iommu_domain_ops) {
788 		.attach_dev	= s390_iommu_attach_device,
789 		.map_pages	= s390_iommu_map_pages,
790 		.unmap_pages	= s390_iommu_unmap_pages,
791 		.flush_iotlb_all = s390_iommu_flush_iotlb_all,
792 		.iotlb_sync      = s390_iommu_iotlb_sync,
793 		.iotlb_sync_map  = s390_iommu_iotlb_sync_map,
794 		.iova_to_phys	= s390_iommu_iova_to_phys,
795 		.free		= s390_domain_free,
796 	}
797 };
798