static int __init Fb_map_video_memory(struct fb_info *info) { #ifndef CONFIG_FB_SUNXI_RESERVED_MEM unsigned map_size = PAGE_ALIGN(info->fix.smem_len); struct page *page; page = alloc_pages(GFP_KERNEL, get_order(map_size)); if (page != NULL) { info->screen_base = page_address(page); info->fix.smem_start = virt_to_phys(info->screen_base); memset(info->screen_base, 0, info->fix.smem_len); __inf("Fb_map_video_memory, pa=0x%08lx size:0x%x\n", info->fix.smem_start, info->fix.smem_len); return 0; } else { __wrn("alloc_pages fail!\n"); return -ENOMEM; } #else info->screen_base = (char __iomem *)disp_malloc(info->fix.smem_len); info->fix.smem_start = (unsigned long)__pa(info->screen_base); memset_io(info->screen_base, 0, info->fix.smem_len); __inf("Fb_map_video_memory, pa=0x%08lx size:0x%x\n", info->fix.smem_start, info->fix.smem_len); return 0; #endif }
static int Fb_map_video_memory(struct fb_info *info) { #ifndef FB_RESERVED_MEM unsigned map_size = PAGE_ALIGN(info->fix.smem_len); struct page *page; page = alloc_pages(GFP_KERNEL, get_order(map_size)); if(page != NULL) { info->screen_base = page_address(page); info->fix.smem_start = virt_to_phys(info->screen_base); memset(info->screen_base,0x0,info->fix.smem_len); __inf("Fb_map_video_memory(alloc pages), pa=0x%08lx size:0x%x\n",info->fix.smem_start, info->fix.smem_len); return 0; } else { __wrn("alloc_pages fail! size:0x%x\n", info->fix.smem_len); return -ENOMEM; } #else info->screen_base = (char __iomem *)disp_malloc(info->fix.smem_len, (__u32 *)(&info->fix.smem_start)); if(info->screen_base) { __inf("Fb_map_video_memory(reserve), pa=0x%x size:0x%x\n",(unsigned int)info->fix.smem_start, (unsigned int)info->fix.smem_len); memset(info->screen_base,0x0,info->fix.smem_len); g_fb_addr.fb_paddr = (unsigned int)info->fix.smem_start; g_fb_addr.fb_size=info->fix.smem_len; return 0; } else { __wrn("disp_malloc fail!\n"); return -ENOMEM; } return 0; #endif }
int disp_mem_request(int sel,__u32 size) { #ifndef FB_RESERVED_MEM unsigned map_size = 0; struct page *page; if(g_disp_mm[sel].info_base != 0) return -EINVAL; g_disp_mm[sel].mem_len = size; map_size = PAGE_ALIGN(g_disp_mm[sel].mem_len); page = alloc_pages(GFP_KERNEL,get_order(map_size)); if(page != NULL) { g_disp_mm[sel].info_base = page_address(page); if(g_disp_mm[sel].info_base == 0) { free_pages((unsigned long)(page),get_order(map_size)); __wrn("page_address fail!\n"); return -ENOMEM; } g_disp_mm[sel].mem_start = virt_to_phys(g_disp_mm[sel].info_base); memset(g_disp_mm[sel].info_base,0,size); __inf("pa=0x%08lx va=0x%p size:0x%x\n",g_disp_mm[sel].mem_start, g_disp_mm[sel].info_base, size); return 0; } else { __wrn("alloc_pages fail!\n"); return -ENOMEM; } #else __u32 ret = 0; ret = (__u32)disp_malloc(size); if(ret != 0) { g_disp_mm[sel].info_base = (void*)ret; g_disp_mm[sel].mem_start = virt_to_phys(g_disp_mm[sel].info_base); memset(g_disp_mm[sel].info_base,0,size); __inf("pa=0x%08lx va=0x%p size:0x%x\n",g_disp_mm[sel].mem_start, g_disp_mm[sel].info_base, size); return 0; } else { __wrn("disp_malloc fail!\n"); return -ENOMEM; } #endif }