static u32 __init allocate_aperture(void) { #ifdef CONFIG_DISCONTIGMEM pg_data_t *nd0 = NODE_DATA(0); #else pg_data_t *nd0 = &contig_page_data; #endif u32 aper_size; void *p; if (fallback_aper_order > 7) fallback_aper_order = 7; aper_size = (32 * 1024 * 1024) << fallback_aper_order; /* * Aperture has to be naturally aligned. This means an 2GB aperture won't * have much chances to find a place in the lower 4GB of memory. Unfortunately * we cannot move it up because that would make the IOMMU useless. */ p = __alloc_bootmem_node(nd0, aper_size, aper_size, 0); if (!p || __pa(p)+aper_size > 0xffffffff) { printk("Cannot allocate aperture memory hole (%p,%uK)\n", p, aper_size>>10); if (p) free_bootmem_generic((unsigned long)p, aper_size); return 0; }
static void * __init_refok __earlyonly_bootmem_alloc(int node, unsigned long size, unsigned long align, unsigned long goal) { return __alloc_bootmem_node(NODE_DATA(node), size, align, goal); }
struct pci_iommu_arena * __init iommu_arena_new_node(int nid, struct pci_controller *hose, dma_addr_t base, unsigned long window_size, unsigned long align) { unsigned long mem_size; struct pci_iommu_arena *arena; mem_size = window_size / (PAGE_SIZE / sizeof(unsigned long)); /* Note that the TLB lookup logic uses bitwise concatenation, not addition, so the required arena alignment is based on the size of the window. Retain the align parameter so that particular systems can over-align the arena. */ if (align < mem_size) align = mem_size; #ifdef CONFIG_DISCONTIGMEM arena = alloc_bootmem_node(NODE_DATA(nid), sizeof(*arena)); if (!NODE_DATA(nid) || !arena) { printk("%s: couldn't allocate arena from node %d\n" " falling back to system-wide allocation\n", __func__, nid); arena = alloc_bootmem(sizeof(*arena)); } arena->ptes = __alloc_bootmem_node(NODE_DATA(nid), mem_size, align, 0); if (!NODE_DATA(nid) || !arena->ptes) { printk("%s: couldn't allocate arena ptes from node %d\n" " falling back to system-wide allocation\n", __func__, nid); arena->ptes = __alloc_bootmem(mem_size, align, 0); } #else /* CONFIG_DISCONTIGMEM */ arena = alloc_bootmem(sizeof(*arena)); arena->ptes = __alloc_bootmem(mem_size, align, 0); #endif /* CONFIG_DISCONTIGMEM */ spin_lock_init(&arena->lock); arena->hose = hose; arena->dma_base = base; arena->size = window_size; arena->next_entry = 0; /* Align allocations to a multiple of a page size. Not needed unless there are chip bugs. */ arena->align_entry = 1; return arena; }
static void * __init pcpu_fc_alloc(unsigned int cpu, size_t size, size_t align) { return __alloc_bootmem_node(NODE_DATA(cpu_to_node(cpu)), size, align, __pa(MAX_DMA_ADDRESS)); }
void * __init __alloc_bootmem_node_high(pg_data_t *pgdat, unsigned long size, unsigned long align, unsigned long goal) { return __alloc_bootmem_node(pgdat, size, align, goal); }