aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sh/mm/consistent.c
diff options
context:
space:
mode:
authorMagnus Damm <damm@igel.co.jp>2008-08-11 15:13:24 +0900
committerPaul Mundt <lethal@linux-sh.org>2008-08-11 20:17:55 +0900
commit0c13bf1e7c98668ce69eaedd215ec32f9e1361ae (patch)
treeaaf5fc79baecd9789bb7161d9cc87e6dec051af5 /arch/sh/mm/consistent.c
parent2a5323cd69ff485c1b68960f2b4802cf252558f1 (diff)
downloadkernel_samsung_crespo-0c13bf1e7c98668ce69eaedd215ec32f9e1361ae.zip
kernel_samsung_crespo-0c13bf1e7c98668ce69eaedd215ec32f9e1361ae.tar.gz
kernel_samsung_crespo-0c13bf1e7c98668ce69eaedd215ec32f9e1361ae.tar.bz2
sh: select memchunk size using kernel cmdline
Allow user to pass parameters on kernel command line to override default size for physically contiguous memory buffers. The default VPU buffer size is too small for VGA harware encoding, but instead of just bumping up the number we allow the user to override the default size using the command line. Supports SuperH Mobile hardware blocks such as VEU, VPU and CEU. Signed-off-by: Magnus Damm <damm@igel.co.jp> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch/sh/mm/consistent.c')
-rw-r--r--arch/sh/mm/consistent.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/arch/sh/mm/consistent.c b/arch/sh/mm/consistent.c
index b2ce014..895bb3f 100644
--- a/arch/sh/mm/consistent.c
+++ b/arch/sh/mm/consistent.c
@@ -95,6 +95,29 @@ void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
}
EXPORT_SYMBOL(dma_cache_sync);
+static int __init memchunk_setup(char *str)
+{
+ return 1; /* accept anything that begins with "memchunk." */
+}
+__setup("memchunk.", memchunk_setup);
+
+static void memchunk_cmdline_override(char *name, unsigned long *sizep)
+{
+ char *p = boot_command_line;
+ int k = strlen(name);
+
+ while ((p = strstr(p, "memchunk."))) {
+ p += 9; /* strlen("memchunk.") */
+ if (!strncmp(name, p, k) && p[k] == '=') {
+ p += k + 1;
+ *sizep = memparse(p, NULL);
+ pr_info("%s: forcing memory chunk size to 0x%08lx\n",
+ name, *sizep);
+ break;
+ }
+ }
+}
+
int platform_resource_setup_memory(struct platform_device *pdev,
char *name, unsigned long memsize)
{
@@ -109,6 +132,10 @@ int platform_resource_setup_memory(struct platform_device *pdev,
return -EINVAL;
}
+ memchunk_cmdline_override(name, &memsize);
+ if (!memsize)
+ return 0;
+
buf = dma_alloc_coherent(NULL, memsize, &dma_handle, GFP_KERNEL);
if (!buf) {
pr_warning("%s: unable to allocate memory\n", name);