From mboxrd@z Thu Jan 1 00:00:00 1970 From: plagnioj@jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD) Date: Mon, 15 Aug 2011 11:11:41 +0200 Subject: [PATCH 1/3] ARM: mmp: add sram allocator In-Reply-To: <1313377794-26721-2-git-send-email-leoy@marvell.com> References: <1313377794-26721-1-git-send-email-leoy@marvell.com> <1313377794-26721-2-git-send-email-leoy@marvell.com> Message-ID: <20110815091141.GB32705@game.jcrosoft.org> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On 11:09 Mon 15 Aug , Leo Yan wrote: > On mmp platform, there have two sram banks: > audio sram and internal sram. The audio sram is mainly for audio; > the internal sram is for video, wtm and power management. > So add the sram allocator using genalloc to manage them. > > Every sram bank will register its own platform device > info, after the sram allocator create the generic pool > for the sram bank, the user module can use the pool's > name to get the pool handler; then it can use the handler > to alloc/free memory with genalloc APIs. > > Signed-off-by: Leo Yan > --- > arch/arm/Kconfig | 1 + > arch/arm/mach-mmp/Makefile | 2 +- > arch/arm/mach-mmp/include/mach/sram.h | 35 +++++++ > arch/arm/mach-mmp/sram.c | 168 +++++++++++++++++++++++++++++++++ > 4 files changed, 205 insertions(+), 1 deletions(-) > create mode 100644 arch/arm/mach-mmp/include/mach/sram.h > create mode 100644 arch/arm/mach-mmp/sram.c > > diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig > index 2c71a8f..c7545d1 100644 > --- a/arch/arm/Kconfig > +++ b/arch/arm/Kconfig > @@ -559,6 +559,7 @@ config ARCH_MMP > select TICK_ONESHOT > select PLAT_PXA > select SPARSE_IRQ > + select GENERIC_ALLOCATOR > help > Support for Marvell's PXA168/PXA910(MMP) and MMP2 processor line. > > diff --git a/arch/arm/mach-mmp/Makefile b/arch/arm/mach-mmp/Makefile > index b0ac942..169c674 100644 > --- a/arch/arm/mach-mmp/Makefile > +++ b/arch/arm/mach-mmp/Makefile > @@ -7,7 +7,7 @@ obj-y += common.o clock.o devices.o time.o > # SoC support > obj-$(CONFIG_CPU_PXA168) += pxa168.o irq-pxa168.o > obj-$(CONFIG_CPU_PXA910) += pxa910.o irq-pxa168.o > -obj-$(CONFIG_CPU_MMP2) += mmp2.o irq-mmp2.o > +obj-$(CONFIG_CPU_MMP2) += mmp2.o irq-mmp2.o sram.o > > # board support > obj-$(CONFIG_MACH_ASPENITE) += aspenite.o > diff --git a/arch/arm/mach-mmp/include/mach/sram.h b/arch/arm/mach-mmp/include/mach/sram.h > new file mode 100644 > index 0000000..239e0fc > --- /dev/null > +++ b/arch/arm/mach-mmp/include/mach/sram.h > @@ -0,0 +1,35 @@ > +/* > + * linux/arch/arm/mach-mmp/include/mach/sram.h > + * > + * SRAM Memory Management > + * > + * Copyright (c) 2011 Marvell Semiconductors Inc. > + * > + * 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_SRAM_H > +#define __ASM_ARCH_SRAM_H > + > +#include > + > +/* ARBITRARY: SRAM allocations are multiples of this 2^N size */ > +#define SRAM_GRANULARITY 512 > + > +enum sram_type { > + MMP_SRAM_UNDEFINED = 0, > + MMP_ASRAM, > + MMP_ISRAM, > +}; > + > +struct sram_platdata { > + char *pool_name; > + int granularity; > +}; > + > +extern struct gen_pool *sram_get_gpool(char *pool_name); > + > +#endif /* __ASM_ARCH_SRAM_H */ > diff --git a/arch/arm/mach-mmp/sram.c b/arch/arm/mach-mmp/sram.c > new file mode 100644 > index 0000000..4304f95 > --- /dev/null > +++ b/arch/arm/mach-mmp/sram.c > @@ -0,0 +1,168 @@ > +/* > + * linux/arch/arm/mach-mmp/sram.c > + * > + * based on mach-davinci/sram.c - DaVinci simple SRAM allocator > + * > + * Copyright (c) 2011 Marvell Semiconductors Inc. > + * All Rights Reserved > + * > + * Add for mmp sram support - Leo Yan > + * > + * 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 > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > + > +struct sram_bank_info { > + char *pool_name; > + struct gen_pool *gpool; > + int granularity; > + > + phys_addr_t sram_phys; > + void __iomem *sram_virt; > + u32 sram_size; > + > + struct list_head node; > +}; > + > +static DEFINE_MUTEX(sram_lock); > +static LIST_HEAD(sram_bank_list); > + > +struct gen_pool *sram_get_gpool(char *pool_name) > +{ > + struct sram_bank_info *info = NULL; > + > + if (!pool_name) > + return NULL; > + > + mutex_lock(&sram_lock); > + > + list_for_each_entry(info, &sram_bank_list, node) > + if (!strcmp(pool_name, info->pool_name)) > + break; > + > + mutex_unlock(&sram_lock); > + > + if (&info->node == &sram_bank_list) > + return NULL; > + > + return info->gpool; > +} > +EXPORT_SYMBOL(sram_get_gpool); > + > +static int __devinit sram_probe(struct platform_device *pdev) > +{ > + struct sram_platdata *pdata = pdev->dev.platform_data; > + struct sram_bank_info *info; > + struct resource *res; > + int ret = 0; > + > + if (!pdata && !pdata->pool_name) > + return -ENODEV; > + > + info = kzalloc(sizeof(*info), GFP_KERNEL); > + if (!info) > + return -ENOMEM; > + > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + if (res == NULL) { > + dev_err(&pdev->dev, "no memory resource defined\n"); > + ret = -ENODEV; > + goto out; > + } > + > + if (!resource_size(res)) > + return 0; > + > + info->sram_phys = (phys_addr_t)res->start; > + info->sram_size = resource_size(res); > + info->sram_virt = ioremap(info->sram_phys, info->sram_size); > + info->pool_name = kstrdup(pdata->pool_name, GFP_KERNEL); > + info->granularity = pdata->granularity; if we want name pool this need to be managed at gen alloc level directly not here Best Regards, J.