... | ... | ||
---|---|---|---|
3 | DRM GEM objects, and also implementing the ability to label BO's from UM | 3 | DRM GEM objects, and also implementing the ability to label BO's from UM |
4 | through a new IOCTL. | 4 | through a new IOCTL. |
5 | 5 | ||
6 | The new debugfs file shows a list of driver DRM GEM objects in tabular mode. | 6 | The new debugfs file shows a list of driver DRM GEM objects in tabular mode. |
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: | ||
9 | https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/34224 | ||
8 | 10 | ||
9 | Previous discussion mail archive: | 11 | Discussion of previous revision of this patch series can be found at: |
10 | https://lore.kernel.org/dri-devel/20250316215139.3940623-1-adrian.larumbe@collabora.com/ | 12 | https://lore.kernel.org/dri-devel/20250327140845.105962-1-adrian.larumbe@collabora.com/ |
11 | 13 | ||
12 | Changelog: | 14 | Changelog: |
13 | v2: | 15 | |
14 | - Consolidated some debugfs and labelling struct members into nested structs | 16 | v4: |
15 | - Added helpers for handling the debugfs gems linked list | 17 | - Labelled all kernel BO's, not just heap chunks. |
16 | - Fixed ioctl naming scheme in the uapi header file | 18 | - Refactored DebugGFs GEMs list handling functions |
17 | - Added label length limit and param consistency checks in BO labelling ioctl | 19 | - Added debugfs GEMS node mask to tell different kinds of BO's |
18 | 20 | ||
19 | Adrián Larumbe (4): | 21 | Adrián Larumbe (4): |
20 | drm/panthor: Introduce BO labeling | 22 | drm/panthor: Introduce BO labeling |
21 | drm/panthor: Add driver IOCTL for setting BO labels | 23 | drm/panthor: Add driver IOCTL for setting BO labels |
24 | drm/panthor: Label all kernel BO's | ||
22 | drm/panthor: show device-wide list of DRM GEM objects over DebugFS | 25 | drm/panthor: show device-wide list of DRM GEM objects over DebugFS |
23 | drm/panthor: Display heap chunk entries in DebugFS GEMS file | ||
24 | 26 | ||
25 | drivers/gpu/drm/panthor/panthor_device.c | 5 + | 27 | drivers/gpu/drm/panthor/panthor_device.c | 5 + |
26 | drivers/gpu/drm/panthor/panthor_device.h | 11 ++ | 28 | drivers/gpu/drm/panthor/panthor_device.h | 11 ++ |
27 | drivers/gpu/drm/panthor/panthor_drv.c | 63 ++++++++++ | 29 | drivers/gpu/drm/panthor/panthor_drv.c | 66 ++++++++ |
28 | drivers/gpu/drm/panthor/panthor_gem.c | 154 +++++++++++++++++++++++ | 30 | drivers/gpu/drm/panthor/panthor_fw.c | 8 +- |
29 | drivers/gpu/drm/panthor/panthor_gem.h | 48 +++++++ | 31 | drivers/gpu/drm/panthor/panthor_gem.c | 190 ++++++++++++++++++++++- |
30 | drivers/gpu/drm/panthor/panthor_heap.c | 3 + | 32 | drivers/gpu/drm/panthor/panthor_gem.h | 56 ++++++- |
33 | drivers/gpu/drm/panthor/panthor_heap.c | 6 +- | ||
34 | drivers/gpu/drm/panthor/panthor_sched.c | 9 +- | ||
31 | include/uapi/drm/panthor_drm.h | 19 +++ | 35 | include/uapi/drm/panthor_drm.h | 19 +++ |
32 | 7 files changed, 303 insertions(+) | 36 | 9 files changed, 360 insertions(+), 10 deletions(-) |
33 | 37 | ||
34 | -- | 38 | -- |
35 | 2.48.1 | 39 | 2.48.1 | diff view generated by jsdifflib |
... | ... | ||
---|---|---|---|
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 | 24 ++++++++++++++++++++++++ | 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, 41 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 | + kfree(bo->label.str); | 22 | + /* |
23 | + * Label might have been allocated with kstrdup_const(), | ||
24 | + * we need to take that into account when freeing the memory | ||
25 | + */ | ||
26 | + kfree_const(bo->label.str); | ||
27 | + | ||
23 | + mutex_destroy(&bo->label.lock); | 28 | + mutex_destroy(&bo->label.lock); |
24 | + | 29 | + |
25 | drm_gem_free_mmap_offset(&bo->base.base); | 30 | drm_gem_free_mmap_offset(&bo->base.base); |
26 | mutex_destroy(&bo->gpuva_list_lock); | 31 | mutex_destroy(&bo->gpuva_list_lock); |
27 | drm_gem_shmem_free(&bo->base); | 32 | drm_gem_shmem_free(&bo->base); |
... | ... | ||
53 | +} | 58 | +} |
54 | + | 59 | + |
55 | +void | 60 | +void |
56 | +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) |
57 | +{ | 62 | +{ |
58 | + panthor_gem_bo_set_label(bo->obj, kstrdup_const(label, GFP_KERNEL)); | 63 | + const char *str; |
64 | + | ||
65 | + str = kstrdup_const(label, GFP_KERNEL); | ||
66 | + if (!str) { | ||
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"); | ||
69 | + return; | ||
70 | + } | ||
71 | + | ||
72 | + panthor_gem_bo_set_label(bo->obj, kstrdup_const(str, GFP_KERNEL)); | ||
59 | +} | 73 | +} |
60 | 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 |
61 | index XXXXXXX..XXXXXXX 100644 | 75 | index XXXXXXX..XXXXXXX 100644 |
62 | --- a/drivers/gpu/drm/panthor/panthor_gem.h | 76 | --- a/drivers/gpu/drm/panthor/panthor_gem.h |
63 | +++ b/drivers/gpu/drm/panthor/panthor_gem.h | 77 | +++ b/drivers/gpu/drm/panthor/panthor_gem.h |
... | ... | 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 | --- | 4 | --- |
5 | drivers/gpu/drm/panthor/panthor_drv.c | 37 +++++++++++++++++++++++++++ | 5 | drivers/gpu/drm/panthor/panthor_drv.c | 40 +++++++++++++++++++++++++++ |
6 | include/uapi/drm/panthor_drm.h | 19 ++++++++++++++ | 6 | drivers/gpu/drm/panthor/panthor_gem.h | 2 ++ |
7 | 2 files changed, 56 insertions(+) | 7 | include/uapi/drm/panthor_drm.h | 19 +++++++++++++ |
8 | 3 files changed, 61 insertions(+) | ||
8 | 9 | ||
9 | diff --git a/drivers/gpu/drm/panthor/panthor_drv.c b/drivers/gpu/drm/panthor/panthor_drv.c | 10 | diff --git a/drivers/gpu/drm/panthor/panthor_drv.c b/drivers/gpu/drm/panthor/panthor_drv.c |
10 | index XXXXXXX..XXXXXXX 100644 | 11 | index XXXXXXX..XXXXXXX 100644 |
11 | --- a/drivers/gpu/drm/panthor/panthor_drv.c | 12 | --- a/drivers/gpu/drm/panthor/panthor_drv.c |
12 | +++ b/drivers/gpu/drm/panthor/panthor_drv.c | 13 | +++ b/drivers/gpu/drm/panthor/panthor_drv.c |
... | ... | ||
18 | + struct drm_file *file) | 19 | + struct drm_file *file) |
19 | +{ | 20 | +{ |
20 | + struct drm_panthor_bo_set_label *args = data; | 21 | + struct drm_panthor_bo_set_label *args = data; |
21 | + struct drm_gem_object *obj; | 22 | + struct drm_gem_object *obj; |
22 | + const char *label; | 23 | + const char *label; |
23 | + unsigned long len; | ||
24 | + int ret = 0; | 24 | + int ret = 0; |
25 | + | 25 | + |
26 | + obj = drm_gem_object_lookup(file, args->handle); | 26 | + obj = drm_gem_object_lookup(file, args->handle); |
27 | + if (!obj) | 27 | + if (!obj) |
28 | + return -ENOENT; | 28 | + return -ENOENT; |
29 | + | 29 | + |
30 | + if (args->size && args->label) { | 30 | + if (args->size && args->label) { |
31 | + len = (args->size < PAGE_SIZE) ? args->size : PAGE_SIZE; | 31 | + if (args->size > PANTHOR_BO_LABEL_MAXLEN) { |
32 | + label = strndup_user(u64_to_user_ptr(args->label), len); | 32 | + ret = -E2BIG; |
33 | + goto err_label; | ||
34 | + } | ||
35 | + | ||
36 | + label = strndup_user(u64_to_user_ptr(args->label), args->size); | ||
33 | + if (IS_ERR(label)) { | 37 | + if (IS_ERR(label)) { |
34 | + ret = PTR_ERR(label); | 38 | + ret = PTR_ERR(label); |
35 | + goto err_label; | 39 | + goto err_label; |
36 | + } | 40 | + } |
37 | + } else if (args->size && !args->label) { | 41 | + } else if (args->size && !args->label) { |
... | ... | ||
66 | * - 1.3 - adds DRM_PANTHOR_GROUP_STATE_INNOCENT flag | 70 | * - 1.3 - adds DRM_PANTHOR_GROUP_STATE_INNOCENT flag |
67 | + * - 1.4 - adds DRM_IOCTL_PANTHOR_BO_SET_LABEL ioctl | 71 | + * - 1.4 - adds DRM_IOCTL_PANTHOR_BO_SET_LABEL ioctl |
68 | */ | 72 | */ |
69 | static const struct drm_driver panthor_drm_driver = { | 73 | static const struct drm_driver panthor_drm_driver = { |
70 | .driver_features = DRIVER_RENDER | DRIVER_GEM | DRIVER_SYNCOBJ | | 74 | .driver_features = DRIVER_RENDER | DRIVER_GEM | DRIVER_SYNCOBJ | |
75 | diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/panthor/panthor_gem.h | ||
76 | index XXXXXXX..XXXXXXX 100644 | ||
77 | --- a/drivers/gpu/drm/panthor/panthor_gem.h | ||
78 | +++ b/drivers/gpu/drm/panthor/panthor_gem.h | ||
79 | @@ -XXX,XX +XXX,XX @@ | ||
80 | |||
81 | struct panthor_vm; | ||
82 | |||
83 | +#define PANTHOR_BO_LABEL_MAXLEN PAGE_SIZE | ||
84 | + | ||
85 | /** | ||
86 | * struct panthor_gem_object - Driver specific GEM object. | ||
87 | */ | ||
71 | diff --git a/include/uapi/drm/panthor_drm.h b/include/uapi/drm/panthor_drm.h | 88 | diff --git a/include/uapi/drm/panthor_drm.h b/include/uapi/drm/panthor_drm.h |
72 | index XXXXXXX..XXXXXXX 100644 | 89 | index XXXXXXX..XXXXXXX 100644 |
73 | --- a/include/uapi/drm/panthor_drm.h | 90 | --- a/include/uapi/drm/panthor_drm.h |
74 | +++ b/include/uapi/drm/panthor_drm.h | 91 | +++ b/include/uapi/drm/panthor_drm.h |
75 | @@ -XXX,XX +XXX,XX @@ enum drm_panthor_ioctl_id { | 92 | @@ -XXX,XX +XXX,XX @@ enum drm_panthor_ioctl_id { |
... | ... | diff view generated by jsdifflib |
1 | Expand the driver's DebugFS GEMS file to display entries for the heap | 1 | Kernel BO's aren't exposed to UM, so labelling them is the responsibility |
---|---|---|---|
2 | chunks' GEM objects, both those allocated at heap creation time through an | 2 | of the driver itself. This kind of tagging will prove useful in further |
3 | ioctl(), or in response to a tiler OOM event. | 3 | commits when want to expose these objects through DebugFS. |
4 | |||
5 | Expand panthor_kernel_bo_create() interface to take a NULL-terminated | ||
6 | string. No bounds checking is done because all label strings are given | ||
7 | as statically-allocated literals, but if a more complex kernel BO naming | ||
8 | scheme with explicit memory allocation and formatting was desired in the | ||
9 | future, this would have to change. | ||
4 | 10 | ||
5 | Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com> | 11 | Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com> |
6 | --- | 12 | --- |
7 | drivers/gpu/drm/panthor/panthor_gem.c | 22 +++++++++++----------- | 13 | drivers/gpu/drm/panthor/panthor_fw.c | 8 +++++--- |
8 | drivers/gpu/drm/panthor/panthor_gem.h | 2 ++ | 14 | drivers/gpu/drm/panthor/panthor_gem.c | 3 ++- |
9 | drivers/gpu/drm/panthor/panthor_heap.c | 3 +++ | 15 | drivers/gpu/drm/panthor/panthor_gem.h | 2 +- |
10 | 3 files changed, 16 insertions(+), 11 deletions(-) | 16 | drivers/gpu/drm/panthor/panthor_heap.c | 6 ++++-- |
17 | drivers/gpu/drm/panthor/panthor_sched.c | 9 ++++++--- | ||
18 | 5 files changed, 18 insertions(+), 10 deletions(-) | ||
11 | 19 | ||
20 | diff --git a/drivers/gpu/drm/panthor/panthor_fw.c b/drivers/gpu/drm/panthor/panthor_fw.c | ||
21 | index XXXXXXX..XXXXXXX 100644 | ||
22 | --- a/drivers/gpu/drm/panthor/panthor_fw.c | ||
23 | +++ b/drivers/gpu/drm/panthor/panthor_fw.c | ||
24 | @@ -XXX,XX +XXX,XX @@ panthor_fw_alloc_queue_iface_mem(struct panthor_device *ptdev, | ||
25 | DRM_PANTHOR_BO_NO_MMAP, | ||
26 | DRM_PANTHOR_VM_BIND_OP_MAP_NOEXEC | | ||
27 | DRM_PANTHOR_VM_BIND_OP_MAP_UNCACHED, | ||
28 | - PANTHOR_VM_KERNEL_AUTO_VA); | ||
29 | + PANTHOR_VM_KERNEL_AUTO_VA, | ||
30 | + "Queue FW interface"); | ||
31 | if (IS_ERR(mem)) | ||
32 | return mem; | ||
33 | |||
34 | @@ -XXX,XX +XXX,XX @@ panthor_fw_alloc_suspend_buf_mem(struct panthor_device *ptdev, size_t size) | ||
35 | return panthor_kernel_bo_create(ptdev, panthor_fw_vm(ptdev), size, | ||
36 | DRM_PANTHOR_BO_NO_MMAP, | ||
37 | DRM_PANTHOR_VM_BIND_OP_MAP_NOEXEC, | ||
38 | - PANTHOR_VM_KERNEL_AUTO_VA); | ||
39 | + PANTHOR_VM_KERNEL_AUTO_VA, | ||
40 | + "FW suspend buffer"); | ||
41 | } | ||
42 | |||
43 | 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), | ||
46 | section_size, | ||
47 | DRM_PANTHOR_BO_NO_MMAP, | ||
48 | - vm_map_flags, va); | ||
49 | + vm_map_flags, va, "FW Section"); | ||
50 | if (IS_ERR(section->mem)) | ||
51 | return PTR_ERR(section->mem); | ||
52 | |||
12 | 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 |
13 | index XXXXXXX..XXXXXXX 100644 | 54 | index XXXXXXX..XXXXXXX 100644 |
14 | --- a/drivers/gpu/drm/panthor/panthor_gem.c | 55 | --- a/drivers/gpu/drm/panthor/panthor_gem.c |
15 | +++ b/drivers/gpu/drm/panthor/panthor_gem.c | 56 | +++ b/drivers/gpu/drm/panthor/panthor_gem.c |
16 | @@ -XXX,XX +XXX,XX @@ static void panthor_gem_debugfs_bo_init(struct panthor_gem_object *bo) | 57 | @@ -XXX,XX +XXX,XX @@ void panthor_kernel_bo_destroy(struct panthor_kernel_bo *bo) |
17 | get_task_comm(bo->gems.creator.process_name, current->group_leader); | 58 | struct panthor_kernel_bo * |
18 | } | 59 | panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm, |
19 | 60 | size_t size, u32 bo_flags, u32 vm_map_flags, | |
20 | -static void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo) | 61 | - u64 gpu_va) |
21 | -{ | 62 | + u64 gpu_va, const char *name) |
22 | - struct panthor_device *ptdev = container_of(bo->base.base.dev, | ||
23 | - struct panthor_device, base); | ||
24 | - | ||
25 | - mutex_lock(&ptdev->gems.lock); | ||
26 | - list_add_tail(&bo->gems.node, &ptdev->gems.node); | ||
27 | - mutex_unlock(&ptdev->gems.lock); | ||
28 | -} | ||
29 | - | ||
30 | static void panthor_gem_debugfs_bo_rm(struct panthor_gem_object *bo) | ||
31 | { | 63 | { |
32 | struct panthor_device *ptdev = container_of(bo->base.base.dev, | 64 | struct drm_gem_shmem_object *obj; |
33 | @@ -XXX,XX +XXX,XX @@ static void panthor_gem_debugfs_bo_rm(struct panthor_gem_object *bo) | 65 | struct panthor_kernel_bo *kbo; |
34 | list_del_init(&bo->gems.node); | 66 | @@ -XXX,XX +XXX,XX @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm, |
35 | mutex_unlock(&ptdev->gems.lock); | 67 | kbo->obj = &obj->base; |
36 | } | 68 | bo->flags = bo_flags; |
37 | + | 69 | |
38 | +void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo) | 70 | + panthor_gem_kernel_bo_set_label(kbo, name); |
39 | +{ | 71 | /* The system and GPU MMU page size might differ, which becomes a |
40 | + struct panthor_device *ptdev = container_of(bo->base.base.dev, | 72 | * problem for FW sections that need to be mapped at explicit address |
41 | + struct panthor_device, base); | 73 | * since our PAGE_SIZE alignment might cover a VA range that's |
42 | + | ||
43 | + mutex_lock(&ptdev->gems.lock); | ||
44 | + list_add_tail(&bo->gems.node, &ptdev->gems.node); | ||
45 | + mutex_unlock(&ptdev->gems.lock); | ||
46 | +} | ||
47 | #else | ||
48 | static void panthor_gem_debugfs_bo_init(struct panthor_gem_object *bo) {} | ||
49 | -static void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo) {} | ||
50 | static void panthor_gem_debugfs_bo_rm(struct panthor_gem_object *bo) {} | ||
51 | +void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo) {} | ||
52 | #endif | ||
53 | |||
54 | static void panthor_gem_free_object(struct drm_gem_object *obj) | ||
55 | 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 |
56 | index XXXXXXX..XXXXXXX 100644 | 75 | index XXXXXXX..XXXXXXX 100644 |
57 | --- a/drivers/gpu/drm/panthor/panthor_gem.h | 76 | --- a/drivers/gpu/drm/panthor/panthor_gem.h |
58 | +++ b/drivers/gpu/drm/panthor/panthor_gem.h | 77 | +++ b/drivers/gpu/drm/panthor/panthor_gem.h |
59 | @@ -XXX,XX +XXX,XX @@ panthor_gem_create_with_handle(struct drm_file *file, | 78 | @@ -XXX,XX +XXX,XX @@ panthor_kernel_bo_vunmap(struct panthor_kernel_bo *bo) |
60 | void panthor_gem_bo_set_label(struct drm_gem_object *obj, const char *label); | 79 | struct panthor_kernel_bo * |
61 | void panthor_gem_kernel_bo_set_label(struct panthor_kernel_bo *bo, const char *label); | 80 | panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm, |
62 | 81 | size_t size, u32 bo_flags, u32 vm_map_flags, | |
63 | +void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo); | 82 | - u64 gpu_va); |
64 | + | 83 | + u64 gpu_va, const char *name); |
65 | static inline u64 | 84 | |
66 | panthor_kernel_bo_gpuva(struct panthor_kernel_bo *bo) | 85 | void panthor_kernel_bo_destroy(struct panthor_kernel_bo *bo); |
67 | { | 86 | |
68 | diff --git a/drivers/gpu/drm/panthor/panthor_heap.c b/drivers/gpu/drm/panthor/panthor_heap.c | 87 | diff --git a/drivers/gpu/drm/panthor/panthor_heap.c b/drivers/gpu/drm/panthor/panthor_heap.c |
69 | index XXXXXXX..XXXXXXX 100644 | 88 | index XXXXXXX..XXXXXXX 100644 |
70 | --- a/drivers/gpu/drm/panthor/panthor_heap.c | 89 | --- a/drivers/gpu/drm/panthor/panthor_heap.c |
71 | +++ b/drivers/gpu/drm/panthor/panthor_heap.c | 90 | +++ b/drivers/gpu/drm/panthor/panthor_heap.c |
72 | @@ -XXX,XX +XXX,XX @@ static int panthor_alloc_heap_chunk(struct panthor_device *ptdev, | 91 | @@ -XXX,XX +XXX,XX @@ static int panthor_alloc_heap_chunk(struct panthor_device *ptdev, |
73 | heap->chunk_count++; | 92 | chunk->bo = panthor_kernel_bo_create(ptdev, vm, heap->chunk_size, |
74 | mutex_unlock(&heap->lock); | 93 | DRM_PANTHOR_BO_NO_MMAP, |
75 | 94 | DRM_PANTHOR_VM_BIND_OP_MAP_NOEXEC, | |
76 | + panthor_gem_kernel_bo_set_label(chunk->bo, "\"Tiler heap chunk\""); | 95 | - PANTHOR_VM_KERNEL_AUTO_VA); |
77 | + panthor_gem_debugfs_bo_add(to_panthor_bo(chunk->bo->obj)); | 96 | + PANTHOR_VM_KERNEL_AUTO_VA, |
78 | + | 97 | + "Tiler heap chunk"); |
79 | return 0; | 98 | if (IS_ERR(chunk->bo)) { |
80 | 99 | ret = PTR_ERR(chunk->bo); | |
81 | err_destroy_bo: | 100 | goto err_free_chunk; |
101 | @@ -XXX,XX +XXX,XX @@ panthor_heap_pool_create(struct panthor_device *ptdev, struct panthor_vm *vm) | ||
102 | pool->gpu_contexts = panthor_kernel_bo_create(ptdev, vm, bosize, | ||
103 | DRM_PANTHOR_BO_NO_MMAP, | ||
104 | DRM_PANTHOR_VM_BIND_OP_MAP_NOEXEC, | ||
105 | - PANTHOR_VM_KERNEL_AUTO_VA); | ||
106 | + PANTHOR_VM_KERNEL_AUTO_VA, | ||
107 | + "Heap pool"); | ||
108 | if (IS_ERR(pool->gpu_contexts)) { | ||
109 | ret = PTR_ERR(pool->gpu_contexts); | ||
110 | goto err_destroy_pool; | ||
111 | diff --git a/drivers/gpu/drm/panthor/panthor_sched.c b/drivers/gpu/drm/panthor/panthor_sched.c | ||
112 | index XXXXXXX..XXXXXXX 100644 | ||
113 | --- a/drivers/gpu/drm/panthor/panthor_sched.c | ||
114 | +++ b/drivers/gpu/drm/panthor/panthor_sched.c | ||
115 | @@ -XXX,XX +XXX,XX @@ group_create_queue(struct panthor_group *group, | ||
116 | DRM_PANTHOR_BO_NO_MMAP, | ||
117 | DRM_PANTHOR_VM_BIND_OP_MAP_NOEXEC | | ||
118 | DRM_PANTHOR_VM_BIND_OP_MAP_UNCACHED, | ||
119 | - PANTHOR_VM_KERNEL_AUTO_VA); | ||
120 | + PANTHOR_VM_KERNEL_AUTO_VA, | ||
121 | + "Ring buffer"); | ||
122 | if (IS_ERR(queue->ringbuf)) { | ||
123 | ret = PTR_ERR(queue->ringbuf); | ||
124 | goto err_free_queue; | ||
125 | @@ -XXX,XX +XXX,XX @@ group_create_queue(struct panthor_group *group, | ||
126 | DRM_PANTHOR_BO_NO_MMAP, | ||
127 | DRM_PANTHOR_VM_BIND_OP_MAP_NOEXEC | | ||
128 | DRM_PANTHOR_VM_BIND_OP_MAP_UNCACHED, | ||
129 | - PANTHOR_VM_KERNEL_AUTO_VA); | ||
130 | + PANTHOR_VM_KERNEL_AUTO_VA, | ||
131 | + "fdinfo slots"); | ||
132 | |||
133 | if (IS_ERR(queue->profiling.slots)) { | ||
134 | ret = PTR_ERR(queue->profiling.slots); | ||
135 | @@ -XXX,XX +XXX,XX @@ int panthor_group_create(struct panthor_file *pfile, | ||
136 | DRM_PANTHOR_BO_NO_MMAP, | ||
137 | DRM_PANTHOR_VM_BIND_OP_MAP_NOEXEC | | ||
138 | DRM_PANTHOR_VM_BIND_OP_MAP_UNCACHED, | ||
139 | - PANTHOR_VM_KERNEL_AUTO_VA); | ||
140 | + PANTHOR_VM_KERNEL_AUTO_VA, | ||
141 | + "Group sync objects"); | ||
142 | if (IS_ERR(group->syncobjs)) { | ||
143 | ret = PTR_ERR(group->syncobjs); | ||
144 | goto err_put_group; | ||
82 | -- | 145 | -- |
83 | 2.48.1 | 146 | 2.48.1 |
84 | 147 | diff view generated by jsdifflib |
1 | Add a device DebugFS file that displays a complete list of all the DRM GEM | 1 | Add a device DebugFS file that displays a complete list of all the DRM |
---|---|---|---|
2 | objects that are exposed to UM through a DRM handle. | 2 | GEM objects that are exposed to UM through a DRM handle. |
3 | 3 | ||
4 | Since leaking object identifiers that might belong to a different NS is | 4 | Since leaking object identifiers that might belong to a different NS is |
5 | inadmissible, this functionality is only made available in debug builds | 5 | inadmissible, this functionality is only made available in debug builds |
6 | with DEBUGFS support enabled. | 6 | with DEBUGFS support enabled. |
7 | 7 | ||
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, BO | 12 | fields: Client PID, BO's global name, reference count, BO virtual size, |
13 | 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 flag |
14 | bitmask. | 14 | bitmask. |
15 | |||
16 | There's also a kflags field for the type of BO. Bit 0 tells us whether | ||
17 | it's a kernel BO, and bit 1 means the BO is mapped onto the FW's address | ||
18 | space. | ||
15 | 19 | ||
16 | Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com> | 20 | Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com> |
17 | --- | 21 | --- |
18 | drivers/gpu/drm/panthor/panthor_device.c | 5 + | 22 | drivers/gpu/drm/panthor/panthor_device.c | 5 + |
19 | drivers/gpu/drm/panthor/panthor_device.h | 11 ++ | 23 | drivers/gpu/drm/panthor/panthor_device.h | 11 ++ |
20 | drivers/gpu/drm/panthor/panthor_drv.c | 26 +++++ | 24 | drivers/gpu/drm/panthor/panthor_drv.c | 26 ++++ |
21 | drivers/gpu/drm/panthor/panthor_gem.c | 130 +++++++++++++++++++++++ | 25 | drivers/gpu/drm/panthor/panthor_gem.c | 149 +++++++++++++++++++++++ |
22 | drivers/gpu/drm/panthor/panthor_gem.h | 29 +++++ | 26 | drivers/gpu/drm/panthor/panthor_gem.h | 35 ++++++ |
23 | 5 files changed, 201 insertions(+) | 27 | 5 files changed, 226 insertions(+) |
24 | 28 | ||
25 | diff --git a/drivers/gpu/drm/panthor/panthor_device.c b/drivers/gpu/drm/panthor/panthor_device.c | 29 | diff --git a/drivers/gpu/drm/panthor/panthor_device.c b/drivers/gpu/drm/panthor/panthor_device.c |
26 | index XXXXXXX..XXXXXXX 100644 | 30 | index XXXXXXX..XXXXXXX 100644 |
27 | --- a/drivers/gpu/drm/panthor/panthor_device.c | 31 | --- a/drivers/gpu/drm/panthor/panthor_device.c |
28 | +++ b/drivers/gpu/drm/panthor/panthor_device.c | 32 | +++ b/drivers/gpu/drm/panthor/panthor_device.c |
29 | @@ -XXX,XX +XXX,XX @@ int panthor_device_init(struct panthor_device *ptdev) | 33 | @@ -XXX,XX +XXX,XX @@ int panthor_device_init(struct panthor_device *ptdev) |
30 | pm_runtime_set_autosuspend_delay(ptdev->base.dev, 50); | 34 | if (ret) |
31 | pm_runtime_use_autosuspend(ptdev->base.dev); | 35 | return ret; |
32 | 36 | ||
33 | +#ifdef CONFIG_DEBUG_FS | 37 | +#ifdef CONFIG_DEBUG_FS |
34 | + drmm_mutex_init(&ptdev->base, &ptdev->gems.lock); | 38 | + drmm_mutex_init(&ptdev->base, &ptdev->gems.lock); |
35 | + INIT_LIST_HEAD(&ptdev->gems.node); | 39 | + INIT_LIST_HEAD(&ptdev->gems.node); |
36 | +#endif | 40 | +#endif |
37 | + | 41 | + |
38 | ret = drm_dev_register(&ptdev->base, 0); | 42 | atomic_set(&ptdev->pm.state, PANTHOR_DEVICE_PM_STATE_SUSPENDED); |
39 | if (ret) | 43 | p = alloc_page(GFP_KERNEL | __GFP_ZERO); |
40 | goto err_disable_autosuspend; | 44 | if (!p) |
41 | diff --git a/drivers/gpu/drm/panthor/panthor_device.h b/drivers/gpu/drm/panthor/panthor_device.h | 45 | diff --git a/drivers/gpu/drm/panthor/panthor_device.h b/drivers/gpu/drm/panthor/panthor_device.h |
42 | index XXXXXXX..XXXXXXX 100644 | 46 | index XXXXXXX..XXXXXXX 100644 |
43 | --- a/drivers/gpu/drm/panthor/panthor_device.h | 47 | --- a/drivers/gpu/drm/panthor/panthor_device.h |
44 | +++ b/drivers/gpu/drm/panthor/panthor_device.h | 48 | +++ b/drivers/gpu/drm/panthor/panthor_device.h |
45 | @@ -XXX,XX +XXX,XX @@ struct panthor_device { | 49 | @@ -XXX,XX +XXX,XX @@ struct panthor_device { |
... | ... | ||
111 | +#include <linux/cleanup.h> | 115 | +#include <linux/cleanup.h> |
112 | #include <linux/dma-buf.h> | 116 | #include <linux/dma-buf.h> |
113 | #include <linux/dma-mapping.h> | 117 | #include <linux/dma-mapping.h> |
114 | #include <linux/err.h> | 118 | #include <linux/err.h> |
115 | @@ -XXX,XX +XXX,XX @@ | 119 | @@ -XXX,XX +XXX,XX @@ |
120 | #include <drm/panthor_drm.h> | ||
121 | |||
122 | #include "panthor_device.h" | ||
123 | +#include "panthor_fw.h" | ||
116 | #include "panthor_gem.h" | 124 | #include "panthor_gem.h" |
117 | #include "panthor_mmu.h" | 125 | #include "panthor_mmu.h" |
118 | 126 | ||
119 | +#ifdef CONFIG_DEBUG_FS | 127 | +#ifdef CONFIG_DEBUG_FS |
120 | +static void panthor_gem_debugfs_bo_init(struct panthor_gem_object *bo) | 128 | +static void panthor_gem_debugfs_bo_init(struct panthor_gem_object *bo, u32 type_mask) |
121 | +{ | 129 | +{ |
122 | + INIT_LIST_HEAD(&bo->gems.node); | 130 | + INIT_LIST_HEAD(&bo->debugfs.node); |
123 | + bo->gems.creator.tgid = current->group_leader->pid; | 131 | + |
124 | + get_task_comm(bo->gems.creator.process_name, current->group_leader); | 132 | + if (!(type_mask & PANTHOR_BO_FW_MAPPED)) { |
125 | +} | 133 | + bo->debugfs.creator.tgid = current->group_leader->pid; |
126 | + | 134 | + get_task_comm(bo->debugfs.creator.process_name, current->group_leader); |
127 | +static void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo) | 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) | ||
128 | +{ | 146 | +{ |
129 | + struct panthor_device *ptdev = container_of(bo->base.base.dev, | 147 | + struct panthor_device *ptdev = container_of(bo->base.base.dev, |
130 | + struct panthor_device, base); | 148 | + struct panthor_device, base); |
131 | + | 149 | + |
150 | + panthor_gem_debugfs_bo_init(bo, type_mask); | ||
151 | + | ||
132 | + mutex_lock(&ptdev->gems.lock); | 152 | + mutex_lock(&ptdev->gems.lock); |
133 | + list_add_tail(&bo->gems.node, &ptdev->gems.node); | 153 | + list_add_tail(&bo->debugfs.node, &ptdev->gems.node); |
134 | + mutex_unlock(&ptdev->gems.lock); | 154 | + mutex_unlock(&ptdev->gems.lock); |
135 | +} | 155 | +} |
136 | + | 156 | + |
137 | +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) |
138 | +{ | 158 | +{ |
139 | + struct panthor_device *ptdev = container_of(bo->base.base.dev, | 159 | + struct panthor_device *ptdev = container_of(bo->base.base.dev, |
140 | + struct panthor_device, base); | 160 | + struct panthor_device, base); |
141 | + | 161 | + |
142 | + if (list_empty(&bo->gems.node)) | 162 | + if (list_empty(&bo->debugfs.node)) |
143 | + return; | 163 | + return; |
144 | + | 164 | + |
145 | + mutex_lock(&ptdev->gems.lock); | 165 | + mutex_lock(&ptdev->gems.lock); |
146 | + list_del_init(&bo->gems.node); | 166 | + list_del_init(&bo->debugfs.node); |
147 | + mutex_unlock(&ptdev->gems.lock); | 167 | + mutex_unlock(&ptdev->gems.lock); |
148 | +} | 168 | +} |
169 | + | ||
149 | +#else | 170 | +#else |
150 | +static void panthor_gem_debugfs_bo_init(struct panthor_gem_object *bo) {} | 171 | +static void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo, u32 type_mask) {} |
151 | +static void panthor_gem_debugfs_bo_add(struct panthor_gem_object *bo) {} | ||
152 | +static void panthor_gem_debugfs_bo_rm(struct panthor_gem_object *bo) {} | 172 | +static void panthor_gem_debugfs_bo_rm(struct panthor_gem_object *bo) {} |
153 | +#endif | 173 | +#endif |
154 | + | 174 | + |
155 | static void panthor_gem_free_object(struct drm_gem_object *obj) | 175 | static void panthor_gem_free_object(struct drm_gem_object *obj) |
156 | { | 176 | { |
157 | struct panthor_gem_object *bo = to_panthor_bo(obj); | 177 | struct panthor_gem_object *bo = to_panthor_bo(obj); |
158 | struct drm_gem_object *vm_root_gem = bo->exclusive_vm_root_gem; | 178 | struct drm_gem_object *vm_root_gem = bo->exclusive_vm_root_gem; |
159 | 179 | ||
160 | + panthor_gem_debugfs_bo_rm(bo); | 180 | + panthor_gem_debugfs_bo_rm(bo); |
161 | + | 181 | + |
162 | kfree(bo->label.str); | 182 | /* |
163 | mutex_destroy(&bo->label.lock); | 183 | * Label might have been allocated with kstrdup_const(), |
164 | 184 | * we need to take that into account when freeing the memory | |
165 | @@ -XXX,XX +XXX,XX @@ struct drm_gem_object *panthor_gem_create_object(struct drm_device *ddev, size_t | 185 | @@ -XXX,XX +XXX,XX @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm, |
166 | drm_gem_gpuva_set_lock(&obj->base.base, &obj->gpuva_list_lock); | 186 | struct drm_gem_shmem_object *obj; |
167 | mutex_init(&obj->label.lock); | 187 | struct panthor_kernel_bo *kbo; |
168 | 188 | struct panthor_gem_object *bo; | |
169 | + panthor_gem_debugfs_bo_init(obj); | 189 | + u32 type_mask = PANTHOR_BO_KERNEL; |
170 | + | 190 | int ret; |
171 | return &obj->base.base; | 191 | |
172 | } | 192 | if (drm_WARN_ON(&ptdev->base, !vm)) |
173 | 193 | @@ -XXX,XX +XXX,XX @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm, | |
194 | kbo->obj = &obj->base; | ||
195 | bo->flags = bo_flags; | ||
196 | |||
197 | + if (vm == panthor_fw_vm(ptdev)) | ||
198 | + type_mask |= PANTHOR_BO_FW_MAPPED; | ||
199 | + | ||
200 | panthor_gem_kernel_bo_set_label(kbo, name); | ||
201 | + panthor_gem_debugfs_bo_add(to_panthor_bo(kbo->obj), type_mask); | ||
202 | + | ||
203 | /* 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 | ||
205 | * since our PAGE_SIZE alignment might cover a VA range that's | ||
174 | @@ -XXX,XX +XXX,XX @@ panthor_gem_create_with_handle(struct drm_file *file, | 206 | @@ -XXX,XX +XXX,XX @@ panthor_gem_create_with_handle(struct drm_file *file, |
175 | /* drop reference from allocate - handle holds it now. */ | 207 | /* drop reference from allocate - handle holds it now. */ |
176 | drm_gem_object_put(&shmem->base); | 208 | drm_gem_object_put(&shmem->base); |
177 | 209 | ||
178 | + panthor_gem_debugfs_bo_add(bo); | 210 | + panthor_gem_debugfs_bo_add(bo, 0); |
179 | + | 211 | + |
180 | return ret; | 212 | return ret; |
181 | } | 213 | } |
182 | 214 | ||
183 | @@ -XXX,XX +XXX,XX @@ panthor_gem_kernel_bo_set_label(struct panthor_kernel_bo *bo, const char *label) | 215 | @@ -XXX,XX +XXX,XX @@ panthor_gem_kernel_bo_set_label(struct panthor_kernel_bo *bo, const char *label) |
184 | { | 216 | |
185 | panthor_gem_bo_set_label(bo->obj, kstrdup_const(label, GFP_KERNEL)); | 217 | panthor_gem_bo_set_label(bo->obj, kstrdup_const(str, GFP_KERNEL)); |
186 | } | 218 | } |
187 | + | 219 | + |
188 | +#ifdef CONFIG_DEBUG_FS | 220 | +#ifdef CONFIG_DEBUG_FS |
189 | +static bool panfrost_gem_print_flag(const char *name, | 221 | +static bool panfrost_gem_print_flag(const char *name, |
190 | + bool is_set, | 222 | + bool is_set, |
... | ... | ||
217 | + return; | 249 | + return; |
218 | + | 250 | + |
219 | + resident_size = bo->base.pages != NULL ? bo->base.base.size : 0; | 251 | + resident_size = bo->base.pages != NULL ? bo->base.base.size : 0; |
220 | + | 252 | + |
221 | + snprintf(creator_info, sizeof(creator_info), | 253 | + snprintf(creator_info, sizeof(creator_info), |
222 | + "%s/%d", bo->gems.creator.process_name, bo->gems.creator.tgid); | 254 | + "%s/%d", bo->debugfs.creator.process_name, bo->debugfs.creator.tgid); |
223 | + seq_printf(m, "%-32s%-16d%-16d%-16zd%-16zd%-16lx", | 255 | + seq_printf(m, "%-32s%-16d%-16d%-16zd%-16zd%-16lx", |
224 | + creator_info, | 256 | + creator_info, |
225 | + bo->base.base.name, | 257 | + bo->base.base.name, |
226 | + refcount, | 258 | + refcount, |
227 | + bo->base.base.size, | 259 | + bo->base.base.size, |
... | ... | ||
239 | + has_flags = panfrost_gem_print_flag("purgeable", true, has_flags, m); | 271 | + has_flags = panfrost_gem_print_flag("purgeable", true, has_flags, m); |
240 | + if (!has_flags) | 272 | + if (!has_flags) |
241 | + seq_puts(m, "none"); | 273 | + seq_puts(m, "none"); |
242 | + seq_puts(m, ")"); | 274 | + seq_puts(m, ")"); |
243 | + | 275 | + |
276 | + seq_printf(m, "%-6s0x%-2x", "", bo->debugfs.bo_mask); | ||
277 | + | ||
244 | + mutex_lock(&bo->label.lock); | 278 | + mutex_lock(&bo->label.lock); |
245 | + seq_printf(m, "%-16s%-60s", "", bo->label.str ? : NULL); | 279 | + seq_printf(m, "%-6s%-60s", "", bo->label.str ? : NULL); |
246 | + mutex_unlock(&bo->label.lock); | 280 | + mutex_unlock(&bo->label.lock); |
247 | + seq_puts(m, "\n"); | 281 | + seq_puts(m, "\n"); |
248 | + | 282 | + |
249 | + totals->size += bo->base.base.size; | 283 | + totals->size += bo->base.base.size; |
250 | + totals->resident += resident_size; | 284 | + totals->resident += resident_size; |
... | ... | ||
256 | + struct seq_file *m) | 290 | + struct seq_file *m) |
257 | +{ | 291 | +{ |
258 | + struct gem_size_totals totals = {0}; | 292 | + struct gem_size_totals totals = {0}; |
259 | + struct panthor_gem_object *bo; | 293 | + struct panthor_gem_object *bo; |
260 | + | 294 | + |
261 | + seq_puts(m, "created-by global-name refcount size resident-size file-offset flags label\n"); | 295 | + seq_puts(m, "created-by global-name refcount size resident-size file-offset flags kflags label\n"); |
262 | + seq_puts(m, "------------------------------------------------------------------------------------------------------------------------------------------------\n"); | 296 | + seq_puts(m, "------------------------------------------------------------------------------------------------------------------------------------------------\n"); |
263 | + | 297 | + |
264 | + scoped_guard(mutex, &ptdev->gems.lock) { | 298 | + scoped_guard(mutex, &ptdev->gems.lock) { |
265 | + list_for_each_entry(bo, &ptdev->gems.node, gems.node) | 299 | + list_for_each_entry(bo, &ptdev->gems.node, debugfs.node) |
266 | + panthor_gem_debugfs_bo_print(bo, m, &totals); | 300 | + panthor_gem_debugfs_bo_print(bo, m, &totals); |
267 | + } | 301 | + } |
268 | + | 302 | + |
269 | + seq_puts(m, "================================================================================================================================================\n"); | 303 | + seq_puts(m, "==========================================================================================================================================================\n"); |
270 | + seq_printf(m, "Total size: %zd, Total resident: %zd, Total reclaimable: %zd\n", | 304 | + seq_printf(m, "Total size: %zd, Total resident: %zd, Total reclaimable: %zd\n", |
271 | + totals.size, totals.resident, totals.reclaimable); | 305 | + totals.size, totals.resident, totals.reclaimable); |
272 | +} | 306 | +} |
273 | +#endif | 307 | +#endif |
274 | diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/panthor/panthor_gem.h | 308 | diff --git a/drivers/gpu/drm/panthor/panthor_gem.h b/drivers/gpu/drm/panthor/panthor_gem.h |
275 | index XXXXXXX..XXXXXXX 100644 | 309 | index XXXXXXX..XXXXXXX 100644 |
276 | --- a/drivers/gpu/drm/panthor/panthor_gem.h | 310 | --- a/drivers/gpu/drm/panthor/panthor_gem.h |
277 | +++ b/drivers/gpu/drm/panthor/panthor_gem.h | 311 | +++ b/drivers/gpu/drm/panthor/panthor_gem.h |
278 | @@ -XXX,XX +XXX,XX @@ | 312 | @@ -XXX,XX +XXX,XX @@ struct panthor_vm; |
279 | 313 | ||
280 | struct panthor_vm; | 314 | #define PANTHOR_BO_LABEL_MAXLEN PAGE_SIZE |
281 | 315 | ||
316 | +#define PANTHOR_BO_KERNEL BIT(0) | ||
317 | +#define PANTHOR_BO_FW_MAPPED BIT(1) | ||
318 | + | ||
282 | +/** | 319 | +/** |
283 | + * struct panthor_gem_debugfs - GEM object's DebugFS list information | 320 | + * struct panthor_gem_debugfs - GEM object's DebugFS list information |
284 | + */ | 321 | + */ |
285 | +struct panthor_gem_debugfs { | 322 | +struct panthor_gem_debugfs { |
286 | + /** | 323 | + /** |
... | ... | ||
295 | + char process_name[TASK_COMM_LEN]; | 332 | + char process_name[TASK_COMM_LEN]; |
296 | + | 333 | + |
297 | + /** @creator.tgid: PID of the thread's group leader within its process */ | 334 | + /** @creator.tgid: PID of the thread's group leader within its process */ |
298 | + pid_t tgid; | 335 | + pid_t tgid; |
299 | + } creator; | 336 | + } creator; |
337 | + | ||
338 | + /** @bo_mask: Bitmask encoding BO type as {USER, KERNEL} x {GPU, FW} */ | ||
339 | + u32 bo_mask; | ||
300 | +}; | 340 | +}; |
301 | + | 341 | + |
302 | /** | 342 | /** |
303 | * struct panthor_gem_object - Driver specific GEM object. | 343 | * struct panthor_gem_object - Driver specific GEM object. |
304 | */ | 344 | */ |
305 | @@ -XXX,XX +XXX,XX @@ struct panthor_gem_object { | 345 | @@ -XXX,XX +XXX,XX @@ struct panthor_gem_object { |
306 | /** @lock.str: Protects access to the @label.str field. */ | 346 | /** @lock.str: Protects access to the @label.str field. */ |
307 | struct mutex lock; | 347 | struct mutex lock; |
308 | } label; | 348 | } label; |
309 | + | 349 | + |
310 | +#ifdef CONFIG_DEBUG_FS | 350 | +#ifdef CONFIG_DEBUG_FS |
311 | + struct panthor_gem_debugfs gems; | 351 | + struct panthor_gem_debugfs debugfs; |
312 | +#endif | 352 | +#endif |
313 | }; | 353 | }; |
314 | 354 | ||
315 | /** | 355 | /** |
316 | @@ -XXX,XX +XXX,XX @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm, | 356 | @@ -XXX,XX +XXX,XX @@ panthor_kernel_bo_create(struct panthor_device *ptdev, struct panthor_vm *vm, |
... | ... | diff view generated by jsdifflib |