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