xref: /linux/drivers/gpu/drm/drm_buddy.c (revision d639d9fa162aadec1ae9980c4dcf6e50bd2f8290)
1 // SPDX-License-Identifier: MIT
2 /*
3  * Copyright © 2021 Intel Corporation
4  */
5 
6 #include <kunit/test-bug.h>
7 
8 #include <linux/export.h>
9 #include <linux/kmemleak.h>
10 #include <linux/module.h>
11 #include <linux/sizes.h>
12 
13 #include <linux/gpu_buddy.h>
14 #include <drm/drm_buddy.h>
15 #include <drm/drm_print.h>
16 
17 /**
18  * drm_buddy_block_print - print block information
19  *
20  * @mm: DRM buddy manager
21  * @block: DRM buddy block
22  * @p: DRM printer to use
23  */
24 void drm_buddy_block_print(struct gpu_buddy *mm,
25 			   struct gpu_buddy_block *block,
26 			   struct drm_printer *p)
27 {
28 	u64 start = gpu_buddy_block_offset(block);
29 	u64 size = gpu_buddy_block_size(mm, block);
30 
31 	drm_printf(p, "%#018llx-%#018llx: %llu\n", start, start + size, size);
32 }
33 EXPORT_SYMBOL(drm_buddy_block_print);
34 
35 /**
36  * drm_buddy_print - print allocator state
37  *
38  * @mm: DRM buddy manager
39  * @p: DRM printer to use
40  */
41 void drm_buddy_print(struct gpu_buddy *mm, struct drm_printer *p)
42 {
43 	int order;
44 
45 	gpu_buddy_driver_lock_held(mm);
46 	drm_printf(p, "chunk_size: %lluKiB, total: %lluMiB, free: %lluMiB, clear_free: %lluMiB\n",
47 		   mm->chunk_size >> 10, mm->size >> 20, mm->avail >> 20, mm->clear_avail >> 20);
48 
49 	for (order = mm->max_order; order >= 0; order--) {
50 		struct gpu_buddy_block *block, *tmp;
51 		struct rb_root *root;
52 		u64 count = 0, free;
53 		unsigned int tree;
54 
55 		for_each_free_tree(tree) {
56 			root = &mm->free_trees[tree][order];
57 
58 			rbtree_postorder_for_each_entry_safe(block, tmp, root, rb) {
59 				BUG_ON(!gpu_buddy_block_is_free(block));
60 				count++;
61 			}
62 		}
63 
64 		drm_printf(p, "order-%2d ", order);
65 
66 		free = count * (mm->chunk_size << order);
67 		if (free < SZ_1M)
68 			drm_printf(p, "free: %8llu KiB", free >> 10);
69 		else
70 			drm_printf(p, "free: %8llu MiB", free >> 20);
71 
72 		drm_printf(p, ", blocks: %llu\n", count);
73 	}
74 }
75 EXPORT_SYMBOL(drm_buddy_print);
76 
77 MODULE_DESCRIPTION("DRM-specific GPU Buddy Allocator Print Helpers");
78 MODULE_LICENSE("Dual MIT/GPL");
79