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