]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - lib/swiotlb.c
lib/swiotlb.c: use memblock apis for early memory allocations
[karo-tx-linux.git] / lib / swiotlb.c
index e4399fa65ad6b921aa88ed2a881d27118dda2dbb..615f3de4b5ce2e3248a101f1adc174a03d65b6fb 100644 (file)
@@ -172,8 +172,9 @@ int __init swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose)
        /*
         * Get the overflow emergency buffer
         */
-       v_overflow_buffer = alloc_bootmem_low_pages_nopanic(
-                                               PAGE_ALIGN(io_tlb_overflow));
+       v_overflow_buffer = memblock_virt_alloc_nopanic(
+                                               PAGE_ALIGN(io_tlb_overflow),
+                                               PAGE_SIZE);
        if (!v_overflow_buffer)
                return -ENOMEM;
 
@@ -184,11 +185,15 @@ int __init swiotlb_init_with_tbl(char *tlb, unsigned long nslabs, int verbose)
         * to find contiguous free memory regions of size up to IO_TLB_SEGSIZE
         * between io_tlb_start and io_tlb_end.
         */
-       io_tlb_list = alloc_bootmem_pages(PAGE_ALIGN(io_tlb_nslabs * sizeof(int)));
+       io_tlb_list = memblock_virt_alloc(
+                               PAGE_ALIGN(io_tlb_nslabs * sizeof(int)),
+                               PAGE_SIZE);
        for (i = 0; i < io_tlb_nslabs; i++)
                io_tlb_list[i] = IO_TLB_SEGSIZE - OFFSET(i, IO_TLB_SEGSIZE);
        io_tlb_index = 0;
-       io_tlb_orig_addr = alloc_bootmem_pages(PAGE_ALIGN(io_tlb_nslabs * sizeof(phys_addr_t)));
+       io_tlb_orig_addr = memblock_virt_alloc(
+                               PAGE_ALIGN(io_tlb_nslabs * sizeof(phys_addr_t)),
+                               PAGE_SIZE);
 
        if (verbose)
                swiotlb_print_info();
@@ -215,13 +220,13 @@ swiotlb_init(int verbose)
        bytes = io_tlb_nslabs << IO_TLB_SHIFT;
 
        /* Get IO TLB memory from the low pages */
-       vstart = alloc_bootmem_low_pages_nopanic(PAGE_ALIGN(bytes));
+       vstart = memblock_virt_alloc_nopanic(PAGE_ALIGN(bytes), PAGE_SIZE);
        if (vstart && !swiotlb_init_with_tbl(vstart, io_tlb_nslabs, verbose))
                return;
 
        if (io_tlb_start)
-               free_bootmem(io_tlb_start,
-                                PAGE_ALIGN(io_tlb_nslabs << IO_TLB_SHIFT));
+               memblock_free_early(io_tlb_start,
+                                   PAGE_ALIGN(io_tlb_nslabs << IO_TLB_SHIFT));
        pr_warn("Cannot allocate SWIOTLB buffer");
        no_iotlb_memory = true;
 }
@@ -357,14 +362,14 @@ void __init swiotlb_free(void)
                free_pages((unsigned long)phys_to_virt(io_tlb_start),
                           get_order(io_tlb_nslabs << IO_TLB_SHIFT));
        } else {
-               free_bootmem_late(io_tlb_overflow_buffer,
-                                 PAGE_ALIGN(io_tlb_overflow));
-               free_bootmem_late(__pa(io_tlb_orig_addr),
-                                 PAGE_ALIGN(io_tlb_nslabs * sizeof(phys_addr_t)));
-               free_bootmem_late(__pa(io_tlb_list),
-                                 PAGE_ALIGN(io_tlb_nslabs * sizeof(int)));
-               free_bootmem_late(io_tlb_start,
-                                 PAGE_ALIGN(io_tlb_nslabs << IO_TLB_SHIFT));
+               memblock_free_late(io_tlb_overflow_buffer,
+                                  PAGE_ALIGN(io_tlb_overflow));
+               memblock_free_late(__pa(io_tlb_orig_addr),
+                                  PAGE_ALIGN(io_tlb_nslabs * sizeof(phys_addr_t)));
+               memblock_free_late(__pa(io_tlb_list),
+                                  PAGE_ALIGN(io_tlb_nslabs * sizeof(int)));
+               memblock_free_late(io_tlb_start,
+                                  PAGE_ALIGN(io_tlb_nslabs << IO_TLB_SHIFT));
        }
        io_tlb_nslabs = 0;
 }