unsigned long size,
                        unsigned long start,
                        unsigned int nr,
-                       void *data, struct gen_pool *pool);
+                       void *data, struct gen_pool *pool,
+                       unsigned long start_addr);
 
 /*
  *  General purpose special memory pool descriptor.
 
 extern unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size,
                unsigned long start, unsigned int nr, void *data,
-               struct gen_pool *pool);
+               struct gen_pool *pool, unsigned long start_addr);
 
 extern unsigned long gen_pool_fixed_alloc(unsigned long *map,
                unsigned long size, unsigned long start, unsigned int nr,
-               void *data, struct gen_pool *pool);
+               void *data, struct gen_pool *pool, unsigned long start_addr);
 
 extern unsigned long gen_pool_first_fit_align(unsigned long *map,
                unsigned long size, unsigned long start, unsigned int nr,
-               void *data, struct gen_pool *pool);
+               void *data, struct gen_pool *pool, unsigned long start_addr);
 
 
 extern unsigned long gen_pool_first_fit_order_align(unsigned long *map,
                unsigned long size, unsigned long start, unsigned int nr,
-               void *data, struct gen_pool *pool);
+               void *data, struct gen_pool *pool, unsigned long start_addr);
 
 extern unsigned long gen_pool_best_fit(unsigned long *map, unsigned long size,
                unsigned long start, unsigned int nr, void *data,
-               struct gen_pool *pool);
+               struct gen_pool *pool, unsigned long start_addr);
 
 
 extern struct gen_pool *devm_gen_pool_create(struct device *dev,
 
                end_bit = chunk_size(chunk) >> order;
 retry:
                start_bit = algo(chunk->bits, end_bit, start_bit,
-                                nbits, data, pool);
+                                nbits, data, pool, chunk->start_addr);
                if (start_bit >= end_bit)
                        continue;
                remain = bitmap_set_ll(chunk->bits, start_bit, nbits);
  */
 unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size,
                unsigned long start, unsigned int nr, void *data,
-               struct gen_pool *pool)
+               struct gen_pool *pool, unsigned long start_addr)
 {
        return bitmap_find_next_zero_area(map, size, start, nr, 0);
 }
  */
 unsigned long gen_pool_first_fit_align(unsigned long *map, unsigned long size,
                unsigned long start, unsigned int nr, void *data,
-               struct gen_pool *pool)
+               struct gen_pool *pool, unsigned long start_addr)
 {
        struct genpool_data_align *alignment;
-       unsigned long align_mask;
+       unsigned long align_mask, align_off;
        int order;
 
        alignment = data;
        order = pool->min_alloc_order;
        align_mask = ((alignment->align + (1UL << order) - 1) >> order) - 1;
-       return bitmap_find_next_zero_area(map, size, start, nr, align_mask);
+       align_off = (start_addr & (alignment->align - 1)) >> order;
+
+       return bitmap_find_next_zero_area_off(map, size, start, nr,
+                                             align_mask, align_off);
 }
 EXPORT_SYMBOL(gen_pool_first_fit_align);
 
  */
 unsigned long gen_pool_fixed_alloc(unsigned long *map, unsigned long size,
                unsigned long start, unsigned int nr, void *data,
-               struct gen_pool *pool)
+               struct gen_pool *pool, unsigned long start_addr)
 {
        struct genpool_data_fixed *fixed_data;
        int order;
  */
 unsigned long gen_pool_first_fit_order_align(unsigned long *map,
                unsigned long size, unsigned long start,
-               unsigned int nr, void *data, struct gen_pool *pool)
+               unsigned int nr, void *data, struct gen_pool *pool,
+               unsigned long start_addr)
 {
        unsigned long align_mask = roundup_pow_of_two(nr) - 1;
 
  */
 unsigned long gen_pool_best_fit(unsigned long *map, unsigned long size,
                unsigned long start, unsigned int nr, void *data,
-               struct gen_pool *pool)
+               struct gen_pool *pool, unsigned long start_addr)
 {
        unsigned long start_bit = size;
        unsigned long len = size + 1;