dma-pool: scale the default DMA coherent pool size with memory capacity
[linux-2.6-microblaze.git] / kernel / dma / pool.c
index dde6de7..35bb51c 100644 (file)
@@ -20,8 +20,8 @@ static unsigned long pool_size_dma32;
 static struct gen_pool *atomic_pool_kernel __ro_after_init;
 static unsigned long pool_size_kernel;
 
-#define DEFAULT_DMA_COHERENT_POOL_SIZE  SZ_256K
-static size_t atomic_pool_size = DEFAULT_DMA_COHERENT_POOL_SIZE;
+/* Size can be defined by the coherent_pool command line */
+static size_t atomic_pool_size;
 
 /* Dynamic background expansion when the atomic pool is near capacity */
 static struct work_struct atomic_pool_work;
@@ -170,6 +170,16 @@ static int __init dma_atomic_pool_init(void)
 {
        int ret = 0;
 
+       /*
+        * If coherent_pool was not used on the command line, default the pool
+        * sizes to 128KB per 1GB of memory, min 128KB, max MAX_ORDER-1.
+        */
+       if (!atomic_pool_size) {
+               atomic_pool_size = max(totalram_pages() >> PAGE_SHIFT, 1UL) *
+                                       SZ_128K;
+               atomic_pool_size = min_t(size_t, atomic_pool_size,
+                                        1 << (PAGE_SHIFT + MAX_ORDER-1));
+       }
        INIT_WORK(&atomic_pool_work, atomic_pool_work_fn);
 
        atomic_pool_kernel = __dma_atomic_pool_init(atomic_pool_size,