xref: /linux/drivers/staging/media/ipu7/ipu7-mmu.c (revision 8d2b0853add1d7534dc0794e3c8e0b9e8c4ec640)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (C) 2013 - 2025 Intel Corporation
4  */
5 
6 #include <asm/barrier.h>
7 
8 #include <linux/align.h>
9 #include <linux/atomic.h>
10 #include <linux/bitops.h>
11 #include <linux/bits.h>
12 #include <linux/bug.h>
13 #include <linux/cacheflush.h>
14 #include <linux/device.h>
15 #include <linux/dma-mapping.h>
16 #include <linux/err.h>
17 #include <linux/gfp.h>
18 #include <linux/iopoll.h>
19 #include <linux/iova.h>
20 #include <linux/math.h>
21 #include <linux/minmax.h>
22 #include <linux/pci.h>
23 #include <linux/pfn.h>
24 #include <linux/slab.h>
25 #include <linux/spinlock.h>
26 #include <linux/types.h>
27 #include <linux/vmalloc.h>
28 
29 #include "ipu7.h"
30 #include "ipu7-dma.h"
31 #include "ipu7-mmu.h"
32 #include "ipu7-platform-regs.h"
33 
34 #define ISP_PAGE_SHIFT		12
35 #define ISP_PAGE_SIZE		BIT(ISP_PAGE_SHIFT)
36 #define ISP_PAGE_MASK		(~(ISP_PAGE_SIZE - 1U))
37 
38 #define ISP_L1PT_SHIFT		22
39 #define ISP_L1PT_MASK		(~((1U << ISP_L1PT_SHIFT) - 1))
40 
41 #define ISP_L2PT_SHIFT		12
42 #define ISP_L2PT_MASK		(~(ISP_L1PT_MASK | (~(ISP_PAGE_MASK))))
43 
44 #define ISP_L1PT_PTES		1024U
45 #define ISP_L2PT_PTES		1024U
46 
47 #define ISP_PADDR_SHIFT		12
48 
49 #define REG_L1_PHYS		0x0004	/* 27-bit pfn */
50 #define REG_INFO		0x0008
51 
52 #define TBL_PHYS_ADDR(a)	((phys_addr_t)(a) << ISP_PADDR_SHIFT)
53 
54 #define MMU_TLB_INVALIDATE_TIMEOUT	2000
55 
56 static __maybe_unused void mmu_irq_handler(struct ipu7_mmu *mmu)
57 {
58 	unsigned int i;
59 	u32 irq_cause;
60 
61 	for (i = 0; i < mmu->nr_mmus; i++) {
62 		irq_cause = readl(mmu->mmu_hw[i].base + MMU_REG_IRQ_CAUSE);
63 		pr_info("mmu %s irq_cause = 0x%x", mmu->mmu_hw[i].name,
64 			irq_cause);
65 		writel(0x1ffff, mmu->mmu_hw[i].base + MMU_REG_IRQ_CLEAR);
66 	}
67 }
68 
69 static void tlb_invalidate(struct ipu7_mmu *mmu)
70 {
71 	unsigned long flags;
72 	unsigned int i;
73 	int ret;
74 	u32 val;
75 
76 	spin_lock_irqsave(&mmu->ready_lock, flags);
77 	if (!mmu->ready) {
78 		spin_unlock_irqrestore(&mmu->ready_lock, flags);
79 		return;
80 	}
81 
82 	for (i = 0; i < mmu->nr_mmus; i++) {
83 		writel(0xffffffffU, mmu->mmu_hw[i].base +
84 		       MMU_REG_INVALIDATE_0);
85 
86 		/* Need check with HW, use l1streams or l2streams */
87 		if (mmu->mmu_hw[i].nr_l2streams > 32)
88 			writel(0xffffffffU, mmu->mmu_hw[i].base +
89 			       MMU_REG_INVALIDATE_1);
90 
91 		/*
92 		 * The TLB invalidation is a "single cycle" (IOMMU clock cycles)
93 		 * When the actual MMIO write reaches the IPU TLB Invalidate
94 		 * register, wmb() will force the TLB invalidate out if the CPU
95 		 * attempts to update the IOMMU page table (or sooner).
96 		 */
97 		wmb();
98 
99 		/* wait invalidation done */
100 		ret = readl_poll_timeout_atomic(mmu->mmu_hw[i].base +
101 						MMU_REG_INVALIDATION_STATUS,
102 						val, !(val & 0x1U), 500,
103 						MMU_TLB_INVALIDATE_TIMEOUT);
104 		if (ret)
105 			dev_err(mmu->dev, "MMU[%u] TLB invalidate failed\n", i);
106 	}
107 
108 	spin_unlock_irqrestore(&mmu->ready_lock, flags);
109 }
110 
111 static dma_addr_t map_single(struct ipu7_mmu_info *mmu_info, void *ptr)
112 {
113 	dma_addr_t dma;
114 
115 	dma = dma_map_single(mmu_info->dev, ptr, PAGE_SIZE, DMA_BIDIRECTIONAL);
116 	if (dma_mapping_error(mmu_info->dev, dma))
117 		return 0;
118 
119 	return dma;
120 }
121 
122 static int get_dummy_page(struct ipu7_mmu_info *mmu_info)
123 {
124 	void *pt = (void *)get_zeroed_page(GFP_ATOMIC | GFP_DMA32);
125 	dma_addr_t dma;
126 
127 	if (!pt)
128 		return -ENOMEM;
129 
130 	dev_dbg(mmu_info->dev, "dummy_page: get_zeroed_page() == %p\n", pt);
131 
132 	dma = map_single(mmu_info, pt);
133 	if (!dma) {
134 		dev_err(mmu_info->dev, "Failed to map dummy page\n");
135 		goto err_free_page;
136 	}
137 
138 	mmu_info->dummy_page = pt;
139 	mmu_info->dummy_page_pteval = dma >> ISP_PAGE_SHIFT;
140 
141 	return 0;
142 
143 err_free_page:
144 	free_page((unsigned long)pt);
145 	return -ENOMEM;
146 }
147 
148 static void free_dummy_page(struct ipu7_mmu_info *mmu_info)
149 {
150 	dma_unmap_single(mmu_info->dev,
151 			 TBL_PHYS_ADDR(mmu_info->dummy_page_pteval),
152 			 PAGE_SIZE, DMA_BIDIRECTIONAL);
153 	free_page((unsigned long)mmu_info->dummy_page);
154 }
155 
156 static int alloc_dummy_l2_pt(struct ipu7_mmu_info *mmu_info)
157 {
158 	u32 *pt = (u32 *)get_zeroed_page(GFP_ATOMIC | GFP_DMA32);
159 	dma_addr_t dma;
160 	unsigned int i;
161 
162 	if (!pt)
163 		return -ENOMEM;
164 
165 	dev_dbg(mmu_info->dev, "dummy_l2: get_zeroed_page() = %p\n", pt);
166 
167 	dma = map_single(mmu_info, pt);
168 	if (!dma) {
169 		dev_err(mmu_info->dev, "Failed to map l2pt page\n");
170 		goto err_free_page;
171 	}
172 
173 	for (i = 0; i < ISP_L2PT_PTES; i++)
174 		pt[i] = mmu_info->dummy_page_pteval;
175 
176 	mmu_info->dummy_l2_pt = pt;
177 	mmu_info->dummy_l2_pteval = dma >> ISP_PAGE_SHIFT;
178 
179 	return 0;
180 
181 err_free_page:
182 	free_page((unsigned long)pt);
183 	return -ENOMEM;
184 }
185 
186 static void free_dummy_l2_pt(struct ipu7_mmu_info *mmu_info)
187 {
188 	dma_unmap_single(mmu_info->dev,
189 			 TBL_PHYS_ADDR(mmu_info->dummy_l2_pteval),
190 			 PAGE_SIZE, DMA_BIDIRECTIONAL);
191 	free_page((unsigned long)mmu_info->dummy_l2_pt);
192 }
193 
194 static u32 *alloc_l1_pt(struct ipu7_mmu_info *mmu_info)
195 {
196 	u32 *pt = (u32 *)get_zeroed_page(GFP_ATOMIC | GFP_DMA32);
197 	dma_addr_t dma;
198 	unsigned int i;
199 
200 	if (!pt)
201 		return NULL;
202 
203 	dev_dbg(mmu_info->dev, "alloc_l1: get_zeroed_page() = %p\n", pt);
204 
205 	for (i = 0; i < ISP_L1PT_PTES; i++)
206 		pt[i] = mmu_info->dummy_l2_pteval;
207 
208 	dma = map_single(mmu_info, pt);
209 	if (!dma) {
210 		dev_err(mmu_info->dev, "Failed to map l1pt page\n");
211 		goto err_free_page;
212 	}
213 
214 	mmu_info->l1_pt_dma = dma >> ISP_PADDR_SHIFT;
215 	dev_dbg(mmu_info->dev, "l1 pt %p mapped at %pad\n", pt, &dma);
216 
217 	return pt;
218 
219 err_free_page:
220 	free_page((unsigned long)pt);
221 	return NULL;
222 }
223 
224 static u32 *alloc_l2_pt(struct ipu7_mmu_info *mmu_info)
225 {
226 	u32 *pt = (u32 *)get_zeroed_page(GFP_ATOMIC | GFP_DMA32);
227 	unsigned int i;
228 
229 	if (!pt)
230 		return NULL;
231 
232 	dev_dbg(mmu_info->dev, "alloc_l2: get_zeroed_page() = %p\n", pt);
233 
234 	for (i = 0; i < ISP_L1PT_PTES; i++)
235 		pt[i] = mmu_info->dummy_page_pteval;
236 
237 	return pt;
238 }
239 
240 static void l2_unmap(struct ipu7_mmu_info *mmu_info, unsigned long iova,
241 		     phys_addr_t dummy, size_t size)
242 {
243 	unsigned int l2_entries;
244 	unsigned int l2_idx;
245 	unsigned long flags;
246 	u32 l1_idx;
247 	u32 *l2_pt;
248 
249 	spin_lock_irqsave(&mmu_info->lock, flags);
250 	for (l1_idx = iova >> ISP_L1PT_SHIFT;
251 	     size > 0U && l1_idx < ISP_L1PT_PTES; l1_idx++) {
252 		dev_dbg(mmu_info->dev,
253 			"unmapping l2 pgtable (l1 index %u (iova 0x%8.8lx))\n",
254 			l1_idx, iova);
255 
256 		if (mmu_info->l1_pt[l1_idx] == mmu_info->dummy_l2_pteval) {
257 			dev_err(mmu_info->dev,
258 				"unmap not mapped iova 0x%8.8lx l1 index %u\n",
259 				iova, l1_idx);
260 			continue;
261 		}
262 		l2_pt = mmu_info->l2_pts[l1_idx];
263 
264 		l2_entries = 0;
265 		for (l2_idx = (iova & ISP_L2PT_MASK) >> ISP_L2PT_SHIFT;
266 		     size > 0U && l2_idx < ISP_L2PT_PTES; l2_idx++) {
267 			phys_addr_t pteval = TBL_PHYS_ADDR(l2_pt[l2_idx]);
268 
269 			dev_dbg(mmu_info->dev,
270 				"unmap l2 index %u with pteval 0x%p\n",
271 				l2_idx, &pteval);
272 			l2_pt[l2_idx] = mmu_info->dummy_page_pteval;
273 
274 			iova += ISP_PAGE_SIZE;
275 			size -= ISP_PAGE_SIZE;
276 
277 			l2_entries++;
278 		}
279 
280 		WARN_ON_ONCE(!l2_entries);
281 		clflush_cache_range(&l2_pt[l2_idx - l2_entries],
282 				    sizeof(l2_pt[0]) * l2_entries);
283 	}
284 
285 	WARN_ON_ONCE(size);
286 	spin_unlock_irqrestore(&mmu_info->lock, flags);
287 }
288 
289 static int l2_map(struct ipu7_mmu_info *mmu_info, unsigned long iova,
290 		  phys_addr_t paddr, size_t size)
291 {
292 	struct device *dev = mmu_info->dev;
293 	unsigned int l2_entries;
294 	u32 *l2_pt, *l2_virt;
295 	unsigned int l2_idx;
296 	unsigned long flags;
297 	size_t mapped = 0;
298 	dma_addr_t dma;
299 	u32 l1_entry;
300 	u32 l1_idx;
301 	int err = 0;
302 
303 	spin_lock_irqsave(&mmu_info->lock, flags);
304 
305 	paddr = ALIGN(paddr, ISP_PAGE_SIZE);
306 	for (l1_idx = iova >> ISP_L1PT_SHIFT;
307 	     size && l1_idx < ISP_L1PT_PTES; l1_idx++) {
308 		dev_dbg(dev,
309 			"mapping l2 page table for l1 index %u (iova %8.8x)\n",
310 			l1_idx, (u32)iova);
311 
312 		l1_entry = mmu_info->l1_pt[l1_idx];
313 		if (l1_entry == mmu_info->dummy_l2_pteval) {
314 			l2_virt = mmu_info->l2_pts[l1_idx];
315 			if (likely(!l2_virt)) {
316 				l2_virt = alloc_l2_pt(mmu_info);
317 				if (!l2_virt) {
318 					err = -ENOMEM;
319 					goto error;
320 				}
321 			}
322 
323 			dma = map_single(mmu_info, l2_virt);
324 			if (!dma) {
325 				dev_err(dev, "Failed to map l2pt page\n");
326 				free_page((unsigned long)l2_virt);
327 				err = -EINVAL;
328 				goto error;
329 			}
330 
331 			l1_entry = dma >> ISP_PADDR_SHIFT;
332 
333 			dev_dbg(dev, "page for l1_idx %u %p allocated\n",
334 				l1_idx, l2_virt);
335 			mmu_info->l1_pt[l1_idx] = l1_entry;
336 			mmu_info->l2_pts[l1_idx] = l2_virt;
337 
338 			clflush_cache_range(&mmu_info->l1_pt[l1_idx],
339 					    sizeof(mmu_info->l1_pt[l1_idx]));
340 		}
341 
342 		l2_pt = mmu_info->l2_pts[l1_idx];
343 		l2_entries = 0;
344 
345 		for (l2_idx = (iova & ISP_L2PT_MASK) >> ISP_L2PT_SHIFT;
346 		     size && l2_idx < ISP_L2PT_PTES; l2_idx++) {
347 			l2_pt[l2_idx] = paddr >> ISP_PADDR_SHIFT;
348 
349 			dev_dbg(dev, "l2 index %u mapped as 0x%8.8x\n", l2_idx,
350 				l2_pt[l2_idx]);
351 
352 			iova += ISP_PAGE_SIZE;
353 			paddr += ISP_PAGE_SIZE;
354 			mapped += ISP_PAGE_SIZE;
355 			size -= ISP_PAGE_SIZE;
356 
357 			l2_entries++;
358 		}
359 
360 		WARN_ON_ONCE(!l2_entries);
361 		clflush_cache_range(&l2_pt[l2_idx - l2_entries],
362 				    sizeof(l2_pt[0]) * l2_entries);
363 	}
364 
365 	spin_unlock_irqrestore(&mmu_info->lock, flags);
366 
367 	return 0;
368 
369 error:
370 	spin_unlock_irqrestore(&mmu_info->lock, flags);
371 	/* unroll mapping in case something went wrong */
372 	if (mapped)
373 		l2_unmap(mmu_info, iova - mapped, paddr - mapped, mapped);
374 
375 	return err;
376 }
377 
378 static int __ipu7_mmu_map(struct ipu7_mmu_info *mmu_info, unsigned long iova,
379 			  phys_addr_t paddr, size_t size)
380 {
381 	u32 iova_start = round_down(iova, ISP_PAGE_SIZE);
382 	u32 iova_end = ALIGN(iova + size, ISP_PAGE_SIZE);
383 
384 	dev_dbg(mmu_info->dev,
385 		"mapping iova 0x%8.8x--0x%8.8x, size %zu at paddr %pap\n",
386 		iova_start, iova_end, size, &paddr);
387 
388 	return l2_map(mmu_info, iova_start, paddr, size);
389 }
390 
391 static void __ipu7_mmu_unmap(struct ipu7_mmu_info *mmu_info,
392 			     unsigned long iova, size_t size)
393 {
394 	l2_unmap(mmu_info, iova, 0, size);
395 }
396 
397 static int allocate_trash_buffer(struct ipu7_mmu *mmu)
398 {
399 	unsigned int n_pages = PFN_UP(IPU_MMUV2_TRASH_RANGE);
400 	unsigned long iova_addr;
401 	struct iova *iova;
402 	unsigned int i;
403 	dma_addr_t dma;
404 	int ret;
405 
406 	/* Allocate 8MB in iova range */
407 	iova = alloc_iova(&mmu->dmap->iovad, n_pages,
408 			  PHYS_PFN(mmu->dmap->mmu_info->aperture_end), 0);
409 	if (!iova) {
410 		dev_err(mmu->dev, "cannot allocate iova range for trash\n");
411 		return -ENOMEM;
412 	}
413 
414 	dma = dma_map_page(mmu->dmap->mmu_info->dev, mmu->trash_page, 0,
415 			   PAGE_SIZE, DMA_BIDIRECTIONAL);
416 	if (dma_mapping_error(mmu->dmap->mmu_info->dev, dma)) {
417 		dev_err(mmu->dmap->mmu_info->dev, "Failed to map trash page\n");
418 		ret = -ENOMEM;
419 		goto out_free_iova;
420 	}
421 
422 	mmu->pci_trash_page = dma;
423 
424 	/*
425 	 * Map the 8MB iova address range to the same physical trash page
426 	 * mmu->trash_page which is already reserved at the probe
427 	 */
428 	iova_addr = iova->pfn_lo;
429 	for (i = 0; i < n_pages; i++) {
430 		ret = ipu7_mmu_map(mmu->dmap->mmu_info, PFN_PHYS(iova_addr),
431 				   mmu->pci_trash_page, PAGE_SIZE);
432 		if (ret) {
433 			dev_err(mmu->dev,
434 				"mapping trash buffer range failed\n");
435 			goto out_unmap;
436 		}
437 
438 		iova_addr++;
439 	}
440 
441 	mmu->iova_trash_page = PFN_PHYS(iova->pfn_lo);
442 	dev_dbg(mmu->dev, "iova trash buffer for MMUID: %d is %u\n",
443 		mmu->mmid, (unsigned int)mmu->iova_trash_page);
444 	return 0;
445 
446 out_unmap:
447 	ipu7_mmu_unmap(mmu->dmap->mmu_info, PFN_PHYS(iova->pfn_lo),
448 		       PFN_PHYS(iova_size(iova)));
449 	dma_unmap_page(mmu->dmap->mmu_info->dev, mmu->pci_trash_page,
450 		       PAGE_SIZE, DMA_BIDIRECTIONAL);
451 out_free_iova:
452 	__free_iova(&mmu->dmap->iovad, iova);
453 	return ret;
454 }
455 
456 static void __mmu_at_init(struct ipu7_mmu *mmu)
457 {
458 	struct ipu7_mmu_info *mmu_info;
459 	unsigned int i;
460 
461 	mmu_info = mmu->dmap->mmu_info;
462 	for (i = 0; i < mmu->nr_mmus; i++) {
463 		struct ipu7_mmu_hw *mmu_hw = &mmu->mmu_hw[i];
464 		unsigned int j;
465 
466 		/* Write page table address per MMU */
467 		writel((phys_addr_t)mmu_info->l1_pt_dma,
468 		       mmu_hw->base + MMU_REG_PAGE_TABLE_BASE_ADDR);
469 		dev_dbg(mmu->dev, "mmu %s base was set as %x\n", mmu_hw->name,
470 			readl(mmu_hw->base + MMU_REG_PAGE_TABLE_BASE_ADDR));
471 
472 		/* Set info bits and axi_refill per MMU */
473 		writel(mmu_hw->info_bits,
474 		       mmu_hw->base + MMU_REG_USER_INFO_BITS);
475 		writel(mmu_hw->refill, mmu_hw->base + MMU_REG_AXI_REFILL_IF_ID);
476 		writel(mmu_hw->collapse_en_bitmap,
477 		       mmu_hw->base + MMU_REG_COLLAPSE_ENABLE_BITMAP);
478 
479 		dev_dbg(mmu->dev, "mmu %s info_bits was set as %x\n",
480 			mmu_hw->name,
481 			readl(mmu_hw->base + MMU_REG_USER_INFO_BITS));
482 
483 		if (mmu_hw->at_sp_arb_cfg)
484 			writel(mmu_hw->at_sp_arb_cfg,
485 			       mmu_hw->base + MMU_REG_AT_SP_ARB_CFG);
486 
487 		/* default irq configuration */
488 		writel(0x3ff, mmu_hw->base + MMU_REG_IRQ_MASK);
489 		writel(0x3ff, mmu_hw->base + MMU_REG_IRQ_ENABLE);
490 
491 		/* Configure MMU TLB stream configuration for L1/L2 */
492 		for (j = 0; j < mmu_hw->nr_l1streams; j++) {
493 			writel(mmu_hw->l1_block_sz[j], mmu_hw->base +
494 			       mmu_hw->l1_block + 4U * j);
495 		}
496 
497 		for (j = 0; j < mmu_hw->nr_l2streams; j++) {
498 			writel(mmu_hw->l2_block_sz[j], mmu_hw->base +
499 			       mmu_hw->l2_block + 4U * j);
500 		}
501 
502 		for (j = 0; j < mmu_hw->uao_p_num; j++) {
503 			if (!mmu_hw->uao_p2tlb[j])
504 				continue;
505 			writel(mmu_hw->uao_p2tlb[j], mmu_hw->uao_base + 4U * j);
506 		}
507 	}
508 }
509 
510 static void __mmu_zlx_init(struct ipu7_mmu *mmu)
511 {
512 	unsigned int i;
513 
514 	dev_dbg(mmu->dev, "mmu zlx init\n");
515 
516 	for (i = 0; i < mmu->nr_mmus; i++) {
517 		struct ipu7_mmu_hw *mmu_hw = &mmu->mmu_hw[i];
518 		unsigned int j;
519 
520 		dev_dbg(mmu->dev, "mmu %s zlx init\n", mmu_hw->name);
521 		for (j = 0; j < IPU_ZLX_POOL_NUM; j++) {
522 			if (!mmu_hw->zlx_axi_pool[j])
523 				continue;
524 			writel(mmu_hw->zlx_axi_pool[j],
525 			       mmu_hw->zlx_base + ZLX_REG_AXI_POOL + j * 0x4U);
526 		}
527 
528 		for (j = 0; j < mmu_hw->zlx_nr; j++) {
529 			if (!mmu_hw->zlx_conf[j])
530 				continue;
531 
532 			writel(mmu_hw->zlx_conf[j],
533 			       mmu_hw->zlx_base + ZLX_REG_CONF + j * 0x8U);
534 		}
535 
536 		for (j = 0; j < mmu_hw->zlx_nr; j++) {
537 			if (!mmu_hw->zlx_en[j])
538 				continue;
539 
540 			writel(mmu_hw->zlx_en[j],
541 			       mmu_hw->zlx_base + ZLX_REG_EN + j * 0x8U);
542 		}
543 	}
544 }
545 
546 int ipu7_mmu_hw_init(struct ipu7_mmu *mmu)
547 {
548 	unsigned long flags;
549 
550 	dev_dbg(mmu->dev, "IPU mmu hardware init\n");
551 
552 	/* Initialise the each MMU and ZLX */
553 	__mmu_at_init(mmu);
554 	__mmu_zlx_init(mmu);
555 
556 	if (!mmu->trash_page) {
557 		int ret;
558 
559 		mmu->trash_page = alloc_page(GFP_KERNEL);
560 		if (!mmu->trash_page) {
561 			dev_err(mmu->dev, "insufficient memory for trash buffer\n");
562 			return -ENOMEM;
563 		}
564 
565 		ret = allocate_trash_buffer(mmu);
566 		if (ret) {
567 			__free_page(mmu->trash_page);
568 			mmu->trash_page = NULL;
569 			dev_err(mmu->dev, "trash buffer allocation failed\n");
570 			return ret;
571 		}
572 	}
573 
574 	spin_lock_irqsave(&mmu->ready_lock, flags);
575 	mmu->ready = true;
576 	spin_unlock_irqrestore(&mmu->ready_lock, flags);
577 
578 	return 0;
579 }
580 EXPORT_SYMBOL_NS_GPL(ipu7_mmu_hw_init, "INTEL_IPU7");
581 
582 static struct ipu7_mmu_info *ipu7_mmu_alloc(struct ipu7_device *isp)
583 {
584 	struct ipu7_mmu_info *mmu_info;
585 	int ret;
586 
587 	mmu_info = kzalloc(sizeof(*mmu_info), GFP_KERNEL);
588 	if (!mmu_info)
589 		return NULL;
590 
591 	if (isp->secure_mode) {
592 		mmu_info->aperture_start = IPU_FW_CODE_REGION_END;
593 		mmu_info->aperture_end =
594 			(dma_addr_t)DMA_BIT_MASK(IPU_MMU_ADDR_BITS);
595 	} else {
596 		mmu_info->aperture_start = IPU_FW_CODE_REGION_START;
597 		mmu_info->aperture_end =
598 			(dma_addr_t)DMA_BIT_MASK(IPU_MMU_ADDR_BITS_NON_SECURE);
599 	}
600 
601 	mmu_info->pgsize_bitmap = SZ_4K;
602 	mmu_info->dev = &isp->pdev->dev;
603 
604 	ret = get_dummy_page(mmu_info);
605 	if (ret)
606 		goto err_free_info;
607 
608 	ret = alloc_dummy_l2_pt(mmu_info);
609 	if (ret)
610 		goto err_free_dummy_page;
611 
612 	mmu_info->l2_pts = vzalloc(ISP_L2PT_PTES * sizeof(*mmu_info->l2_pts));
613 	if (!mmu_info->l2_pts)
614 		goto err_free_dummy_l2_pt;
615 
616 	/*
617 	 * We always map the L1 page table (a single page as well as
618 	 * the L2 page tables).
619 	 */
620 	mmu_info->l1_pt = alloc_l1_pt(mmu_info);
621 	if (!mmu_info->l1_pt)
622 		goto err_free_l2_pts;
623 
624 	spin_lock_init(&mmu_info->lock);
625 
626 	dev_dbg(mmu_info->dev, "domain initialised\n");
627 
628 	return mmu_info;
629 
630 err_free_l2_pts:
631 	vfree(mmu_info->l2_pts);
632 err_free_dummy_l2_pt:
633 	free_dummy_l2_pt(mmu_info);
634 err_free_dummy_page:
635 	free_dummy_page(mmu_info);
636 err_free_info:
637 	kfree(mmu_info);
638 
639 	return NULL;
640 }
641 
642 void ipu7_mmu_hw_cleanup(struct ipu7_mmu *mmu)
643 {
644 	unsigned long flags;
645 
646 	spin_lock_irqsave(&mmu->ready_lock, flags);
647 	mmu->ready = false;
648 	spin_unlock_irqrestore(&mmu->ready_lock, flags);
649 }
650 EXPORT_SYMBOL_NS_GPL(ipu7_mmu_hw_cleanup, "INTEL_IPU7");
651 
652 static struct ipu7_dma_mapping *alloc_dma_mapping(struct ipu7_device *isp)
653 {
654 	struct ipu7_dma_mapping *dmap;
655 	unsigned long base_pfn;
656 
657 	dmap = kzalloc(sizeof(*dmap), GFP_KERNEL);
658 	if (!dmap)
659 		return NULL;
660 
661 	dmap->mmu_info = ipu7_mmu_alloc(isp);
662 	if (!dmap->mmu_info) {
663 		kfree(dmap);
664 		return NULL;
665 	}
666 
667 	/* 0~64M is forbidden for uctile controller */
668 	base_pfn = max_t(unsigned long, 1,
669 			 PFN_DOWN(dmap->mmu_info->aperture_start));
670 	init_iova_domain(&dmap->iovad, SZ_4K, base_pfn);
671 	dmap->mmu_info->dmap = dmap;
672 
673 	dev_dbg(&isp->pdev->dev, "alloc mapping\n");
674 
675 	iova_cache_get();
676 
677 	return dmap;
678 }
679 
680 phys_addr_t ipu7_mmu_iova_to_phys(struct ipu7_mmu_info *mmu_info,
681 				  dma_addr_t iova)
682 {
683 	phys_addr_t phy_addr;
684 	unsigned long flags;
685 	u32 *l2_pt;
686 
687 	spin_lock_irqsave(&mmu_info->lock, flags);
688 	l2_pt = mmu_info->l2_pts[iova >> ISP_L1PT_SHIFT];
689 	phy_addr = (phys_addr_t)l2_pt[(iova & ISP_L2PT_MASK) >> ISP_L2PT_SHIFT];
690 	phy_addr <<= ISP_PAGE_SHIFT;
691 	spin_unlock_irqrestore(&mmu_info->lock, flags);
692 
693 	return phy_addr;
694 }
695 
696 void ipu7_mmu_unmap(struct ipu7_mmu_info *mmu_info, unsigned long iova,
697 		    size_t size)
698 {
699 	unsigned int min_pagesz;
700 
701 	dev_dbg(mmu_info->dev, "unmapping iova 0x%lx size 0x%zx\n", iova, size);
702 
703 	/* find out the minimum page size supported */
704 	min_pagesz = 1U << __ffs(mmu_info->pgsize_bitmap);
705 
706 	/*
707 	 * The virtual address and the size of the mapping must be
708 	 * aligned (at least) to the size of the smallest page supported
709 	 * by the hardware
710 	 */
711 	if (!IS_ALIGNED(iova | size, min_pagesz)) {
712 		dev_err(mmu_info->dev,
713 			"unaligned: iova 0x%lx size 0x%zx min_pagesz 0x%x\n",
714 			iova, size, min_pagesz);
715 		return;
716 	}
717 
718 	__ipu7_mmu_unmap(mmu_info, iova, size);
719 }
720 
721 int ipu7_mmu_map(struct ipu7_mmu_info *mmu_info, unsigned long iova,
722 		 phys_addr_t paddr, size_t size)
723 {
724 	unsigned int min_pagesz;
725 
726 	if (mmu_info->pgsize_bitmap == 0UL)
727 		return -ENODEV;
728 
729 	/* find out the minimum page size supported */
730 	min_pagesz = 1U << __ffs(mmu_info->pgsize_bitmap);
731 
732 	/*
733 	 * both the virtual address and the physical one, as well as
734 	 * the size of the mapping, must be aligned (at least) to the
735 	 * size of the smallest page supported by the hardware
736 	 */
737 	if (!IS_ALIGNED(iova | paddr | size, min_pagesz)) {
738 		dev_err(mmu_info->dev,
739 			"unaligned: iova %lx pa %pa size %zx min_pagesz %x\n",
740 			iova, &paddr, size, min_pagesz);
741 		return -EINVAL;
742 	}
743 
744 	dev_dbg(mmu_info->dev, "map: iova 0x%lx pa %pa size 0x%zx\n",
745 		iova, &paddr, size);
746 
747 	return __ipu7_mmu_map(mmu_info, iova, paddr, size);
748 }
749 
750 static void ipu7_mmu_destroy(struct ipu7_mmu *mmu)
751 {
752 	struct ipu7_dma_mapping *dmap = mmu->dmap;
753 	struct ipu7_mmu_info *mmu_info = dmap->mmu_info;
754 	struct iova *iova;
755 	u32 l1_idx;
756 
757 	if (mmu->iova_trash_page) {
758 		iova = find_iova(&dmap->iovad, PHYS_PFN(mmu->iova_trash_page));
759 		if (iova) {
760 			/* unmap and free the trash buffer iova */
761 			ipu7_mmu_unmap(mmu_info, PFN_PHYS(iova->pfn_lo),
762 				       PFN_PHYS(iova_size(iova)));
763 			__free_iova(&dmap->iovad, iova);
764 		} else {
765 			dev_err(mmu->dev, "trash buffer iova not found.\n");
766 		}
767 
768 		mmu->iova_trash_page = 0;
769 		dma_unmap_page(mmu_info->dev, mmu->pci_trash_page,
770 			       PAGE_SIZE, DMA_BIDIRECTIONAL);
771 		mmu->pci_trash_page = 0;
772 		__free_page(mmu->trash_page);
773 	}
774 
775 	for (l1_idx = 0; l1_idx < ISP_L1PT_PTES; l1_idx++) {
776 		if (mmu_info->l1_pt[l1_idx] != mmu_info->dummy_l2_pteval) {
777 			dma_unmap_single(mmu_info->dev,
778 					 TBL_PHYS_ADDR(mmu_info->l1_pt[l1_idx]),
779 					 PAGE_SIZE, DMA_BIDIRECTIONAL);
780 			free_page((unsigned long)mmu_info->l2_pts[l1_idx]);
781 		}
782 	}
783 
784 	vfree(mmu_info->l2_pts);
785 	free_dummy_page(mmu_info);
786 	dma_unmap_single(mmu_info->dev, TBL_PHYS_ADDR(mmu_info->l1_pt_dma),
787 			 PAGE_SIZE, DMA_BIDIRECTIONAL);
788 	free_page((unsigned long)mmu_info->dummy_l2_pt);
789 	free_page((unsigned long)mmu_info->l1_pt);
790 	kfree(mmu_info);
791 }
792 
793 struct ipu7_mmu *ipu7_mmu_init(struct device *dev,
794 			       void __iomem *base, int mmid,
795 			       const struct ipu7_hw_variants *hw)
796 {
797 	struct ipu7_device *isp = pci_get_drvdata(to_pci_dev(dev));
798 	struct ipu7_mmu_pdata *pdata;
799 	struct ipu7_mmu *mmu;
800 	unsigned int i;
801 
802 	if (hw->nr_mmus > IPU_MMU_MAX_NUM)
803 		return ERR_PTR(-EINVAL);
804 
805 	pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL);
806 	if (!pdata)
807 		return ERR_PTR(-ENOMEM);
808 
809 	for (i = 0; i < hw->nr_mmus; i++) {
810 		struct ipu7_mmu_hw *pdata_mmu = &pdata->mmu_hw[i];
811 		const struct ipu7_mmu_hw *src_mmu = &hw->mmu_hw[i];
812 
813 		if (src_mmu->nr_l1streams > IPU_MMU_MAX_TLB_L1_STREAMS ||
814 		    src_mmu->nr_l2streams > IPU_MMU_MAX_TLB_L2_STREAMS)
815 			return ERR_PTR(-EINVAL);
816 
817 		*pdata_mmu = *src_mmu;
818 		pdata_mmu->base = base + src_mmu->offset;
819 		pdata_mmu->zlx_base = base + src_mmu->zlx_offset;
820 		pdata_mmu->uao_base = base + src_mmu->uao_offset;
821 	}
822 
823 	mmu = devm_kzalloc(dev, sizeof(*mmu), GFP_KERNEL);
824 	if (!mmu)
825 		return ERR_PTR(-ENOMEM);
826 
827 	mmu->mmid = mmid;
828 	mmu->mmu_hw = pdata->mmu_hw;
829 	mmu->nr_mmus = hw->nr_mmus;
830 	mmu->tlb_invalidate = tlb_invalidate;
831 	mmu->ready = false;
832 	INIT_LIST_HEAD(&mmu->vma_list);
833 	spin_lock_init(&mmu->ready_lock);
834 
835 	mmu->dmap = alloc_dma_mapping(isp);
836 	if (!mmu->dmap) {
837 		dev_err(dev, "can't alloc dma mapping\n");
838 		return ERR_PTR(-ENOMEM);
839 	}
840 
841 	return mmu;
842 }
843 
844 void ipu7_mmu_cleanup(struct ipu7_mmu *mmu)
845 {
846 	struct ipu7_dma_mapping *dmap = mmu->dmap;
847 
848 	ipu7_mmu_destroy(mmu);
849 	mmu->dmap = NULL;
850 	iova_cache_put();
851 	put_iova_domain(&dmap->iovad);
852 	kfree(dmap);
853 }
854