int g2d_deallocate_mva(unsigned int va, unsigned int mva, unsigned int size) { G2D_DBG("try to deallocate mva with 0x%x (%d)\n", va, size); m4u_invalid_tlb_range(M4U_CLNTMOD_G2D, mva, mva + size - 1); m4u_dealloc_mva(M4U_CLNTMOD_G2D, va, size, mva); return 0; }
static void ion_mm_heap_free(struct ion_buffer *buffer) { ion_mm_buffer_info* pBufferInfo = (ion_mm_buffer_info*) buffer->priv_virt; ION_FUNC_ENTER; mutex_lock(&ion_mm_buffer_info_mutex); if (pBufferInfo) { if ((pBufferInfo->eModuleID != -1) && (pBufferInfo->MVA)) m4u_dealloc_mva(pBufferInfo->eModuleID, (unsigned int)pBufferInfo->pVA, buffer->size, pBufferInfo->MVA); if (pBufferInfo->pVA) vfree(pBufferInfo->pVA); kfree(pBufferInfo); if (buffer->sg_table) sg_free_table(buffer->sg_table); kfree(buffer->sg_table); } mutex_unlock(&ion_mm_buffer_info_mutex); ION_FUNC_LEAVE; }
int g2d_allocate_mva(unsigned int va, unsigned int *mva, unsigned int size) { int err = 0; G2D_DBG("try to allocate mva with 0x%x (%d)\n", va, size); err = m4u_alloc_mva(M4U_CLNTMOD_G2D, va, size, mva); if (err != 0) { G2D_ERR("failed to allocate mva\n"); return -1; } err = m4u_insert_tlb_range(M4U_CLNTMOD_G2D, *mva, *mva + size - 1, RT_RANGE_HIGH_PRIORITY, 1); if (err != 0) { G2D_ERR("failed to insert m4u tlb\n"); m4u_dealloc_mva(M4U_CLNTMOD_G2D, va, size, *mva); return -1; } return 0; }
int disphal_unmap_overlay_out_buffer(unsigned int va, unsigned int size, unsigned int dma_pa) { m4u_dealloc_mva(DISP_WDMA, va, size, dma_pa); return 0; }
DPI_STATUS DPI_Capture_Framebuffer(unsigned int pvbuf, unsigned int bpp) { unsigned int mva; unsigned int ret = 0; M4U_PORT_STRUCT portStruct; struct disp_path_config_mem_out_struct mem_out = {0}; printk("enter DPI_Capture_FB!\n"); if(bpp == 32) mem_out.outFormat = eARGB8888; else if(bpp == 16) mem_out.outFormat = eRGB565; else if(bpp == 24) mem_out.outFormat = eRGB888; else printk("DPI_Capture_FB, fb color format not support\n"); printk("before alloc MVA: va = 0x%x, size = %d\n", pvbuf, lcm_params->height*lcm_params->width*bpp/8); ret = m4u_alloc_mva(DISP_WDMA, pvbuf, lcm_params->height*lcm_params->width*bpp/8, 0, 0, &mva); if(ret!=0) { printk("m4u_alloc_mva() fail! \n"); return DPI_STATUS_OK; } printk("addr=0x%x, format=%d \n", mva, mem_out.outFormat); m4u_dma_cache_maint(DISP_WDMA, (void *)pvbuf, lcm_params->height*lcm_params->width*bpp/8, DMA_BIDIRECTIONAL); portStruct.ePortID = DISP_WDMA; //hardware port ID, defined in M4U_PORT_ID_ENUM portStruct.Virtuality = 1; portStruct.Security = 0; portStruct.domain = 0; //domain : 0 1 2 3 portStruct.Distance = 1; portStruct.Direction = 0; m4u_config_port(&portStruct); mem_out.enable = 1; mem_out.dstAddr = mva; mem_out.srcROI.x = 0; mem_out.srcROI.y = 0; mem_out.srcROI.height= lcm_params->height; mem_out.srcROI.width= lcm_params->width; disp_path_get_mutex(); disp_path_config_mem_out(&mem_out); printk("Wait DPI idle \n"); disp_path_release_mutex(); msleep(20); disp_path_get_mutex(); mem_out.enable = 0; disp_path_config_mem_out(&mem_out); disp_path_release_mutex(); portStruct.ePortID = DISP_WDMA; //hardware port ID, defined in M4U_PORT_ID_ENUM portStruct.Virtuality = 0; portStruct.Security = 0; portStruct.domain = 0; //domain : 0 1 2 3 portStruct.Distance = 1; portStruct.Direction = 0; m4u_config_port(&portStruct); m4u_dealloc_mva(DISP_WDMA, pvbuf, lcm_params->height*lcm_params->width*bpp/8, mva); return DPI_STATUS_OK; }