Skip to content

Commit a5efb4c

Browse files
committed
drm/panfrost: Restructure the GEM object creation
Setting the GPU VA when creating the GEM object doesn't allow for any conditional adjustments to the mapping. In preparation to support adjusting the mapping and per FD address spaces, restructure the GEM object creation to map and unmap the GEM object in the GEM object .open() and .close() hooks. While panfrost_gem_free_object() and panfrost_gem_prime_import_sg_table() are not really needed after this commit, keep them as we'll need them in subsequent commits. Cc: Tomeu Vizoso <[email protected]> Cc: Boris Brezillon <[email protected]> Cc: Robin Murphy <[email protected]> Reviewed-by: Steven Price <[email protected]> Acked-by: Alyssa Rosenzweig <[email protected]> Signed-off-by: Rob Herring <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
1 parent 3bf5189 commit a5efb4c

File tree

2 files changed

+39
-38
lines changed

2 files changed

+39
-38
lines changed

Diff for: drivers/gpu/drm/panfrost/panfrost_drv.c

-9
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ static int panfrost_ioctl_get_param(struct drm_device *ddev, void *data, struct
7878
static int panfrost_ioctl_create_bo(struct drm_device *dev, void *data,
7979
struct drm_file *file)
8080
{
81-
int ret;
8281
struct drm_gem_shmem_object *shmem;
8382
struct drm_panfrost_create_bo *args = data;
8483

@@ -90,17 +89,9 @@ static int panfrost_ioctl_create_bo(struct drm_device *dev, void *data,
9089
if (IS_ERR(shmem))
9190
return PTR_ERR(shmem);
9291

93-
ret = panfrost_mmu_map(to_panfrost_bo(&shmem->base));
94-
if (ret)
95-
goto err_free;
96-
9792
args->offset = to_panfrost_bo(&shmem->base)->node.start << PAGE_SHIFT;
9893

9994
return 0;
100-
101-
err_free:
102-
drm_gem_handle_delete(file, args->handle);
103-
return ret;
10495
}
10596

10697
/**

Diff for: drivers/gpu/drm/panfrost/panfrost_gem.c

+39-29
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,6 @@ static void panfrost_gem_free_object(struct drm_gem_object *obj)
1919
struct panfrost_gem_object *bo = to_panfrost_bo(obj);
2020
struct panfrost_device *pfdev = obj->dev->dev_private;
2121

22-
if (bo->is_mapped)
23-
panfrost_mmu_unmap(bo);
24-
25-
spin_lock(&pfdev->mm_lock);
26-
drm_mm_remove_node(&bo->node);
27-
spin_unlock(&pfdev->mm_lock);
28-
2922
mutex_lock(&pfdev->shrinker_lock);
3023
if (!list_empty(&bo->base.madv_list))
3124
list_del(&bo->base.madv_list);
@@ -34,8 +27,47 @@ static void panfrost_gem_free_object(struct drm_gem_object *obj)
3427
drm_gem_shmem_free_object(obj);
3528
}
3629

30+
static int panfrost_gem_open(struct drm_gem_object *obj, struct drm_file *file_priv)
31+
{
32+
int ret;
33+
size_t size = obj->size;
34+
u64 align = size >= SZ_2M ? SZ_2M >> PAGE_SHIFT : 0;
35+
struct panfrost_gem_object *bo = to_panfrost_bo(obj);
36+
struct panfrost_device *pfdev = obj->dev->dev_private;
37+
38+
spin_lock(&pfdev->mm_lock);
39+
ret = drm_mm_insert_node_generic(&pfdev->mm, &bo->node,
40+
size >> PAGE_SHIFT, align, 0, 0);
41+
if (ret)
42+
goto out;
43+
44+
ret = panfrost_mmu_map(bo);
45+
if (ret)
46+
drm_mm_remove_node(&bo->node);
47+
48+
out:
49+
spin_unlock(&pfdev->mm_lock);
50+
return ret;
51+
}
52+
53+
static void panfrost_gem_close(struct drm_gem_object *obj, struct drm_file *file_priv)
54+
{
55+
struct panfrost_gem_object *bo = to_panfrost_bo(obj);
56+
struct panfrost_device *pfdev = obj->dev->dev_private;
57+
58+
if (bo->is_mapped)
59+
panfrost_mmu_unmap(bo);
60+
61+
spin_lock(&pfdev->mm_lock);
62+
if (drm_mm_node_allocated(&bo->node))
63+
drm_mm_remove_node(&bo->node);
64+
spin_unlock(&pfdev->mm_lock);
65+
}
66+
3767
static const struct drm_gem_object_funcs panfrost_gem_funcs = {
3868
.free = panfrost_gem_free_object,
69+
.open = panfrost_gem_open,
70+
.close = panfrost_gem_close,
3971
.print_info = drm_gem_shmem_print_info,
4072
.pin = drm_gem_shmem_pin,
4173
.unpin = drm_gem_shmem_unpin,
@@ -55,32 +87,15 @@ static const struct drm_gem_object_funcs panfrost_gem_funcs = {
5587
*/
5688
struct drm_gem_object *panfrost_gem_create_object(struct drm_device *dev, size_t size)
5789
{
58-
int ret;
59-
struct panfrost_device *pfdev = dev->dev_private;
6090
struct panfrost_gem_object *obj;
61-
u64 align;
6291

6392
obj = kzalloc(sizeof(*obj), GFP_KERNEL);
6493
if (!obj)
6594
return NULL;
6695

6796
obj->base.base.funcs = &panfrost_gem_funcs;
6897

69-
size = roundup(size, PAGE_SIZE);
70-
align = size >= SZ_2M ? SZ_2M >> PAGE_SHIFT : 0;
71-
72-
spin_lock(&pfdev->mm_lock);
73-
ret = drm_mm_insert_node_generic(&pfdev->mm, &obj->node,
74-
size >> PAGE_SHIFT, align, 0, 0);
75-
spin_unlock(&pfdev->mm_lock);
76-
if (ret)
77-
goto free_obj;
78-
7998
return &obj->base.base;
80-
81-
free_obj:
82-
kfree(obj);
83-
return ERR_PTR(ret);
8499
}
85100

86101
struct drm_gem_object *
@@ -89,15 +104,10 @@ panfrost_gem_prime_import_sg_table(struct drm_device *dev,
89104
struct sg_table *sgt)
90105
{
91106
struct drm_gem_object *obj;
92-
struct panfrost_gem_object *pobj;
93107

94108
obj = drm_gem_shmem_prime_import_sg_table(dev, attach, sgt);
95109
if (IS_ERR(obj))
96110
return ERR_CAST(obj);
97111

98-
pobj = to_panfrost_bo(obj);
99-
100-
panfrost_mmu_map(pobj);
101-
102112
return obj;
103113
}

0 commit comments

Comments
 (0)