[PATCH v3 13/14] picoxcell: add support for the onchip SRAM

Jamie Iles jamie at jamieiles.com
Fri Dec 10 11:28:24 EST 2010


The onchip SRAM is a 128KB SRAM that is shared with the picoArray
DSP array. Use a generic allocator based on the mach-davinci SRAM
allocator to provide allocations from this SRAM.

Signed-off-by: Jamie Iles <jamie at jamieiles.com>
---
 arch/arm/Kconfig                            |    1 +
 arch/arm/mach-picoxcell/Kconfig             |    9 ++++
 arch/arm/mach-picoxcell/Makefile            |    1 +
 arch/arm/mach-picoxcell/include/mach/sram.h |   28 +++++++++++
 arch/arm/mach-picoxcell/sram.c              |   66 +++++++++++++++++++++++++++
 5 files changed, 105 insertions(+), 0 deletions(-)
 create mode 100644 arch/arm/mach-picoxcell/include/mach/sram.h
 create mode 100644 arch/arm/mach-picoxcell/sram.c

diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
index 85f9c97..c803b28 100644
--- a/arch/arm/Kconfig
+++ b/arch/arm/Kconfig
@@ -596,6 +596,7 @@ config ARCH_PICOXCELL
 	select TICK_ONESHOT
 	select CPU_V6
 	select HAVE_TCM
+	select GENERIC_ALLOCATOR
 	help
 	  This enables support for systems based on the Picochip picoXcell
 	  family of Femtocell devices.
diff --git a/arch/arm/mach-picoxcell/Kconfig b/arch/arm/mach-picoxcell/Kconfig
index 671cadc..a0b197c 100644
--- a/arch/arm/mach-picoxcell/Kconfig
+++ b/arch/arm/mach-picoxcell/Kconfig
@@ -26,4 +26,13 @@ config PC3X3_STOP_WDT_IN_SUSPEND
 	  to keep running. If you say no here, make sure that the watchdog uses
 	  the pretimeout mode and mark the watchdog as a wakeup source.
 
+config PICOXCELL_SRAM
+	bool "Support SRAM in Linux"
+	default y
+	help
+	  Say yes here to add support for allocations from the onchip SRAM.
+	  This SRAM is low latency and is 128KB in size. The SRAM is also
+	  accessible by the picoArray so care needs to be taken when using this
+	  in combination with picoArray firmware that utilizes the SRAM.
+
 endmenu
diff --git a/arch/arm/mach-picoxcell/Makefile b/arch/arm/mach-picoxcell/Makefile
index 7ed0d7c..6f2a5b8 100644
--- a/arch/arm/mach-picoxcell/Makefile
+++ b/arch/arm/mach-picoxcell/Makefile
@@ -8,3 +8,4 @@ obj-$(CONFIG_CPU_FREQ)		+= cpufreq.o
 obj-$(CONFIG_PM)		+= pm.o
 obj-$(CONFIG_PICOXCELL_PC3X2)	+= pc3x2.o
 obj-$(CONFIG_PICOXCELL_PC3X3)	+= pc3x3.o
+obj-$(CONFIG_PICOXCELL_SRAM)	+= sram.o
diff --git a/arch/arm/mach-picoxcell/include/mach/sram.h b/arch/arm/mach-picoxcell/include/mach/sram.h
new file mode 100644
index 0000000..4cd1a71
--- /dev/null
+++ b/arch/arm/mach-picoxcell/include/mach/sram.h
@@ -0,0 +1,28 @@
+/*
+ * mach/sram.h - picoxcell simple SRAM allocator
+ *
+ * Adapted from the DaVinci SRAM allocator by David Brownell. picoXcell always
+ * has 128KB of SRAM at the same address so the allocator is a bit simpler
+ * than for DaVinci.
+ *
+ * Copyright (C) 2010 Jamie Iles
+ * 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.
+ */
+#ifndef __PICOXCELL_SRAM_H__
+#define __PICOXCELL_SRAM_H__
+
+/*
+ * Granularity of SRAM allocations. With 128KB, 512 bytes seems like a
+ * reasonable granularity.
+ */
+#define SRAM_GRANULARITY		512
+
+void *sram_alloc(size_t len, dma_addr_t *dma);
+void sram_free(void *addr, size_t len);
+
+#endif /* __PICOXCELL_SRAM_H__ */
diff --git a/arch/arm/mach-picoxcell/sram.c b/arch/arm/mach-picoxcell/sram.c
new file mode 100644
index 0000000..4c290d1
--- /dev/null
+++ b/arch/arm/mach-picoxcell/sram.c
@@ -0,0 +1,66 @@
+/*
+ * mach-picoxcell/sram.c - picoxcell simple SRAM allocator
+ *
+ * Adapted from the DaVinci SRAM allocator by David Brownell. picoXcell always
+ * has 128KB of SRAM at the same address so the allocator is a bit simpler
+ * than for DaVinci.
+ *
+ * Copyright (C) 2010 Jamie Iles
+ * 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/module.h>
+#include <linux/init.h>
+#include <linux/genalloc.h>
+
+#include <mach/hardware.h>
+#include <mach/sram.h>
+
+static struct gen_pool *sram_pool;
+
+void *sram_alloc(size_t len, dma_addr_t *dma)
+{
+	unsigned long vaddr;
+
+	if (dma)
+		*dma = 0;
+
+	if (!sram_pool)
+		return NULL;
+
+	vaddr = gen_pool_alloc(sram_pool, len);
+	if (!vaddr)
+		return NULL;
+
+	if (dma)
+		*dma = SRAM_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);
+
+static int __init sram_init(void)
+{
+	int ret;
+
+	sram_pool = gen_pool_create(ilog2(SRAM_GRANULARITY), -1);
+	if (!sram_pool)
+		return -ENOMEM;
+
+	ret = gen_pool_add(sram_pool, SRAM_VIRT, SRAM_SIZE, -1);
+	WARN_ON(ret < 0);
+
+	return ret;
+}
+core_initcall(sram_init);
-- 
1.7.2.3




More information about the linux-arm-kernel mailing list