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 © 2024 Intel Corporation
4 */
5
6#include <linux/atomic.h>
7
8#include <drm/drm_print.h>
9
10#include "xe_gt.h"
11#include "xe_gt_stats.h"
12
13/**
14 * xe_gt_stats_incr - Increments the specified stats counter
15 * @gt: GT structure
16 * @id: xe_gt_stats_id type id that needs to be incremented
17 * @incr: value to be incremented with
18 *
19 * Increments the specified stats counter.
20 */
21void xe_gt_stats_incr(struct xe_gt *gt, const enum xe_gt_stats_id id, int incr)
22{
23 if (id >= __XE_GT_STATS_NUM_IDS)
24 return;
25
26 atomic64_add(incr, >->stats.counters[id]);
27}
28
29#define DEF_STAT_STR(ID, name) [XE_GT_STATS_ID_##ID] = name
30
31static const char *const stat_description[__XE_GT_STATS_NUM_IDS] = {
32 DEF_STAT_STR(SVM_PAGEFAULT_COUNT, "svm_pagefault_count"),
33 DEF_STAT_STR(TLB_INVAL, "tlb_inval_count"),
34 DEF_STAT_STR(SVM_TLB_INVAL_COUNT, "svm_tlb_inval_count"),
35 DEF_STAT_STR(SVM_TLB_INVAL_US, "svm_tlb_inval_us"),
36 DEF_STAT_STR(VMA_PAGEFAULT_COUNT, "vma_pagefault_count"),
37 DEF_STAT_STR(VMA_PAGEFAULT_KB, "vma_pagefault_kb"),
38 DEF_STAT_STR(SVM_4K_PAGEFAULT_COUNT, "svm_4K_pagefault_count"),
39 DEF_STAT_STR(SVM_64K_PAGEFAULT_COUNT, "svm_64K_pagefault_count"),
40 DEF_STAT_STR(SVM_2M_PAGEFAULT_COUNT, "svm_2M_pagefault_count"),
41 DEF_STAT_STR(SVM_4K_VALID_PAGEFAULT_COUNT, "svm_4K_valid_pagefault_count"),
42 DEF_STAT_STR(SVM_64K_VALID_PAGEFAULT_COUNT, "svm_64K_valid_pagefault_count"),
43 DEF_STAT_STR(SVM_2M_VALID_PAGEFAULT_COUNT, "svm_2M_valid_pagefault_count"),
44 DEF_STAT_STR(SVM_4K_PAGEFAULT_US, "svm_4K_pagefault_us"),
45 DEF_STAT_STR(SVM_64K_PAGEFAULT_US, "svm_64K_pagefault_us"),
46 DEF_STAT_STR(SVM_2M_PAGEFAULT_US, "svm_2M_pagefault_us"),
47 DEF_STAT_STR(SVM_4K_MIGRATE_COUNT, "svm_4K_migrate_count"),
48 DEF_STAT_STR(SVM_64K_MIGRATE_COUNT, "svm_64K_migrate_count"),
49 DEF_STAT_STR(SVM_2M_MIGRATE_COUNT, "svm_2M_migrate_count"),
50 DEF_STAT_STR(SVM_4K_MIGRATE_US, "svm_4K_migrate_us"),
51 DEF_STAT_STR(SVM_64K_MIGRATE_US, "svm_64K_migrate_us"),
52 DEF_STAT_STR(SVM_2M_MIGRATE_US, "svm_2M_migrate_us"),
53 DEF_STAT_STR(SVM_DEVICE_COPY_US, "svm_device_copy_us"),
54 DEF_STAT_STR(SVM_4K_DEVICE_COPY_US, "svm_4K_device_copy_us"),
55 DEF_STAT_STR(SVM_64K_DEVICE_COPY_US, "svm_64K_device_copy_us"),
56 DEF_STAT_STR(SVM_2M_DEVICE_COPY_US, "svm_2M_device_copy_us"),
57 DEF_STAT_STR(SVM_CPU_COPY_US, "svm_cpu_copy_us"),
58 DEF_STAT_STR(SVM_4K_CPU_COPY_US, "svm_4K_cpu_copy_us"),
59 DEF_STAT_STR(SVM_64K_CPU_COPY_US, "svm_64K_cpu_copy_us"),
60 DEF_STAT_STR(SVM_2M_CPU_COPY_US, "svm_2M_cpu_copy_us"),
61 DEF_STAT_STR(SVM_DEVICE_COPY_KB, "svm_device_copy_kb"),
62 DEF_STAT_STR(SVM_CPU_COPY_KB, "svm_cpu_copy_kb"),
63 DEF_STAT_STR(SVM_4K_GET_PAGES_US, "svm_4K_get_pages_us"),
64 DEF_STAT_STR(SVM_64K_GET_PAGES_US, "svm_64K_get_pages_us"),
65 DEF_STAT_STR(SVM_2M_GET_PAGES_US, "svm_2M_get_pages_us"),
66 DEF_STAT_STR(SVM_4K_BIND_US, "svm_4K_bind_us"),
67 DEF_STAT_STR(SVM_64K_BIND_US, "svm_64K_bind_us"),
68 DEF_STAT_STR(SVM_2M_BIND_US, "svm_2M_bind_us"),
69};
70
71/**
72 * xe_gt_stats_print_info - Print the GT stats
73 * @gt: GT structure
74 * @p: drm_printer where it will be printed out.
75 *
76 * This prints out all the available GT stats.
77 */
78int xe_gt_stats_print_info(struct xe_gt *gt, struct drm_printer *p)
79{
80 enum xe_gt_stats_id id;
81
82 for (id = 0; id < __XE_GT_STATS_NUM_IDS; ++id)
83 drm_printf(p, "%s: %lld\n", stat_description[id],
84 atomic64_read(>->stats.counters[id]));
85
86 return 0;
87}
88
89/**
90 * xe_gt_stats_clear - Clear the GT stats
91 * @gt: GT structure
92 *
93 * This clear (zeros) all the available GT stats.
94 */
95void xe_gt_stats_clear(struct xe_gt *gt)
96{
97 int id;
98
99 for (id = 0; id < ARRAY_SIZE(gt->stats.counters); ++id)
100 atomic64_set(>->stats.counters[id], 0);
101}