Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b55f685e authored by Donguk Ryu's avatar Donguk Ryu Committed by Kukjin Kim
Browse files

ARM: S5P: Add Support System MMU



This patch adds support System MMU which supports address transition
from virtual address to physical address. Basically, each hardware
block is connected System MMU block can use directly vitrual address
when it accesses physical memory not using physical address.

Signed-off-by: default avatarDonguk Ryu <du.ryu@samsung.com>
Signed-off-by: default avatarSangbeom Kim <sbkim73@samsung.com>
[kgene.kim@samsung.com: removed useless codes]
Signed-off-by: default avatarKukjin Kim <kgene.kim@samsung.com>
parent 2cf0c58e
Loading
Loading
Loading
Loading
+18 −0
Original line number Diff line number Diff line
@@ -55,6 +55,24 @@
#define COMBINER_GROUP(x)	((x) * MAX_IRQ_IN_COMBINER + IRQ_SPI(64))
#define COMBINER_IRQ(x, y)	(COMBINER_GROUP(x) + y)

#define IRQ_SYSMMU_MDMA0_0	COMBINER_IRQ(4, 0)
#define IRQ_SYSMMU_SSS_0	COMBINER_IRQ(4, 1)
#define IRQ_SYSMMU_FIMC0_0	COMBINER_IRQ(4, 2)
#define IRQ_SYSMMU_FIMC1_0	COMBINER_IRQ(4, 3)
#define IRQ_SYSMMU_FIMC2_0	COMBINER_IRQ(4, 4)
#define IRQ_SYSMMU_FIMC3_0	COMBINER_IRQ(4, 5)
#define IRQ_SYSMMU_JPEG_0	COMBINER_IRQ(4, 6)
#define IRQ_SYSMMU_2D_0		COMBINER_IRQ(4, 7)

#define IRQ_SYSMMU_ROTATOR_0	COMBINER_IRQ(5, 0)
#define IRQ_SYSMMU_MDMA1_0	COMBINER_IRQ(5, 1)
#define IRQ_SYSMMU_LCD0_M0_0	COMBINER_IRQ(5, 2)
#define IRQ_SYSMMU_LCD1_M1_0	COMBINER_IRQ(5, 3)
#define IRQ_SYSMMU_TV_M0_0	COMBINER_IRQ(5, 4)
#define IRQ_SYSMMU_MFC_M0_0	COMBINER_IRQ(5, 5)
#define IRQ_SYSMMU_MFC_M1_0	COMBINER_IRQ(5, 6)
#define IRQ_SYSMMU_PCIE_0	COMBINER_IRQ(5, 7)

#define IRQ_PDMA0		COMBINER_IRQ(21, 0)
#define IRQ_PDMA1		COMBINER_IRQ(21, 1)

+19 −0
Original line number Diff line number Diff line
@@ -108,6 +108,25 @@
#define S5PV310_PA_SDRAM		(0x40000000)
#define S5P_PA_SDRAM			S5PV310_PA_SDRAM

#define S5PV310_PA_SYSMMU_MDMA		0x10A40000
#define S5PV310_PA_SYSMMU_SSS		0x10A50000
#define S5PV310_PA_SYSMMU_FIMC0		0x11A20000
#define S5PV310_PA_SYSMMU_FIMC1		0x11A30000
#define S5PV310_PA_SYSMMU_FIMC2		0x11A40000
#define S5PV310_PA_SYSMMU_FIMC3		0x11A50000
#define S5PV310_PA_SYSMMU_JPEG		0x11A60000
#define S5PV310_PA_SYSMMU_FIMD0		0x11E20000
#define S5PV310_PA_SYSMMU_FIMD1		0x12220000
#define S5PV310_PA_SYSMMU_PCIe		0x12620000
#define S5PV310_PA_SYSMMU_G2D		0x12A20000
#define S5PV310_PA_SYSMMU_ROTATOR	0x12A30000
#define S5PV310_PA_SYSMMU_MDMA2		0x12A40000
#define S5PV310_PA_SYSMMU_TV		0x12E20000
#define S5PV310_PA_SYSMMU_MFC_L		0x13620000
#define S5PV310_PA_SYSMMU_MFC_R		0x13630000
#define S5PV310_SYSMMU_TOTAL_IPNUM	16
#define S5P_SYSMMU_TOTAL_IPNUM		S5PV310_SYSMMU_TOTAL_IPNUM

/* compatibiltiy defines. */
#define S3C_PA_UART			S5PV310_PA_UART
#define S3C_PA_HSMMC0			S5PV310_PA_HSMMC(0)
+24 −0
Original line number Diff line number Diff line
/* linux/arch/arm/mach-s5pv310/include/mach/regs-sysmmu.h
 *
 * Copyright (c) 2010 Samsung Electronics Co., Ltd.
 *		http://www.samsung.com
 *
 * S5PV310 - System MMU register
 *
 * 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_ARCH_REGS_SYSMMU_H
#define __ASM_ARCH_REGS_SYSMMU_H __FILE__

#define S5P_MMU_CTRL			0x000
#define S5P_MMU_CFG			0x004
#define S5P_MMU_STATUS			0x008
#define S5P_MMU_FLUSH			0x00C
#define S5P_PT_BASE_ADDR		0x014
#define S5P_INT_STATUS			0x018
#define S5P_PAGE_FAULT_ADDR		0x024

#endif /* __ASM_ARCH_REGS_SYSMMU_H */
+119 −0
Original line number Diff line number Diff line
/* linux/arch/arm/mach-s5pv310/include/mach/sysmmu.h
 *
 * Copyright (c) 2010 Samsung Electronics Co., Ltd.
 *		http://www.samsung.com/
 *
 * Samsung sysmmu driver for S5PV310
 *
 * 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_ARM_ARCH_SYSMMU_H
#define __ASM_ARM_ARCH_SYSMMU_H __FILE__

enum s5pv310_sysmmu_ips {
	SYSMMU_MDMA,
	SYSMMU_SSS,
	SYSMMU_FIMC0,
	SYSMMU_FIMC1,
	SYSMMU_FIMC2,
	SYSMMU_FIMC3,
	SYSMMU_JPEG,
	SYSMMU_FIMD0,
	SYSMMU_FIMD1,
	SYSMMU_PCIe,
	SYSMMU_G2D,
	SYSMMU_ROTATOR,
	SYSMMU_MDMA2,
	SYSMMU_TV,
	SYSMMU_MFC_L,
	SYSMMU_MFC_R,
};

static char *sysmmu_ips_name[S5P_SYSMMU_TOTAL_IPNUM] = {
	"SYSMMU_MDMA"	,
	"SYSMMU_SSS"	,
	"SYSMMU_FIMC0"	,
	"SYSMMU_FIMC1"	,
	"SYSMMU_FIMC2"	,
	"SYSMMU_FIMC3"	,
	"SYSMMU_JPEG"	,
	"SYSMMU_FIMD0"	,
	"SYSMMU_FIMD1"	,
	"SYSMMU_PCIe"	,
	"SYSMMU_G2D"	,
	"SYSMMU_ROTATOR",
	"SYSMMU_MDMA2"	,
	"SYSMMU_TV"	,
	"SYSMMU_MFC_L"	,
	"SYSMMU_MFC_R"	,
};

typedef enum s5pv310_sysmmu_ips sysmmu_ips;

struct sysmmu_tt_info {
	unsigned long *pgd;
	unsigned long pgd_paddr;
	unsigned long *pte;
};

struct sysmmu_controller {
	const char		*name;

	/* channels registers */
	void __iomem		*regs;

	/* channel irq */
	unsigned int		irq;

	sysmmu_ips		ips;

	/* Translation Table Info. */
	struct sysmmu_tt_info	*tt_info;

	struct resource		*mem;
	struct device		*dev;

	/* SysMMU controller enable - true : enable */
	bool			enable;
};

/**
 * s5p_sysmmu_enable() - enable system mmu of ip
 * @ips: The ip connected system mmu.
 *
 * This function enable system mmu to transfer address
 * from virtual address to physical address
 */
int s5p_sysmmu_enable(sysmmu_ips ips);

/**
 * 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
 */
int 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
 */
int 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
 */
int s5p_sysmmu_tlb_invalidate(sysmmu_ips ips);
#endif /* __ASM_ARM_ARCH_SYSMMU_H */
+16 −0
Original line number Diff line number Diff line
@@ -66,3 +66,19 @@ config S5P_DEV_CSIS1
	bool
	help
	  Compile in platform device definitions for MIPI-CSIS channel 1

menuconfig S5P_SYSMMU
	bool "SYSMMU support"
	depends on ARCH_S5PV310
	help
	  This is a System MMU driver for Samsung ARM based Soc.

if S5P_SYSMMU

config S5P_SYSMMU_DEBUG
	bool "Enables debug messages"
	depends on S5P_SYSMMU
	help
	  This enables SYSMMU driver debug massages.

endif
Loading