All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
To: Russell King - ARM Linux <linux@arm.linux.org.uk>
Cc: Sekhar Nori <nsekhar@ti.com>, Kevin Hilman <khilman@ti.com>,
	Tony Lindgren <tony@atomide.com>,
	Paul Mundt <lethal@linux-sh.org>,
	Magnus Damm <magnus.damm@gmail.com>,
	davinci-linux-open-source@linux.davincidsp.com,
	linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org
Subject: Re: [RFC PATCH v2] Consolidate SRAM support
Date: Tue, 19 Apr 2011 18:01:35 +0200	[thread overview]
Message-ID: <20110419160135.GA4204@game.jcrosoft.org> (raw)
In-Reply-To: <20110418085259.GA26044@n2100.arm.linux.org.uk>

Hi,

	I do post a patch to add the support to specify a virt and phys
	address to the generic allocator so the pv-pool.c is not needed
	we can just use the generic fucntion

	I'll post a v3 updated again it

Best Regards,
J.
> --- /dev/null > +++ b/arch/arm/common/pv-pool.c
> @@ -0,0 +1,69 @@
> +/*
> + * Unified Phys/Virt allocator, based on mach-davinci/sram.c, which was
> + * Copyright (C) 2009 David Brownell.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + */
> +#include <linux/dma-mapping.h>
> +#include <linux/genalloc.h>
> +#include <linux/init.h>
> +#include <linux/module.h>
> +#include <linux/slab.h>
> +
> +#include <asm/pv-pool.h>
> +
> +struct pv_pool {
> +	struct gen_pool *genpool;
> +	void *cpu_base;
> +	phys_addr_t phys_base;
> +};
> +
> +void *pv_pool_alloc(struct pv_pool *pool, size_t len, phys_addr_t *phys)
> +{
> +	void *addr = (void *)gen_pool_alloc(pool->genpool, len);
> +
> +	if (phys)
> +		*phys = addr ? (pool->phys_base + (addr - pool->cpu_base)) :
> +			 (phys_addr_t)-1ULL;
> +
> +	return addr;
> +}
> +EXPORT_SYMBOL_GPL(pv_pool_alloc);
> +
> +void pv_pool_free(struct pv_pool *pool, void *addr, size_t len)
> +{
> +	gen_pool_free(pool->genpool, (unsigned long)addr, len);
> +}
> +EXPORT_SYMBOL_GPL(pv_pool_free);
> +
> +struct pv_pool *pv_pool_create(void *addr, phys_addr_t phys, size_t len,
> +	int min_alloc_order)
> +{
> +	struct pv_pool *pool = kzalloc(sizeof(struct pv_pool), GFP_KERNEL);
> +
> +	if (pool) {
> +		pool->cpu_base = addr;
> +		pool->phys_base = phys;
> +		pool->genpool = gen_pool_create(min_alloc_order, -1);
> +		if (!pool->genpool) {
> +			kfree(pool);
> +			pool = NULL;
> +		} else {
> +			WARN_ON(gen_pool_add(pool->genpool, (unsigned long)addr,
> +						len, -1) < 0);
> +		}
> +	}
> +
> +	return pool;
> +}
> +EXPORT_SYMBOL_GPL(pv_pool_create);
> +
> +void pv_pool_destroy(struct pv_pool *pool)
> +{
> +	gen_pool_destroy(pool->genpool);
> +	kfree(pool);
> +}
> +EXPORT_SYMBOL_GPL(pv_pool_destroy);
> diff --git a/arch/arm/include/asm/pv-pool.h b/arch/arm/include/asm/pv-pool.h
> new file mode 100644
> index 0000000..b7ae871
> --- /dev/null
> +++ b/arch/arm/include/asm/pv-pool.h
> @@ -0,0 +1,20 @@
> +#ifndef __ASMARM_PV_POOL_H
> +#define __ASMARM_PV_POOL_H
> +
> +#include <asm/fncpy.h>
> +
> +struct pv_pool;
> +
> +void *pv_pool_alloc(struct pv_pool *, size_t, phys_addr_t *);
> +void pv_pool_free(struct pv_pool *, void *, size_t);
> +struct pv_pool *pv_pool_create(void *, phys_addr_t, size_t, int);
> +void pv_pool_destroy(struct pv_pool *);
> +
> +/* Macro to copy a function into SRAM, using the fncpy API */
> +#define pv_pool_fncpy(pool, funcp, size) ({			\
> +	size_t _sz = size;					\
> +	void *_sram = pv_pool_alloc(pool, _sz, NULL);		\
> +	(_sram ? fncpy(_sram, &(funcp), _sz) : NULL);		\
> +})
> +
> +#endif
> diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c
> index 68fe4c2..5eca128 100644
> --- a/arch/arm/mach-davinci/da850.c
> +++ b/arch/arm/mach-davinci/da850.c
> @@ -1099,7 +1099,7 @@ static struct davinci_soc_info davinci_soc_info_da850 = {
>  	.gpio_irq		= IRQ_DA8XX_GPIO0,
>  	.serial_dev		= &da8xx_serial_device,
>  	.emac_pdata		= &da8xx_emac_pdata,
> -	.sram_dma		= DA8XX_ARM_RAM_BASE,
> +	.sram_phys		= DA8XX_ARM_RAM_BASE,
>  	.sram_len		= SZ_8K,
>  	.reset_device		= &da8xx_wdt_device,
>  };
> diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c
> index 76364d1..3df8730 100644
> --- a/arch/arm/mach-davinci/dm355.c
> +++ b/arch/arm/mach-davinci/dm355.c
> @@ -850,7 +850,7 @@ static struct davinci_soc_info davinci_soc_info_dm355 = {
>  	.gpio_num		= 104,
>  	.gpio_irq		= IRQ_DM355_GPIOBNK0,
>  	.serial_dev		= &dm355_serial_device,
> -	.sram_dma		= 0x00010000,
> +	.sram_phys		= 0x00010000,
>  	.sram_len		= SZ_32K,
>  	.reset_device		= &davinci_wdt_device,
>  };
> diff --git a/arch/arm/mach-davinci/dm365.c b/arch/arm/mach-davinci/dm365.c
> index 4604e72..d306034 100644
> --- a/arch/arm/mach-davinci/dm365.c
> +++ b/arch/arm/mach-davinci/dm365.c
> @@ -1082,7 +1082,7 @@ static struct davinci_soc_info davinci_soc_info_dm365 = {
>  	.gpio_unbanked		= 8,	/* really 16 ... skip muxed GPIOs */
>  	.serial_dev		= &dm365_serial_device,
>  	.emac_pdata		= &dm365_emac_pdata,
> -	.sram_dma		= 0x00010000,
> +	.sram_phys		= 0x00010000,
>  	.sram_len		= SZ_32K,
>  	.reset_device		= &davinci_wdt_device,
>  };
> diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c
> index 9a2376b..4ca7295 100644
> --- a/arch/arm/mach-davinci/dm644x.c
> +++ b/arch/arm/mach-davinci/dm644x.c
> @@ -764,7 +764,7 @@ static struct davinci_soc_info davinci_soc_info_dm644x = {
>  	.gpio_irq		= IRQ_GPIOBNK0,
>  	.serial_dev		= &dm644x_serial_device,
>  	.emac_pdata		= &dm644x_emac_pdata,
> -	.sram_dma		= 0x00008000,
> +	.sram_phys		= 0x00008000,
>  	.sram_len		= SZ_16K,
>  	.reset_device		= &davinci_wdt_device,
>  };
> diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-davinci/dm646x.c
> index 1e0f809..a4365f7 100644
> --- a/arch/arm/mach-davinci/dm646x.c
> +++ b/arch/arm/mach-davinci/dm646x.c
> @@ -848,7 +848,7 @@ static struct davinci_soc_info davinci_soc_info_dm646x = {
>  	.gpio_irq		= IRQ_DM646X_GPIOBNK0,
>  	.serial_dev		= &dm646x_serial_device,
>  	.emac_pdata		= &dm646x_emac_pdata,
> -	.sram_dma		= 0x10010000,
> +	.sram_phys		= 0x10010000,
>  	.sram_len		= SZ_32K,
>  	.reset_device		= &davinci_wdt_device,
>  };
> diff --git a/arch/arm/mach-davinci/include/mach/common.h b/arch/arm/mach-davinci/include/mach/common.h
> index a57cba2..665d049 100644
> --- a/arch/arm/mach-davinci/include/mach/common.h
> +++ b/arch/arm/mach-davinci/include/mach/common.h
> @@ -75,7 +75,7 @@ struct davinci_soc_info {
>  	int				gpio_ctlrs_num;
>  	struct platform_device		*serial_dev;
>  	struct emac_platform_data	*emac_pdata;
> -	dma_addr_t			sram_dma;
> +	phys_addr_t			sram_phys;
>  	unsigned			sram_len;
>  	struct platform_device		*reset_device;
>  	void				(*reset)(struct platform_device *);
> diff --git a/arch/arm/mach-davinci/include/mach/sram.h b/arch/arm/mach-davinci/include/mach/sram.h
> index 111f7cc..7d77e85 100644
> --- a/arch/arm/mach-davinci/include/mach/sram.h
> +++ b/arch/arm/mach-davinci/include/mach/sram.h
> @@ -10,18 +10,11 @@
>  #ifndef __MACH_SRAM_H
>  #define __MACH_SRAM_H
>  
> +#include <asm/pv-pool.h>
> +
>  /* ARBITRARY:  SRAM allocations are multiples of this 2^N size */
>  #define SRAM_GRANULARITY	512
>  
> -/*
> - * SRAM allocations return a CPU virtual address, or NULL on error.
> - * If a DMA address is requested and the SRAM supports DMA, its
> - * mapped address is also returned.
> - *
> - * Errors include SRAM memory not being available, and requesting
> - * DMA mapped SRAM on systems which don't allow that.
> - */
> -extern void *sram_alloc(size_t len, dma_addr_t *dma);
> -extern void sram_free(void *addr, size_t len);
> +extern struct pv_pool *davinci_pv_pool;
>  
>  #endif /* __MACH_SRAM_H */
> diff --git a/arch/arm/mach-davinci/pm.c b/arch/arm/mach-davinci/pm.c
> index 1bd73a0..f69cd7b 100644
> --- a/arch/arm/mach-davinci/pm.c
> +++ b/arch/arm/mach-davinci/pm.c
> @@ -29,12 +29,6 @@
>  static void (*davinci_sram_suspend) (struct davinci_pm_config *);
>  static struct davinci_pm_config *pdata;
>  
> -static void davinci_sram_push(void *dest, void *src, unsigned int size)
> -{
> -	memcpy(dest, src, size);
> -	flush_icache_range((unsigned long)dest, (unsigned long)(dest + size));
> -}
> -
>  static void davinci_pm_suspend(void)
>  {
>  	unsigned val;
> @@ -123,15 +117,13 @@ static int __init davinci_pm_probe(struct platform_device *pdev)
>  		return -ENOENT;
>  	}
>  
> -	davinci_sram_suspend = sram_alloc(davinci_cpu_suspend_sz, NULL);
> +	davinci_sram_suspend = pv_pool_fncpy(davinci_pv_pool,
> +				davinci_cpu_suspend, davinci_cpu_suspend_sz);
>  	if (!davinci_sram_suspend) {
>  		dev_err(&pdev->dev, "cannot allocate SRAM memory\n");
>  		return -ENOMEM;
>  	}
>  
> -	davinci_sram_push(davinci_sram_suspend, davinci_cpu_suspend,
> -						davinci_cpu_suspend_sz);
> -
>  	suspend_set_ops(&davinci_pm_ops);
>  
>  	return 0;
> diff --git a/arch/arm/mach-davinci/sram.c b/arch/arm/mach-davinci/sram.c
> index db0f778..ebd4d67 100644
> --- a/arch/arm/mach-davinci/sram.c
> +++ b/arch/arm/mach-davinci/sram.c
> @@ -10,40 +10,13 @@
>   */
>  #include <linux/module.h>
>  #include <linux/init.h>
> -#include <linux/genalloc.h>
> +#include <asm/pv-pool.h>
>  
>  #include <mach/common.h>
>  #include <mach/sram.h>
>  
> -static struct gen_pool *sram_pool;
> -
> -void *sram_alloc(size_t len, dma_addr_t *dma)
> -{
> -	unsigned long vaddr;
> -	dma_addr_t dma_base = davinci_soc_info.sram_dma;
> -
> -	if (dma)
> -		*dma = 0;
> -	if (!sram_pool || (dma && !dma_base))
> -		return NULL;
> -
> -	vaddr = gen_pool_alloc(sram_pool, len);
> -	if (!vaddr)
> -		return NULL;
> -
> -	if (dma)
> -		*dma = dma_base + (vaddr - SRAM_VIRT);
> -	return (void *)vaddr;
> -
> -}
> -EXPORT_SYMBOL(sram_alloc);
> -
> -void sram_free(void *addr, size_t len)
> -{
> -	gen_pool_free(sram_pool, (unsigned long) addr, len);
> -}
> -EXPORT_SYMBOL(sram_free);
> -
> +struct pv_pool *davinci_pv_pool;
> +EXPORT_SYMBOL_GPL(davinci_pv_pool);
>  
>  /*
>   * REVISIT This supports CPU and DMA access to/from SRAM, but it
> @@ -58,13 +31,12 @@ static int __init sram_init(void)
>  
>  	if (len) {
>  		len = min_t(unsigned, len, SRAM_SIZE);
> -		sram_pool = gen_pool_create(ilog2(SRAM_GRANULARITY), -1);
> -		if (!sram_pool)
> +		davinci_pv_pool = pv_pool_create((void *)SRAM_VIRT,
> +					davinci_soc_info.sram_phys, len,
> +					ilog2(SRAM_GRANULARITY));
> +		if (!davinci_pv_pool)
>  			status = -ENOMEM;
>  	}
> -	if (sram_pool)
> -		status = gen_pool_add(sram_pool, SRAM_VIRT, len, -1);
> -	WARN_ON(status < 0);
>  	return status;
>  }
>  core_initcall(sram_init);
> diff --git a/arch/arm/plat-mxc/Kconfig b/arch/arm/plat-mxc/Kconfig
> index b0cb425..f60d5ea 100644
> --- a/arch/arm/plat-mxc/Kconfig
> +++ b/arch/arm/plat-mxc/Kconfig
> @@ -118,6 +118,6 @@ config ARCH_MXC_AUDMUX_V2
>  
>  config IRAM_ALLOC
>  	bool
> -	select GENERIC_ALLOCATOR
> +	select PV_POOL
>  
>  endif
> diff --git a/arch/arm/plat-mxc/include/mach/iram.h b/arch/arm/plat-mxc/include/mach/iram.h
> index 022690c..543c6df 100644
> --- a/arch/arm/plat-mxc/include/mach/iram.h
> +++ b/arch/arm/plat-mxc/include/mach/iram.h
> @@ -17,25 +17,37 @@
>   * MA 02110-1301, USA.
>   */
>  #include <linux/errno.h>
> +#include <asm/pv-pool.h>
>  
>  #ifdef CONFIG_IRAM_ALLOC
>  
> -int __init iram_init(unsigned long base, unsigned long size);
> -void __iomem *iram_alloc(unsigned int size, unsigned long *dma_addr);
> -void iram_free(unsigned long dma_addr, unsigned int size);
> +int __init iram_init(phys_addr_t base, size_t size);
> +
> +extern struct pv_pool *mxc_iram_pool;
> +
> +static inline void *iram_alloc(size_t size, phys_addr_t *phys)
> +{
> +	return pv_pool_alloc(iram_pool, size, phys);
> +}
> +
> +static inline void iram_free(void *addr, size_t size)
> +{
> +	pv_pool_free(iram_pool, addr, size);
> +}
>  
>  #else
>  
> -static inline int __init iram_init(unsigned long base, unsigned long size)
> +static inline int __init iram_init(phys_addr_t base, size_t size)
>  {
>  	return -ENOMEM;
>  }
>  
> -static inline void __iomem *iram_alloc(unsigned int size, unsigned long *dma_addr)
> +static inline void *iram_alloc(size_t size, phys_addr_t *phys)
>  {
> +	*phys = (phys_addr_t)-1ULL;
>  	return NULL;
>  }
>  
> -static inline void iram_free(unsigned long base, unsigned long size) {}
> +static inline void iram_free(void *addr, size_t size) {}
>  
>  #endif
> diff --git a/arch/arm/plat-mxc/iram_alloc.c b/arch/arm/plat-mxc/iram_alloc.c
> index 074c386..1e3d437 100644
> --- a/arch/arm/plat-mxc/iram_alloc.c
> +++ b/arch/arm/plat-mxc/iram_alloc.c
> @@ -24,50 +24,24 @@
>  #include <linux/genalloc.h>
>  #include <mach/iram.h>
>  
> -static unsigned long iram_phys_base;
> -static void __iomem *iram_virt_base;
> -static struct gen_pool *iram_pool;
> +struct pv_pool *mxc_iram_pool;
> +EXPORT_SYMBOL(mxc_iram_pool);
>  
> -static inline void __iomem *iram_phys_to_virt(unsigned long p)
> +int __init iram_init(phys_addr_t base, size_t size)
>  {
> -	return iram_virt_base + (p - iram_phys_base);
> -}
> -
> -void __iomem *iram_alloc(unsigned int size, unsigned long *dma_addr)
> -{
> -	if (!iram_pool)
> -		return NULL;
> -
> -	*dma_addr = gen_pool_alloc(iram_pool, size);
> -	pr_debug("iram alloc - %dB@0x%lX\n", size, *dma_addr);
> -	if (!*dma_addr)
> -		return NULL;
> -	return iram_phys_to_virt(*dma_addr);
> -}
> -EXPORT_SYMBOL(iram_alloc);
> -
> -void iram_free(unsigned long addr, unsigned int size)
> -{
> -	if (!iram_pool)
> -		return;
> -
> -	gen_pool_free(iram_pool, addr, size);
> -}
> -EXPORT_SYMBOL(iram_free);
> +	void *addr = /*FIXME*/ ioremap(base, size);
>  
> -int __init iram_init(unsigned long base, unsigned long size)
> -{
> -	iram_phys_base = base;
> +	if (!addr)
> +		return -EIO;
>  
> -	iram_pool = gen_pool_create(PAGE_SHIFT, -1);
> -	if (!iram_pool)
> +	mxc_iram_pool = pv_pool_create(addr, base, size, PAGE_SHIFT);
> +	if (!mxc_iram_pool) {
> +		iounmap(addr);
>  		return -ENOMEM;
> +	}
>  
> -	gen_pool_add(iram_pool, base, size, -1);
> -	iram_virt_base = ioremap(iram_phys_base, size);
> -	if (!iram_virt_base)
> -		return -EIO;
> +	pr_debug("i.MX IRAM pool: %lu KB@0x%08llx\n", size / 1024,
> +		 (unsigned long long)base);
>  
> -	pr_debug("i.MX IRAM pool: %ld KB@0x%p\n", size / 1024, iram_virt_base);
>  	return 0;
>  }
> diff --git a/arch/arm/plat-omap/include/plat/sram.h b/arch/arm/plat-omap/include/plat/sram.h
> index f500fc3..9fc27d0 100644
> --- a/arch/arm/plat-omap/include/plat/sram.h
> +++ b/arch/arm/plat-omap/include/plat/sram.h
> @@ -12,16 +12,19 @@
>  #define __ARCH_ARM_OMAP_SRAM_H
>  
>  #ifndef __ASSEMBLY__
> -#include <asm/fncpy.h>
> +#include <asm/pv-pool.h>
>  
> -extern void *omap_sram_push_address(unsigned long size);
> +extern struct pv_pool *omap_pv_pool;
>  
> -/* Macro to push a function to the internal SRAM, using the fncpy API */
> +/*
> + * Note that fncpy requires the SRAM address to be aligned to an 8-byte
> + * boundary, so the min_alloc_order for the pool is set appropriately.
> + */
>  #define omap_sram_push(funcp, size) ({				\
> -	typeof(&(funcp)) _res = NULL;				\
> -	void *_sram_address = omap_sram_push_address(size);	\
> -	if (_sram_address)					\
> -		_res = fncpy(_sram_address, &(funcp), size);	\
> +	typeof(&(funcp)) _res;					\
> +	_res = pv_pool_fncpy(omap_pv_pool, funcp, size);	\
> +	if (!_res)						\
> +		pr_err("Not enough space in SRAM\n");		\
>  	_res;							\
>  })
>  
> diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c
> index a3f50b3..3588749 100644
> --- a/arch/arm/plat-omap/sram.c
> +++ b/arch/arm/plat-omap/sram.c
> @@ -75,7 +75,6 @@
>  static unsigned long omap_sram_start;
>  static unsigned long omap_sram_base;
>  static unsigned long omap_sram_size;
> -static unsigned long omap_sram_ceil;
>  
>  /*
>   * Depending on the target RAMFS firewall setup, the public usable amount of
> @@ -104,6 +103,8 @@ static int is_sram_locked(void)
>  		return 1; /* assume locked with no PPA or security driver */
>  }
>  
> +struct pv_pool *omap_pv_pool;
> +
>  /*
>   * The amount of SRAM depends on the core type.
>   * Note that we cannot try to test for SRAM here because writes
> @@ -182,7 +183,16 @@ static void __init omap_detect_sram(void)
>  			omap_sram_size - SRAM_BOOTLOADER_SZ);
>  	omap_sram_size -= reserved;
>  
> -	omap_sram_ceil = omap_sram_base + omap_sram_size;
> +	{
> +		/* The first SRAM_BOOTLOADER_SZ of SRAM are reserved */
> +		void *base = (void *)omap_sram_base + SRAM_BOOTLOADER_SZ;
> +		phys_addr_t phys = omap_sram_start + SRAM_BOOTLOADER_SZ;
> +		size_t len = omap_sram_size - SRAM_BOOTLOADER_SZ;
> +
> +		omap_pv_pool = pv_pool_create(base, phys, len,
> +						ilog2(FNCPY_ALIGN));
> +		WARN_ON(!omap_pv_pool);
> +	}
>  }
>  
>  static struct map_desc omap_sram_io_desc[] __initdata = {
> @@ -242,26 +252,6 @@ static void __init omap_map_sram(void)
>  	       omap_sram_size - SRAM_BOOTLOADER_SZ);
>  }
>  
> -/*
> - * Memory allocator for SRAM: calculates the new ceiling address
> - * for pushing a function using the fncpy API.
> - *
> - * Note that fncpy requires the returned address to be aligned
> - * to an 8-byte boundary.
> - */
> -void *omap_sram_push_address(unsigned long size)
> -{
> -	if (size > (omap_sram_ceil - (omap_sram_base + SRAM_BOOTLOADER_SZ))) {
> -		printk(KERN_ERR "Not enough space in SRAM\n");
> -		return NULL;
> -	}
> -
> -	omap_sram_ceil -= size;
> -	omap_sram_ceil = ROUND_DOWN(omap_sram_ceil, FNCPY_ALIGN);
> -
> -	return (void *)omap_sram_ceil;
> -}
> -
>  #ifdef CONFIG_ARCH_OMAP1
>  
>  static void (*_omap_sram_reprogram_clock)(u32 dpllctl, u32 ckctl);
> diff --git a/drivers/uio/uio_pruss.c b/drivers/uio/uio_pruss.c
> index daf6e77..2be3155 100644
> --- a/drivers/uio/uio_pruss.c
> +++ b/drivers/uio/uio_pruss.c
> @@ -62,7 +62,7 @@ MODULE_PARM_DESC(extram_pool_sz, "external ram pool size to allocate");
>  struct uio_pruss_dev {
>  	struct uio_info *info;
>  	struct clk *pruss_clk;
> -	dma_addr_t sram_paddr;
> +	phys_addr_t sram_paddr;
>  	dma_addr_t ddr_paddr;
>  	void __iomem *prussio_vaddr;
>  	void *sram_vaddr;
> @@ -106,7 +106,7 @@ static void pruss_cleanup(struct platform_device *dev,
>  			gdev->ddr_paddr);
>  	}
>  	if (gdev->sram_vaddr)
> -		sram_free(gdev->sram_vaddr, sram_pool_sz);
> +		pv_pool_free(davinci_pv_pool, gdev->sram_vaddr, sram_pool_sz);
>  	kfree(gdev->info);
>  	clk_put(gdev->pruss_clk);
>  	kfree(gdev);
> @@ -152,7 +152,8 @@ static int __devinit pruss_probe(struct platform_device *dev)
>  		goto out_free;
>  	}
>  
> -	gdev->sram_vaddr = sram_alloc(sram_pool_sz, &(gdev->sram_paddr));
> +	gdev->sram_vaddr = pv_pool_alloc(davinci_pv_pool, sram_pool_sz,
> +					   &(gdev->sram_paddr));
>  	if (!gdev->sram_vaddr) {
>  		dev_err(&dev->dev, "Could not allocate SRAM pool\n");
>  		goto out_free;
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

WARNING: multiple messages have this Message-ID (diff)
From: plagnioj@jcrosoft.com (Jean-Christophe PLAGNIOL-VILLARD)
To: linux-arm-kernel@lists.infradead.org
Subject: [RFC PATCH v2] Consolidate SRAM support
Date: Tue, 19 Apr 2011 18:01:35 +0200	[thread overview]
Message-ID: <20110419160135.GA4204@game.jcrosoft.org> (raw)
In-Reply-To: <20110418085259.GA26044@n2100.arm.linux.org.uk>

Hi,

	I do post a patch to add the support to specify a virt and phys
	address to the generic allocator so the pv-pool.c is not needed
	we can just use the generic fucntion

	I'll post a v3 updated again it

Best Regards,
J.
> --- /dev/null > +++ b/arch/arm/common/pv-pool.c
> @@ -0,0 +1,69 @@
> +/*
> + * Unified Phys/Virt allocator, based on mach-davinci/sram.c, which was
> + * Copyright (C) 2009 David Brownell.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + */
> +#include <linux/dma-mapping.h>
> +#include <linux/genalloc.h>
> +#include <linux/init.h>
> +#include <linux/module.h>
> +#include <linux/slab.h>
> +
> +#include <asm/pv-pool.h>
> +
> +struct pv_pool {
> +	struct gen_pool *genpool;
> +	void *cpu_base;
> +	phys_addr_t phys_base;
> +};
> +
> +void *pv_pool_alloc(struct pv_pool *pool, size_t len, phys_addr_t *phys)
> +{
> +	void *addr = (void *)gen_pool_alloc(pool->genpool, len);
> +
> +	if (phys)
> +		*phys = addr ? (pool->phys_base + (addr - pool->cpu_base)) :
> +			 (phys_addr_t)-1ULL;
> +
> +	return addr;
> +}
> +EXPORT_SYMBOL_GPL(pv_pool_alloc);
> +
> +void pv_pool_free(struct pv_pool *pool, void *addr, size_t len)
> +{
> +	gen_pool_free(pool->genpool, (unsigned long)addr, len);
> +}
> +EXPORT_SYMBOL_GPL(pv_pool_free);
> +
> +struct pv_pool *pv_pool_create(void *addr, phys_addr_t phys, size_t len,
> +	int min_alloc_order)
> +{
> +	struct pv_pool *pool = kzalloc(sizeof(struct pv_pool), GFP_KERNEL);
> +
> +	if (pool) {
> +		pool->cpu_base = addr;
> +		pool->phys_base = phys;
> +		pool->genpool = gen_pool_create(min_alloc_order, -1);
> +		if (!pool->genpool) {
> +			kfree(pool);
> +			pool = NULL;
> +		} else {
> +			WARN_ON(gen_pool_add(pool->genpool, (unsigned long)addr,
> +						len, -1) < 0);
> +		}
> +	}
> +
> +	return pool;
> +}
> +EXPORT_SYMBOL_GPL(pv_pool_create);
> +
> +void pv_pool_destroy(struct pv_pool *pool)
> +{
> +	gen_pool_destroy(pool->genpool);
> +	kfree(pool);
> +}
> +EXPORT_SYMBOL_GPL(pv_pool_destroy);
> diff --git a/arch/arm/include/asm/pv-pool.h b/arch/arm/include/asm/pv-pool.h
> new file mode 100644
> index 0000000..b7ae871
> --- /dev/null
> +++ b/arch/arm/include/asm/pv-pool.h
> @@ -0,0 +1,20 @@
> +#ifndef __ASMARM_PV_POOL_H
> +#define __ASMARM_PV_POOL_H
> +
> +#include <asm/fncpy.h>
> +
> +struct pv_pool;
> +
> +void *pv_pool_alloc(struct pv_pool *, size_t, phys_addr_t *);
> +void pv_pool_free(struct pv_pool *, void *, size_t);
> +struct pv_pool *pv_pool_create(void *, phys_addr_t, size_t, int);
> +void pv_pool_destroy(struct pv_pool *);
> +
> +/* Macro to copy a function into SRAM, using the fncpy API */
> +#define pv_pool_fncpy(pool, funcp, size) ({			\
> +	size_t _sz = size;					\
> +	void *_sram = pv_pool_alloc(pool, _sz, NULL);		\
> +	(_sram ? fncpy(_sram, &(funcp), _sz) : NULL);		\
> +})
> +
> +#endif
> diff --git a/arch/arm/mach-davinci/da850.c b/arch/arm/mach-davinci/da850.c
> index 68fe4c2..5eca128 100644
> --- a/arch/arm/mach-davinci/da850.c
> +++ b/arch/arm/mach-davinci/da850.c
> @@ -1099,7 +1099,7 @@ static struct davinci_soc_info davinci_soc_info_da850 = {
>  	.gpio_irq		= IRQ_DA8XX_GPIO0,
>  	.serial_dev		= &da8xx_serial_device,
>  	.emac_pdata		= &da8xx_emac_pdata,
> -	.sram_dma		= DA8XX_ARM_RAM_BASE,
> +	.sram_phys		= DA8XX_ARM_RAM_BASE,
>  	.sram_len		= SZ_8K,
>  	.reset_device		= &da8xx_wdt_device,
>  };
> diff --git a/arch/arm/mach-davinci/dm355.c b/arch/arm/mach-davinci/dm355.c
> index 76364d1..3df8730 100644
> --- a/arch/arm/mach-davinci/dm355.c
> +++ b/arch/arm/mach-davinci/dm355.c
> @@ -850,7 +850,7 @@ static struct davinci_soc_info davinci_soc_info_dm355 = {
>  	.gpio_num		= 104,
>  	.gpio_irq		= IRQ_DM355_GPIOBNK0,
>  	.serial_dev		= &dm355_serial_device,
> -	.sram_dma		= 0x00010000,
> +	.sram_phys		= 0x00010000,
>  	.sram_len		= SZ_32K,
>  	.reset_device		= &davinci_wdt_device,
>  };
> diff --git a/arch/arm/mach-davinci/dm365.c b/arch/arm/mach-davinci/dm365.c
> index 4604e72..d306034 100644
> --- a/arch/arm/mach-davinci/dm365.c
> +++ b/arch/arm/mach-davinci/dm365.c
> @@ -1082,7 +1082,7 @@ static struct davinci_soc_info davinci_soc_info_dm365 = {
>  	.gpio_unbanked		= 8,	/* really 16 ... skip muxed GPIOs */
>  	.serial_dev		= &dm365_serial_device,
>  	.emac_pdata		= &dm365_emac_pdata,
> -	.sram_dma		= 0x00010000,
> +	.sram_phys		= 0x00010000,
>  	.sram_len		= SZ_32K,
>  	.reset_device		= &davinci_wdt_device,
>  };
> diff --git a/arch/arm/mach-davinci/dm644x.c b/arch/arm/mach-davinci/dm644x.c
> index 9a2376b..4ca7295 100644
> --- a/arch/arm/mach-davinci/dm644x.c
> +++ b/arch/arm/mach-davinci/dm644x.c
> @@ -764,7 +764,7 @@ static struct davinci_soc_info davinci_soc_info_dm644x = {
>  	.gpio_irq		= IRQ_GPIOBNK0,
>  	.serial_dev		= &dm644x_serial_device,
>  	.emac_pdata		= &dm644x_emac_pdata,
> -	.sram_dma		= 0x00008000,
> +	.sram_phys		= 0x00008000,
>  	.sram_len		= SZ_16K,
>  	.reset_device		= &davinci_wdt_device,
>  };
> diff --git a/arch/arm/mach-davinci/dm646x.c b/arch/arm/mach-davinci/dm646x.c
> index 1e0f809..a4365f7 100644
> --- a/arch/arm/mach-davinci/dm646x.c
> +++ b/arch/arm/mach-davinci/dm646x.c
> @@ -848,7 +848,7 @@ static struct davinci_soc_info davinci_soc_info_dm646x = {
>  	.gpio_irq		= IRQ_DM646X_GPIOBNK0,
>  	.serial_dev		= &dm646x_serial_device,
>  	.emac_pdata		= &dm646x_emac_pdata,
> -	.sram_dma		= 0x10010000,
> +	.sram_phys		= 0x10010000,
>  	.sram_len		= SZ_32K,
>  	.reset_device		= &davinci_wdt_device,
>  };
> diff --git a/arch/arm/mach-davinci/include/mach/common.h b/arch/arm/mach-davinci/include/mach/common.h
> index a57cba2..665d049 100644
> --- a/arch/arm/mach-davinci/include/mach/common.h
> +++ b/arch/arm/mach-davinci/include/mach/common.h
> @@ -75,7 +75,7 @@ struct davinci_soc_info {
>  	int				gpio_ctlrs_num;
>  	struct platform_device		*serial_dev;
>  	struct emac_platform_data	*emac_pdata;
> -	dma_addr_t			sram_dma;
> +	phys_addr_t			sram_phys;
>  	unsigned			sram_len;
>  	struct platform_device		*reset_device;
>  	void				(*reset)(struct platform_device *);
> diff --git a/arch/arm/mach-davinci/include/mach/sram.h b/arch/arm/mach-davinci/include/mach/sram.h
> index 111f7cc..7d77e85 100644
> --- a/arch/arm/mach-davinci/include/mach/sram.h
> +++ b/arch/arm/mach-davinci/include/mach/sram.h
> @@ -10,18 +10,11 @@
>  #ifndef __MACH_SRAM_H
>  #define __MACH_SRAM_H
>  
> +#include <asm/pv-pool.h>
> +
>  /* ARBITRARY:  SRAM allocations are multiples of this 2^N size */
>  #define SRAM_GRANULARITY	512
>  
> -/*
> - * SRAM allocations return a CPU virtual address, or NULL on error.
> - * If a DMA address is requested and the SRAM supports DMA, its
> - * mapped address is also returned.
> - *
> - * Errors include SRAM memory not being available, and requesting
> - * DMA mapped SRAM on systems which don't allow that.
> - */
> -extern void *sram_alloc(size_t len, dma_addr_t *dma);
> -extern void sram_free(void *addr, size_t len);
> +extern struct pv_pool *davinci_pv_pool;
>  
>  #endif /* __MACH_SRAM_H */
> diff --git a/arch/arm/mach-davinci/pm.c b/arch/arm/mach-davinci/pm.c
> index 1bd73a0..f69cd7b 100644
> --- a/arch/arm/mach-davinci/pm.c
> +++ b/arch/arm/mach-davinci/pm.c
> @@ -29,12 +29,6 @@
>  static void (*davinci_sram_suspend) (struct davinci_pm_config *);
>  static struct davinci_pm_config *pdata;
>  
> -static void davinci_sram_push(void *dest, void *src, unsigned int size)
> -{
> -	memcpy(dest, src, size);
> -	flush_icache_range((unsigned long)dest, (unsigned long)(dest + size));
> -}
> -
>  static void davinci_pm_suspend(void)
>  {
>  	unsigned val;
> @@ -123,15 +117,13 @@ static int __init davinci_pm_probe(struct platform_device *pdev)
>  		return -ENOENT;
>  	}
>  
> -	davinci_sram_suspend = sram_alloc(davinci_cpu_suspend_sz, NULL);
> +	davinci_sram_suspend = pv_pool_fncpy(davinci_pv_pool,
> +				davinci_cpu_suspend, davinci_cpu_suspend_sz);
>  	if (!davinci_sram_suspend) {
>  		dev_err(&pdev->dev, "cannot allocate SRAM memory\n");
>  		return -ENOMEM;
>  	}
>  
> -	davinci_sram_push(davinci_sram_suspend, davinci_cpu_suspend,
> -						davinci_cpu_suspend_sz);
> -
>  	suspend_set_ops(&davinci_pm_ops);
>  
>  	return 0;
> diff --git a/arch/arm/mach-davinci/sram.c b/arch/arm/mach-davinci/sram.c
> index db0f778..ebd4d67 100644
> --- a/arch/arm/mach-davinci/sram.c
> +++ b/arch/arm/mach-davinci/sram.c
> @@ -10,40 +10,13 @@
>   */
>  #include <linux/module.h>
>  #include <linux/init.h>
> -#include <linux/genalloc.h>
> +#include <asm/pv-pool.h>
>  
>  #include <mach/common.h>
>  #include <mach/sram.h>
>  
> -static struct gen_pool *sram_pool;
> -
> -void *sram_alloc(size_t len, dma_addr_t *dma)
> -{
> -	unsigned long vaddr;
> -	dma_addr_t dma_base = davinci_soc_info.sram_dma;
> -
> -	if (dma)
> -		*dma = 0;
> -	if (!sram_pool || (dma && !dma_base))
> -		return NULL;
> -
> -	vaddr = gen_pool_alloc(sram_pool, len);
> -	if (!vaddr)
> -		return NULL;
> -
> -	if (dma)
> -		*dma = dma_base + (vaddr - SRAM_VIRT);
> -	return (void *)vaddr;
> -
> -}
> -EXPORT_SYMBOL(sram_alloc);
> -
> -void sram_free(void *addr, size_t len)
> -{
> -	gen_pool_free(sram_pool, (unsigned long) addr, len);
> -}
> -EXPORT_SYMBOL(sram_free);
> -
> +struct pv_pool *davinci_pv_pool;
> +EXPORT_SYMBOL_GPL(davinci_pv_pool);
>  
>  /*
>   * REVISIT This supports CPU and DMA access to/from SRAM, but it
> @@ -58,13 +31,12 @@ static int __init sram_init(void)
>  
>  	if (len) {
>  		len = min_t(unsigned, len, SRAM_SIZE);
> -		sram_pool = gen_pool_create(ilog2(SRAM_GRANULARITY), -1);
> -		if (!sram_pool)
> +		davinci_pv_pool = pv_pool_create((void *)SRAM_VIRT,
> +					davinci_soc_info.sram_phys, len,
> +					ilog2(SRAM_GRANULARITY));
> +		if (!davinci_pv_pool)
>  			status = -ENOMEM;
>  	}
> -	if (sram_pool)
> -		status = gen_pool_add(sram_pool, SRAM_VIRT, len, -1);
> -	WARN_ON(status < 0);
>  	return status;
>  }
>  core_initcall(sram_init);
> diff --git a/arch/arm/plat-mxc/Kconfig b/arch/arm/plat-mxc/Kconfig
> index b0cb425..f60d5ea 100644
> --- a/arch/arm/plat-mxc/Kconfig
> +++ b/arch/arm/plat-mxc/Kconfig
> @@ -118,6 +118,6 @@ config ARCH_MXC_AUDMUX_V2
>  
>  config IRAM_ALLOC
>  	bool
> -	select GENERIC_ALLOCATOR
> +	select PV_POOL
>  
>  endif
> diff --git a/arch/arm/plat-mxc/include/mach/iram.h b/arch/arm/plat-mxc/include/mach/iram.h
> index 022690c..543c6df 100644
> --- a/arch/arm/plat-mxc/include/mach/iram.h
> +++ b/arch/arm/plat-mxc/include/mach/iram.h
> @@ -17,25 +17,37 @@
>   * MA 02110-1301, USA.
>   */
>  #include <linux/errno.h>
> +#include <asm/pv-pool.h>
>  
>  #ifdef CONFIG_IRAM_ALLOC
>  
> -int __init iram_init(unsigned long base, unsigned long size);
> -void __iomem *iram_alloc(unsigned int size, unsigned long *dma_addr);
> -void iram_free(unsigned long dma_addr, unsigned int size);
> +int __init iram_init(phys_addr_t base, size_t size);
> +
> +extern struct pv_pool *mxc_iram_pool;
> +
> +static inline void *iram_alloc(size_t size, phys_addr_t *phys)
> +{
> +	return pv_pool_alloc(iram_pool, size, phys);
> +}
> +
> +static inline void iram_free(void *addr, size_t size)
> +{
> +	pv_pool_free(iram_pool, addr, size);
> +}
>  
>  #else
>  
> -static inline int __init iram_init(unsigned long base, unsigned long size)
> +static inline int __init iram_init(phys_addr_t base, size_t size)
>  {
>  	return -ENOMEM;
>  }
>  
> -static inline void __iomem *iram_alloc(unsigned int size, unsigned long *dma_addr)
> +static inline void *iram_alloc(size_t size, phys_addr_t *phys)
>  {
> +	*phys = (phys_addr_t)-1ULL;
>  	return NULL;
>  }
>  
> -static inline void iram_free(unsigned long base, unsigned long size) {}
> +static inline void iram_free(void *addr, size_t size) {}
>  
>  #endif
> diff --git a/arch/arm/plat-mxc/iram_alloc.c b/arch/arm/plat-mxc/iram_alloc.c
> index 074c386..1e3d437 100644
> --- a/arch/arm/plat-mxc/iram_alloc.c
> +++ b/arch/arm/plat-mxc/iram_alloc.c
> @@ -24,50 +24,24 @@
>  #include <linux/genalloc.h>
>  #include <mach/iram.h>
>  
> -static unsigned long iram_phys_base;
> -static void __iomem *iram_virt_base;
> -static struct gen_pool *iram_pool;
> +struct pv_pool *mxc_iram_pool;
> +EXPORT_SYMBOL(mxc_iram_pool);
>  
> -static inline void __iomem *iram_phys_to_virt(unsigned long p)
> +int __init iram_init(phys_addr_t base, size_t size)
>  {
> -	return iram_virt_base + (p - iram_phys_base);
> -}
> -
> -void __iomem *iram_alloc(unsigned int size, unsigned long *dma_addr)
> -{
> -	if (!iram_pool)
> -		return NULL;
> -
> -	*dma_addr = gen_pool_alloc(iram_pool, size);
> -	pr_debug("iram alloc - %dB at 0x%lX\n", size, *dma_addr);
> -	if (!*dma_addr)
> -		return NULL;
> -	return iram_phys_to_virt(*dma_addr);
> -}
> -EXPORT_SYMBOL(iram_alloc);
> -
> -void iram_free(unsigned long addr, unsigned int size)
> -{
> -	if (!iram_pool)
> -		return;
> -
> -	gen_pool_free(iram_pool, addr, size);
> -}
> -EXPORT_SYMBOL(iram_free);
> +	void *addr = /*FIXME*/ ioremap(base, size);
>  
> -int __init iram_init(unsigned long base, unsigned long size)
> -{
> -	iram_phys_base = base;
> +	if (!addr)
> +		return -EIO;
>  
> -	iram_pool = gen_pool_create(PAGE_SHIFT, -1);
> -	if (!iram_pool)
> +	mxc_iram_pool = pv_pool_create(addr, base, size, PAGE_SHIFT);
> +	if (!mxc_iram_pool) {
> +		iounmap(addr);
>  		return -ENOMEM;
> +	}
>  
> -	gen_pool_add(iram_pool, base, size, -1);
> -	iram_virt_base = ioremap(iram_phys_base, size);
> -	if (!iram_virt_base)
> -		return -EIO;
> +	pr_debug("i.MX IRAM pool: %lu KB at 0x%08llx\n", size / 1024,
> +		 (unsigned long long)base);
>  
> -	pr_debug("i.MX IRAM pool: %ld KB at 0x%p\n", size / 1024, iram_virt_base);
>  	return 0;
>  }
> diff --git a/arch/arm/plat-omap/include/plat/sram.h b/arch/arm/plat-omap/include/plat/sram.h
> index f500fc3..9fc27d0 100644
> --- a/arch/arm/plat-omap/include/plat/sram.h
> +++ b/arch/arm/plat-omap/include/plat/sram.h
> @@ -12,16 +12,19 @@
>  #define __ARCH_ARM_OMAP_SRAM_H
>  
>  #ifndef __ASSEMBLY__
> -#include <asm/fncpy.h>
> +#include <asm/pv-pool.h>
>  
> -extern void *omap_sram_push_address(unsigned long size);
> +extern struct pv_pool *omap_pv_pool;
>  
> -/* Macro to push a function to the internal SRAM, using the fncpy API */
> +/*
> + * Note that fncpy requires the SRAM address to be aligned to an 8-byte
> + * boundary, so the min_alloc_order for the pool is set appropriately.
> + */
>  #define omap_sram_push(funcp, size) ({				\
> -	typeof(&(funcp)) _res = NULL;				\
> -	void *_sram_address = omap_sram_push_address(size);	\
> -	if (_sram_address)					\
> -		_res = fncpy(_sram_address, &(funcp), size);	\
> +	typeof(&(funcp)) _res;					\
> +	_res = pv_pool_fncpy(omap_pv_pool, funcp, size);	\
> +	if (!_res)						\
> +		pr_err("Not enough space in SRAM\n");		\
>  	_res;							\
>  })
>  
> diff --git a/arch/arm/plat-omap/sram.c b/arch/arm/plat-omap/sram.c
> index a3f50b3..3588749 100644
> --- a/arch/arm/plat-omap/sram.c
> +++ b/arch/arm/plat-omap/sram.c
> @@ -75,7 +75,6 @@
>  static unsigned long omap_sram_start;
>  static unsigned long omap_sram_base;
>  static unsigned long omap_sram_size;
> -static unsigned long omap_sram_ceil;
>  
>  /*
>   * Depending on the target RAMFS firewall setup, the public usable amount of
> @@ -104,6 +103,8 @@ static int is_sram_locked(void)
>  		return 1; /* assume locked with no PPA or security driver */
>  }
>  
> +struct pv_pool *omap_pv_pool;
> +
>  /*
>   * The amount of SRAM depends on the core type.
>   * Note that we cannot try to test for SRAM here because writes
> @@ -182,7 +183,16 @@ static void __init omap_detect_sram(void)
>  			omap_sram_size - SRAM_BOOTLOADER_SZ);
>  	omap_sram_size -= reserved;
>  
> -	omap_sram_ceil = omap_sram_base + omap_sram_size;
> +	{
> +		/* The first SRAM_BOOTLOADER_SZ of SRAM are reserved */
> +		void *base = (void *)omap_sram_base + SRAM_BOOTLOADER_SZ;
> +		phys_addr_t phys = omap_sram_start + SRAM_BOOTLOADER_SZ;
> +		size_t len = omap_sram_size - SRAM_BOOTLOADER_SZ;
> +
> +		omap_pv_pool = pv_pool_create(base, phys, len,
> +						ilog2(FNCPY_ALIGN));
> +		WARN_ON(!omap_pv_pool);
> +	}
>  }
>  
>  static struct map_desc omap_sram_io_desc[] __initdata = {
> @@ -242,26 +252,6 @@ static void __init omap_map_sram(void)
>  	       omap_sram_size - SRAM_BOOTLOADER_SZ);
>  }
>  
> -/*
> - * Memory allocator for SRAM: calculates the new ceiling address
> - * for pushing a function using the fncpy API.
> - *
> - * Note that fncpy requires the returned address to be aligned
> - * to an 8-byte boundary.
> - */
> -void *omap_sram_push_address(unsigned long size)
> -{
> -	if (size > (omap_sram_ceil - (omap_sram_base + SRAM_BOOTLOADER_SZ))) {
> -		printk(KERN_ERR "Not enough space in SRAM\n");
> -		return NULL;
> -	}
> -
> -	omap_sram_ceil -= size;
> -	omap_sram_ceil = ROUND_DOWN(omap_sram_ceil, FNCPY_ALIGN);
> -
> -	return (void *)omap_sram_ceil;
> -}
> -
>  #ifdef CONFIG_ARCH_OMAP1
>  
>  static void (*_omap_sram_reprogram_clock)(u32 dpllctl, u32 ckctl);
> diff --git a/drivers/uio/uio_pruss.c b/drivers/uio/uio_pruss.c
> index daf6e77..2be3155 100644
> --- a/drivers/uio/uio_pruss.c
> +++ b/drivers/uio/uio_pruss.c
> @@ -62,7 +62,7 @@ MODULE_PARM_DESC(extram_pool_sz, "external ram pool size to allocate");
>  struct uio_pruss_dev {
>  	struct uio_info *info;
>  	struct clk *pruss_clk;
> -	dma_addr_t sram_paddr;
> +	phys_addr_t sram_paddr;
>  	dma_addr_t ddr_paddr;
>  	void __iomem *prussio_vaddr;
>  	void *sram_vaddr;
> @@ -106,7 +106,7 @@ static void pruss_cleanup(struct platform_device *dev,
>  			gdev->ddr_paddr);
>  	}
>  	if (gdev->sram_vaddr)
> -		sram_free(gdev->sram_vaddr, sram_pool_sz);
> +		pv_pool_free(davinci_pv_pool, gdev->sram_vaddr, sram_pool_sz);
>  	kfree(gdev->info);
>  	clk_put(gdev->pruss_clk);
>  	kfree(gdev);
> @@ -152,7 +152,8 @@ static int __devinit pruss_probe(struct platform_device *dev)
>  		goto out_free;
>  	}
>  
> -	gdev->sram_vaddr = sram_alloc(sram_pool_sz, &(gdev->sram_paddr));
> +	gdev->sram_vaddr = pv_pool_alloc(davinci_pv_pool, sram_pool_sz,
> +					   &(gdev->sram_paddr));
>  	if (!gdev->sram_vaddr) {
>  		dev_err(&dev->dev, "Could not allocate SRAM pool\n");
>  		goto out_free;
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  parent reply	other threads:[~2011-04-19 16:10 UTC|newest]

Thread overview: 144+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-04-15 13:06 [RFC PATCH] Consolidate SRAM support Russell King - ARM Linux
2011-04-15 13:06 ` Russell King - ARM Linux
2011-04-15 13:39 ` Rob Herring
2011-04-15 13:39   ` Rob Herring
2011-04-15 14:02   ` Ithamar R. Adema
2011-04-15 14:02     ` Ithamar R. Adema
2011-04-15 14:40   ` Arnd Bergmann
2011-04-15 14:40     ` Arnd Bergmann
2011-04-15 15:26     ` Russell King - ARM Linux
2011-04-15 15:26       ` Russell King - ARM Linux
2011-04-15 15:32       ` Grant Likely
2011-04-15 15:32         ` Grant Likely
2011-04-15 15:41         ` Russell King - ARM Linux
2011-04-15 15:41           ` Russell King - ARM Linux
2011-04-16  4:11           ` Magnus Damm
2011-04-16  4:11             ` Magnus Damm
2011-04-17 17:47           ` Arnd Bergmann
2011-04-17 17:47             ` Arnd Bergmann
2011-04-15 16:03   ` Russell King - ARM Linux
2011-04-15 16:03     ` Russell King - ARM Linux
2011-04-15 16:18     ` Nguyen Dinh-R00091
2011-04-15 16:18       ` Nguyen Dinh-R00091
2011-04-15 16:20       ` Russell King - ARM Linux
2011-04-15 16:20         ` Russell King - ARM Linux
2011-04-15 16:58         ` Russell King - ARM Linux
2011-04-15 16:58           ` Russell King - ARM Linux
2011-04-15 19:20           ` Nguyen Dinh-R00091
2011-04-15 19:20             ` Nguyen Dinh-R00091
2011-04-15 19:40             ` Russell King - ARM Linux
2011-04-15 19:40               ` Russell King - ARM Linux
2011-04-15 20:06               ` Nguyen Dinh-R00091
2011-04-15 20:06                 ` Nguyen Dinh-R00091
2011-04-15 13:52 ` Eduardo Valentin
2011-04-15 13:52   ` Eduardo Valentin
2011-04-15 15:24   ` Russell King - ARM Linux
2011-04-15 15:24     ` Russell King - ARM Linux
2011-04-15 14:50 ` Detlef Vollmann
2011-04-15 14:50   ` Detlef Vollmann
2011-04-15 15:37   ` Russell King - ARM Linux
2011-04-15 15:37     ` Russell King - ARM Linux
2011-04-15 18:12     ` Detlef Vollmann
2011-04-15 18:12       ` Detlef Vollmann
2011-04-15 18:21       ` Russell King - ARM Linux
2011-04-15 18:21         ` Russell King - ARM Linux
2011-04-15 16:04   ` Nicolas Ferre
2011-04-15 16:04     ` Nicolas Ferre
2011-04-15 18:14     ` Detlef Vollmann
2011-04-15 18:14       ` Detlef Vollmann
2011-04-16 11:27       ` Detlef Vollmann
2011-04-16 11:27         ` Detlef Vollmann
2011-04-15 18:31 ` Jean-Christophe PLAGNIOL-VILLARD
2011-04-15 18:31   ` Jean-Christophe PLAGNIOL-VILLARD
2011-04-15 18:38   ` [PATCH 1/2] at91: 9260 and 9g20 add support of join SRAM Memory Mapping Jean-Christophe PLAGNIOL-VILLARD
2011-04-15 18:39   ` [PATCH 2/2] at91: add generic allocator support for sram Jean-Christophe PLAGNIOL-VILLARD
2011-04-15 20:11 ` [RFC PATCH] Consolidate SRAM support Uwe Kleine-König
2011-04-15 20:11   ` Uwe Kleine-König
2011-04-15 20:19   ` Russell King - ARM Linux
2011-04-15 20:19     ` Russell King - ARM Linux
2011-04-15 20:22     ` Uwe Kleine-König
2011-04-15 20:22       ` Uwe Kleine-König
2011-04-16 13:01 ` Haojian Zhuang
2011-04-16 13:01   ` Haojian Zhuang
2011-04-16 13:09   ` Russell King - ARM Linux
2011-04-16 13:09     ` Russell King - ARM Linux
2011-04-18  6:48     ` Tony Lindgren
2011-04-18  6:48       ` Tony Lindgren
2011-04-18  7:00       ` Tomi Valkeinen
2011-04-18  7:00         ` Tomi Valkeinen
2011-04-18  8:17         ` Tony Lindgren
2011-04-18  8:17           ` Tony Lindgren
2011-04-19 14:16           ` Tomi Valkeinen
2011-04-19 14:16             ` Tomi Valkeinen
2011-04-20  5:27             ` Tony Lindgren
2011-04-20  5:27               ` Tony Lindgren
2011-04-18  8:52 ` [RFC PATCH v2] " Russell King - ARM Linux
2011-04-18  8:52   ` Russell King - ARM Linux
2011-04-18  9:31   ` Haojian Zhuang
2011-04-18  9:31     ` Haojian Zhuang
2011-04-18 11:33   ` Tony Lindgren
2011-04-18 11:33     ` Tony Lindgren
2011-04-18 13:50   ` Detlef Vollmann
2011-04-18 13:50     ` Detlef Vollmann
2011-04-18 16:12   ` Nori, Sekhar
2011-04-18 16:12     ` Nori, Sekhar
2011-04-18 16:18     ` Russell King - ARM Linux
2011-04-18 16:18       ` Russell King - ARM Linux
2011-04-19 16:01   ` Jean-Christophe PLAGNIOL-VILLARD [this message]
2011-04-19 16:01     ` Jean-Christophe PLAGNIOL-VILLARD
2011-04-19 16:18     ` Russell King - ARM Linux
2011-04-19 16:18       ` Russell King - ARM Linux
2011-04-19 19:05       ` Jean-Christophe PLAGNIOL-VILLARD
2011-04-19 19:05         ` Jean-Christophe PLAGNIOL-VILLARD
2011-04-19 23:20         ` Russell King - ARM Linux
2011-04-19 23:20           ` Russell King - ARM Linux
2011-04-20  4:06           ` Jean-Christophe PLAGNIOL-VILLARD
2011-04-20  4:06             ` Jean-Christophe PLAGNIOL-VILLARD
2011-04-19  1:23 ` [RFC PATCH] " Linus Walleij
2011-04-19  1:23   ` Linus Walleij
2011-05-12 17:45 ` [RFC PATCH v3] " Russell King - ARM Linux
2011-05-12 17:45   ` Russell King - ARM Linux
2011-05-12 18:35   ` Jean-Christophe PLAGNIOL-VILLARD
2011-05-12 18:35     ` Jean-Christophe PLAGNIOL-VILLARD
2011-05-13  7:30   ` Jean Pihet
2011-05-13  7:30     ` Jean Pihet
2011-05-13  9:11     ` Russell King - ARM Linux
2011-05-13  9:11       ` Russell King - ARM Linux
2011-05-13  9:25       ` Jean Pihet
2011-05-13  9:25         ` Jean Pihet
2011-05-13  9:19   ` Santosh Shilimkar
2011-05-13  9:19     ` Santosh Shilimkar
2011-05-17 13:06   ` Nori, Sekhar
2011-05-17 13:06     ` Nori, Sekhar
2011-05-17 21:41     ` [PATCH 0/9] Ben Gardiner
2011-05-17 21:41       ` [PATCH 1/9] davinci: pm: fix compiler errors and kernel panics from sram consolidation Ben Gardiner
2011-05-17 21:41       ` [PATCH 2/9] davinci: sram: ioremap the davinci_soc_info specified sram regions Ben Gardiner
2011-05-18  4:51         ` Jean-Christophe PLAGNIOL-VILLARD
2011-05-18 12:11           ` Nori, Sekhar
2011-05-18 12:14             ` Russell King - ARM Linux
2011-05-18 15:58               ` Jean-Christophe PLAGNIOL-VILLARD
2011-05-25 23:16                 ` Jean-Christophe PLAGNIOL-VILLARD
2011-05-18 13:18         ` Nori, Sekhar
2011-05-18 13:36           ` Ben Gardiner
2011-05-17 21:41       ` [PATCH 3/9] davinci: da850: remove the SRAM_VIRT iotable entry Ben Gardiner
2011-05-17 21:42       ` [PATCH 4/9] davinci: dm355: " Ben Gardiner
2011-05-17 21:42       ` [PATCH 5/9] davinci: dm365: " Ben Gardiner
2011-05-17 21:42       ` [PATCH 6/9] davinci: dm644x: " Ben Gardiner
2011-05-17 21:42       ` [PATCH 7/9] davinci: dm646x: " Ben Gardiner
2011-05-17 21:42       ` [PATCH 8/9] davinci: remove definition of SRAM_VIRT Ben Gardiner
2011-05-18 10:40         ` Sergei Shtylyov
2011-05-17 21:42       ` [PATCH 9/9] davinci: da850: changed SRAM allocator to shared ram Ben Gardiner
2011-05-18 10:29         ` Sergei Shtylyov
2011-05-18 12:33           ` Ben Gardiner
2011-05-26  1:02   ` [RFC PATCH v4] Consolidate SRAM support Jean-Christophe PLAGNIOL-VILLARD
2011-05-26  1:02     ` Jean-Christophe PLAGNIOL-VILLARD
     [not found]     ` <1306371777-20431-1-git-send-email-plagnioj-sclMFOaUSTBWk0Htik3J/w@public.gmane.org>
2011-05-31 17:09       ` Nori, Sekhar
2011-05-31 17:09         ` Nori, Sekhar
2011-05-31 21:21         ` Russell King - ARM Linux
2011-05-31 21:21           ` Russell King - ARM Linux
2011-06-29 13:12     ` Nori, Sekhar
2011-06-29 13:12       ` Nori, Sekhar
2011-07-08 16:51     ` Nori, Sekhar
2011-07-08 16:51       ` Nori, Sekhar
2011-07-08 16:58       ` Nori, Sekhar
2011-07-08 16:58         ` Nori, Sekhar

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20110419160135.GA4204@game.jcrosoft.org \
    --to=plagnioj@jcrosoft.com \
    --cc=davinci-linux-open-source@linux.davincidsp.com \
    --cc=khilman@ti.com \
    --cc=lethal@linux-sh.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-omap@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=magnus.damm@gmail.com \
    --cc=nsekhar@ti.com \
    --cc=tony@atomide.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.