Skip to content

Commit

Permalink
staging: android: persistent_ram: Make it possible to use memory outs…
Browse files Browse the repository at this point in the history
…ide of bootmem

This includes devices' memory (e.g. framebuffers or memory mapped
EEPROMs on a local bus), as well as the normal RAM that we don't use
for the main memory.

For the normal (but unused) ram we could use kmaps, but this assumes
highmem support, so we don't bother and just use the memory via
ioremap.

As a side effect, the following hack is possible: when used together
with pstore_ram (new ramoops) module, we can limit the normal RAM region
with mem= and then point ramoops to use the rest of the memory, e.g.

	mem=128M ramoops.mem_address=0x8000000

Sure, we could just reserve the region with memblock_reserve() early in
the arch/ code, and then register a pstore_ram platform device pointing
to the reserved region. It's still a viable option if platform wants
to do so.

Also, we might want to use IO accessors in case of a real device,
but for now we don't bother (the old ramoops wasn't using it either, so
at least we don't make things worse).

Signed-off-by: Anton Vorontsov <anton.vorontsov@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Anton Vorontsov authored and Greg Kroah-Hartman committed May 14, 2012
1 parent 2b1321e commit 24c3d2f
Showing 1 changed file with 17 additions and 1 deletion.
18 changes: 17 additions & 1 deletion drivers/staging/android/persistent_ram.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include <linux/rslib.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <asm/page.h>
#include "persistent_ram.h"

struct persistent_ram_buffer {
Expand Down Expand Up @@ -349,10 +350,25 @@ static void *persistent_ram_vmap(phys_addr_t start, size_t size)
return vaddr;
}

static void *persistent_ram_iomap(phys_addr_t start, size_t size)
{
if (!request_mem_region(start, size, "persistent_ram")) {
pr_err("request mem region (0x%llx@0x%llx) failed\n",
(unsigned long long)size, (unsigned long long)start);
return NULL;
}

return ioremap(start, size);
}

static int persistent_ram_buffer_map(phys_addr_t start, phys_addr_t size,
struct persistent_ram_zone *prz)
{
prz->vaddr = persistent_ram_vmap(start, size);
if (pfn_valid(start >> PAGE_SHIFT))
prz->vaddr = persistent_ram_vmap(start, size);
else
prz->vaddr = persistent_ram_iomap(start, size);

if (!prz->vaddr) {
pr_err("%s: Failed to map 0x%llx pages at 0x%llx\n", __func__,
(unsigned long long)size, (unsigned long long)start);
Expand Down

0 comments on commit 24c3d2f

Please sign in to comment.