diff options
author | Hareesh Gundu <hareeshg@codeaurora.org> | 2016-11-21 19:18:29 +0530 |
---|---|---|
committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-12-14 09:01:22 -0800 |
commit | 6b8b2d1a05160c71fdb504ce206a05325a90abc5 (patch) | |
tree | 42d0902440cf7a98b7c256c539b8220798ea9471 /drivers/gpu/msm | |
parent | 3162449f7d245d45f007d4ea3224576ddf1bcc63 (diff) |
msm: kgsl: Get pages from the system incase mempool is not configured
Allow driver to get pages from the system incase mempool configuration
is not defined from the device tree. This will fix kgsl driver probe
failure for without gpu mempool configuration devices.
Change-Id: I3142a5d2e13ed40f643c91594fd868c37620ce54
Signed-off-by: Hareesh Gundu <hareeshg@codeaurora.org>
Diffstat (limited to 'drivers/gpu/msm')
-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 */ |