linux/arch/sh/mm/consistent.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2004 - 2007  Paul Mundt
   3 *
   4 * This file is subject to the terms and conditions of the GNU General Public
   5 * License.  See the file "COPYING" in the main directory of this archive
   6 * for more details.
   7 */
   8#include <linux/mm.h>
   9#include <linux/init.h>
  10#include <linux/platform_device.h>
  11#include <linux/dma-mapping.h>
  12#include <linux/io.h>
  13
  14static int __init memchunk_setup(char *str)
  15{
  16        return 1; /* accept anything that begins with "memchunk." */
  17}
  18__setup("memchunk.", memchunk_setup);
  19
  20static void __init memchunk_cmdline_override(char *name, unsigned long *sizep)
  21{
  22        char *p = boot_command_line;
  23        int k = strlen(name);
  24
  25        while ((p = strstr(p, "memchunk."))) {
  26                p += 9; /* strlen("memchunk.") */
  27                if (!strncmp(name, p, k) && p[k] == '=') {
  28                        p += k + 1;
  29                        *sizep = memparse(p, NULL);
  30                        pr_info("%s: forcing memory chunk size to 0x%08lx\n",
  31                                name, *sizep);
  32                        break;
  33                }
  34        }
  35}
  36
  37int __init platform_resource_setup_memory(struct platform_device *pdev,
  38                                          char *name, unsigned long memsize)
  39{
  40        struct resource *r;
  41        dma_addr_t dma_handle;
  42        void *buf;
  43
  44        r = pdev->resource + pdev->num_resources - 1;
  45        if (r->flags) {
  46                pr_warning("%s: unable to find empty space for resource\n",
  47                        name);
  48                return -EINVAL;
  49        }
  50
  51        memchunk_cmdline_override(name, &memsize);
  52        if (!memsize)
  53                return 0;
  54
  55        buf = dma_alloc_coherent(&pdev->dev, memsize, &dma_handle, GFP_KERNEL);
  56        if (!buf) {
  57                pr_warning("%s: unable to allocate memory\n", name);
  58                return -ENOMEM;
  59        }
  60
  61        memset(buf, 0, memsize);
  62
  63        r->flags = IORESOURCE_MEM;
  64        r->start = dma_handle;
  65        r->end = r->start + memsize - 1;
  66        r->name = name;
  67        return 0;
  68}
  69