/* * Called from map_io. We need to call to this early enough so that we * can reserve the fixed SDRAM regions before VM could get hold of them. */ void __init omapfb_reserve_sdram(void) { struct bootmem_data *bdata; unsigned long sdram_start, sdram_size; unsigned long reserved; int i; if (config_invalid) return; bdata = NODE_DATA(0)->bdata; sdram_start = bdata->node_min_pfn << PAGE_SHIFT; sdram_size = (bdata->node_low_pfn << PAGE_SHIFT) - sdram_start; reserved = 0; for (i = 0; ; i++) { struct omapfb_mem_region rg; if (get_fbmem_region(i, &rg) < 0) break; if (i == OMAPFB_PLANE_NUM) { printk(KERN_ERR "Extraneous FB mem configuration entries\n"); config_invalid = 1; return; } /* Check if it's our memory type. */ if (set_fbmem_region_type(&rg, OMAPFB_MEMTYPE_SDRAM, sdram_start, sdram_size) < 0 || (rg.type != OMAPFB_MEMTYPE_SDRAM)) continue; BUG_ON(omapfb_config.mem_desc.region[i].size); if (check_fbmem_region(i, &rg, sdram_start, sdram_size) < 0) { config_invalid = 1; return; } if (rg.paddr) { reserve_bootmem(rg.paddr, rg.size, BOOTMEM_DEFAULT); reserved += rg.size; } omapfb_config.mem_desc.region[i] = rg; configured_regions++; } omapfb_config.mem_desc.region_cnt = i; if (reserved) pr_info("Reserving %lu bytes SDRAM for frame buffer\n", reserved); }
/* * Called at sram init time, before anything is pushed to the SRAM stack. * Because of the stack scheme, we will allocate everything from the * start of the lowest address region to the end of SRAM. This will also * include padding for page alignment and possible holes between regions. * * As opposed to the SDRAM case, we'll also do any dynamic allocations at * this point, since the driver built as a module would have problem with * freeing / reallocating the regions. */ unsigned long __init omapfb_reserve_sram(unsigned long sram_pstart, unsigned long sram_vstart, unsigned long sram_size, unsigned long pstart_avail, unsigned long size_avail) { struct omapfb_mem_region rg; unsigned long pend_avail; unsigned long reserved; int i; if (config_invalid) return 0; reserved = 0; pend_avail = pstart_avail + size_avail; for (i = 0; ; i++) { if (get_fbmem_region(i, &rg) < 0) break; if (i == OMAPFB_PLANE_NUM) { printk(KERN_ERR "Extraneous FB mem configuration entries\n"); config_invalid = 1; return 0; } /* Check if it's our memory type. */ if (set_fbmem_region_type(&rg, OMAPFB_MEMTYPE_SRAM, sram_pstart, sram_size) < 0 || (rg.type != OMAPFB_MEMTYPE_SRAM)) continue; BUG_ON(omapfb_config.mem_desc.region[i].size); if (check_fbmem_region(i, &rg, pstart_avail, size_avail) < 0) { config_invalid = 1; return 0; } if (!rg.paddr) { /* Dynamic allocation */ if ((size_avail & PAGE_MASK) < rg.size) { printk("Not enough SRAM for FB region %d\n", i); config_invalid = 1; return 0; } size_avail = (size_avail - rg.size) & PAGE_MASK; rg.paddr = pstart_avail + size_avail; } /* Reserve everything above the start of the region. */ if (pend_avail - rg.paddr > reserved) reserved = pend_avail - rg.paddr; size_avail = pend_avail - reserved - pstart_avail; /* * We have a kernel mapping for this already, so the * driver won't have to make one. */ rg.vaddr = (void *)(sram_vstart + rg.paddr - sram_pstart); omapfb_config.mem_desc.region[i] = rg; configured_regions++; } omapfb_config.mem_desc.region_cnt = i; if (reserved) pr_info("Reserving %lu bytes SRAM for frame buffer\n", reserved); return reserved; }