diff options
-rw-r--r-- | drivers/gpu/msm/kgsl_pool.c | 22 | ||||
-rw-r--r-- | drivers/gpu/msm/kgsl_sharedmem.c | 23 | ||||
-rw-r--r-- | drivers/gpu/msm/kgsl_sharedmem.h | 26 |
3 files changed, 50 insertions, 21 deletions
diff --git a/drivers/gpu/msm/kgsl_pool.c b/drivers/gpu/msm/kgsl_pool.c index 6ecbab466c7c..bd1e432d8c7d 100644 --- a/drivers/gpu/msm/kgsl_pool.c +++ b/drivers/gpu/msm/kgsl_pool.c @@ -303,6 +303,27 @@ int kgsl_pool_alloc_page(int *page_size, struct page **pages, if ((pages == NULL) || pages_len < (*page_size >> PAGE_SHIFT)) return -EINVAL; + /* If the pool is not configured get pages from the system */ + if (!kgsl_num_pools) { + gfp_t gfp_mask = kgsl_gfp_mask(order); + + page = alloc_pages(gfp_mask, order); + if (page == NULL) { + /* Retry with lower order pages */ + if (order > 0) { + size_t size = PAGE_SIZE << --order; + *page_size = kgsl_get_page_size(size, + ilog2(size)); + *align = ilog2(*page_size); + return -EAGAIN; + + } else + return -ENOMEM; + } + _kgsl_pool_zero_page(page, order); + goto done; + } + pool = _kgsl_get_pool_from_order(order); if (pool == NULL) return -EINVAL; @@ -338,6 +359,7 @@ int kgsl_pool_alloc_page(int *page_size, struct page **pages, _kgsl_pool_zero_page(page, order); } +done: for (j = 0; j < (*page_size >> PAGE_SHIFT); j++) { p = nth_page(page, j); pages[pcount] = p; diff --git a/drivers/gpu/msm/kgsl_sharedmem.c b/drivers/gpu/msm/kgsl_sharedmem.c index 283b72c22db4..6e2a0e3f2645 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.c +++ b/drivers/gpu/msm/kgsl_sharedmem.c @@ -613,25 +613,6 @@ int kgsl_cache_range_op(struct kgsl_memdesc *memdesc, uint64_t offset, } EXPORT_SYMBOL(kgsl_cache_range_op); -#ifndef CONFIG_ALLOC_BUFFERS_IN_4K_CHUNKS -static inline int get_page_size(size_t size, unsigned int align) -{ - if (align >= ilog2(SZ_1M) && size >= SZ_1M) - return SZ_1M; - else if (align >= ilog2(SZ_64K) && size >= SZ_64K) - return SZ_64K; - else if (align >= ilog2(SZ_8K) && size >= SZ_8K) - return SZ_8K; - else - return PAGE_SIZE; -} -#else -static inline int get_page_size(size_t size, unsigned int align) -{ - return PAGE_SIZE; -} -#endif - int kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, uint64_t size) @@ -648,7 +629,7 @@ kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, align = (memdesc->flags & KGSL_MEMALIGN_MASK) >> KGSL_MEMALIGN_SHIFT; - page_size = get_page_size(size, align); + page_size = kgsl_get_page_size(size, align); /* * The alignment cannot be less than the intended page size - it can be @@ -719,7 +700,7 @@ kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, memdesc->page_count += page_count; /* Get the needed page size for the next iteration */ - page_size = get_page_size(len, align); + page_size = kgsl_get_page_size(len, align); } /* Call to the hypervisor to lock any secure buffer allocations */ diff --git a/drivers/gpu/msm/kgsl_sharedmem.h b/drivers/gpu/msm/kgsl_sharedmem.h index c1c2afa68756..7db8ce0413c2 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.h +++ b/drivers/gpu/msm/kgsl_sharedmem.h @@ -363,4 +363,30 @@ static inline void kgsl_free_sgt(struct sg_table *sgt) } } +/** + * kgsl_get_page_size() - Get supported pagesize + * @size: Size of the page + * @align: Desired alignment of the size + * + * Return supported pagesize + */ +#ifndef CONFIG_ALLOC_BUFFERS_IN_4K_CHUNKS +static inline int kgsl_get_page_size(size_t size, unsigned int align) +{ + if (align >= ilog2(SZ_1M) && size >= SZ_1M) + return SZ_1M; + else if (align >= ilog2(SZ_64K) && size >= SZ_64K) + return SZ_64K; + else if (align >= ilog2(SZ_8K) && size >= SZ_8K) + return SZ_8K; + else + return PAGE_SIZE; +} +#else +static inline int kgsl_get_page_size(size_t size, unsigned int align) +{ + return PAGE_SIZE; +} +#endif + #endif /* __KGSL_SHAREDMEM_H */ |