Lines Matching refs:data
223 static bool set_sysmmu_active(struct sysmmu_drvdata *data) in set_sysmmu_active() argument
227 return ++data->activations == 1; in set_sysmmu_active()
230 static bool set_sysmmu_inactive(struct sysmmu_drvdata *data) in set_sysmmu_inactive() argument
233 BUG_ON(data->activations < 1); in set_sysmmu_inactive()
234 return --data->activations == 0; in set_sysmmu_inactive()
237 static bool is_sysmmu_active(struct sysmmu_drvdata *data) in is_sysmmu_active() argument
239 return data->activations > 0; in is_sysmmu_active()
247 static unsigned int __raw_sysmmu_version(struct sysmmu_drvdata *data) in __raw_sysmmu_version() argument
249 return MMU_RAW_VER(__raw_readl(data->sfrbase + REG_MMU_VERSION)); in __raw_sysmmu_version()
317 struct sysmmu_drvdata *data = dev_id; in exynos_sysmmu_irq() local
322 WARN_ON(!is_sysmmu_active(data)); in exynos_sysmmu_irq()
324 spin_lock(&data->lock); in exynos_sysmmu_irq()
326 if (!IS_ERR(data->clk_master)) in exynos_sysmmu_irq()
327 clk_enable(data->clk_master); in exynos_sysmmu_irq()
330 __ffs(__raw_readl(data->sfrbase + REG_INT_STATUS)); in exynos_sysmmu_irq()
334 addr = __raw_readl(data->sfrbase + fault_reg_offset[itype]); in exynos_sysmmu_irq()
338 __func__, dev_name(data->sysmmu)); in exynos_sysmmu_irq()
344 __raw_readl(data->sfrbase + REG_PT_BASE_ADDR); in exynos_sysmmu_irq()
345 show_fault_information(dev_name(data->sysmmu), in exynos_sysmmu_irq()
347 if (data->domain) in exynos_sysmmu_irq()
348 ret = report_iommu_fault(data->domain, in exynos_sysmmu_irq()
349 data->master, addr, itype); in exynos_sysmmu_irq()
355 __raw_writel(1 << itype, data->sfrbase + REG_INT_CLEAR); in exynos_sysmmu_irq()
357 sysmmu_unblock(data->sfrbase); in exynos_sysmmu_irq()
359 if (!IS_ERR(data->clk_master)) in exynos_sysmmu_irq()
360 clk_disable(data->clk_master); in exynos_sysmmu_irq()
362 spin_unlock(&data->lock); in exynos_sysmmu_irq()
367 static void __sysmmu_disable_nocount(struct sysmmu_drvdata *data) in __sysmmu_disable_nocount() argument
369 if (!IS_ERR(data->clk_master)) in __sysmmu_disable_nocount()
370 clk_enable(data->clk_master); in __sysmmu_disable_nocount()
372 __raw_writel(CTRL_DISABLE, data->sfrbase + REG_MMU_CTRL); in __sysmmu_disable_nocount()
373 __raw_writel(0, data->sfrbase + REG_MMU_CFG); in __sysmmu_disable_nocount()
375 clk_disable(data->clk); in __sysmmu_disable_nocount()
376 if (!IS_ERR(data->clk_master)) in __sysmmu_disable_nocount()
377 clk_disable(data->clk_master); in __sysmmu_disable_nocount()
380 static bool __sysmmu_disable(struct sysmmu_drvdata *data) in __sysmmu_disable() argument
385 spin_lock_irqsave(&data->lock, flags); in __sysmmu_disable()
387 disabled = set_sysmmu_inactive(data); in __sysmmu_disable()
390 data->pgtable = 0; in __sysmmu_disable()
391 data->domain = NULL; in __sysmmu_disable()
393 __sysmmu_disable_nocount(data); in __sysmmu_disable()
395 dev_dbg(data->sysmmu, "Disabled\n"); in __sysmmu_disable()
397 dev_dbg(data->sysmmu, "%d times left to disable\n", in __sysmmu_disable()
398 data->activations); in __sysmmu_disable()
401 spin_unlock_irqrestore(&data->lock, flags); in __sysmmu_disable()
406 static void __sysmmu_init_config(struct sysmmu_drvdata *data) in __sysmmu_init_config() argument
411 ver = __raw_sysmmu_version(data); in __sysmmu_init_config()
424 __raw_writel(cfg, data->sfrbase + REG_MMU_CFG); in __sysmmu_init_config()
427 static void __sysmmu_enable_nocount(struct sysmmu_drvdata *data) in __sysmmu_enable_nocount() argument
429 if (!IS_ERR(data->clk_master)) in __sysmmu_enable_nocount()
430 clk_enable(data->clk_master); in __sysmmu_enable_nocount()
431 clk_enable(data->clk); in __sysmmu_enable_nocount()
433 __raw_writel(CTRL_BLOCK, data->sfrbase + REG_MMU_CTRL); in __sysmmu_enable_nocount()
435 __sysmmu_init_config(data); in __sysmmu_enable_nocount()
437 __sysmmu_set_ptbase(data->sfrbase, data->pgtable); in __sysmmu_enable_nocount()
439 __raw_writel(CTRL_ENABLE, data->sfrbase + REG_MMU_CTRL); in __sysmmu_enable_nocount()
441 if (!IS_ERR(data->clk_master)) in __sysmmu_enable_nocount()
442 clk_disable(data->clk_master); in __sysmmu_enable_nocount()
445 static int __sysmmu_enable(struct sysmmu_drvdata *data, in __sysmmu_enable() argument
451 spin_lock_irqsave(&data->lock, flags); in __sysmmu_enable()
452 if (set_sysmmu_active(data)) { in __sysmmu_enable()
453 data->pgtable = pgtable; in __sysmmu_enable()
454 data->domain = domain; in __sysmmu_enable()
456 __sysmmu_enable_nocount(data); in __sysmmu_enable()
458 dev_dbg(data->sysmmu, "Enabled\n"); in __sysmmu_enable()
460 ret = (pgtable == data->pgtable) ? 1 : -EBUSY; in __sysmmu_enable()
462 dev_dbg(data->sysmmu, "already enabled\n"); in __sysmmu_enable()
466 set_sysmmu_inactive(data); /* decrement count */ in __sysmmu_enable()
468 spin_unlock_irqrestore(&data->lock, flags); in __sysmmu_enable()
485 struct sysmmu_drvdata *data; in __exynos_sysmmu_enable() local
491 data = dev_get_drvdata(owner->sysmmu); in __exynos_sysmmu_enable()
493 ret = __sysmmu_enable(data, pgtable, domain); in __exynos_sysmmu_enable()
495 data->master = dev; in __exynos_sysmmu_enable()
514 struct sysmmu_drvdata *data; in exynos_sysmmu_disable() local
520 data = dev_get_drvdata(owner->sysmmu); in exynos_sysmmu_disable()
522 disabled = __sysmmu_disable(data); in exynos_sysmmu_disable()
524 data->master = NULL; in exynos_sysmmu_disable()
531 static void __sysmmu_tlb_invalidate_flpdcache(struct sysmmu_drvdata *data, in __sysmmu_tlb_invalidate_flpdcache() argument
534 if (__raw_sysmmu_version(data) == MAKE_MMU_VER(3, 3)) in __sysmmu_tlb_invalidate_flpdcache()
535 __raw_writel(iova | 0x1, data->sfrbase + REG_MMU_FLUSH_ENTRY); in __sysmmu_tlb_invalidate_flpdcache()
543 struct sysmmu_drvdata *data = dev_get_drvdata(owner->sysmmu); in sysmmu_tlb_invalidate_flpdcache() local
545 if (!IS_ERR(data->clk_master)) in sysmmu_tlb_invalidate_flpdcache()
546 clk_enable(data->clk_master); in sysmmu_tlb_invalidate_flpdcache()
548 spin_lock_irqsave(&data->lock, flags); in sysmmu_tlb_invalidate_flpdcache()
549 if (is_sysmmu_active(data)) in sysmmu_tlb_invalidate_flpdcache()
550 __sysmmu_tlb_invalidate_flpdcache(data, iova); in sysmmu_tlb_invalidate_flpdcache()
551 spin_unlock_irqrestore(&data->lock, flags); in sysmmu_tlb_invalidate_flpdcache()
553 if (!IS_ERR(data->clk_master)) in sysmmu_tlb_invalidate_flpdcache()
554 clk_disable(data->clk_master); in sysmmu_tlb_invalidate_flpdcache()
562 struct sysmmu_drvdata *data; in sysmmu_tlb_invalidate_entry() local
564 data = dev_get_drvdata(owner->sysmmu); in sysmmu_tlb_invalidate_entry()
566 spin_lock_irqsave(&data->lock, flags); in sysmmu_tlb_invalidate_entry()
567 if (is_sysmmu_active(data)) { in sysmmu_tlb_invalidate_entry()
570 if (!IS_ERR(data->clk_master)) in sysmmu_tlb_invalidate_entry()
571 clk_enable(data->clk_master); in sysmmu_tlb_invalidate_entry()
583 if (MMU_MAJ_VER(__raw_sysmmu_version(data)) == 2) in sysmmu_tlb_invalidate_entry()
586 if (sysmmu_block(data->sfrbase)) { in sysmmu_tlb_invalidate_entry()
588 data->sfrbase, iova, num_inv); in sysmmu_tlb_invalidate_entry()
589 sysmmu_unblock(data->sfrbase); in sysmmu_tlb_invalidate_entry()
591 if (!IS_ERR(data->clk_master)) in sysmmu_tlb_invalidate_entry()
592 clk_disable(data->clk_master); in sysmmu_tlb_invalidate_entry()
597 spin_unlock_irqrestore(&data->lock, flags); in sysmmu_tlb_invalidate_entry()
604 struct sysmmu_drvdata *data; in exynos_sysmmu_tlb_invalidate() local
606 data = dev_get_drvdata(owner->sysmmu); in exynos_sysmmu_tlb_invalidate()
608 spin_lock_irqsave(&data->lock, flags); in exynos_sysmmu_tlb_invalidate()
609 if (is_sysmmu_active(data)) { in exynos_sysmmu_tlb_invalidate()
610 if (!IS_ERR(data->clk_master)) in exynos_sysmmu_tlb_invalidate()
611 clk_enable(data->clk_master); in exynos_sysmmu_tlb_invalidate()
612 if (sysmmu_block(data->sfrbase)) { in exynos_sysmmu_tlb_invalidate()
613 __sysmmu_tlb_invalidate(data->sfrbase); in exynos_sysmmu_tlb_invalidate()
614 sysmmu_unblock(data->sfrbase); in exynos_sysmmu_tlb_invalidate()
616 if (!IS_ERR(data->clk_master)) in exynos_sysmmu_tlb_invalidate()
617 clk_disable(data->clk_master); in exynos_sysmmu_tlb_invalidate()
621 spin_unlock_irqrestore(&data->lock, flags); in exynos_sysmmu_tlb_invalidate()
628 struct sysmmu_drvdata *data; in exynos_sysmmu_probe() local
631 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); in exynos_sysmmu_probe()
632 if (!data) in exynos_sysmmu_probe()
636 data->sfrbase = devm_ioremap_resource(dev, res); in exynos_sysmmu_probe()
637 if (IS_ERR(data->sfrbase)) in exynos_sysmmu_probe()
638 return PTR_ERR(data->sfrbase); in exynos_sysmmu_probe()
647 dev_name(dev), data); in exynos_sysmmu_probe()
653 data->clk = devm_clk_get(dev, "sysmmu"); in exynos_sysmmu_probe()
654 if (IS_ERR(data->clk)) { in exynos_sysmmu_probe()
656 return PTR_ERR(data->clk); in exynos_sysmmu_probe()
658 ret = clk_prepare(data->clk); in exynos_sysmmu_probe()
665 data->clk_master = devm_clk_get(dev, "master"); in exynos_sysmmu_probe()
666 if (!IS_ERR(data->clk_master)) { in exynos_sysmmu_probe()
667 ret = clk_prepare(data->clk_master); in exynos_sysmmu_probe()
669 clk_unprepare(data->clk); in exynos_sysmmu_probe()
675 data->sysmmu = dev; in exynos_sysmmu_probe()
676 spin_lock_init(&data->lock); in exynos_sysmmu_probe()
678 platform_set_drvdata(pdev, data); in exynos_sysmmu_probe()