[PATCH] ARM: S5P: Remove sysmmu driver from arch tree

Kukjin Kim kgene.kim at samsung.com
Fri Jul 15 23:32:19 EDT 2011


KyongHo Cho wrote:
> 
> This patch remove the System MMU driver from arch/arm/plat-s5p
> because it will be merged with IOMMU API implementation and moved to
> drivers/iommu directory.
> Since the System MMU driver defines custom API and thus is not referred
> by any device drivers in the mainline kernel, this patch will not
> cause any problem.
> 
I think this should be made based on your previous patches which are to move
sysmmu features into drivers/iommu and to improve sysmmu driver.
Following is its #0 patch.
http://marc.info/?l=linux-arm-kernel&m=130974568421704&w=2

Thanks.

Best regards,
Kgene.
--
Kukjin Kim <kgene.kim at samsung.com>, Senior Engineer,
SW Solution Development Team, Samsung Electronics Co., Ltd.

> Signed-off-by: KyongHo Cho <pullip.cho at samsung.com>
> ---
>  arch/arm/plat-s5p/Kconfig               |    8 -
>  arch/arm/plat-s5p/Makefile              |    1 -
>  arch/arm/plat-s5p/include/plat/sysmmu.h |   95 ----------
>  arch/arm/plat-s5p/sysmmu.c              |  312
-------------------------------
>  4 files changed, 0 insertions(+), 416 deletions(-)
>  delete mode 100644 arch/arm/plat-s5p/include/plat/sysmmu.h
>  delete mode 100644 arch/arm/plat-s5p/sysmmu.c
> 
> diff --git a/arch/arm/plat-s5p/Kconfig b/arch/arm/plat-s5p/Kconfig
> index 7f9ff2a..8ad962d 100644
> --- a/arch/arm/plat-s5p/Kconfig
> +++ b/arch/arm/plat-s5p/Kconfig
> @@ -43,14 +43,6 @@ config S5P_HRT
>  	help
>  	  Use the High Resolution timer support
> 
> -comment "System MMU"
> -
> -config S5P_SYSTEM_MMU
> -	bool "S5P SYSTEM MMU"
> -	depends on ARCH_EXYNOS4
> -	help
> -	  Say Y here if you want to enable System MMU
> -
>  config S5P_DEV_FIMC0
>  	bool
>  	help
> diff --git a/arch/arm/plat-s5p/Makefile b/arch/arm/plat-s5p/Makefile
> index e234cc4..f43d8e7 100644
> --- a/arch/arm/plat-s5p/Makefile
> +++ b/arch/arm/plat-s5p/Makefile
> @@ -19,7 +19,6 @@ obj-y				+= clock.o
>  obj-y				+= irq.o
>  obj-$(CONFIG_S5P_EXT_INT)	+= irq-eint.o
>  obj-$(CONFIG_S5P_GPIO_INT)	+= irq-gpioint.o
> -obj-$(CONFIG_S5P_SYSTEM_MMU)	+= sysmmu.o
>  obj-$(CONFIG_PM)		+= pm.o
>  obj-$(CONFIG_PM)		+= irq-pm.o
>  obj-$(CONFIG_S5P_HRT) 		+= s5p-time.o
> diff --git a/arch/arm/plat-s5p/include/plat/sysmmu.h b/arch/arm/plat-
> s5p/include/plat/sysmmu.h
> deleted file mode 100644
> index bf5283c..0000000
> --- a/arch/arm/plat-s5p/include/plat/sysmmu.h
> +++ /dev/null
> @@ -1,95 +0,0 @@
> -/* linux/arch/arm/plat-s5p/include/plat/sysmmu.h
> - *
> - * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd.
> - *		http://www.samsung.com
> - *
> - * Samsung System MMU driver for S5P platform
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License version 2 as
> - * published by the Free Software Foundation.
> -*/
> -
> -#ifndef __ASM__PLAT_SYSMMU_H
> -#define __ASM__PLAT_SYSMMU_H __FILE__
> -
> -enum S5P_SYSMMU_INTERRUPT_TYPE {
> -	SYSMMU_PAGEFAULT,
> -	SYSMMU_AR_MULTIHIT,
> -	SYSMMU_AW_MULTIHIT,
> -	SYSMMU_BUSERROR,
> -	SYSMMU_AR_SECURITY,
> -	SYSMMU_AR_ACCESS,
> -	SYSMMU_AW_SECURITY,
> -	SYSMMU_AW_PROTECTION, /* 7 */
> -	SYSMMU_FAULTS_NUM
> -};
> -
> -#ifdef CONFIG_S5P_SYSTEM_MMU
> -
> -#include <mach/sysmmu.h>
> -
> -/**
> - * s5p_sysmmu_enable() - enable system mmu of ip
> - * @ips: The ip connected system mmu.
> - * #pgd: Base physical address of the 1st level page table
> - *
> - * This function enable system mmu to transfer address
> - * from virtual address to physical address
> - */
> -void s5p_sysmmu_enable(sysmmu_ips ips, unsigned long pgd);
> -
> -/**
> - * s5p_sysmmu_disable() - disable sysmmu mmu of ip
> - * @ips: The ip connected system mmu.
> - *
> - * This function disable system mmu to transfer address
> - * from virtual address to physical address
> - */
> -void s5p_sysmmu_disable(sysmmu_ips ips);
> -
> -/**
> - * s5p_sysmmu_set_tablebase_pgd() - set page table base address to refer
page
> table
> - * @ips: The ip connected system mmu.
> - * @pgd: The page table base address.
> - *
> - * This function set page table base address
> - * When system mmu transfer address from virtaul address to physical
address,
> - * system mmu refer address information from page table
> - */
> -void s5p_sysmmu_set_tablebase_pgd(sysmmu_ips ips, unsigned long pgd);
> -
> -/**
> - * s5p_sysmmu_tlb_invalidate() - flush all TLB entry in system mmu
> - * @ips: The ip connected system mmu.
> - *
> - * This function flush all TLB entry in system mmu
> - */
> -void s5p_sysmmu_tlb_invalidate(sysmmu_ips ips);
> -
> -/** s5p_sysmmu_set_fault_handler() - Fault handler for System MMUs
> - * @itype: type of fault.
> - * @pgtable_base: the physical address of page table base. This is 0 if
@ips is
> - *               SYSMMU_BUSERROR.
> - * @fault_addr: the device (virtual) address that the System MMU tried to
> - *             translated. This is 0 if @ips is SYSMMU_BUSERROR.
> - * Called when interrupt occurred by the System MMUs
> - * The device drivers of peripheral devices that has a System MMU can
implement
> - * a fault handler to resolve address translation fault by System MMU.
> - * The meanings of return value and parameters are described below.
> -
> - * return value: non-zero if the fault is correctly resolved.
> - *         zero if the fault is not handled.
> - */
> -void s5p_sysmmu_set_fault_handler(sysmmu_ips ips,
> -			int (*handler)(enum S5P_SYSMMU_INTERRUPT_TYPE
> itype,
> -					unsigned long pgtable_base,
> -					unsigned long fault_addr));
> -#else
> -#define s5p_sysmmu_enable(ips, pgd) do { } while (0)
> -#define s5p_sysmmu_disable(ips) do { } while (0)
> -#define s5p_sysmmu_set_tablebase_pgd(ips, pgd) do { } while (0)
> -#define s5p_sysmmu_tlb_invalidate(ips) do { } while (0)
> -#define s5p_sysmmu_set_fault_handler(ips, handler) do { } while (0)
> -#endif
> -#endif /* __ASM_PLAT_SYSMMU_H */
> diff --git a/arch/arm/plat-s5p/sysmmu.c b/arch/arm/plat-s5p/sysmmu.c
> deleted file mode 100644
> index 54f5edd..0000000
> --- a/arch/arm/plat-s5p/sysmmu.c
> +++ /dev/null
> @@ -1,312 +0,0 @@
> -/* linux/arch/arm/plat-s5p/sysmmu.c
> - *
> - * Copyright (c) 2010 Samsung Electronics Co., Ltd.
> - *		http://www.samsung.com
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License version 2 as
> - * published by the Free Software Foundation.
> - */
> -
> -#include <linux/io.h>
> -#include <linux/interrupt.h>
> -#include <linux/platform_device.h>
> -
> -#include <asm/pgtable.h>
> -
> -#include <mach/map.h>
> -#include <mach/regs-sysmmu.h>
> -#include <plat/sysmmu.h>
> -
> -#define CTRL_ENABLE	0x5
> -#define CTRL_BLOCK	0x7
> -#define CTRL_DISABLE	0x0
> -
> -static struct device *dev;
> -
> -static unsigned short fault_reg_offset[SYSMMU_FAULTS_NUM] = {
> -	S5P_PAGE_FAULT_ADDR,
> -	S5P_AR_FAULT_ADDR,
> -	S5P_AW_FAULT_ADDR,
> -	S5P_DEFAULT_SLAVE_ADDR,
> -	S5P_AR_FAULT_ADDR,
> -	S5P_AR_FAULT_ADDR,
> -	S5P_AW_FAULT_ADDR,
> -	S5P_AW_FAULT_ADDR
> -};
> -
> -static char *sysmmu_fault_name[SYSMMU_FAULTS_NUM] = {
> -	"PAGE FAULT",
> -	"AR MULTI-HIT FAULT",
> -	"AW MULTI-HIT FAULT",
> -	"BUS ERROR",
> -	"AR SECURITY PROTECTION FAULT",
> -	"AR ACCESS PROTECTION FAULT",
> -	"AW SECURITY PROTECTION FAULT",
> -	"AW ACCESS PROTECTION FAULT"
> -};
> -
> -static int (*fault_handlers[S5P_SYSMMU_TOTAL_IPNUM])(
> -		enum S5P_SYSMMU_INTERRUPT_TYPE itype,
> -		unsigned long pgtable_base,
> -		unsigned long fault_addr);
> -
> -/*
> - * If adjacent 2 bits are true, the system MMU is enabled.
> - * The system MMU is disabled, otherwise.
> - */
> -static unsigned long sysmmu_states;
> -
> -static inline void set_sysmmu_active(sysmmu_ips ips)
> -{
> -	sysmmu_states |= 3 << (ips * 2);
> -}
> -
> -static inline void set_sysmmu_inactive(sysmmu_ips ips)
> -{
> -	sysmmu_states &= ~(3 << (ips * 2));
> -}
> -
> -static inline int is_sysmmu_active(sysmmu_ips ips)
> -{
> -	return sysmmu_states & (3 << (ips * 2));
> -}
> -
> -static void __iomem *sysmmusfrs[S5P_SYSMMU_TOTAL_IPNUM];
> -
> -static inline void sysmmu_block(sysmmu_ips ips)
> -{
> -	__raw_writel(CTRL_BLOCK, sysmmusfrs[ips] + S5P_MMU_CTRL);
> -	dev_dbg(dev, "%s is blocked.\n", sysmmu_ips_name[ips]);
> -}
> -
> -static inline void sysmmu_unblock(sysmmu_ips ips)
> -{
> -	__raw_writel(CTRL_ENABLE, sysmmusfrs[ips] + S5P_MMU_CTRL);
> -	dev_dbg(dev, "%s is unblocked.\n", sysmmu_ips_name[ips]);
> -}
> -
> -static inline void __sysmmu_tlb_invalidate(sysmmu_ips ips)
> -{
> -	__raw_writel(0x1, sysmmusfrs[ips] + S5P_MMU_FLUSH);
> -	dev_dbg(dev, "TLB of %s is invalidated.\n", sysmmu_ips_name[ips]);
> -}
> -
> -static inline void __sysmmu_set_ptbase(sysmmu_ips ips, unsigned long pgd)
> -{
> -	if (unlikely(pgd == 0)) {
> -		pgd = (unsigned long)ZERO_PAGE(0);
> -		__raw_writel(0x20, sysmmusfrs[ips] + S5P_MMU_CFG); /* 4KB
> LV1 */
> -	} else {
> -		__raw_writel(0x0, sysmmusfrs[ips] + S5P_MMU_CFG); /* 16KB
> LV1 */
> -	}
> -
> -	__raw_writel(pgd, sysmmusfrs[ips] + S5P_PT_BASE_ADDR);
> -
> -	dev_dbg(dev, "Page table base of %s is initialized with 0x%08lX.\n",
> -						sysmmu_ips_name[ips],
> pgd);
> -	__sysmmu_tlb_invalidate(ips);
> -}
> -
> -void sysmmu_set_fault_handler(sysmmu_ips ips,
> -			int (*handler)(enum S5P_SYSMMU_INTERRUPT_TYPE
> itype,
> -					unsigned long pgtable_base,
> -					unsigned long fault_addr))
> -{
> -	BUG_ON(!((ips >= SYSMMU_MDMA) && (ips <
> S5P_SYSMMU_TOTAL_IPNUM)));
> -	fault_handlers[ips] = handler;
> -}
> -
> -static irqreturn_t s5p_sysmmu_irq(int irq, void *dev_id)
> -{
> -	/* SYSMMU is in blocked when interrupt occurred. */
> -	unsigned long base = 0;
> -	sysmmu_ips ips = (sysmmu_ips)dev_id;
> -	enum S5P_SYSMMU_INTERRUPT_TYPE itype;
> -
> -	itype = (enum S5P_SYSMMU_INTERRUPT_TYPE)
> -		__ffs(__raw_readl(sysmmusfrs[ips] + S5P_INT_STATUS));
> -
> -	BUG_ON(!((itype >= 0) && (itype < 8)));
> -
> -	dev_alert(dev, "%s occurred by %s.\n", sysmmu_fault_name[itype],
> -
> 	sysmmu_ips_name[ips]);
> -
> -	if (fault_handlers[ips]) {
> -		unsigned long addr;
> -
> -		base = __raw_readl(sysmmusfrs[ips] + S5P_PT_BASE_ADDR);
> -		addr = __raw_readl(sysmmusfrs[ips] +
fault_reg_offset[itype]);
> -
> -		if (fault_handlers[ips](itype, base, addr)) {
> -			__raw_writel(1 << itype,
> -					sysmmusfrs[ips] + S5P_INT_CLEAR);
> -			dev_notice(dev, "%s from %s is resolved."
> -					" Retrying translation.\n",
> -				sysmmu_fault_name[itype],
> sysmmu_ips_name[ips]);
> -		} else {
> -			base = 0;
> -		}
> -	}
> -
> -	sysmmu_unblock(ips);
> -
> -	if (!base)
> -		dev_notice(dev, "%s from %s is not handled.\n",
> -			sysmmu_fault_name[itype], sysmmu_ips_name[ips]);
> -
> -	return IRQ_HANDLED;
> -}
> -
> -void s5p_sysmmu_set_tablebase_pgd(sysmmu_ips ips, unsigned long pgd)
> -{
> -	if (is_sysmmu_active(ips)) {
> -		sysmmu_block(ips);
> -		__sysmmu_set_ptbase(ips, pgd);
> -		sysmmu_unblock(ips);
> -	} else {
> -		dev_dbg(dev, "%s is disabled. "
> -			"Skipping initializing page table base.\n",
> -						sysmmu_ips_name[ips]);
> -	}
> -}
> -
> -void s5p_sysmmu_enable(sysmmu_ips ips, unsigned long pgd)
> -{
> -	if (!is_sysmmu_active(ips)) {
> -		sysmmu_clk_enable(ips);
> -
> -		__sysmmu_set_ptbase(ips, pgd);
> -
> -		__raw_writel(CTRL_ENABLE, sysmmusfrs[ips] +
> S5P_MMU_CTRL);
> -
> -		set_sysmmu_active(ips);
> -		dev_dbg(dev, "%s is enabled.\n", sysmmu_ips_name[ips]);
> -	} else {
> -		dev_dbg(dev, "%s is already enabled.\n",
> sysmmu_ips_name[ips]);
> -	}
> -}
> -
> -void s5p_sysmmu_disable(sysmmu_ips ips)
> -{
> -	if (is_sysmmu_active(ips)) {
> -		__raw_writel(CTRL_DISABLE, sysmmusfrs[ips] +
> S5P_MMU_CTRL);
> -		set_sysmmu_inactive(ips);
> -		sysmmu_clk_disable(ips);
> -		dev_dbg(dev, "%s is disabled.\n", sysmmu_ips_name[ips]);
> -	} else {
> -		dev_dbg(dev, "%s is already disabled.\n",
> sysmmu_ips_name[ips]);
> -	}
> -}
> -
> -void s5p_sysmmu_tlb_invalidate(sysmmu_ips ips)
> -{
> -	if (is_sysmmu_active(ips)) {
> -		sysmmu_block(ips);
> -		__sysmmu_tlb_invalidate(ips);
> -		sysmmu_unblock(ips);
> -	} else {
> -		dev_dbg(dev, "%s is disabled. "
> -			"Skipping invalidating TLB.\n",
sysmmu_ips_name[ips]);
> -	}
> -}
> -
> -static int s5p_sysmmu_probe(struct platform_device *pdev)
> -{
> -	int i, ret;
> -	struct resource *res, *mem;
> -
> -	dev = &pdev->dev;
> -
> -	for (i = 0; i < S5P_SYSMMU_TOTAL_IPNUM; i++) {
> -		int irq;
> -
> -		sysmmu_clk_init(dev, i);
> -		sysmmu_clk_disable(i);
> -
> -		res = platform_get_resource(pdev, IORESOURCE_MEM, i);
> -		if (!res) {
> -			dev_err(dev, "Failed to get the resource of %s.\n",
> -
> 	sysmmu_ips_name[i]);
> -			ret = -ENODEV;
> -			goto err_res;
> -		}
> -
> -		mem = request_mem_region(res->start,
> -				((res->end) - (res->start)) + 1,
pdev->name);
> -		if (!mem) {
> -			dev_err(dev, "Failed to request the memory region
> of %s.\n",
> -
> 	sysmmu_ips_name[i]);
> -			ret = -EBUSY;
> -			goto err_res;
> -		}
> -
> -		sysmmusfrs[i] = ioremap(res->start, res->end - res->start +
1);
> -		if (!sysmmusfrs[i]) {
> -			dev_err(dev, "Failed to ioremap() for %s.\n",
> -
> 	sysmmu_ips_name[i]);
> -			ret = -ENXIO;
> -			goto err_reg;
> -		}
> -
> -		irq = platform_get_irq(pdev, i);
> -		if (irq <= 0) {
> -			dev_err(dev, "Failed to get the IRQ resource of
%s.\n",
> -
> 	sysmmu_ips_name[i]);
> -			ret = -ENOENT;
> -			goto err_map;
> -		}
> -
> -		if (request_irq(irq, s5p_sysmmu_irq, IRQF_DISABLED,
> -						pdev->name, (void *)i)) {
> -			dev_err(dev, "Failed to request IRQ for %s.\n",
> -
> 	sysmmu_ips_name[i]);
> -			ret = -ENOENT;
> -			goto err_map;
> -		}
> -	}
> -
> -	return 0;
> -
> -err_map:
> -	iounmap(sysmmusfrs[i]);
> -err_reg:
> -	release_mem_region(mem->start, resource_size(mem));
> -err_res:
> -	return ret;
> -}
> -
> -static int s5p_sysmmu_remove(struct platform_device *pdev)
> -{
> -	return 0;
> -}
> -int s5p_sysmmu_runtime_suspend(struct device *dev)
> -{
> -	return 0;
> -}
> -
> -int s5p_sysmmu_runtime_resume(struct device *dev)
> -{
> -	return 0;
> -}
> -
> -const struct dev_pm_ops s5p_sysmmu_pm_ops = {
> -	.runtime_suspend	= s5p_sysmmu_runtime_suspend,
> -	.runtime_resume		= s5p_sysmmu_runtime_resume,
> -};
> -
> -static struct platform_driver s5p_sysmmu_driver = {
> -	.probe		= s5p_sysmmu_probe,
> -	.remove		= s5p_sysmmu_remove,
> -	.driver		= {
> -		.owner		= THIS_MODULE,
> -		.name		= "s5p-sysmmu",
> -		.pm		= &s5p_sysmmu_pm_ops,
> -	}
> -};
> -
> -static int __init s5p_sysmmu_init(void)
> -{
> -	return platform_driver_register(&s5p_sysmmu_driver);
> -}
> -arch_initcall(s5p_sysmmu_init);
> --




More information about the linux-arm-kernel mailing list