Beispiel #1
0
static void *
__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp,
            pgprot_t prot)
{
    struct page *page;
    void *addr;

    *handle = ~0;
    size = PAGE_ALIGN(size);

    page = __dma_alloc_buffer(dev, size, gfp);
    if (!page)
        return NULL;

    if (!arch_is_coherent())
        addr = __dma_alloc_remap(page, size, gfp, prot);
    else
        addr = page_address(page);

    if (addr)
        *handle = page_to_dma(dev, page);

    return addr;
}
Beispiel #2
0
static void *
__dma_alloc(struct device *dev, size_t size, dma_addr_t *handle, gfp_t gfp,
            pgprot_t prot)
{
    struct page *page;
    void *addr;

    /*
     * FIXME:DMA memory, split_page, BUG_ON(PageCompound()) google it pls :P c58721
     */
    /* Google result:
     * Following is a work-around (a.k.a. hack) to prevent pages
     * with __GFP_COMP being passed to split_page() which cannot
     * handle them.  The real problem is that this flag probably
     * should be 0 on ARM as it is not supported on this
     * platform--see CONFIG_HUGETLB_PAGE. */
    gfp &=  ~(__GFP_COMP);
    *handle = ~0;
    size = PAGE_ALIGN(size);

    page = __dma_alloc_buffer(dev, size, gfp);
    if (!page)
        return NULL;

    if (!arch_is_coherent())
        addr = __dma_alloc_remap(page, size, gfp, prot);
    else
        addr = page_address(page);

    if (addr)
        *handle = pfn_to_dma(dev, page_to_pfn(page));
    else
        __dma_free_buffer(page, size);

    return addr;
}