static void *vb2_cma_phys_alloc(void *alloc_ctx, unsigned long size) { struct vb2_cma_phys_conf *conf = alloc_ctx; struct vb2_cma_phys_buf *buf; buf = kzalloc(sizeof *buf, GFP_KERNEL); if (!buf) return ERR_PTR(-ENOMEM); buf->paddr = cma_alloc(conf->dev, conf->type, size, conf->alignment); if (IS_ERR((void *)buf->paddr)) { printk(KERN_ERR "cma_alloc of size %ld failed\n", size); kfree(buf); return ERR_PTR(-ENOMEM); } buf->conf = conf; buf->size = size; buf->cacheable = conf->cacheable; buf->handler.refcount = &buf->refcount; buf->handler.put = vb2_cma_phys_put; buf->handler.arg = buf; atomic_inc(&buf->refcount); return buf; }
int g2d_init_mem(struct device *dev, unsigned int *base, unsigned int *size) { #ifdef CONFIG_S5P_MEM_CMA struct cma_info mem_info; int err; char cma_name[8]; #endif #ifdef CONFIG_S5P_MEM_CMA /* CMA */ sprintf(cma_name, "fimg2d"); err = cma_info(&mem_info, dev, 0); FIMG2D_DEBUG("[cma_info] start_addr : 0x%x, end_addr : 0x%x, " "total_size : 0x%x, free_size : 0x%x\n", mem_info.lower_bound, mem_info.upper_bound, mem_info.total_size, mem_info.free_size); if (err) { FIMG2D_ERROR("%s: get cma info failed\n", __func__); return -1; } *size = mem_info.total_size; *base = (dma_addr_t)cma_alloc (dev, cma_name, (size_t)(*size), 0); FIMG2D_DEBUG("size = 0x%x\n", *size); FIMG2D_DEBUG("*base phys= 0x%x\n", *base); FIMG2D_DEBUG("*base virt = 0x%x\n", (u32)phys_to_virt(*base)); #else *base = s5p_get_media_memory_bank(S5P_MDEV_FIMG2D, 0); #endif return 0; }
/** * allocates a hardware buffer * @param numBytes bytes to allocate * @param cacheable cacheable or non-cacheable */ virtual void* allocAccelBuffer(unsigned int numBytes, uint32_t cacheable) { void* virt = cma_alloc(numBytes, cacheable); // Changed to try to increase performances if (!virt) return 0; void* phys = reinterpret_cast<void*>(cma_get_phy_addr(virt)); m_physmap.insert(std::make_pair(phys, virt)); // printf("<%s> %p\n", __func__, phys); return phys; }
/** * dma_alloc_from_contiguous() - allocate pages from contiguous area * @dev: Pointer to device for which the allocation is performed. * @count: Requested number of pages. * @align: Requested alignment of pages (in PAGE_SIZE order). * * This function allocates memory buffer for specified device. It uses * device specific contiguous memory area if available or the default * global one. Requires architecture specific dev_get_cma_area() helper * function. */ struct page *dma_alloc_from_contiguous(struct device *dev, int count, unsigned int align) { if (align > CONFIG_CMA_ALIGNMENT) align = CONFIG_CMA_ALIGNMENT; return cma_alloc(dev_get_cma_area(dev), count, align); }
struct page *kvm_alloc_hpt(unsigned long nr_pages) { unsigned long align_pages = HPT_ALIGN_PAGES; VM_BUG_ON(get_order(nr_pages) < KVM_CMA_CHUNK_ORDER - PAGE_SHIFT); /* Old CPUs require HPT aligned on a multiple of its size */ if (!cpu_has_feature(CPU_FTR_ARCH_206)) align_pages = nr_pages; return cma_alloc(kvm_cma, nr_pages, get_order(align_pages)); }
int s3cfb_map_default_video_memory(struct s3cfb_global *fbdev, struct fb_info *fb, int fimd_id) { struct fb_fix_screeninfo *fix = &fb->fix; struct s3cfb_window *win = fb->par; #ifdef CONFIG_CMA struct cma_info mem_info; int err; #endif if (win->owner == DMA_MEM_OTHER) return 0; #ifdef CONFIG_CMA err = cma_info(&mem_info, fbdev->dev, CMA_REGION_FIMD); if (err) return err; fix->smem_start = (dma_addr_t)cma_alloc (fbdev->dev, CMA_REGION_FIMD, (size_t)fix->smem_len, 0); if (IS_ERR_VALUE(fix->smem_start)) { return -EBUSY; } fb->screen_base = cma_get_virt(fix->smem_start, fix->smem_len, 1); #elif defined(CONFIG_S5P_MEM_BOOTMEM) fix->smem_start = s5p_get_media_memory_bank(S5P_MDEV_FIMD, 1); fix->smem_len = s5p_get_media_memsize_bank(S5P_MDEV_FIMD, 1); fb->screen_base = ioremap_wc(fix->smem_start, fix->smem_len); #else fb->screen_base = dma_alloc_writecombine(fbdev->dev, PAGE_ALIGN(fix->smem_len), (unsigned int *) &fix->smem_start, GFP_KERNEL); #endif if (!fb->screen_base) return -ENOMEM; else dev_info(fbdev->dev, "[fb%d] dma: 0x%08x, cpu: 0x%08x, " "size: 0x%08x\n", win->id, (unsigned int)fix->smem_start, (unsigned int)fb->screen_base, fix->smem_len); memset(fb->screen_base, 0, fix->smem_len); win->owner = DMA_MEM_FIMD; return 0; }
int s3cfb_map_default_video_memory(struct s3cfb_global *fbdev, struct fb_info *fb, int fimd_id) { struct fb_fix_screeninfo *fix = &fb->fix; struct s3cfb_window *win = fb->par; #ifdef CONFIG_S5P_MEM_CMA struct cma_info mem_info; unsigned int reserved_size; int err; #endif #if MALI_USE_UNIFIED_MEMORY_PROVIDER unsigned int arg = 0; #endif if (win->owner == DMA_MEM_OTHER) return 0; #ifdef CONFIG_S5P_MEM_CMA err = cma_info(&mem_info, fbdev->dev, 0); if (ERR_PTR(err)) return -ENOMEM; reserved_size = mem_info.total_size; fix->smem_start = (dma_addr_t)cma_alloc (fbdev->dev, "fimd", (size_t)reserved_size, 0); fb->screen_base = cma_get_virt(fix->smem_start, reserved_size, 1); #elif defined(CONFIG_S5P_MEM_BOOTMEM) fix->smem_start = s5p_get_media_memory_bank(S5P_MDEV_FIMD, 0); fix->smem_len = s5p_get_media_memsize_bank(S5P_MDEV_FIMD, 0); fb->screen_base = phys_to_virt(fix->smem_start); #endif memset(fb->screen_base, 0, fix->smem_len); win->owner = DMA_MEM_FIMD; #if MALI_USE_UNIFIED_MEMORY_PROVIDER if (s3cfb_ump_wrapper(win, fix, arg)) { dev_info(fbdev->dev, "[fb%d] : Wrapped UMP memory : %x\n" , win->id, (unsigned int)ump_wrapped_buffer); s3cfb_unmap_video_memory(fbdev, fb); return -ENOMEM; } #endif return 0; }
struct kvm_rma_info *kvm_alloc_rma() { struct page *page; struct kvm_rma_info *ri; ri = kmalloc(sizeof(struct kvm_rma_info), GFP_KERNEL); if (!ri) return NULL; page = cma_alloc(kvm_cma, kvm_rma_pages, get_order(kvm_rma_pages)); if (!page) goto err_out; atomic_set(&ri->use_count, 1); ri->base_pfn = page_to_pfn(page); return ri; err_out: kfree(ri); return NULL; }
int s3cfb_extdsp_map_default_video_memory(struct s3cfb_extdsp_global *fbdev, struct fb_info *fb, int extdsp_id) { struct fb_fix_screeninfo *fix = &fb->fix; #ifdef CONFIG_S5P_MEM_CMA struct cma_info mem_info; int err; #endif #ifdef CONFIG_S5P_MEM_CMA err = cma_info(&mem_info, fbdev->dev, 0); if (ERR_PTR(err)) return -ENOMEM; fix->smem_start = (dma_addr_t)cma_alloc (fbdev->dev, "extdsp", (size_t)PAGE_ALIGN(fix->smem_len), 0); fb->screen_base = cma_get_virt(fix->smem_start, PAGE_ALIGN(fix->smem_len), 1); #else fb->screen_base = dma_alloc_writecombine(fbdev->dev, PAGE_ALIGN(fix->smem_len), (unsigned int *) &fix->smem_start, GFP_KERNEL); #endif if (!fb->screen_base) return -ENOMEM; else dev_info(fbdev->dev, "[fb%d] dma: 0x%08x, cpu: 0x%08x, " "size: 0x%08x\n", 0, (unsigned int)fix->smem_start, (unsigned int)fb->screen_base, fix->smem_len); memset(fb->screen_base, 0, fix->smem_len); return 0; }
struct page *kvm_alloc_hpt(unsigned long nr_pages) { VM_BUG_ON(order_base_2(nr_pages) < KVM_CMA_CHUNK_ORDER - PAGE_SHIFT); return cma_alloc(kvm_cma, nr_pages, order_base_2(HPT_ALIGN_PAGES)); }
int s3cfb_map_default_video_memory(struct s3cfb_global *fbdev, struct fb_info *fb, int fimd_id) { struct fb_fix_screeninfo *fix = &fb->fix; struct s3cfb_window *win = fb->par; #ifdef CONFIG_VCM struct cma_info mem_info; unsigned int reserved_size; int err; struct vcm_phys *phys = NULL; ump_dd_physical_block ump_memory_description; unsigned int device_virt_start = 0; int frame_size = fix->smem_len / CONFIG_FB_S3C_NR_BUFFERS; struct vcm_res *fb_dev_vcm_res[CONFIG_FB_S3C_NR_BUFFERS]; enum vcm_dev_id id; #else #ifdef CONFIG_S5P_MEM_CMA struct cma_info mem_info; unsigned int reserved_size; int err; #endif #endif #ifdef MALI_USE_UNIFIED_MEMORY_PROVIDER #ifdef CONFIG_VCM int i; unsigned int arg = 0; #ifdef CONFIG_UMP_VCM_ALLOC struct ump_vcm ump_vcm; #endif unsigned int arg = 0; #endif #endif if (win->owner == DMA_MEM_OTHER) return 0; #ifdef CONFIG_VCM phys = kmalloc(sizeof(*phys) + sizeof(*phys->parts), GFP_KERNEL); memset(phys, 0, sizeof(*phys) + sizeof(*phys->parts)); if (fimd_id == 0) id = VCM_DEV_FIMD0; else id = VCM_DEV_FIMD1; err = cma_info(&mem_info, fbdev->dev, 0); if (ERR_PTR(err)) return -ENOMEM; reserved_size = fix->smem_len; fix->smem_start = (dma_addr_t)cma_alloc (fbdev->dev, "fimd", (size_t)reserved_size, 0); fb->screen_base = cma_get_virt(fix->smem_start, reserved_size, 1); fbdev->s5p_vcm = vcm_create_unified((SZ_64M), id, &s3cfb_vcm_driver); if (IS_ERR(fbdev->s5p_vcm)) return PTR_ERR(fbdev->s5p_vcm); if (vcm_activate(fbdev->s5p_vcm)) dev_info(fbdev->dev, "[fb%d] : VCM activated", win->id); phys->count = 1; phys->size = fix->smem_len; phys->free = NULL; phys->parts[0].size = fix->smem_len; phys->parts[0].start = fix->smem_start; win->s5p_vcm_res = vcm_map(fbdev->s5p_vcm, phys, 0); device_virt_start = win->s5p_vcm_res->start; for (i = 0; i < CONFIG_FB_S3C_NR_BUFFERS; i++) { fb_dev_vcm_res[i] = kzalloc(sizeof(struct vcm_res), GFP_KERNEL); win->s3cfb_vcm[i].dev_vcm_res = fb_dev_vcm_res[i]; win->s3cfb_vcm[i].dev_vcm_res->start = device_virt_start + frame_size * i; win->s3cfb_vcm[i].dev_vcm_res->bound_size = frame_size; win->s3cfb_vcm[i].dev_vcm_res->res_size = frame_size; win->s3cfb_vcm[i].dev_vcm = fbdev->s5p_vcm; win->s3cfb_vcm[i].dev_vcm_res->vcm = fbdev->s5p_vcm; if (IS_ERR(win->s3cfb_vcm[i].dev_vcm_res)) return -ENOMEM; } #else #ifdef CONFIG_S5P_MEM_CMA err = cma_info(&mem_info, fbdev->dev, 0); if (ERR_PTR(err)) return -ENOMEM; reserved_size = mem_info.total_size; fix->smem_start = (dma_addr_t)cma_alloc (fbdev->dev, "fimd", (size_t)reserved_size, 0); fb->screen_base = cma_get_virt(fix->smem_start, reserved_size, 1); #elif defined(CONFIG_S5P_MEM_BOOTMEM) fix->smem_start = s5p_get_media_memory_bank(S5P_MDEV_FIMD, 1); fix->smem_len = s5p_get_media_memsize_bank(S5P_MDEV_FIMD, 1); fb->screen_base = ioremap_wc(fix->smem_start, fix->smem_len); #endif #endif memset(fb->screen_base, 0, fix->smem_len); win->owner = DMA_MEM_FIMD; #if MALI_USE_UNIFIED_MEMORY_PROVIDER #ifdef CONFIG_VCM #ifdef CONFIG_UMP_VCM_ALLOC for (i = 0; i < CONFIG_FB_S3C_NR_BUFFERS; i++) { ump_vcm.vcm = win->s3cfb_vcm[i].dev_vcm; ump_vcm.vcm_res = win->s3cfb_vcm[i].dev_vcm_res; ump_vcm.dev_id = id; arg = (unsigned int)&ump_vcm; ump_memory_description.addr = fix->smem_start + ((fix->smem_len / CONFIG_FB_S3C_NR_BUFFERS) * i); ump_memory_description.size = fix->smem_len / CONFIG_FB_S3C_NR_BUFFERS; win->ump_wrapped_buffer[i] = ump_dd_handle_create_from_phys_blocks (&ump_memory_description, 1); if (ump_dd_vcm_attribute_set(win->ump_wrapped_buffer[i], arg)) return -ENOMEM; } #else if (s3cfb_ump_wrapper(fix, arg, 0, win)) { dev_info(fbdev->dev, "[fb%d] : Wrapped UMP memory : %x\n" , win->id, (unsigned int)ump_wrapped_buffer); s3cfb_unmap_video_memory(fbdev, fb); return -ENOMEM; } #endif #endif #endif return 0; }
int s3cfb_map_video_memory(struct s3cfb_global *fbdev, struct fb_info *fb) { struct fb_fix_screeninfo *fix = &fb->fix; struct s3cfb_window *win = fb->par; #ifdef CONFIG_VCM struct fb_var_screeninfo *var = &fb->var; struct cma_info mem_info; unsigned int reserved_size; int err; struct vcm_phys *phys = NULL; unsigned int device_virt_start = 0; int frame_num = var->yres_virtual / var->yres; int frame_size = fix->smem_len / frame_num; struct vcm_res *fb_dev_vcm_res[frame_num]; enum vcm_dev_id id; struct ump_vcm ump_vcm; unsigned int arg = 0; int i; ump_dd_physical_block ump_memory_description; if (win->owner == DMA_MEM_OTHER) return 0; phys = kmalloc(sizeof(*phys) + sizeof(*phys->parts), GFP_KERNEL); memset(phys, 0, sizeof(*phys) + sizeof(*phys->parts)); if (win->id < 5) id = VCM_DEV_FIMD0; else id = VCM_DEV_FIMD1; err = cma_info(&mem_info, fbdev->dev, 0); if (ERR_PTR(err)) return -ENOMEM; reserved_size = fix->smem_len; fix->smem_start = (dma_addr_t)cma_alloc (fbdev->dev, "fimd", (size_t)reserved_size, 0); fb->screen_base = cma_get_virt(fix->smem_start, reserved_size, 1); phys->count = 1; phys->size = fix->smem_len; phys->free = NULL; phys->parts[0].size = fix->smem_len; phys->parts[0].start = fix->smem_start; win->s5p_vcm_res = vcm_map(fbdev->s5p_vcm, phys, 0); device_virt_start = win->s5p_vcm_res->start; for (i = 0; i < frame_num; i++) { fb_dev_vcm_res[i] = kzalloc(sizeof(struct vcm_res), GFP_KERNEL); win->s3cfb_vcm[i].dev_vcm_res = fb_dev_vcm_res[i]; win->s3cfb_vcm[i].dev_vcm_res->start = device_virt_start + frame_size * i; win->s3cfb_vcm[i].dev_vcm_res->bound_size = frame_size; win->s3cfb_vcm[i].dev_vcm_res->res_size = frame_size; win->s3cfb_vcm[i].dev_vcm = fbdev->s5p_vcm; win->s3cfb_vcm[i].dev_vcm_res->vcm = fbdev->s5p_vcm; if (IS_ERR(win->s3cfb_vcm[i].dev_vcm_res)) return -ENOMEM; } memset(fb->screen_base, 0, (fix->smem_len / frame_num)); win->owner = DMA_MEM_FIMD; #else if (win->owner == DMA_MEM_OTHER) return 0; fb->screen_base = dma_alloc_writecombine(fbdev->dev, PAGE_ALIGN(fix->smem_len), (unsigned int *) &fix->smem_start, GFP_KERNEL); if (!fb->screen_base) return -ENOMEM; else dev_info(fbdev->dev, "[fb%d] dma: 0x%08x, cpu: 0x%08x, " "size: 0x%08x\n", win->id, (unsigned int)fix->smem_start, (unsigned int)fb->screen_base, fix->smem_len); memset(fb->screen_base, 0, fix->smem_len); win->owner = DMA_MEM_FIMD; #endif #if MALI_USE_UNIFIED_MEMORY_PROVIDER #ifdef CONFIG_VCM #ifdef CONFIG_UMP_VCM_ALLOC for (i = 0; i < frame_num; i++) { ump_vcm.vcm = win->s3cfb_vcm[i].dev_vcm; ump_vcm.vcm_res = win->s3cfb_vcm[i].dev_vcm_res; ump_vcm.dev_id = id; arg = (unsigned int)&ump_vcm; ump_memory_description.addr = fix->smem_start + ((fix->smem_len / frame_num) * i); ump_memory_description.size = fix->smem_len / frame_num; win->ump_wrapped_buffer[i] = ump_dd_handle_create_from_phys_blocks (&ump_memory_description, 1); if (ump_dd_vcm_attribute_set(win->ump_wrapped_buffer[i], arg)) return -ENOMEM; } #else if (s3cfb_ump_wrapper(fix, arg, 0, win)) { dev_info(fbdev->dev, "[fb%d] : Wrapped UMP memory : %x\n" , win->id, (unsigned int)ump_wrapped_buffer); s3cfb_unmap_video_memory(fbdev, fb); return -ENOMEM; } #endif #endif #endif return 0; }
/* it will be return error */ available_size = cma_infos[0].free_size; else available_size -= (bound_size - MAX_MEM_OFFSET); } mfc_dbg("avail: 0x%08x\n", available_size); size = cma_infos[0].free_size; if (size > available_size) { mfc_info("'mfc-secure' region is too large (%d:%d)", size >> 10, MAX_MEM_OFFSET >> 10); return -ENOMEM; } base[0] = cma_alloc(dev->device, "A", size, ALIGN_128KB); if (IS_ERR_VALUE(base[0])) { mfc_err("failed to get rsv. memory from CMA on mfc-secure"); return -ENOMEM; } dev->mem_infos[0].base = base[0]; dev->mem_infos[0].size = size; dev->mem_infos[0].addr = cma_get_virt(base[0], size, 0); available_size -= dev->mem_infos[0].size; mfc_dbg("avail: 0x%08x\n", available_size); size = MFC_MEMSIZE_DRM; if (size > available_size) { mfc_info("failed to allocate DRM shared area (%d:%d)\n",