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;
}
Beispiel #5
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;
}