...
...
7
To visualise it, cat sudo cat /sys/kernel/debug/dri/*.gpu/gems.
7
To visualise it, cat sudo cat /sys/kernel/debug/dri/*.gpu/gems.
8
To test this functionality from UM, please refer to this Mesa patch series:
8
To test this functionality from UM, please refer to this Mesa patch series:
9
https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34224
9
https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34224
10
10
11
Discussion of previous revision of this patch series can be found at:
11
Discussion of previous revision of this patch series can be found at:
12
https://lore.kernel.org/dri-devel/20250327140845.105962-1-adrian.larumbe@collabora.com/
12
https://lore.kernel.org/dri-devel/20250402115432.1469703-1-adrian.larumbe@collabora.com/
13
13
14
Changelog:
14
Changelog:
15
v5:
16
- Kept case and naming of kernel BO's consistent
17
- Increased the driver minor after new ioctl
18
- Now adds BO to debugfs GEMs list at GEM object creation time
19
- No longer try to hide BO creator's name when it's a workqueue or modprobe
20
- Reworked the procedure for printing GEM state and kernel BO flags
21
- Turned kernel BO flags and GEM state flags into bit enums
22
- Wait until BO state is marked as initialied for debugfs display
15
23
16
v4:
24
v4:
17
- Labelled all kernel BO's, not just heap chunks.
25
- Labelled all kernel BO's, not just heap chunks.
18
- Refactored DebugGFs GEMs list handling functions
26
- Refactored DebugGFs GEMs list handling functions
19
- Added debugfs GEMS node mask to tell different kinds of BO's
27
- Added debugfs GEMS node mask to tell different kinds of BO's
...
...
24
drm/panthor: Label all kernel BO's
32
drm/panthor: Label all kernel BO's
25
drm/panthor: show device-wide list of DRM GEM objects over DebugFS
33
drm/panthor: show device-wide list of DRM GEM objects over DebugFS
26
34
27
drivers/gpu/drm/panthor/panthor_device.c | 5 +
35
drivers/gpu/drm/panthor/panthor_device.c | 5 +
28
drivers/gpu/drm/panthor/panthor_device.h | 11 ++
36
drivers/gpu/drm/panthor/panthor_device.h | 11 ++
29
drivers/gpu/drm/panthor/panthor_drv.c | 66 ++++++++
37
drivers/gpu/drm/panthor/panthor_drv.c | 68 +++++++-
30
drivers/gpu/drm/panthor/panthor_fw.c | 8 +-
38
drivers/gpu/drm/panthor/panthor_fw.c | 8 +-
31
drivers/gpu/drm/panthor/panthor_gem.c | 190 ++++++++++++++++++++++-
39
drivers/gpu/drm/panthor/panthor_gem.c | 210 ++++++++++++++++++++++-
32
drivers/gpu/drm/panthor/panthor_gem.h | 56 ++++++-
40
drivers/gpu/drm/panthor/panthor_gem.h | 86 +++++++++-
33
drivers/gpu/drm/panthor/panthor_heap.c | 6 +-
41
drivers/gpu/drm/panthor/panthor_heap.c | 6 +-
34
drivers/gpu/drm/panthor/panthor_sched.c | 9 +-
42
drivers/gpu/drm/panthor/panthor_sched.c | 9 +-
35
include/uapi/drm/panthor_drm.h | 19 +++
43
include/uapi/drm/panthor_drm.h | 19 ++
36
9 files changed, 360 insertions(+), 10 deletions(-)
44
9 files changed, 411 insertions(+), 11 deletions(-)
37
45
38
--
46
--
39
2.48.1
47
2.48.1
diff view generated by jsdifflib
1
Add a new character string Panthor BO field, and a function that allows
1
Add a new character string Panthor BO field, and a function that allows
2
setting it from within the driver.
2
setting it from within the driver.
3
3
4
Driver takes care of freeing the string when it's replaced or no longer
4
Driver takes care of freeing the string when it's replaced or no longer
5
needed at object destruction time, but allocating it is the responsibility
5
needed at object destruction time, but allocating it is the responsibility
6
of callers.
6
of callers.
7
7
8
Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
8
Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
9
---
9
---
10
drivers/gpu/drm/panthor/panthor_gem.c | 38 +++++++++++++++++++++++++++
10
drivers/gpu/drm/panthor/panthor_gem.c | 38 +++++++++++++++++++++++++++
11
drivers/gpu/drm/panthor/panthor_gem.h | 17 ++++++++++++
11
drivers/gpu/drm/panthor/panthor_gem.h | 17 ++++++++++++
12
2 files changed, 55 insertions(+)
12
2 files changed, 55 insertions(+)
13
13
14
diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/panthor/panthor_gem.c
14
diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/panthor/panthor_gem.c
15
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
16
--- a/drivers/gpu/drm/panthor/panthor_gem.c
16
--- a/drivers/gpu/drm/panthor/panthor_gem.c
17
+++ b/drivers/gpu/drm/panthor/panthor_gem.c
17
+++ b/drivers/gpu/drm/panthor/panthor_gem.c
18
@@ -XXX,XX +XXX,XX @@ static void panthor_gem_free_object(struct drm_gem_object *obj)
18
@@ -XXX,XX +XXX,XX @@ static void panthor_gem_free_object(struct drm_gem_object *obj)
19
    struct panthor_gem_object *bo = to_panthor_bo(obj);
19
    struct panthor_gem_object *bo = to_panthor_bo(obj);
20
    struct drm_gem_object *vm_root_gem = bo->exclusive_vm_root_gem;
20
    struct drm_gem_object *vm_root_gem = bo->exclusive_vm_root_gem;
21
21
22
+    /*
22
+    /*
23
+     * Label might have been allocated with kstrdup_const(),
23
+     * Label might have been allocated with kstrdup_const(),
24
+     * we need to take that into account when freeing the memory
24
+     * we need to take that into account when freeing the memory
25
+     */
25
+     */
26
+    kfree_const(bo->label.str);
26
+    kfree_const(bo->label.str);
27
+
27
+
28
+    mutex_destroy(&bo->label.lock);
28
+    mutex_destroy(&bo->label.lock);
29
+
29
+
30
    drm_gem_free_mmap_offset(&bo->base.base);
30
    drm_gem_free_mmap_offset(&bo->base.base);
31
    mutex_destroy(&bo->gpuva_list_lock);
31
    mutex_destroy(&bo->gpuva_list_lock);
32
    drm_gem_shmem_free(&bo->base);
32
    drm_gem_shmem_free(&bo->base);
33
@@ -XXX,XX +XXX,XX @@ struct drm_gem_object *panthor_gem_create_object(struct drm_device *ddev, size_t
33
@@ -XXX,XX +XXX,XX @@ struct drm_gem_object *panthor_gem_create_object(struct drm_device *ddev, size_t
34
    obj->base.map_wc = !ptdev->coherent;
34
    obj->base.map_wc = !ptdev->coherent;
35
    mutex_init(&obj->gpuva_list_lock);
35
    mutex_init(&obj->gpuva_list_lock);
36
    drm_gem_gpuva_set_lock(&obj->base.base, &obj->gpuva_list_lock);
36
    drm_gem_gpuva_set_lock(&obj->base.base, &obj->gpuva_list_lock);
37
+    mutex_init(&obj->label.lock);
37
+    mutex_init(&obj->label.lock);
38
38
39
    return &obj->base.base;
39
    return &obj->base.base;
40
}
40
}
41
@@ -XXX,XX +XXX,XX @@ panthor_gem_create_with_handle(struct drm_file *file,
41
@@ -XXX,XX +XXX,XX @@ panthor_gem_create_with_handle(struct drm_file *file,
42
42
43
    return ret;
43
    return ret;
44
}
44
}
45
+
45
+
46
+void
46
+void
47
+panthor_gem_bo_set_label(struct drm_gem_object *obj, const char *label)
47
+panthor_gem_bo_set_label(struct drm_gem_object *obj, const char *label)
48
+{
48
+{
49
+    struct panthor_gem_object *bo = to_panthor_bo(obj);
49
+    struct panthor_gem_object *bo = to_panthor_bo(obj);
50
+    const char *old_label;
50
+    const char *old_label;
51
+
51
+
52
+    mutex_lock(&bo->label.lock);
52
+    mutex_lock(&bo->label.lock);
53
+    old_label = bo->label.str;
53
+    old_label = bo->label.str;
54
+    bo->label.str = label;
54
+    bo->label.str = label;
55
+    mutex_unlock(&bo->label.lock);
55
+    mutex_unlock(&bo->label.lock);
56
+
56
+
57
+    kfree(old_label);
57
+    kfree(old_label);
58
+}
58
+}
59
+
59
+
60
+void
60
+void
61
+panthor_gem_kernel_bo_set_label(struct panthor_kernel_bo *bo, const char *label)
61
+panthor_gem_kernel_bo_set_label(struct panthor_kernel_bo *bo, const char *label)
62
+{
62
+{
63
+    const char *str;
63
+    const char *str;
64
+
64
+
65
+    str = kstrdup_const(label, GFP_KERNEL);
65
+    str = kstrdup_const(label, GFP_KERNEL);
66
+    if (!str) {
66
+    if (!str) {
67
+        /* Failing to allocate memory for a label isn't a fatal condition */
67
+        /* Failing to allocate memory for a label isn't a fatal condition */
68
+        drm_warn(bo->obj->dev, "Not enough memory to allocate BO label");
68
+        drm_warn(bo->obj->dev, "Not enough memory to allocate BO label");
69
+        return;
69
+        return;
70
+    }
70
+    }
71
+
71
+
72
+    panthor_gem_bo_set_label(bo->obj, kstrdup_const(str, GFP_KERNEL));
72
+    panthor_gem_bo_set_label(bo->obj, kstrdup_const(str, GFP_KERNEL));
73
+}
73
+}
74
diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/panthor/panthor_gem.h
74
diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/panthor/panthor_gem.h
75
index XXXXXXX..XXXXXXX 100644
75
index XXXXXXX..XXXXXXX 100644
76
--- a/drivers/gpu/drm/panthor/panthor_gem.h
76
--- a/drivers/gpu/drm/panthor/panthor_gem.h
77
+++ b/drivers/gpu/drm/panthor/panthor_gem.h
77
+++ b/drivers/gpu/drm/panthor/panthor_gem.h
78
@@ -XXX,XX +XXX,XX @@ struct panthor_gem_object {
78
@@ -XXX,XX +XXX,XX @@ struct panthor_gem_object {
79
79
80
    /** @flags: Combination of drm_panthor_bo_flags flags. */
80
    /** @flags: Combination of drm_panthor_bo_flags flags. */
81
    u32 flags;
81
    u32 flags;
82
+
82
+
83
+    /**
83
+    /**
84
+     * @label: BO tagging fields. The label can be assigned within the
84
+     * @label: BO tagging fields. The label can be assigned within the
85
+     * driver itself or through a specific IOCTL.
85
+     * driver itself or through a specific IOCTL.
86
+     */
86
+     */
87
+    struct {
87
+    struct {
88
+        /**
88
+        /**
89
+         * @label.str: Pointer to NULL-terminated string,
89
+         * @label.str: Pointer to NULL-terminated string,
90
+         */
90
+         */
91
+        const char *str;
91
+        const char *str;
92
+
92
+
93
+        /** @lock.str: Protects access to the @label.str field. */
93
+        /** @lock.str: Protects access to the @label.str field. */
94
+        struct mutex lock;
94
+        struct mutex lock;
95
+    } label;
95
+    } label;
96
};
96
};
97
97
98
/**
98
/**
99
@@ -XXX,XX +XXX,XX @@ panthor_gem_create_with_handle(struct drm_file *file,
99
@@ -XXX,XX +XXX,XX @@ panthor_gem_create_with_handle(struct drm_file *file,
100
             struct panthor_vm *exclusive_vm,
100
             struct panthor_vm *exclusive_vm,
101
             u64 *size, u32 flags, uint32_t *handle);
101
             u64 *size, u32 flags, uint32_t *handle);
102
102
103
+void panthor_gem_bo_set_label(struct drm_gem_object *obj, const char *label);
103
+void panthor_gem_bo_set_label(struct drm_gem_object *obj, const char *label);
104
+void panthor_gem_kernel_bo_set_label(struct panthor_kernel_bo *bo, const char *label);
104
+void panthor_gem_kernel_bo_set_label(struct panthor_kernel_bo *bo, const char *label);
105
+
105
+
106
static inline u64
106
static inline u64
107
panthor_kernel_bo_gpuva(struct panthor_kernel_bo *bo)
107
panthor_kernel_bo_gpuva(struct panthor_kernel_bo *bo)
108
{
108
{
109
--
109
--
110
2.48.1
110
2.48.1
111
111
diff view generated by jsdifflib
1
Allow UM to label a BO for which it possesses a DRM handle.
1
Allow UM to label a BO for which it possesses a DRM handle.
2
2
3
Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
3
Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
4
Reviewed-by: Liviu Dudau <liviu.dudau@arm.com>
4
---
5
---
5
drivers/gpu/drm/panthor/panthor_drv.c | 40 +++++++++++++++++++++++++++
6
drivers/gpu/drm/panthor/panthor_drv.c | 42 ++++++++++++++++++++++++++-
6
drivers/gpu/drm/panthor/panthor_gem.h | 2 ++
7
drivers/gpu/drm/panthor/panthor_gem.h | 2 ++
7
include/uapi/drm/panthor_drm.h | 19 +++++++++++++
8
include/uapi/drm/panthor_drm.h | 19 ++++++++++++
8
3 files changed, 61 insertions(+)
9
3 files changed, 62 insertions(+), 1 deletion(-)
9
10
10
diff --git a/drivers/gpu/drm/panthor/panthor_drv.c b/drivers/gpu/drm/panthor/panthor_drv.c
11
diff --git a/drivers/gpu/drm/panthor/panthor_drv.c b/drivers/gpu/drm/panthor/panthor_drv.c
11
index XXXXXXX..XXXXXXX 100644
12
index XXXXXXX..XXXXXXX 100644
12
--- a/drivers/gpu/drm/panthor/panthor_drv.c
13
--- a/drivers/gpu/drm/panthor/panthor_drv.c
13
+++ b/drivers/gpu/drm/panthor/panthor_drv.c
14
+++ b/drivers/gpu/drm/panthor/panthor_drv.c
...
...
70
* - 1.3 - adds DRM_PANTHOR_GROUP_STATE_INNOCENT flag
71
* - 1.3 - adds DRM_PANTHOR_GROUP_STATE_INNOCENT flag
71
+ * - 1.4 - adds DRM_IOCTL_PANTHOR_BO_SET_LABEL ioctl
72
+ * - 1.4 - adds DRM_IOCTL_PANTHOR_BO_SET_LABEL ioctl
72
*/
73
*/
73
static const struct drm_driver panthor_drm_driver = {
74
static const struct drm_driver panthor_drm_driver = {
74
    .driver_features = DRIVER_RENDER | DRIVER_GEM | DRIVER_SYNCOBJ |
75
    .driver_features = DRIVER_RENDER | DRIVER_GEM | DRIVER_SYNCOBJ |
76
@@ -XXX,XX +XXX,XX @@ static const struct drm_driver panthor_drm_driver = {
77
    .name = "panthor",
78
    .desc = "Panthor DRM driver",
79
    .major = 1,
80
-    .minor = 3,
81
+    .minor = 4,
82
83
    .gem_create_object = panthor_gem_create_object,
84
    .gem_prime_import_sg_table = drm_gem_shmem_prime_import_sg_table,
75
diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/panthor/panthor_gem.h
85
diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/panthor/panthor_gem.h
76
index XXXXXXX..XXXXXXX 100644
86
index XXXXXXX..XXXXXXX 100644
77
--- a/drivers/gpu/drm/panthor/panthor_gem.h
87
--- a/drivers/gpu/drm/panthor/panthor_gem.h
78
+++ b/drivers/gpu/drm/panthor/panthor_gem.h
88
+++ b/drivers/gpu/drm/panthor/panthor_gem.h
79
@@ -XXX,XX +XXX,XX @@
89
@@ -XXX,XX +XXX,XX @@
...
...
diff view generated by jsdifflib
...
...
9
future, this would have to change.
9
future, this would have to change.
10
10
11
Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
11
Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
12
---
12
---
13
drivers/gpu/drm/panthor/panthor_fw.c | 8 +++++---
13
drivers/gpu/drm/panthor/panthor_fw.c | 8 +++++---
14
drivers/gpu/drm/panthor/panthor_gem.c | 3 ++-
14
drivers/gpu/drm/panthor/panthor_gem.c | 4 +++-
15
drivers/gpu/drm/panthor/panthor_gem.h | 2 +-
15
drivers/gpu/drm/panthor/panthor_gem.h | 2 +-
16
drivers/gpu/drm/panthor/panthor_heap.c | 6 ++++--
16
drivers/gpu/drm/panthor/panthor_heap.c | 6 ++++--
17
drivers/gpu/drm/panthor/panthor_sched.c | 9 ++++++---
17
drivers/gpu/drm/panthor/panthor_sched.c | 9 ++++++---
18
5 files changed, 18 insertions(+), 10 deletions(-)
18
5 files changed, 19 insertions(+), 10 deletions(-)
19
19
20
diff --git a/drivers/gpu/drm/panthor/panthor_fw.c b/drivers/gpu/drm/panthor/panthor_fw.c
20
diff --git a/drivers/gpu/drm/panthor/panthor_fw.c b/drivers/gpu/drm/panthor/panthor_fw.c
21
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
22
--- a/drivers/gpu/drm/panthor/panthor_fw.c
22
--- a/drivers/gpu/drm/panthor/panthor_fw.c
23
+++ b/drivers/gpu/drm/panthor/panthor_fw.c
23
+++ b/drivers/gpu/drm/panthor/panthor_fw.c
...
...
44
@@ -XXX,XX +XXX,XX @@ static int panthor_fw_load_section_entry(struct panthor_device *ptdev,
44
@@ -XXX,XX +XXX,XX @@ static int panthor_fw_load_section_entry(struct panthor_device *ptdev,
45
        section->mem = panthor_kernel_bo_create(ptdev, panthor_fw_vm(ptdev),
45
        section->mem = panthor_kernel_bo_create(ptdev, panthor_fw_vm(ptdev),
46
                            section_size,
46
                            section_size,
47
                            DRM_PANTHOR_BO_NO_MMAP,
47
                            DRM_PANTHOR_BO_NO_MMAP,
48
-                            vm_map_flags, va);
48
-                            vm_map_flags, va);
49
+                            vm_map_flags, va, "FW Section");
49
+                            vm_map_flags, va, "FW section");
50
        if (IS_ERR(section->mem))
50
        if (IS_ERR(section->mem))
51
            return PTR_ERR(section->mem);
51
            return PTR_ERR(section->mem);
52
52
53
diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/panthor/panthor_gem.c
53
diff --git a/drivers/gpu/drm/panthor/panthor_gem.c b/drivers/gpu/drm/panthor/panthor_gem.c
54
index XXXXXXX..XXXXXXX 100644
54
index XXXXXXX..XXXXXXX 100644
...
...
66
@@ -XXX,XX +XXX,XX @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm,
66
@@ -XXX,XX +XXX,XX @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm,
67
    kbo->obj = &obj->base;
67
    kbo->obj = &obj->base;
68
    bo->flags = bo_flags;
68
    bo->flags = bo_flags;
69
69
70
+    panthor_gem_kernel_bo_set_label(kbo, name);
70
+    panthor_gem_kernel_bo_set_label(kbo, name);
71
+
71
    /* The system and GPU MMU page size might differ, which becomes a
72
    /* The system and GPU MMU page size might differ, which becomes a
72
     * problem for FW sections that need to be mapped at explicit address
73
     * problem for FW sections that need to be mapped at explicit address
73
     * since our PAGE_SIZE alignment might cover a VA range that's
74
     * since our PAGE_SIZE alignment might cover a VA range that's
74
diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/panthor/panthor_gem.h
75
diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/panthor/panthor_gem.h
75
index XXXXXXX..XXXXXXX 100644
76
index XXXXXXX..XXXXXXX 100644
...
...
126
                     DRM_PANTHOR_BO_NO_MMAP,
127
                     DRM_PANTHOR_BO_NO_MMAP,
127
                     DRM_PANTHOR_VM_BIND_OP_MAP_NOEXEC |
128
                     DRM_PANTHOR_VM_BIND_OP_MAP_NOEXEC |
128
                     DRM_PANTHOR_VM_BIND_OP_MAP_UNCACHED,
129
                     DRM_PANTHOR_VM_BIND_OP_MAP_UNCACHED,
129
-                     PANTHOR_VM_KERNEL_AUTO_VA);
130
-                     PANTHOR_VM_KERNEL_AUTO_VA);
130
+                     PANTHOR_VM_KERNEL_AUTO_VA,
131
+                     PANTHOR_VM_KERNEL_AUTO_VA,
131
+                     "fdinfo slots");
132
+                     "Group job stats");
132
133
133
    if (IS_ERR(queue->profiling.slots)) {
134
    if (IS_ERR(queue->profiling.slots)) {
134
        ret = PTR_ERR(queue->profiling.slots);
135
        ret = PTR_ERR(queue->profiling.slots);
135
@@ -XXX,XX +XXX,XX @@ int panthor_group_create(struct panthor_file *pfile,
136
@@ -XXX,XX +XXX,XX @@ int panthor_group_create(struct panthor_file *pfile,
136
                         DRM_PANTHOR_BO_NO_MMAP,
137
                         DRM_PANTHOR_BO_NO_MMAP,
...
...
diff view generated by jsdifflib
...
...
8
File format is that of a table, with each entry displaying a variety of
8
File format is that of a table, with each entry displaying a variety of
9
fields with information about each GEM object.
9
fields with information about each GEM object.
10
10
11
Each GEM object entry in the file displays the following information
11
Each GEM object entry in the file displays the following information
12
fields: Client PID, BO's global name, reference count, BO virtual size,
12
fields: Client PID, BO's global name, reference count, BO virtual size,
13
BO resize size, VM address in its DRM-managed range, BO label and a flag
13
BO resize size, VM address in its DRM-managed range, BO label and a GEM
14
bitmask.
14
state flags.
15
15
16
There's also a kflags field for the type of BO. Bit 0 tells us whether
16
There's also a kflags field for the type of BO, which tells us whether
17
it's a kernel BO, and bit 1 means the BO is mapped onto the FW's address
17
it's a kernel BO and/or mapped onto the FW's address space.
18
space.
19
18
20
Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
19
Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com>
21
---
20
---
22
drivers/gpu/drm/panthor/panthor_device.c | 5 +
21
drivers/gpu/drm/panthor/panthor_device.c | 5 +
23
drivers/gpu/drm/panthor/panthor_device.h | 11 ++
22
drivers/gpu/drm/panthor/panthor_device.h | 11 ++
24
drivers/gpu/drm/panthor/panthor_drv.c | 26 ++++
23
drivers/gpu/drm/panthor/panthor_drv.c | 26 ++++
25
drivers/gpu/drm/panthor/panthor_gem.c | 149 +++++++++++++++++++++++
24
drivers/gpu/drm/panthor/panthor_gem.c | 168 +++++++++++++++++++++++
26
drivers/gpu/drm/panthor/panthor_gem.h | 35 ++++++
25
drivers/gpu/drm/panthor/panthor_gem.h | 65 +++++++++
27
5 files changed, 226 insertions(+)
26
5 files changed, 275 insertions(+)
28
27
29
diff --git a/drivers/gpu/drm/panthor/panthor_device.c b/drivers/gpu/drm/panthor/panthor_device.c
28
diff --git a/drivers/gpu/drm/panthor/panthor_device.c b/drivers/gpu/drm/panthor/panthor_device.c
30
index XXXXXXX..XXXXXXX 100644
29
index XXXXXXX..XXXXXXX 100644
31
--- a/drivers/gpu/drm/panthor/panthor_device.c
30
--- a/drivers/gpu/drm/panthor/panthor_device.c
32
+++ b/drivers/gpu/drm/panthor/panthor_device.c
31
+++ b/drivers/gpu/drm/panthor/panthor_device.c
...
...
123
+#include "panthor_fw.h"
122
+#include "panthor_fw.h"
124
#include "panthor_gem.h"
123
#include "panthor_gem.h"
125
#include "panthor_mmu.h"
124
#include "panthor_mmu.h"
126
125
127
+#ifdef CONFIG_DEBUG_FS
126
+#ifdef CONFIG_DEBUG_FS
128
+static void panthor_gem_debugfs_bo_init(struct panthor_gem_object *bo, u32 type_mask)
127
+static void panthor_gem_debugfs_bo_add(struct panthor_device *ptdev,
128
+                 struct panthor_gem_object *bo)
129
+{
129
+{
130
+    INIT_LIST_HEAD(&bo->debugfs.node);
130
+    INIT_LIST_HEAD(&bo->debugfs.node);
131
+
131
+
132
+    if (!(type_mask & PANTHOR_BO_FW_MAPPED)) {
132
+    bo->debugfs.creator.tgid = current->group_leader->pid;
133
+        bo->debugfs.creator.tgid = current->group_leader->pid;
133
+    get_task_comm(bo->debugfs.creator.process_name, current->group_leader);
134
+        get_task_comm(bo->debugfs.creator.process_name, current->group_leader);
135
+    } else {
136
+        bo->debugfs.creator.tgid = 0;
137
+        snprintf(bo->debugfs.creator.process_name,
138
+             sizeof(bo->debugfs.creator.process_name),
139
+             "kernel");
140
+    }
141
+
142
+    bo->debugfs.bo_mask = type_mask;
143
+}
144
+
145
+static void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo, u32 type_mask)
146
+{
147
+    struct panthor_device *ptdev = container_of(bo->base.base.dev,
148
+                         struct panthor_device, base);
149
+
150
+    panthor_gem_debugfs_bo_init(bo, type_mask);
151
+
134
+
152
+    mutex_lock(&ptdev->gems.lock);
135
+    mutex_lock(&ptdev->gems.lock);
153
+    list_add_tail(&bo->debugfs.node, &ptdev->gems.node);
136
+    list_add_tail(&bo->debugfs.node, &ptdev->gems.node);
154
+    mutex_unlock(&ptdev->gems.lock);
137
+    mutex_unlock(&ptdev->gems.lock);
155
+}
138
+}
...
...
166
+    list_del_init(&bo->debugfs.node);
149
+    list_del_init(&bo->debugfs.node);
167
+    mutex_unlock(&ptdev->gems.lock);
150
+    mutex_unlock(&ptdev->gems.lock);
168
+}
151
+}
169
+
152
+
170
+#else
153
+#else
171
+static void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo, u32 type_mask) {}
154
+static void panthor_gem_debugfs_bo_add(struct panthor_device *ptdev,
155
+                 struct panthor_gem_object *bo)
156
+{}
172
+static void panthor_gem_debugfs_bo_rm(struct panthor_gem_object *bo) {}
157
+static void panthor_gem_debugfs_bo_rm(struct panthor_gem_object *bo) {}
173
+#endif
158
+#endif
174
+
159
+
175
static void panthor_gem_free_object(struct drm_gem_object *obj)
160
static void panthor_gem_free_object(struct drm_gem_object *obj)
176
{
161
{
...
...
184
     * we need to take that into account when freeing the memory
169
     * we need to take that into account when freeing the memory
185
@@ -XXX,XX +XXX,XX @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm,
170
@@ -XXX,XX +XXX,XX @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm,
186
    struct drm_gem_shmem_object *obj;
171
    struct drm_gem_shmem_object *obj;
187
    struct panthor_kernel_bo *kbo;
172
    struct panthor_kernel_bo *kbo;
188
    struct panthor_gem_object *bo;
173
    struct panthor_gem_object *bo;
189
+    u32 type_mask = PANTHOR_BO_KERNEL;
174
+    u32 debug_flags = PANTHOR_DEBUGFS_BO_FLAGS_KERNEL;
190
    int ret;
175
    int ret;
191
176
192
    if (drm_WARN_ON(&ptdev->base, !vm))
177
    if (drm_WARN_ON(&ptdev->base, !vm))
193
@@ -XXX,XX +XXX,XX @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm,
178
@@ -XXX,XX +XXX,XX @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm,
194
    kbo->obj = &obj->base;
179
    kbo->obj = &obj->base;
195
    bo->flags = bo_flags;
180
    bo->flags = bo_flags;
196
181
197
+    if (vm == panthor_fw_vm(ptdev))
182
+    if (vm == panthor_fw_vm(ptdev))
198
+        type_mask |= PANTHOR_BO_FW_MAPPED;
183
+        debug_flags |= PANTHOR_DEBUGFS_BO_FW_FLAG_MAPPED;
199
+
184
+
200
    panthor_gem_kernel_bo_set_label(kbo, name);
185
    panthor_gem_kernel_bo_set_label(kbo, name);
201
+    panthor_gem_debugfs_bo_add(to_panthor_bo(kbo->obj), type_mask);
186
+    panthor_gem_debugfs_bo_set_mask(to_panthor_bo(kbo->obj), debug_flags);
202
+
187
203
    /* The system and GPU MMU page size might differ, which becomes a
188
    /* The system and GPU MMU page size might differ, which becomes a
204
     * problem for FW sections that need to be mapped at explicit address
189
     * problem for FW sections that need to be mapped at explicit address
205
     * since our PAGE_SIZE alignment might cover a VA range that's
190
@@ -XXX,XX +XXX,XX @@ struct drm_gem_object *panthor_gem_create_object(struct drm_device *ddev, size_t
191
    drm_gem_gpuva_set_lock(&obj->base.base, &obj->gpuva_list_lock);
192
    mutex_init(&obj->label.lock);
193
194
+    panthor_gem_debugfs_bo_add(ptdev, obj);
195
+
196
    return &obj->base.base;
197
}
198
206
@@ -XXX,XX +XXX,XX @@ panthor_gem_create_with_handle(struct drm_file *file,
199
@@ -XXX,XX +XXX,XX @@ panthor_gem_create_with_handle(struct drm_file *file,
207
    /* drop reference from allocate - handle holds it now. */
200
    /* drop reference from allocate - handle holds it now. */
208
    drm_gem_object_put(&shmem->base);
201
    drm_gem_object_put(&shmem->base);
209
202
210
+    panthor_gem_debugfs_bo_add(bo, 0);
203
+    panthor_gem_debugfs_bo_set_mask(bo, 0);
211
+
204
+
212
    return ret;
205
    return ret;
213
}
206
}
214
207
215
@@ -XXX,XX +XXX,XX @@ panthor_gem_kernel_bo_set_label(struct panthor_kernel_bo *bo, const char *label)
208
@@ -XXX,XX +XXX,XX @@ panthor_gem_kernel_bo_set_label(struct panthor_kernel_bo *bo, const char *label)
216
209
217
    panthor_gem_bo_set_label(bo->obj, kstrdup_const(str, GFP_KERNEL));
210
    panthor_gem_bo_set_label(bo->obj, kstrdup_const(str, GFP_KERNEL));
218
}
211
}
219
+
212
+
220
+#ifdef CONFIG_DEBUG_FS
213
+#ifdef CONFIG_DEBUG_FS
221
+static bool panfrost_gem_print_flag(const char *name,
214
+static void
222
+                 bool is_set,
215
+panthor_gem_debugfs_print_flags(struct seq_file *m,
223
+                 bool other_flags_printed,
216
+                const char *names[],
224
+                 struct seq_file *m)
217
+                u32 name_count,
225
+{
218
+                u32 flags)
226
+    if (is_set)
219
+{
227
+        seq_printf(m, "%s%s", other_flags_printed ? "," : "", name);
220
+    bool first = true;
228
+
221
+
229
+    return is_set | other_flags_printed;
222
+    seq_puts(m, "(");
223
+
224
+    if (!flags)
225
+        seq_puts(m, "none");
226
+
227
+    while (flags) {
228
+        u32 bit = fls(flags) - 1;
229
+
230
+        if (!first)
231
+            seq_puts(m, ",");
232
+
233
+        if (bit >= name_count || !names[bit])
234
+            seq_printf(m, "unknown-bit%d", bit);
235
+        else
236
+            seq_printf(m, "%s", names[bit]);
237
+
238
+        first = false;
239
+        flags &= ~BIT(bit);
240
+    }
241
+
242
+    seq_puts(m, ")");
230
+}
243
+}
231
+
244
+
232
+struct gem_size_totals {
245
+struct gem_size_totals {
233
+    size_t size;
246
+    size_t size;
234
+    size_t resident;
247
+    size_t resident;
...
...
239
+                     struct seq_file *m,
252
+                     struct seq_file *m,
240
+                     struct gem_size_totals *totals)
253
+                     struct gem_size_totals *totals)
241
+{
254
+{
242
+    unsigned int refcount = kref_read(&bo->base.base.refcount);
255
+    unsigned int refcount = kref_read(&bo->base.base.refcount);
243
+    char creator_info[32] = {};
256
+    char creator_info[32] = {};
244
+    bool has_flags = false;
257
+    u32 gem_state_flags = 0;
245
+    size_t resident_size;
258
+    size_t resident_size;
259
+
260
+    static const char *gem_status_flags[] = {
261
+        "imported", "exported", "purged", "purgeable"
262
+    };
263
+
264
+    static const char *panthor_bo_flags[] = {
265
+        "kernel", "fw"
266
+    };
246
+
267
+
247
+    /* Skip BOs being destroyed. */
268
+    /* Skip BOs being destroyed. */
248
+    if (!refcount)
269
+    if (!refcount)
249
+        return;
270
+        return;
250
+
271
+
...
...
258
+         refcount,
279
+         refcount,
259
+         bo->base.base.size,
280
+         bo->base.base.size,
260
+         resident_size,
281
+         resident_size,
261
+         drm_vma_node_start(&bo->base.base.vma_node));
282
+         drm_vma_node_start(&bo->base.base.vma_node));
262
+
283
+
263
+    seq_puts(m, "(");
284
+
264
+    has_flags = panfrost_gem_print_flag("imported", bo->base.base.import_attach != NULL,
285
+    if (bo->base.base.import_attach != NULL)
265
+                     has_flags, m);
286
+        gem_state_flags |= PANTHOR_DEBUGFS_GEM_IMPORTED;
266
+    has_flags = panfrost_gem_print_flag("exported", bo->base.base.dma_buf != NULL,
287
+    if (bo->base.base.dma_buf != NULL)
267
+                     has_flags, m);
288
+        gem_state_flags |= PANTHOR_DEBUGFS_GEM_EXPORTED;
268
+    if (bo->base.madv < 0)
289
+    if (bo->base.madv < 0)
269
+        has_flags = panfrost_gem_print_flag("purged", true, has_flags, m);
290
+        gem_state_flags |= PANTHOR_DEBUGFS_GEM_PURGED;
270
+    else if (bo->base.madv > 0)
291
+    if (bo->base.madv)
271
+        has_flags = panfrost_gem_print_flag("purgeable", true, has_flags, m);
292
+        gem_state_flags |= PANTHOR_DEBUGFS_GEM_PURGEABLE;
272
+    if (!has_flags)
293
+
273
+        seq_puts(m, "none");
294
+    panthor_gem_debugfs_print_flags(m, gem_status_flags,
274
+    seq_puts(m, ")");
295
+                    sizeof(gem_status_flags), gem_state_flags);
275
+
296
+    seq_printf(m, "%-4s", "");
276
+    seq_printf(m, "%-6s0x%-2x", "", bo->debugfs.bo_mask);
297
+    panthor_gem_debugfs_print_flags(m, panthor_bo_flags, sizeof(panthor_bo_flags),
298
+                    bo->debugfs.flags & (u32)~PANTHOR_DEBUGFS_BO_FLAG_INITIALISED);
277
+
299
+
278
+    mutex_lock(&bo->label.lock);
300
+    mutex_lock(&bo->label.lock);
279
+    seq_printf(m, "%-6s%-60s", "", bo->label.str ? : NULL);
301
+    seq_printf(m, "%-6s%-60s", "", bo->label.str ? : NULL);
280
+    mutex_unlock(&bo->label.lock);
302
+    mutex_unlock(&bo->label.lock);
281
+    seq_puts(m, "\n");
303
+    seq_puts(m, "\n");
...
...
290
+                 struct seq_file *m)
312
+                 struct seq_file *m)
291
+{
313
+{
292
+    struct gem_size_totals totals = {0};
314
+    struct gem_size_totals totals = {0};
293
+    struct panthor_gem_object *bo;
315
+    struct panthor_gem_object *bo;
294
+
316
+
295
+    seq_puts(m, "created-by global-name refcount size resident-size file-offset flags kflags label\n");
317
+    seq_puts(m, "created-by global-name refcount size resident-size file-offset state kflags label\n");
296
+    seq_puts(m, "------------------------------------------------------------------------------------------------------------------------------------------------\n");
318
+    seq_puts(m, "------------------------------------------------------------------------------------------------------------------------------------------------\n");
297
+
319
+
298
+    scoped_guard(mutex, &ptdev->gems.lock) {
320
+    scoped_guard(mutex, &ptdev->gems.lock) {
299
+        list_for_each_entry(bo, &ptdev->gems.node, debugfs.node)
321
+        list_for_each_entry(bo, &ptdev->gems.node, debugfs.node) {
300
+            panthor_gem_debugfs_bo_print(bo, m, &totals);
322
+            if (bo->debugfs.flags & PANTHOR_DEBUGFS_BO_FLAG_INITIALISED)
323
+                panthor_gem_debugfs_bo_print(bo, m, &totals);
324
+        }
325
+
301
+    }
326
+    }
302
+
327
+
303
+    seq_puts(m, "==========================================================================================================================================================\n");
328
+    seq_puts(m, "==========================================================================================================================================================\n");
304
+    seq_printf(m, "Total size: %zd, Total resident: %zd, Total reclaimable: %zd\n",
329
+    seq_printf(m, "Total size: %zd, Total resident: %zd, Total reclaimable: %zd\n",
305
+         totals.size, totals.resident, totals.reclaimable);
330
+         totals.size, totals.resident, totals.reclaimable);
...
...
311
+++ b/drivers/gpu/drm/panthor/panthor_gem.h
336
+++ b/drivers/gpu/drm/panthor/panthor_gem.h
312
@@ -XXX,XX +XXX,XX @@ struct panthor_vm;
337
@@ -XXX,XX +XXX,XX @@ struct panthor_vm;
313
338
314
#define PANTHOR_BO_LABEL_MAXLEN    PAGE_SIZE
339
#define PANTHOR_BO_LABEL_MAXLEN    PAGE_SIZE
315
340
316
+#define PANTHOR_BO_KERNEL    BIT(0)
341
+enum panthor_debugfs_gem_state_flags {
317
+#define PANTHOR_BO_FW_MAPPED    BIT(1)
342
+    /** @PANTHOR_DEBUGFS_GEM_IMPORTED: GEM BO is PRIME imported. */
343
+    PANTHOR_DEBUGFS_GEM_IMPORTED = BIT(0),
344
+
345
+    /** @PANTHOR_DEBUGFS_GEM_EXPORTED: GEM BO is PRIME exported. */
346
+    PANTHOR_DEBUGFS_GEM_EXPORTED = BIT(1),
347
+
348
+    /** @PANTHOR_DEBUGFS_GEM_PURGED: GEM BO was reclaimed by the shrinker. */
349
+    PANTHOR_DEBUGFS_GEM_PURGED = BIT(2),
350
+
351
+    /** @PANTHOR_DEBUGFS_GEM_PURGEABLE: GEM BO can be reclaimed by the shrinker. */
352
+    PANTHOR_DEBUGFS_GEM_PURGEABLE = BIT(3),
353
+};
354
+
355
+enum panthor_debugfs_bo_flags {
356
+    /** @PANTHOR_DEBUGFS_BO_KERNEL: BO is for kernel use only. */
357
+    PANTHOR_DEBUGFS_BO_FLAGS_KERNEL = BIT(0),
358
+
359
+    /** @PANTHOR_DEBUGFS_BO_FW_MAPPED: BO is mapped on the FW VM. */
360
+    PANTHOR_DEBUGFS_BO_FW_FLAG_MAPPED = BIT(1),
361
+
362
+    /** @PANTHOR_DEBUGFS_BO_INITIALISED: BO is ready for DebugFS display. */
363
+    PANTHOR_DEBUGFS_BO_FLAG_INITIALISED = BIT(31),
364
+};
318
+
365
+
319
+/**
366
+/**
320
+ * struct panthor_gem_debugfs - GEM object's DebugFS list information
367
+ * struct panthor_gem_debugfs - GEM object's DebugFS list information
321
+ */
368
+ */
322
+struct panthor_gem_debugfs {
369
+struct panthor_gem_debugfs {
...
...
333
+
380
+
334
+        /** @creator.tgid: PID of the thread's group leader within its process */
381
+        /** @creator.tgid: PID of the thread's group leader within its process */
335
+        pid_t tgid;
382
+        pid_t tgid;
336
+    } creator;
383
+    } creator;
337
+
384
+
338
+    /** @bo_mask: Bitmask encoding BO type as {USER, KERNEL} x {GPU, FW} */
385
+    /** @bo_mask: Combination of panthor_debugfs_bo_flags flags */
339
+    u32 bo_mask;
386
+    u32 flags;
340
+};
387
+};
341
+
388
+
342
/**
389
/**
343
* struct panthor_gem_object - Driver specific GEM object.
390
* struct panthor_gem_object - Driver specific GEM object.
344
*/
391
*/
...
...
358
void panthor_kernel_bo_destroy(struct panthor_kernel_bo *bo);
405
void panthor_kernel_bo_destroy(struct panthor_kernel_bo *bo);
359
406
360
+#ifdef CONFIG_DEBUG_FS
407
+#ifdef CONFIG_DEBUG_FS
361
+void panthor_gem_debugfs_print_bos(struct panthor_device *pfdev,
408
+void panthor_gem_debugfs_print_bos(struct panthor_device *pfdev,
362
+                 struct seq_file *m);
409
+                 struct seq_file *m);
410
+static inline void
411
+panthor_gem_debugfs_bo_set_mask(struct panthor_gem_object *bo, u32 type_mask)
412
+{
413
+    bo->debugfs.flags = type_mask | PANTHOR_DEBUGFS_BO_FLAG_INITIALISED;
414
+}
415
+
416
+#else
417
+void panthor_gem_debugfs_bo_set_mask(struct panthor_gem_object *bo, u32 type_mask) {};
363
+#endif
418
+#endif
364
+
419
+
365
#endif /* __PANTHOR_GEM_H__ */
420
#endif /* __PANTHOR_GEM_H__ */
366
--
421
--
367
2.48.1
422
2.48.1
368
423
diff view generated by jsdifflib