1 /* linux/drivers/iommu/exynos_iommu.c
3 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
4 * http://www.samsung.com
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
11 #ifdef CONFIG_EXYNOS_IOMMU_DEBUG
16 #include <linux/interrupt.h>
17 #include <linux/platform_device.h>
18 #include <linux/slab.h>
19 #include <linux/pm_runtime.h>
20 #include <linux/clk.h>
21 #include <linux/err.h>
23 #include <linux/iommu.h>
24 #include <linux/errno.h>
25 #include <linux/list.h>
26 #include <linux/memblock.h>
27 #include <linux/export.h>
29 #include <asm/cacheflush.h>
30 #include <asm/pgtable.h>
32 typedef u32 sysmmu_iova_t
;
33 typedef u32 sysmmu_pte_t
;
35 /* We does not consider super section mapping (16MB) */
37 #define LPAGE_ORDER 16
38 #define SPAGE_ORDER 12
40 #define SECT_SIZE (1 << SECT_ORDER)
41 #define LPAGE_SIZE (1 << LPAGE_ORDER)
42 #define SPAGE_SIZE (1 << SPAGE_ORDER)
44 #define SECT_MASK (~(SECT_SIZE - 1))
45 #define LPAGE_MASK (~(LPAGE_SIZE - 1))
46 #define SPAGE_MASK (~(SPAGE_SIZE - 1))
48 #define lv1ent_fault(sent) ((*(sent) == ZERO_LV2LINK) || \
49 ((*(sent) & 3) == 0) || ((*(sent) & 3) == 3))
50 #define lv1ent_zero(sent) (*(sent) == ZERO_LV2LINK)
51 #define lv1ent_page_zero(sent) ((*(sent) & 3) == 1)
52 #define lv1ent_page(sent) ((*(sent) != ZERO_LV2LINK) && \
54 #define lv1ent_section(sent) ((*(sent) & 3) == 2)
56 #define lv2ent_fault(pent) ((*(pent) & 3) == 0)
57 #define lv2ent_small(pent) ((*(pent) & 2) == 2)
58 #define lv2ent_large(pent) ((*(pent) & 3) == 1)
60 static u32
sysmmu_page_offset(sysmmu_iova_t iova
, u32 size
)
62 return iova
& (size
- 1);
65 #define section_phys(sent) (*(sent) & SECT_MASK)
66 #define section_offs(iova) sysmmu_page_offset((iova), SECT_SIZE)
67 #define lpage_phys(pent) (*(pent) & LPAGE_MASK)
68 #define lpage_offs(iova) sysmmu_page_offset((iova), LPAGE_SIZE)
69 #define spage_phys(pent) (*(pent) & SPAGE_MASK)
70 #define spage_offs(iova) sysmmu_page_offset((iova), SPAGE_SIZE)
72 #define NUM_LV1ENTRIES 4096
73 #define NUM_LV2ENTRIES (SECT_SIZE / SPAGE_SIZE)
75 static u32
lv1ent_offset(sysmmu_iova_t iova
)
77 return iova
>> SECT_ORDER
;
80 static u32
lv2ent_offset(sysmmu_iova_t iova
)
82 return (iova
>> SPAGE_ORDER
) & (NUM_LV2ENTRIES
- 1);
85 #define LV2TABLE_SIZE (NUM_LV2ENTRIES * sizeof(sysmmu_pte_t))
87 #define SPAGES_PER_LPAGE (LPAGE_SIZE / SPAGE_SIZE)
89 #define lv2table_base(sent) (*(sent) & 0xFFFFFC00)
91 #define mk_lv1ent_sect(pa) ((pa) | 2)
92 #define mk_lv1ent_page(pa) ((pa) | 1)
93 #define mk_lv2ent_lpage(pa) ((pa) | 1)
94 #define mk_lv2ent_spage(pa) ((pa) | 2)
96 #define CTRL_ENABLE 0x5
97 #define CTRL_BLOCK 0x7
98 #define CTRL_DISABLE 0x0
101 #define CFG_QOS(n) ((n & 0xF) << 7)
102 #define CFG_MASK 0x0150FFFF /* Selecting bit 0-15, 20, 22 and 24 */
103 #define CFG_ACGEN (1 << 24) /* System MMU 3.3 only */
104 #define CFG_SYSSEL (1 << 22) /* System MMU 3.2 only */
105 #define CFG_FLPDCACHE (1 << 20) /* System MMU 3.2+ only */
107 #define REG_MMU_CTRL 0x000
108 #define REG_MMU_CFG 0x004
109 #define REG_MMU_STATUS 0x008
110 #define REG_MMU_FLUSH 0x00C
111 #define REG_MMU_FLUSH_ENTRY 0x010
112 #define REG_PT_BASE_ADDR 0x014
113 #define REG_INT_STATUS 0x018
114 #define REG_INT_CLEAR 0x01C
116 #define REG_PAGE_FAULT_ADDR 0x024
117 #define REG_AW_FAULT_ADDR 0x028
118 #define REG_AR_FAULT_ADDR 0x02C
119 #define REG_DEFAULT_SLAVE_ADDR 0x030
121 #define REG_MMU_VERSION 0x034
123 #define MMU_MAJ_VER(val) ((val) >> 7)
124 #define MMU_MIN_VER(val) ((val) & 0x7F)
125 #define MMU_RAW_VER(reg) (((reg) >> 21) & ((1 << 11) - 1)) /* 11 bits */
127 #define MAKE_MMU_VER(maj, min) ((((maj) & 0xF) << 7) | ((min) & 0x7F))
129 #define REG_PB0_SADDR 0x04C
130 #define REG_PB0_EADDR 0x050
131 #define REG_PB1_SADDR 0x054
132 #define REG_PB1_EADDR 0x058
134 #define has_sysmmu(dev) (dev->archdata.iommu != NULL)
136 static struct kmem_cache
*lv2table_kmem_cache
;
137 static sysmmu_pte_t
*zero_lv2_table
;
138 #define ZERO_LV2LINK mk_lv1ent_page(virt_to_phys(zero_lv2_table))
140 static sysmmu_pte_t
*section_entry(sysmmu_pte_t
*pgtable
, sysmmu_iova_t iova
)
142 return pgtable
+ lv1ent_offset(iova
);
145 static sysmmu_pte_t
*page_entry(sysmmu_pte_t
*sent
, sysmmu_iova_t iova
)
147 return (sysmmu_pte_t
*)phys_to_virt(
148 lv2table_base(sent
)) + lv2ent_offset(iova
);
151 enum exynos_sysmmu_inttype
{
159 SYSMMU_AW_PROTECTION
, /* 7 */
160 SYSMMU_FAULT_UNKNOWN
,
164 static unsigned short fault_reg_offset
[SYSMMU_FAULTS_NUM
] = {
168 REG_DEFAULT_SLAVE_ADDR
,
175 static char *sysmmu_fault_name
[SYSMMU_FAULTS_NUM
] = {
177 "AR MULTI-HIT FAULT",
178 "AW MULTI-HIT FAULT",
180 "AR SECURITY PROTECTION FAULT",
181 "AR ACCESS PROTECTION FAULT",
182 "AW SECURITY PROTECTION FAULT",
183 "AW ACCESS PROTECTION FAULT",
187 /* attached to dev.archdata.iommu of the master device */
188 struct exynos_iommu_owner
{
189 struct list_head client
; /* entry of exynos_iommu_domain.clients */
191 struct device
*sysmmu
;
192 struct iommu_domain
*domain
;
193 void *vmm_data
; /* IO virtual memory manager's data */
194 spinlock_t lock
; /* Lock to preserve consistency of System MMU */
197 struct exynos_iommu_domain
{
198 struct list_head clients
; /* list of sysmmu_drvdata.node */
199 sysmmu_pte_t
*pgtable
; /* lv1 page table, 16KB */
200 short *lv2entcnt
; /* free lv2 entry counter for each section */
201 spinlock_t lock
; /* lock for this structure */
202 spinlock_t pgtablelock
; /* lock for modifying page table @ pgtable */
205 struct sysmmu_drvdata
{
206 struct device
*sysmmu
; /* System MMU's device descriptor */
207 struct device
*master
; /* Owner of system MMU */
208 void __iomem
*sfrbase
;
210 struct clk
*clk_master
;
213 struct iommu_domain
*domain
;
217 static bool set_sysmmu_active(struct sysmmu_drvdata
*data
)
219 /* return true if the System MMU was not active previously
220 and it needs to be initialized */
221 return ++data
->activations
== 1;
224 static bool set_sysmmu_inactive(struct sysmmu_drvdata
*data
)
226 /* return true if the System MMU is needed to be disabled */
227 BUG_ON(data
->activations
< 1);
228 return --data
->activations
== 0;
231 static bool is_sysmmu_active(struct sysmmu_drvdata
*data
)
233 return data
->activations
> 0;
236 static void sysmmu_unblock(void __iomem
*sfrbase
)
238 __raw_writel(CTRL_ENABLE
, sfrbase
+ REG_MMU_CTRL
);
241 static unsigned int __raw_sysmmu_version(struct sysmmu_drvdata
*data
)
243 return MMU_RAW_VER(__raw_readl(data
->sfrbase
+ REG_MMU_VERSION
));
246 static bool sysmmu_block(void __iomem
*sfrbase
)
250 __raw_writel(CTRL_BLOCK
, sfrbase
+ REG_MMU_CTRL
);
251 while ((i
> 0) && !(__raw_readl(sfrbase
+ REG_MMU_STATUS
) & 1))
254 if (!(__raw_readl(sfrbase
+ REG_MMU_STATUS
) & 1)) {
255 sysmmu_unblock(sfrbase
);
262 static void __sysmmu_tlb_invalidate(void __iomem
*sfrbase
)
264 __raw_writel(0x1, sfrbase
+ REG_MMU_FLUSH
);
267 static void __sysmmu_tlb_invalidate_entry(void __iomem
*sfrbase
,
268 sysmmu_iova_t iova
, unsigned int num_inv
)
272 for (i
= 0; i
< num_inv
; i
++) {
273 __raw_writel((iova
& SPAGE_MASK
) | 1,
274 sfrbase
+ REG_MMU_FLUSH_ENTRY
);
279 static void __sysmmu_set_ptbase(void __iomem
*sfrbase
,
282 __raw_writel(pgd
, sfrbase
+ REG_PT_BASE_ADDR
);
284 __sysmmu_tlb_invalidate(sfrbase
);
287 static void show_fault_information(const char *name
,
288 enum exynos_sysmmu_inttype itype
,
289 phys_addr_t pgtable_base
, sysmmu_iova_t fault_addr
)
293 if ((itype
>= SYSMMU_FAULTS_NUM
) || (itype
< SYSMMU_PAGEFAULT
))
294 itype
= SYSMMU_FAULT_UNKNOWN
;
296 pr_err("%s occurred at %#x by %s(Page table base: %pa)\n",
297 sysmmu_fault_name
[itype
], fault_addr
, name
, &pgtable_base
);
299 ent
= section_entry(phys_to_virt(pgtable_base
), fault_addr
);
300 pr_err("\tLv1 entry: %#x\n", *ent
);
302 if (lv1ent_page(ent
)) {
303 ent
= page_entry(ent
, fault_addr
);
304 pr_err("\t Lv2 entry: %#x\n", *ent
);
308 static irqreturn_t
exynos_sysmmu_irq(int irq
, void *dev_id
)
310 /* SYSMMU is in blocked when interrupt occurred. */
311 struct sysmmu_drvdata
*data
= dev_id
;
312 enum exynos_sysmmu_inttype itype
;
313 sysmmu_iova_t addr
= -1;
316 WARN_ON(!is_sysmmu_active(data
));
318 spin_lock(&data
->lock
);
320 if (!IS_ERR(data
->clk_master
))
321 clk_enable(data
->clk_master
);
323 itype
= (enum exynos_sysmmu_inttype
)
324 __ffs(__raw_readl(data
->sfrbase
+ REG_INT_STATUS
));
325 if (WARN_ON(!((itype
>= 0) && (itype
< SYSMMU_FAULT_UNKNOWN
))))
326 itype
= SYSMMU_FAULT_UNKNOWN
;
328 addr
= __raw_readl(data
->sfrbase
+ fault_reg_offset
[itype
]);
330 if (itype
== SYSMMU_FAULT_UNKNOWN
) {
331 pr_err("%s: Fault is not occurred by System MMU '%s'!\n",
332 __func__
, dev_name(data
->sysmmu
));
333 pr_err("%s: Please check if IRQ is correctly configured.\n",
338 __raw_readl(data
->sfrbase
+ REG_PT_BASE_ADDR
);
339 show_fault_information(dev_name(data
->sysmmu
),
342 ret
= report_iommu_fault(data
->domain
,
343 data
->master
, addr
, itype
);
346 /* fault is not recovered by fault handler */
349 __raw_writel(1 << itype
, data
->sfrbase
+ REG_INT_CLEAR
);
351 sysmmu_unblock(data
->sfrbase
);
353 if (!IS_ERR(data
->clk_master
))
354 clk_disable(data
->clk_master
);
356 spin_unlock(&data
->lock
);
361 static void __sysmmu_disable_nocount(struct sysmmu_drvdata
*data
)
363 if (!IS_ERR(data
->clk_master
))
364 clk_enable(data
->clk_master
);
366 __raw_writel(CTRL_DISABLE
, data
->sfrbase
+ REG_MMU_CTRL
);
367 __raw_writel(0, data
->sfrbase
+ REG_MMU_CFG
);
369 clk_disable(data
->clk
);
370 if (!IS_ERR(data
->clk_master
))
371 clk_disable(data
->clk_master
);
374 static bool __sysmmu_disable(struct sysmmu_drvdata
*data
)
379 spin_lock_irqsave(&data
->lock
, flags
);
381 disabled
= set_sysmmu_inactive(data
);
387 __sysmmu_disable_nocount(data
);
389 dev_dbg(data
->sysmmu
, "Disabled\n");
391 dev_dbg(data
->sysmmu
, "%d times left to disable\n",
395 spin_unlock_irqrestore(&data
->lock
, flags
);
400 static void __sysmmu_init_config(struct sysmmu_drvdata
*data
)
402 unsigned int cfg
= CFG_LRU
| CFG_QOS(15);
405 ver
= __raw_sysmmu_version(data
);
406 if (MMU_MAJ_VER(ver
) == 3) {
407 if (MMU_MIN_VER(ver
) >= 2) {
408 cfg
|= CFG_FLPDCACHE
;
409 if (MMU_MIN_VER(ver
) == 3) {
418 __raw_writel(cfg
, data
->sfrbase
+ REG_MMU_CFG
);
421 static void __sysmmu_enable_nocount(struct sysmmu_drvdata
*data
)
423 if (!IS_ERR(data
->clk_master
))
424 clk_enable(data
->clk_master
);
425 clk_enable(data
->clk
);
427 __raw_writel(CTRL_BLOCK
, data
->sfrbase
+ REG_MMU_CTRL
);
429 __sysmmu_init_config(data
);
431 __sysmmu_set_ptbase(data
->sfrbase
, data
->pgtable
);
433 __raw_writel(CTRL_ENABLE
, data
->sfrbase
+ REG_MMU_CTRL
);
435 if (!IS_ERR(data
->clk_master
))
436 clk_disable(data
->clk_master
);
439 static int __sysmmu_enable(struct sysmmu_drvdata
*data
,
440 phys_addr_t pgtable
, struct iommu_domain
*domain
)
445 spin_lock_irqsave(&data
->lock
, flags
);
446 if (set_sysmmu_active(data
)) {
447 data
->pgtable
= pgtable
;
448 data
->domain
= domain
;
450 __sysmmu_enable_nocount(data
);
452 dev_dbg(data
->sysmmu
, "Enabled\n");
454 ret
= (pgtable
== data
->pgtable
) ? 1 : -EBUSY
;
456 dev_dbg(data
->sysmmu
, "already enabled\n");
459 if (WARN_ON(ret
< 0))
460 set_sysmmu_inactive(data
); /* decrement count */
462 spin_unlock_irqrestore(&data
->lock
, flags
);
467 /* __exynos_sysmmu_enable: Enables System MMU
469 * returns -error if an error occurred and System MMU is not enabled,
470 * 0 if the System MMU has been just enabled and 1 if System MMU was already
473 static int __exynos_sysmmu_enable(struct device
*dev
, phys_addr_t pgtable
,
474 struct iommu_domain
*domain
)
478 struct exynos_iommu_owner
*owner
= dev
->archdata
.iommu
;
479 struct sysmmu_drvdata
*data
;
481 BUG_ON(!has_sysmmu(dev
));
483 spin_lock_irqsave(&owner
->lock
, flags
);
485 data
= dev_get_drvdata(owner
->sysmmu
);
487 ret
= __sysmmu_enable(data
, pgtable
, domain
);
491 spin_unlock_irqrestore(&owner
->lock
, flags
);
496 int exynos_sysmmu_enable(struct device
*dev
, phys_addr_t pgtable
)
498 BUG_ON(!memblock_is_memory(pgtable
));
500 return __exynos_sysmmu_enable(dev
, pgtable
, NULL
);
503 static bool exynos_sysmmu_disable(struct device
*dev
)
506 bool disabled
= true;
507 struct exynos_iommu_owner
*owner
= dev
->archdata
.iommu
;
508 struct sysmmu_drvdata
*data
;
510 BUG_ON(!has_sysmmu(dev
));
512 spin_lock_irqsave(&owner
->lock
, flags
);
514 data
= dev_get_drvdata(owner
->sysmmu
);
516 disabled
= __sysmmu_disable(data
);
520 spin_unlock_irqrestore(&owner
->lock
, flags
);
525 static void __sysmmu_tlb_invalidate_flpdcache(struct sysmmu_drvdata
*data
,
528 if (__raw_sysmmu_version(data
) == MAKE_MMU_VER(3, 3))
529 __raw_writel(iova
| 0x1, data
->sfrbase
+ REG_MMU_FLUSH_ENTRY
);
532 static void sysmmu_tlb_invalidate_flpdcache(struct device
*dev
,
536 struct exynos_iommu_owner
*owner
= dev
->archdata
.iommu
;
537 struct sysmmu_drvdata
*data
= dev_get_drvdata(owner
->sysmmu
);
539 if (!IS_ERR(data
->clk_master
))
540 clk_enable(data
->clk_master
);
542 spin_lock_irqsave(&data
->lock
, flags
);
543 if (is_sysmmu_active(data
))
544 __sysmmu_tlb_invalidate_flpdcache(data
, iova
);
545 spin_unlock_irqrestore(&data
->lock
, flags
);
547 if (!IS_ERR(data
->clk_master
))
548 clk_disable(data
->clk_master
);
551 static void sysmmu_tlb_invalidate_entry(struct device
*dev
, sysmmu_iova_t iova
,
554 struct exynos_iommu_owner
*owner
= dev
->archdata
.iommu
;
556 struct sysmmu_drvdata
*data
;
558 data
= dev_get_drvdata(owner
->sysmmu
);
560 spin_lock_irqsave(&data
->lock
, flags
);
561 if (is_sysmmu_active(data
)) {
562 unsigned int num_inv
= 1;
564 if (!IS_ERR(data
->clk_master
))
565 clk_enable(data
->clk_master
);
568 * L2TLB invalidation required
569 * 4KB page: 1 invalidation
570 * 64KB page: 16 invalidation
571 * 1MB page: 64 invalidation
572 * because it is set-associative TLB
573 * with 8-way and 64 sets.
574 * 1MB page can be cached in one of all sets.
575 * 64KB page can be one of 16 consecutive sets.
577 if (MMU_MAJ_VER(__raw_sysmmu_version(data
)) == 2)
578 num_inv
= min_t(unsigned int, size
/ PAGE_SIZE
, 64);
580 if (sysmmu_block(data
->sfrbase
)) {
581 __sysmmu_tlb_invalidate_entry(
582 data
->sfrbase
, iova
, num_inv
);
583 sysmmu_unblock(data
->sfrbase
);
585 if (!IS_ERR(data
->clk_master
))
586 clk_disable(data
->clk_master
);
588 dev_dbg(dev
, "disabled. Skipping TLB invalidation @ %#x\n",
591 spin_unlock_irqrestore(&data
->lock
, flags
);
594 void exynos_sysmmu_tlb_invalidate(struct device
*dev
)
596 struct exynos_iommu_owner
*owner
= dev
->archdata
.iommu
;
598 struct sysmmu_drvdata
*data
;
600 data
= dev_get_drvdata(owner
->sysmmu
);
602 spin_lock_irqsave(&data
->lock
, flags
);
603 if (is_sysmmu_active(data
)) {
604 if (!IS_ERR(data
->clk_master
))
605 clk_enable(data
->clk_master
);
606 if (sysmmu_block(data
->sfrbase
)) {
607 __sysmmu_tlb_invalidate(data
->sfrbase
);
608 sysmmu_unblock(data
->sfrbase
);
610 if (!IS_ERR(data
->clk_master
))
611 clk_disable(data
->clk_master
);
613 dev_dbg(dev
, "disabled. Skipping TLB invalidation\n");
615 spin_unlock_irqrestore(&data
->lock
, flags
);
618 static int __init
exynos_sysmmu_probe(struct platform_device
*pdev
)
621 struct device
*dev
= &pdev
->dev
;
622 struct sysmmu_drvdata
*data
;
623 struct resource
*res
;
625 data
= devm_kzalloc(dev
, sizeof(*data
), GFP_KERNEL
);
629 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
630 data
->sfrbase
= devm_ioremap_resource(dev
, res
);
631 if (IS_ERR(data
->sfrbase
))
632 return PTR_ERR(data
->sfrbase
);
634 irq
= platform_get_irq(pdev
, 0);
636 dev_err(dev
, "Unable to find IRQ resource\n");
640 ret
= devm_request_irq(dev
, irq
, exynos_sysmmu_irq
, 0,
641 dev_name(dev
), data
);
643 dev_err(dev
, "Unabled to register handler of irq %d\n", irq
);
647 data
->clk
= devm_clk_get(dev
, "sysmmu");
648 if (IS_ERR(data
->clk
)) {
649 dev_err(dev
, "Failed to get clock!\n");
650 return PTR_ERR(data
->clk
);
652 ret
= clk_prepare(data
->clk
);
654 dev_err(dev
, "Failed to prepare clk\n");
659 data
->clk_master
= devm_clk_get(dev
, "master");
660 if (!IS_ERR(data
->clk_master
)) {
661 ret
= clk_prepare(data
->clk_master
);
663 clk_unprepare(data
->clk
);
664 dev_err(dev
, "Failed to prepare master's clk\n");
670 spin_lock_init(&data
->lock
);
672 platform_set_drvdata(pdev
, data
);
674 pm_runtime_enable(dev
);
679 static const struct of_device_id sysmmu_of_match
[] __initconst
= {
680 { .compatible
= "samsung,exynos-sysmmu", },
684 static struct platform_driver exynos_sysmmu_driver __refdata
= {
685 .probe
= exynos_sysmmu_probe
,
687 .owner
= THIS_MODULE
,
688 .name
= "exynos-sysmmu",
689 .of_match_table
= sysmmu_of_match
,
693 static inline void pgtable_flush(void *vastart
, void *vaend
)
695 dmac_flush_range(vastart
, vaend
);
696 outer_flush_range(virt_to_phys(vastart
),
697 virt_to_phys(vaend
));
700 static int exynos_iommu_domain_init(struct iommu_domain
*domain
)
702 struct exynos_iommu_domain
*priv
;
705 priv
= kzalloc(sizeof(*priv
), GFP_KERNEL
);
709 priv
->pgtable
= (sysmmu_pte_t
*)__get_free_pages(GFP_KERNEL
, 2);
713 priv
->lv2entcnt
= (short *)__get_free_pages(GFP_KERNEL
| __GFP_ZERO
, 1);
714 if (!priv
->lv2entcnt
)
717 /* w/a of System MMU v3.3 to prevent caching 1MiB mapping */
718 for (i
= 0; i
< NUM_LV1ENTRIES
; i
+= 8) {
719 priv
->pgtable
[i
+ 0] = ZERO_LV2LINK
;
720 priv
->pgtable
[i
+ 1] = ZERO_LV2LINK
;
721 priv
->pgtable
[i
+ 2] = ZERO_LV2LINK
;
722 priv
->pgtable
[i
+ 3] = ZERO_LV2LINK
;
723 priv
->pgtable
[i
+ 4] = ZERO_LV2LINK
;
724 priv
->pgtable
[i
+ 5] = ZERO_LV2LINK
;
725 priv
->pgtable
[i
+ 6] = ZERO_LV2LINK
;
726 priv
->pgtable
[i
+ 7] = ZERO_LV2LINK
;
729 pgtable_flush(priv
->pgtable
, priv
->pgtable
+ NUM_LV1ENTRIES
);
731 spin_lock_init(&priv
->lock
);
732 spin_lock_init(&priv
->pgtablelock
);
733 INIT_LIST_HEAD(&priv
->clients
);
735 domain
->geometry
.aperture_start
= 0;
736 domain
->geometry
.aperture_end
= ~0UL;
737 domain
->geometry
.force_aperture
= true;
743 free_pages((unsigned long)priv
->pgtable
, 2);
749 static void exynos_iommu_domain_destroy(struct iommu_domain
*domain
)
751 struct exynos_iommu_domain
*priv
= domain
->priv
;
752 struct exynos_iommu_owner
*owner
;
756 WARN_ON(!list_empty(&priv
->clients
));
758 spin_lock_irqsave(&priv
->lock
, flags
);
760 list_for_each_entry(owner
, &priv
->clients
, client
) {
761 while (!exynos_sysmmu_disable(owner
->dev
))
762 ; /* until System MMU is actually disabled */
765 while (!list_empty(&priv
->clients
))
766 list_del_init(priv
->clients
.next
);
768 spin_unlock_irqrestore(&priv
->lock
, flags
);
770 for (i
= 0; i
< NUM_LV1ENTRIES
; i
++)
771 if (lv1ent_page(priv
->pgtable
+ i
))
772 kmem_cache_free(lv2table_kmem_cache
,
773 phys_to_virt(lv2table_base(priv
->pgtable
+ i
)));
775 free_pages((unsigned long)priv
->pgtable
, 2);
776 free_pages((unsigned long)priv
->lv2entcnt
, 1);
781 static int exynos_iommu_attach_device(struct iommu_domain
*domain
,
784 struct exynos_iommu_owner
*owner
= dev
->archdata
.iommu
;
785 struct exynos_iommu_domain
*priv
= domain
->priv
;
786 phys_addr_t pagetable
= virt_to_phys(priv
->pgtable
);
790 spin_lock_irqsave(&priv
->lock
, flags
);
792 ret
= __exynos_sysmmu_enable(dev
, pagetable
, domain
);
794 list_add_tail(&owner
->client
, &priv
->clients
);
795 owner
->domain
= domain
;
798 spin_unlock_irqrestore(&priv
->lock
, flags
);
801 dev_err(dev
, "%s: Failed to attach IOMMU with pgtable %pa\n",
802 __func__
, &pagetable
);
806 dev_dbg(dev
, "%s: Attached IOMMU with pgtable %pa %s\n",
807 __func__
, &pagetable
, (ret
== 0) ? "" : ", again");
812 static void exynos_iommu_detach_device(struct iommu_domain
*domain
,
815 struct exynos_iommu_owner
*owner
;
816 struct exynos_iommu_domain
*priv
= domain
->priv
;
817 phys_addr_t pagetable
= virt_to_phys(priv
->pgtable
);
820 spin_lock_irqsave(&priv
->lock
, flags
);
822 list_for_each_entry(owner
, &priv
->clients
, client
) {
823 if (owner
== dev
->archdata
.iommu
) {
824 if (exynos_sysmmu_disable(dev
)) {
825 list_del_init(&owner
->client
);
826 owner
->domain
= NULL
;
832 spin_unlock_irqrestore(&priv
->lock
, flags
);
834 if (owner
== dev
->archdata
.iommu
)
835 dev_dbg(dev
, "%s: Detached IOMMU with pgtable %pa\n",
836 __func__
, &pagetable
);
838 dev_err(dev
, "%s: No IOMMU is attached\n", __func__
);
841 static sysmmu_pte_t
*alloc_lv2entry(struct exynos_iommu_domain
*priv
,
842 sysmmu_pte_t
*sent
, sysmmu_iova_t iova
, short *pgcounter
)
844 if (lv1ent_section(sent
)) {
845 WARN(1, "Trying mapping on %#08x mapped with 1MiB page", iova
);
846 return ERR_PTR(-EADDRINUSE
);
849 if (lv1ent_fault(sent
)) {
851 bool need_flush_flpd_cache
= lv1ent_zero(sent
);
853 pent
= kmem_cache_zalloc(lv2table_kmem_cache
, GFP_ATOMIC
);
854 BUG_ON((unsigned int)pent
& (LV2TABLE_SIZE
- 1));
856 return ERR_PTR(-ENOMEM
);
858 *sent
= mk_lv1ent_page(virt_to_phys(pent
));
859 *pgcounter
= NUM_LV2ENTRIES
;
860 pgtable_flush(pent
, pent
+ NUM_LV2ENTRIES
);
861 pgtable_flush(sent
, sent
+ 1);
864 * If pretched SLPD is a fault SLPD in zero_l2_table, FLPD cache
865 * may caches the address of zero_l2_table. This function
866 * replaces the zero_l2_table with new L2 page table to write
868 * Accessing the valid area may cause page fault since FLPD
869 * cache may still caches zero_l2_table for the valid area
870 * instead of new L2 page table that have the mapping
871 * information of the valid area
872 * Thus any replacement of zero_l2_table with other valid L2
873 * page table must involve FLPD cache invalidation for System
875 * FLPD cache invalidation is performed with TLB invalidation
876 * by VPN without blocking. It is safe to invalidate TLB without
877 * blocking because the target address of TLB invalidation is
878 * not currently mapped.
880 if (need_flush_flpd_cache
) {
881 struct exynos_iommu_owner
*owner
;
883 spin_lock(&priv
->lock
);
884 list_for_each_entry(owner
, &priv
->clients
, client
)
885 sysmmu_tlb_invalidate_flpdcache(
887 spin_unlock(&priv
->lock
);
891 return page_entry(sent
, iova
);
894 static int lv1set_section(struct exynos_iommu_domain
*priv
,
895 sysmmu_pte_t
*sent
, sysmmu_iova_t iova
,
896 phys_addr_t paddr
, short *pgcnt
)
898 if (lv1ent_section(sent
)) {
899 WARN(1, "Trying mapping on 1MiB@%#08x that is mapped",
904 if (lv1ent_page(sent
)) {
905 if (*pgcnt
!= NUM_LV2ENTRIES
) {
906 WARN(1, "Trying mapping on 1MiB@%#08x that is mapped",
911 kmem_cache_free(lv2table_kmem_cache
, page_entry(sent
, 0));
915 *sent
= mk_lv1ent_sect(paddr
);
917 pgtable_flush(sent
, sent
+ 1);
919 spin_lock(&priv
->lock
);
920 if (lv1ent_page_zero(sent
)) {
921 struct exynos_iommu_owner
*owner
;
923 * Flushing FLPD cache in System MMU v3.3 that may cache a FLPD
924 * entry by speculative prefetch of SLPD which has no mapping.
926 list_for_each_entry(owner
, &priv
->clients
, client
)
927 sysmmu_tlb_invalidate_flpdcache(owner
->dev
, iova
);
929 spin_unlock(&priv
->lock
);
934 static int lv2set_page(sysmmu_pte_t
*pent
, phys_addr_t paddr
, size_t size
,
937 if (size
== SPAGE_SIZE
) {
938 if (WARN_ON(!lv2ent_fault(pent
)))
941 *pent
= mk_lv2ent_spage(paddr
);
942 pgtable_flush(pent
, pent
+ 1);
944 } else { /* size == LPAGE_SIZE */
947 for (i
= 0; i
< SPAGES_PER_LPAGE
; i
++, pent
++) {
948 if (WARN_ON(!lv2ent_fault(pent
))) {
950 memset(pent
- i
, 0, sizeof(*pent
) * i
);
954 *pent
= mk_lv2ent_lpage(paddr
);
956 pgtable_flush(pent
- SPAGES_PER_LPAGE
, pent
);
957 *pgcnt
-= SPAGES_PER_LPAGE
;
964 * *CAUTION* to the I/O virtual memory managers that support exynos-iommu:
966 * System MMU v3.x have an advanced logic to improve address translation
967 * performance with caching more page table entries by a page table walk.
968 * However, the logic has a bug that caching fault page table entries and System
969 * MMU reports page fault if the cached fault entry is hit even though the fault
970 * entry is updated to a valid entry after the entry is cached.
971 * To prevent caching fault page table entries which may be updated to valid
972 * entries later, the virtual memory manager should care about the w/a about the
973 * problem. The followings describe w/a.
975 * Any two consecutive I/O virtual address regions must have a hole of 128KiB
976 * in maximum to prevent misbehavior of System MMU 3.x. (w/a of h/w bug)
978 * Precisely, any start address of I/O virtual region must be aligned by
979 * the following sizes for System MMU v3.1 and v3.2.
980 * System MMU v3.1: 128KiB
981 * System MMU v3.2: 256KiB
983 * Because System MMU v3.3 caches page table entries more aggressively, it needs
985 * - Any two consecutive I/O virtual regions must be have a hole of larger size
986 * than or equal size to 128KiB.
987 * - Start address of an I/O virtual region must be aligned by 128KiB.
989 static int exynos_iommu_map(struct iommu_domain
*domain
, unsigned long l_iova
,
990 phys_addr_t paddr
, size_t size
, int prot
)
992 struct exynos_iommu_domain
*priv
= domain
->priv
;
994 sysmmu_iova_t iova
= (sysmmu_iova_t
)l_iova
;
998 BUG_ON(priv
->pgtable
== NULL
);
1000 spin_lock_irqsave(&priv
->pgtablelock
, flags
);
1002 entry
= section_entry(priv
->pgtable
, iova
);
1004 if (size
== SECT_SIZE
) {
1005 ret
= lv1set_section(priv
, entry
, iova
, paddr
,
1006 &priv
->lv2entcnt
[lv1ent_offset(iova
)]);
1010 pent
= alloc_lv2entry(priv
, entry
, iova
,
1011 &priv
->lv2entcnt
[lv1ent_offset(iova
)]);
1014 ret
= PTR_ERR(pent
);
1016 ret
= lv2set_page(pent
, paddr
, size
,
1017 &priv
->lv2entcnt
[lv1ent_offset(iova
)]);
1021 pr_err("%s: Failed(%d) to map %#zx bytes @ %#x\n",
1022 __func__
, ret
, size
, iova
);
1024 spin_unlock_irqrestore(&priv
->pgtablelock
, flags
);
1029 static void exynos_iommu_tlb_invalidate_entry(struct exynos_iommu_domain
*priv
,
1030 sysmmu_iova_t iova
, size_t size
)
1032 struct exynos_iommu_owner
*owner
;
1033 unsigned long flags
;
1035 spin_lock_irqsave(&priv
->lock
, flags
);
1037 list_for_each_entry(owner
, &priv
->clients
, client
)
1038 sysmmu_tlb_invalidate_entry(owner
->dev
, iova
, size
);
1040 spin_unlock_irqrestore(&priv
->lock
, flags
);
1043 static size_t exynos_iommu_unmap(struct iommu_domain
*domain
,
1044 unsigned long l_iova
, size_t size
)
1046 struct exynos_iommu_domain
*priv
= domain
->priv
;
1047 sysmmu_iova_t iova
= (sysmmu_iova_t
)l_iova
;
1050 unsigned long flags
;
1052 BUG_ON(priv
->pgtable
== NULL
);
1054 spin_lock_irqsave(&priv
->pgtablelock
, flags
);
1056 ent
= section_entry(priv
->pgtable
, iova
);
1058 if (lv1ent_section(ent
)) {
1059 if (WARN_ON(size
< SECT_SIZE
)) {
1060 err_pgsize
= SECT_SIZE
;
1064 *ent
= ZERO_LV2LINK
; /* w/a for h/w bug in Sysmem MMU v3.3 */
1065 pgtable_flush(ent
, ent
+ 1);
1070 if (unlikely(lv1ent_fault(ent
))) {
1071 if (size
> SECT_SIZE
)
1076 /* lv1ent_page(sent) == true here */
1078 ent
= page_entry(ent
, iova
);
1080 if (unlikely(lv2ent_fault(ent
))) {
1085 if (lv2ent_small(ent
)) {
1088 pgtable_flush(ent
, ent
+ 1);
1089 priv
->lv2entcnt
[lv1ent_offset(iova
)] += 1;
1093 /* lv1ent_large(ent) == true here */
1094 if (WARN_ON(size
< LPAGE_SIZE
)) {
1095 err_pgsize
= LPAGE_SIZE
;
1099 memset(ent
, 0, sizeof(*ent
) * SPAGES_PER_LPAGE
);
1100 pgtable_flush(ent
, ent
+ SPAGES_PER_LPAGE
);
1103 priv
->lv2entcnt
[lv1ent_offset(iova
)] += SPAGES_PER_LPAGE
;
1105 spin_unlock_irqrestore(&priv
->pgtablelock
, flags
);
1107 exynos_iommu_tlb_invalidate_entry(priv
, iova
, size
);
1111 spin_unlock_irqrestore(&priv
->pgtablelock
, flags
);
1113 pr_err("%s: Failed: size(%#zx) @ %#x is smaller than page size %#zx\n",
1114 __func__
, size
, iova
, err_pgsize
);
1119 static phys_addr_t
exynos_iommu_iova_to_phys(struct iommu_domain
*domain
,
1122 struct exynos_iommu_domain
*priv
= domain
->priv
;
1123 sysmmu_pte_t
*entry
;
1124 unsigned long flags
;
1125 phys_addr_t phys
= 0;
1127 spin_lock_irqsave(&priv
->pgtablelock
, flags
);
1129 entry
= section_entry(priv
->pgtable
, iova
);
1131 if (lv1ent_section(entry
)) {
1132 phys
= section_phys(entry
) + section_offs(iova
);
1133 } else if (lv1ent_page(entry
)) {
1134 entry
= page_entry(entry
, iova
);
1136 if (lv2ent_large(entry
))
1137 phys
= lpage_phys(entry
) + lpage_offs(iova
);
1138 else if (lv2ent_small(entry
))
1139 phys
= spage_phys(entry
) + spage_offs(iova
);
1142 spin_unlock_irqrestore(&priv
->pgtablelock
, flags
);
1147 static int exynos_iommu_add_device(struct device
*dev
)
1149 struct iommu_group
*group
;
1152 group
= iommu_group_get(dev
);
1155 group
= iommu_group_alloc();
1156 if (IS_ERR(group
)) {
1157 dev_err(dev
, "Failed to allocate IOMMU group\n");
1158 return PTR_ERR(group
);
1162 ret
= iommu_group_add_device(group
, dev
);
1163 iommu_group_put(group
);
1168 static void exynos_iommu_remove_device(struct device
*dev
)
1170 iommu_group_remove_device(dev
);
1173 static const struct iommu_ops exynos_iommu_ops
= {
1174 .domain_init
= exynos_iommu_domain_init
,
1175 .domain_destroy
= exynos_iommu_domain_destroy
,
1176 .attach_dev
= exynos_iommu_attach_device
,
1177 .detach_dev
= exynos_iommu_detach_device
,
1178 .map
= exynos_iommu_map
,
1179 .unmap
= exynos_iommu_unmap
,
1180 .iova_to_phys
= exynos_iommu_iova_to_phys
,
1181 .add_device
= exynos_iommu_add_device
,
1182 .remove_device
= exynos_iommu_remove_device
,
1183 .pgsize_bitmap
= SECT_SIZE
| LPAGE_SIZE
| SPAGE_SIZE
,
1186 static int __init
exynos_iommu_init(void)
1190 lv2table_kmem_cache
= kmem_cache_create("exynos-iommu-lv2table",
1191 LV2TABLE_SIZE
, LV2TABLE_SIZE
, 0, NULL
);
1192 if (!lv2table_kmem_cache
) {
1193 pr_err("%s: Failed to create kmem cache\n", __func__
);
1197 ret
= platform_driver_register(&exynos_sysmmu_driver
);
1199 pr_err("%s: Failed to register driver\n", __func__
);
1200 goto err_reg_driver
;
1203 zero_lv2_table
= kmem_cache_zalloc(lv2table_kmem_cache
, GFP_KERNEL
);
1204 if (zero_lv2_table
== NULL
) {
1205 pr_err("%s: Failed to allocate zero level2 page table\n",
1211 ret
= bus_set_iommu(&platform_bus_type
, &exynos_iommu_ops
);
1213 pr_err("%s: Failed to register exynos-iommu driver.\n",
1220 kmem_cache_free(lv2table_kmem_cache
, zero_lv2_table
);
1222 platform_driver_unregister(&exynos_sysmmu_driver
);
1224 kmem_cache_destroy(lv2table_kmem_cache
);
1227 subsys_initcall(exynos_iommu_init
);