msm: kgsl: Move memory pool initialization to the KGSL core

In the code the memory pools are generic. They are stored in global memory
and none of the APIs take a device handle, yet the device tree description
has traditionally been device specific and as such the pools were set up
at device initialization time.

This is not needed as we can safely look up the memory pools node from the
compatible string at any point. Make the memory pools completely generic
and initialize them with the rest of the KGSL core. This clears the way
to move the memory definitions out of the device and into the top level
soc in the device tree, but since we are using the compatible string
that isn't strictly necessary.

Change-Id: Ic0dedbad687b9581f0e40142644ed19ee069d54d
Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
This commit is contained in:
Jordan Crouse 2019-10-24 10:23:50 -06:00
parent dc333aeae5
commit 0735007430
3 changed files with 16 additions and 14 deletions

View File

@ -4972,9 +4972,6 @@ int kgsl_device_platform_probe(struct kgsl_device *device)
if (status)
goto error_close_mmu;
/* Initialize the memory pools */
kgsl_init_page_pools(device->pdev);
device->events_wq = alloc_workqueue("kgsl-events",
WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_SYSFS, 0);
@ -5000,8 +4997,6 @@ void kgsl_device_platform_remove(struct kgsl_device *device)
kgsl_device_snapshot_close(device);
kgsl_exit_page_pools();
kobject_put(device->gpu_sysfs_kobj);
idr_destroy(&device->context_idr);
@ -5022,6 +5017,8 @@ void kgsl_device_platform_remove(struct kgsl_device *device)
void kgsl_core_exit(void)
{
kgsl_exit_page_pools();
kgsl_events_exit();
kgsl_core_debugfs_close();
@ -5111,6 +5108,9 @@ int __init kgsl_core_init(void)
kgsl_sharedmem_init_sysfs();
/* Initialize the memory pools */
kgsl_probe_page_pools();
INIT_LIST_HEAD(&kgsl_driver.process_list);
INIT_LIST_HEAD(&kgsl_driver.pagetable_list);

View File

@ -599,12 +599,12 @@ static int kgsl_of_parse_mempool(struct kgsl_page_pool *pool,
return 0;
}
static void kgsl_of_get_mempools(struct device_node *parent)
void kgsl_probe_page_pools(void)
{
struct device_node *node, *child;
int index = 0;
node = of_find_compatible_node(parent, NULL, "qcom,gpu-mempools");
node = of_find_compatible_node(NULL, NULL, "qcom,gpu-mempools");
if (!node)
return;
@ -624,12 +624,6 @@ static void kgsl_of_get_mempools(struct device_node *parent)
kgsl_num_pools = index;
of_node_put(node);
}
void kgsl_init_page_pools(struct platform_device *pdev)
{
/* Get GPU mempools data and configure pools */
kgsl_of_get_mempools(pdev->dev.of_node);
/* Initialize shrinker */
register_shrinker(&kgsl_pool_shrinker);

View File

@ -33,7 +33,15 @@ int kgsl_pool_alloc_pages(u64 size, struct page ***pages, struct device *dev);
* otherwise they are given back to system.
*/
void kgsl_pool_free_pages(struct page **pages, unsigned int page_count);
void kgsl_init_page_pools(struct platform_device *pdev);
/**
* kgsl_probe_page_pools - Initialize the memory pools pools
*/
void kgsl_probe_page_pools(void);
/**
* kgsl_exit_page_pools - Free outstanding pooled memory
*/
void kgsl_exit_page_pools(void);
#endif /* __KGSL_POOL_H */