1*2874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later 2ece4e512SSukadev Bhattiprolu /* 3ece4e512SSukadev Bhattiprolu * Copyright 2016-17 IBM Corp. 4ece4e512SSukadev Bhattiprolu */ 5ece4e512SSukadev Bhattiprolu 6ece4e512SSukadev Bhattiprolu #define pr_fmt(fmt) "vas: " fmt 7ece4e512SSukadev Bhattiprolu 8ece4e512SSukadev Bhattiprolu #include <linux/types.h> 9ece4e512SSukadev Bhattiprolu #include <linux/slab.h> 10ece4e512SSukadev Bhattiprolu #include <linux/debugfs.h> 11ece4e512SSukadev Bhattiprolu #include <linux/seq_file.h> 12ece4e512SSukadev Bhattiprolu #include "vas.h" 13ece4e512SSukadev Bhattiprolu 14ece4e512SSukadev Bhattiprolu static struct dentry *vas_debugfs; 15ece4e512SSukadev Bhattiprolu 16ece4e512SSukadev Bhattiprolu static char *cop_to_str(int cop) 17ece4e512SSukadev Bhattiprolu { 18ece4e512SSukadev Bhattiprolu switch (cop) { 19ece4e512SSukadev Bhattiprolu case VAS_COP_TYPE_FAULT: return "Fault"; 20ece4e512SSukadev Bhattiprolu case VAS_COP_TYPE_842: return "NX-842 Normal Priority"; 21ece4e512SSukadev Bhattiprolu case VAS_COP_TYPE_842_HIPRI: return "NX-842 High Priority"; 22ece4e512SSukadev Bhattiprolu case VAS_COP_TYPE_GZIP: return "NX-GZIP Normal Priority"; 23ece4e512SSukadev Bhattiprolu case VAS_COP_TYPE_GZIP_HIPRI: return "NX-GZIP High Priority"; 24ece4e512SSukadev Bhattiprolu case VAS_COP_TYPE_FTW: return "Fast Thread-wakeup"; 25ece4e512SSukadev Bhattiprolu default: return "Unknown"; 26ece4e512SSukadev Bhattiprolu } 27ece4e512SSukadev Bhattiprolu } 28ece4e512SSukadev Bhattiprolu 29267acedfSYangtao Li static int info_show(struct seq_file *s, void *private) 30ece4e512SSukadev Bhattiprolu { 31ece4e512SSukadev Bhattiprolu struct vas_window *window = s->private; 32ece4e512SSukadev Bhattiprolu 33ece4e512SSukadev Bhattiprolu mutex_lock(&vas_mutex); 34ece4e512SSukadev Bhattiprolu 35ece4e512SSukadev Bhattiprolu /* ensure window is not unmapped */ 36ece4e512SSukadev Bhattiprolu if (!window->hvwc_map) 37ece4e512SSukadev Bhattiprolu goto unlock; 38ece4e512SSukadev Bhattiprolu 39ece4e512SSukadev Bhattiprolu seq_printf(s, "Type: %s, %s\n", cop_to_str(window->cop), 40ece4e512SSukadev Bhattiprolu window->tx_win ? "Send" : "Receive"); 41ece4e512SSukadev Bhattiprolu seq_printf(s, "Pid : %d\n", window->pid); 42ece4e512SSukadev Bhattiprolu 43ece4e512SSukadev Bhattiprolu unlock: 44ece4e512SSukadev Bhattiprolu mutex_unlock(&vas_mutex); 45ece4e512SSukadev Bhattiprolu return 0; 46ece4e512SSukadev Bhattiprolu } 47ece4e512SSukadev Bhattiprolu 48267acedfSYangtao Li DEFINE_SHOW_ATTRIBUTE(info); 49ece4e512SSukadev Bhattiprolu 50ece4e512SSukadev Bhattiprolu static inline void print_reg(struct seq_file *s, struct vas_window *win, 51ece4e512SSukadev Bhattiprolu char *name, u32 reg) 52ece4e512SSukadev Bhattiprolu { 53ece4e512SSukadev Bhattiprolu seq_printf(s, "0x%016llx %s\n", read_hvwc_reg(win, name, reg), name); 54ece4e512SSukadev Bhattiprolu } 55ece4e512SSukadev Bhattiprolu 56267acedfSYangtao Li static int hvwc_show(struct seq_file *s, void *private) 57ece4e512SSukadev Bhattiprolu { 58ece4e512SSukadev Bhattiprolu struct vas_window *window = s->private; 59ece4e512SSukadev Bhattiprolu 60ece4e512SSukadev Bhattiprolu mutex_lock(&vas_mutex); 61ece4e512SSukadev Bhattiprolu 62ece4e512SSukadev Bhattiprolu /* ensure window is not unmapped */ 63ece4e512SSukadev Bhattiprolu if (!window->hvwc_map) 64ece4e512SSukadev Bhattiprolu goto unlock; 65ece4e512SSukadev Bhattiprolu 66ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(LPID)); 67ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(PID)); 68ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(XLATE_MSR)); 69ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(XLATE_LPCR)); 70ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(XLATE_CTL)); 71ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(AMR)); 72ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(SEIDR)); 73ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(FAULT_TX_WIN)); 74ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(OSU_INTR_SRC_RA)); 75ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(HV_INTR_SRC_RA)); 76ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(PSWID)); 77ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(LFIFO_BAR)); 78ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(LDATA_STAMP_CTL)); 79ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(LDMA_CACHE_CTL)); 80ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(LRFIFO_PUSH)); 81ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(CURR_MSG_COUNT)); 82ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(LNOTIFY_AFTER_COUNT)); 83ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(LRX_WCRED)); 84ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(LRX_WCRED_ADDER)); 85ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(TX_WCRED)); 86ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(TX_WCRED_ADDER)); 87ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(LFIFO_SIZE)); 88ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(WINCTL)); 89ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(WIN_STATUS)); 90ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(WIN_CTX_CACHING_CTL)); 91ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(TX_RSVD_BUF_COUNT)); 92ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(LRFIFO_WIN_PTR)); 93ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(LNOTIFY_CTL)); 94ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(LNOTIFY_PID)); 95ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(LNOTIFY_LPID)); 96ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(LNOTIFY_TID)); 97ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(LNOTIFY_SCOPE)); 98ece4e512SSukadev Bhattiprolu print_reg(s, window, VREG(NX_UTIL_ADDER)); 99ece4e512SSukadev Bhattiprolu unlock: 100ece4e512SSukadev Bhattiprolu mutex_unlock(&vas_mutex); 101ece4e512SSukadev Bhattiprolu return 0; 102ece4e512SSukadev Bhattiprolu } 103ece4e512SSukadev Bhattiprolu 104267acedfSYangtao Li DEFINE_SHOW_ATTRIBUTE(hvwc); 105ece4e512SSukadev Bhattiprolu 106ece4e512SSukadev Bhattiprolu void vas_window_free_dbgdir(struct vas_window *window) 107ece4e512SSukadev Bhattiprolu { 108ece4e512SSukadev Bhattiprolu if (window->dbgdir) { 109ece4e512SSukadev Bhattiprolu debugfs_remove_recursive(window->dbgdir); 110ece4e512SSukadev Bhattiprolu kfree(window->dbgname); 111ece4e512SSukadev Bhattiprolu window->dbgdir = NULL; 112ece4e512SSukadev Bhattiprolu window->dbgname = NULL; 113ece4e512SSukadev Bhattiprolu } 114ece4e512SSukadev Bhattiprolu } 115ece4e512SSukadev Bhattiprolu 116ece4e512SSukadev Bhattiprolu void vas_window_init_dbgdir(struct vas_window *window) 117ece4e512SSukadev Bhattiprolu { 118ece4e512SSukadev Bhattiprolu struct dentry *f, *d; 119ece4e512SSukadev Bhattiprolu 120ece4e512SSukadev Bhattiprolu if (!window->vinst->dbgdir) 121ece4e512SSukadev Bhattiprolu return; 122ece4e512SSukadev Bhattiprolu 123ece4e512SSukadev Bhattiprolu window->dbgname = kzalloc(16, GFP_KERNEL); 124ece4e512SSukadev Bhattiprolu if (!window->dbgname) 125ece4e512SSukadev Bhattiprolu return; 126ece4e512SSukadev Bhattiprolu 127ece4e512SSukadev Bhattiprolu snprintf(window->dbgname, 16, "w%d", window->winid); 128ece4e512SSukadev Bhattiprolu 129ece4e512SSukadev Bhattiprolu d = debugfs_create_dir(window->dbgname, window->vinst->dbgdir); 130ece4e512SSukadev Bhattiprolu if (IS_ERR(d)) 131ece4e512SSukadev Bhattiprolu goto free_name; 132ece4e512SSukadev Bhattiprolu 133ece4e512SSukadev Bhattiprolu window->dbgdir = d; 134ece4e512SSukadev Bhattiprolu 135ece4e512SSukadev Bhattiprolu f = debugfs_create_file("info", 0444, d, window, &info_fops); 136ece4e512SSukadev Bhattiprolu if (IS_ERR(f)) 137ece4e512SSukadev Bhattiprolu goto remove_dir; 138ece4e512SSukadev Bhattiprolu 139ece4e512SSukadev Bhattiprolu f = debugfs_create_file("hvwc", 0444, d, window, &hvwc_fops); 140ece4e512SSukadev Bhattiprolu if (IS_ERR(f)) 141ece4e512SSukadev Bhattiprolu goto remove_dir; 142ece4e512SSukadev Bhattiprolu 143ece4e512SSukadev Bhattiprolu return; 144ece4e512SSukadev Bhattiprolu 145ece4e512SSukadev Bhattiprolu remove_dir: 146ece4e512SSukadev Bhattiprolu debugfs_remove_recursive(window->dbgdir); 147ece4e512SSukadev Bhattiprolu window->dbgdir = NULL; 1481373cc31SSukadev Bhattiprolu 1491373cc31SSukadev Bhattiprolu free_name: 1501373cc31SSukadev Bhattiprolu kfree(window->dbgname); 1511373cc31SSukadev Bhattiprolu window->dbgname = NULL; 152ece4e512SSukadev Bhattiprolu } 153ece4e512SSukadev Bhattiprolu 154ece4e512SSukadev Bhattiprolu void vas_instance_init_dbgdir(struct vas_instance *vinst) 155ece4e512SSukadev Bhattiprolu { 156ece4e512SSukadev Bhattiprolu struct dentry *d; 157ece4e512SSukadev Bhattiprolu 15845ddea8aSSukadev Bhattiprolu vas_init_dbgdir(); 159ece4e512SSukadev Bhattiprolu if (!vas_debugfs) 160ece4e512SSukadev Bhattiprolu return; 161ece4e512SSukadev Bhattiprolu 162ece4e512SSukadev Bhattiprolu vinst->dbgname = kzalloc(16, GFP_KERNEL); 163ece4e512SSukadev Bhattiprolu if (!vinst->dbgname) 164ece4e512SSukadev Bhattiprolu return; 165ece4e512SSukadev Bhattiprolu 166ece4e512SSukadev Bhattiprolu snprintf(vinst->dbgname, 16, "v%d", vinst->vas_id); 167ece4e512SSukadev Bhattiprolu 168ece4e512SSukadev Bhattiprolu d = debugfs_create_dir(vinst->dbgname, vas_debugfs); 169ece4e512SSukadev Bhattiprolu if (IS_ERR(d)) 170ece4e512SSukadev Bhattiprolu goto free_name; 171ece4e512SSukadev Bhattiprolu 172ece4e512SSukadev Bhattiprolu vinst->dbgdir = d; 173ece4e512SSukadev Bhattiprolu return; 174ece4e512SSukadev Bhattiprolu 175ece4e512SSukadev Bhattiprolu free_name: 176ece4e512SSukadev Bhattiprolu kfree(vinst->dbgname); 177ece4e512SSukadev Bhattiprolu vinst->dbgname = NULL; 178ece4e512SSukadev Bhattiprolu vinst->dbgdir = NULL; 179ece4e512SSukadev Bhattiprolu } 180ece4e512SSukadev Bhattiprolu 18145ddea8aSSukadev Bhattiprolu /* 18245ddea8aSSukadev Bhattiprolu * Set up the "root" VAS debugfs dir. Return if we already set it up 18345ddea8aSSukadev Bhattiprolu * (or failed to) in an earlier instance of VAS. 18445ddea8aSSukadev Bhattiprolu */ 185ece4e512SSukadev Bhattiprolu void vas_init_dbgdir(void) 186ece4e512SSukadev Bhattiprolu { 18745ddea8aSSukadev Bhattiprolu static bool first_time = true; 18845ddea8aSSukadev Bhattiprolu 18945ddea8aSSukadev Bhattiprolu if (!first_time) 19045ddea8aSSukadev Bhattiprolu return; 19145ddea8aSSukadev Bhattiprolu 19245ddea8aSSukadev Bhattiprolu first_time = false; 193ece4e512SSukadev Bhattiprolu vas_debugfs = debugfs_create_dir("vas", NULL); 194ece4e512SSukadev Bhattiprolu if (IS_ERR(vas_debugfs)) 195ece4e512SSukadev Bhattiprolu vas_debugfs = NULL; 196ece4e512SSukadev Bhattiprolu } 197