register sdram as resources
Also, request the sdram regions used by the barebox binary, bss, malloc space and stack. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
32f163f67c
commit
ec8dd25428
|
@ -25,6 +25,9 @@
|
|||
#include <of.h>
|
||||
#include <init.h>
|
||||
#include <libfdt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <asm-generic/memory_layout.h>
|
||||
#include <asm/sections.h>
|
||||
|
||||
/*
|
||||
* Begin and End of memory area for malloc(), and current "brk"
|
||||
|
@ -50,6 +53,33 @@ void mem_malloc_init(void *start, void *end)
|
|||
malloc_brk = malloc_start;
|
||||
}
|
||||
|
||||
static int mem_malloc_resource(void)
|
||||
{
|
||||
/*
|
||||
* Normally it's a bug when one of these fails,
|
||||
* but we have some setups where some of these
|
||||
* regions are outside of sdram in which case
|
||||
* the following fails.
|
||||
*/
|
||||
request_sdram_region("malloc space",
|
||||
malloc_start,
|
||||
malloc_end - malloc_start + 1);
|
||||
request_sdram_region("barebox",
|
||||
(unsigned long)&_stext,
|
||||
(unsigned long)&_etext -
|
||||
(unsigned long)&_stext + 1);
|
||||
request_sdram_region("bss",
|
||||
(unsigned long)&__bss_start,
|
||||
(unsigned long)&__bss_stop -
|
||||
(unsigned long)&__bss_start + 1);
|
||||
#ifdef STACK_BASE
|
||||
request_sdram_region("stack", STACK_BASE, STACK_SIZE);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
coredevice_initcall(mem_malloc_resource);
|
||||
|
||||
static void *sbrk_no_zero(ptrdiff_t increment)
|
||||
{
|
||||
unsigned long old = malloc_brk;
|
||||
|
@ -82,6 +112,10 @@ void barebox_add_memory_bank(const char *name, resource_size_t start,
|
|||
struct memory_bank *bank = xzalloc(sizeof(*bank));
|
||||
struct device_d *dev;
|
||||
|
||||
bank->res = request_iomem_region(name, start, size);
|
||||
|
||||
BUG_ON(!bank->res);
|
||||
|
||||
dev = add_mem_device(name, start, size, IORESOURCE_MEM_WRITEABLE);
|
||||
|
||||
bank->dev = dev;
|
||||
|
@ -91,6 +125,30 @@ void barebox_add_memory_bank(const char *name, resource_size_t start,
|
|||
list_add_tail(&bank->list, &memory_banks);
|
||||
}
|
||||
|
||||
/*
|
||||
* Request a region from the registered sdram
|
||||
*/
|
||||
struct resource *request_sdram_region(const char *name, resource_size_t start,
|
||||
resource_size_t size)
|
||||
{
|
||||
struct memory_bank *bank;
|
||||
|
||||
for_each_memory_bank(bank) {
|
||||
struct resource *res;
|
||||
|
||||
res = request_region(bank->res, name, start, size);
|
||||
if (res)
|
||||
return res;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int release_sdram_region(struct resource *res)
|
||||
{
|
||||
return release_region(res);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OFTREE
|
||||
|
||||
/*
|
||||
|
|
|
@ -13,6 +13,7 @@ struct memory_bank {
|
|||
struct device_d *dev;
|
||||
unsigned long start;
|
||||
unsigned long size;
|
||||
struct resource *res;
|
||||
};
|
||||
|
||||
extern struct list_head memory_banks;
|
||||
|
@ -22,4 +23,8 @@ void barebox_add_memory_bank(const char *name, resource_size_t start,
|
|||
|
||||
#define for_each_memory_bank(mem) list_for_each_entry(mem, &memory_banks, list)
|
||||
|
||||
struct resource *request_sdram_region(const char *name, resource_size_t start,
|
||||
resource_size_t size);
|
||||
int release_sdram_region(struct resource *res);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue