/* * Initialise the coherent pool for atomic allocations. */ static int __init coherent_init(void) { pgprot_t prot = pgprot_dmacoherent(pgprot_kernel); size_t size = coherent_pool_size; struct page *page; void *ptr; if (cma_available) ptr = __alloc_from_contiguous(NULL, size, prot, &page); else ptr = __alloc_remap_buffer(NULL, size, GFP_KERNEL | GFP_DMA, prot, &page, NULL); if (ptr) { coherent_head.vm_start = (unsigned long) ptr; coherent_head.vm_end = (unsigned long) ptr + size; coherent_head.vm_pages = page; printk(KERN_INFO "DMA: preallocated %u KiB pool for atomic coherent allocations\n", (unsigned)size / 1024); return 0; } printk(KERN_ERR "DMA: failed to allocate %u KiB pool for atomic coherent allocation\n", (unsigned)size / 1024); return -ENOMEM; }
/* * Initialise the coherent pool for atomic allocations. */ static int __init coherent_init(void) { pgprot_t prot = pgprot_dmacoherent(pgprot_kernel); size_t size = coherent_pool_size; struct page *page; void *ptr; if (!IS_ENABLED(CONFIG_CMA)) return 0; ptr = __alloc_from_contiguous(NULL, size, prot, &page, false); if (ptr) { coherent_head.vm_start = (unsigned long) ptr; coherent_head.vm_end = (unsigned long) ptr + size; printk(KERN_INFO "DMA: preallocated %u KiB pool for atomic coherent allocations\n", (unsigned)size / 1024); return 0; } printk(KERN_ERR "DMA: failed to allocate %u KiB pool for atomic coherent allocation\n", (unsigned)size / 1024); return -ENOMEM; }