23 #include <linux/kernel.h>
25 #include <linux/list.h>
26 #include <linux/slab.h>
32 #include <linux/module.h>
34 #include <asm/setup.h>
39 #define DBG(format, ...) pr_debug("VRAM: " format, ## __VA_ARGS__)
41 #define DBG(format, ...)
46 #define MAX_POSTPONED_REGIONS 10
48 static bool vram_initialized;
49 static int postponed_cnt;
88 static void omap_vram_free_region(
struct vram_region *vr)
96 unsigned long paddr,
unsigned pages)
110 if (va->
paddr > new->paddr)
119 static void omap_vram_free_allocation(
struct vram_alloc *va)
130 if (vram_initialized) {
131 DBG(
"adding region paddr %08lx size %d\n",
137 rm = omap_vram_create_region(paddr, pages);
141 list_add(&rm->
list, ®ion_list);
146 postponed_regions[postponed_cnt].paddr =
paddr;
147 postponed_regions[postponed_cnt].size =
size;
160 DBG(
"free mem paddr %08lx size %d\n", paddr, size);
168 start = alloc->
paddr;
171 if (start >= paddr && end < paddr + size)
180 omap_vram_free_allocation(alloc);
187 static int _omap_vram_reserve(
unsigned long paddr,
unsigned pages)
202 if (start > paddr || end < paddr + size - 1)
205 DBG(
"block ok, checking allocs\n");
208 end = alloc->
paddr - 1;
210 if (start <= paddr && end >= paddr + size - 1)
218 if (!(start <= paddr && end >= paddr + size - 1))
221 DBG(
"found area start %lx, end %lx\n", start, end);
223 if (omap_vram_create_allocation(rm, paddr, pages) ==
NULL)
237 DBG(
"reserve mem paddr %08lx size %d\n", paddr, size);
244 r = _omap_vram_reserve(paddr, pages);
252 static int _omap_vram_alloc(
unsigned pages,
unsigned long *paddr)
267 if (end - start >= pages << PAGE_SHIFT)
275 if (end - start < pages << PAGE_SHIFT)
278 DBG(
"found %lx, end %lx\n", start, end);
280 alloc = omap_vram_create_allocation(rm, start, pages);
299 DBG(
"alloc mem size %d\n", size);
306 r = _omap_vram_alloc(pages, paddr);
315 unsigned long *free_vram,
316 unsigned long *largest_free_block)
323 *largest_free_block = 0;
335 free = va->
paddr - pa;
337 if (free > *largest_free_block)
338 *largest_free_block =
free;
344 if (free > *largest_free_block)
345 *largest_free_block =
free;
352 #if defined(CONFIG_DEBUG_FS)
386 .
open = vram_debug_open,
392 static int __init omap_vram_create_debugfs(
void)
397 NULL, &vram_debug_fops);
405 static __init int omap_vram_init(
void)
409 vram_initialized = 1;
411 for (i = 0; i < postponed_cnt; i++)
413 postponed_regions[i].size);
415 #ifdef CONFIG_DEBUG_FS
416 if (omap_vram_create_debugfs())
417 pr_err(
"VRAM: Failed to create debugfs file\n");
435 static int __init omap_vram_early_vram(
char *
p)
437 omap_vram_def_sdram_size =
memparse(p, &p);
454 if (omap_vram_def_sdram_size) {
455 size = omap_vram_def_sdram_size;
456 paddr = omap_vram_def_sdram_start;
460 size = omap_vram_sdram_size;
461 paddr = omap_vram_sdram_start;
464 #ifdef CONFIG_OMAP2_VRAM_SIZE
466 size = CONFIG_OMAP2_VRAM_SIZE * 1024 * 1024;
478 pr_err(
"VRAM start address 0x%08x not page aligned\n",
484 pr_err(
"Illegal SDRAM region 0x%08x..0x%08x for VRAM\n",
485 paddr, paddr + size - 1);
490 pr_err(
"FB: failed to reserve VRAM - busy\n");
495 pr_err(
"FB: failed to reserve VRAM - no memory\n");
507 pr_info(
"Reserving %u bytes SDRAM for VRAM\n", size);
512 omap_vram_sdram_start =
start;
513 omap_vram_sdram_size =
size;