Skip to content

Commit 24c3d2f

Browse files
Anton Vorontsovgregkh
authored andcommitted
staging: android: persistent_ram: Make it possible to use memory outside 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 <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 2b1321e commit 24c3d2f

File tree

1 file changed

+17
-1
lines changed

1 file changed

+17
-1
lines changed

drivers/staging/android/persistent_ram.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <linux/rslib.h>
2424
#include <linux/slab.h>
2525
#include <linux/vmalloc.h>
26+
#include <asm/page.h>
2627
#include "persistent_ram.h"
2728

2829
struct persistent_ram_buffer {
@@ -349,10 +350,25 @@ static void *persistent_ram_vmap(phys_addr_t start, size_t size)
349350
return vaddr;
350351
}
351352

353+
static void *persistent_ram_iomap(phys_addr_t start, size_t size)
354+
{
355+
if (!request_mem_region(start, size, "persistent_ram")) {
356+
pr_err("request mem region (0x%llx@0x%llx) failed\n",
357+
(unsigned long long)size, (unsigned long long)start);
358+
return NULL;
359+
}
360+
361+
return ioremap(start, size);
362+
}
363+
352364
static int persistent_ram_buffer_map(phys_addr_t start, phys_addr_t size,
353365
struct persistent_ram_zone *prz)
354366
{
355-
prz->vaddr = persistent_ram_vmap(start, size);
367+
if (pfn_valid(start >> PAGE_SHIFT))
368+
prz->vaddr = persistent_ram_vmap(start, size);
369+
else
370+
prz->vaddr = persistent_ram_iomap(start, size);
371+
356372
if (!prz->vaddr) {
357373
pr_err("%s: Failed to map 0x%llx pages at 0x%llx\n", __func__,
358374
(unsigned long long)size, (unsigned long long)start);

0 commit comments

Comments
 (0)