Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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 */
24void 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}
33EXPORT_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 */
41void drm_buddy_print(struct gpu_buddy *mm, struct drm_printer *p)
42{
43 int order;
44
45 drm_printf(p, "chunk_size: %lluKiB, total: %lluMiB, free: %lluMiB, clear_free: %lluMiB\n",
46 mm->chunk_size >> 10, mm->size >> 20, mm->avail >> 20, mm->clear_avail >> 20);
47
48 for (order = mm->max_order; order >= 0; order--) {
49 struct gpu_buddy_block *block, *tmp;
50 struct rb_root *root;
51 u64 count = 0, free;
52 unsigned int tree;
53
54 for_each_free_tree(tree) {
55 root = &mm->free_trees[tree][order];
56
57 rbtree_postorder_for_each_entry_safe(block, tmp, root, rb) {
58 BUG_ON(!gpu_buddy_block_is_free(block));
59 count++;
60 }
61 }
62
63 drm_printf(p, "order-%2d ", order);
64
65 free = count * (mm->chunk_size << order);
66 if (free < SZ_1M)
67 drm_printf(p, "free: %8llu KiB", free >> 10);
68 else
69 drm_printf(p, "free: %8llu MiB", free >> 20);
70
71 drm_printf(p, ", blocks: %llu\n", count);
72 }
73}
74EXPORT_SYMBOL(drm_buddy_print);
75
76MODULE_DESCRIPTION("DRM-specific GPU Buddy Allocator Print Helpers");
77MODULE_LICENSE("Dual MIT/GPL");