162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2016-17 IBM Corp. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#define pr_fmt(fmt) "vas: " fmt 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/types.h> 962306a36Sopenharmony_ci#include <linux/slab.h> 1062306a36Sopenharmony_ci#include <linux/debugfs.h> 1162306a36Sopenharmony_ci#include <linux/seq_file.h> 1262306a36Sopenharmony_ci#include <asm/vas.h> 1362306a36Sopenharmony_ci#include "vas.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cistatic struct dentry *vas_debugfs; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cistatic char *cop_to_str(int cop) 1862306a36Sopenharmony_ci{ 1962306a36Sopenharmony_ci switch (cop) { 2062306a36Sopenharmony_ci case VAS_COP_TYPE_FAULT: return "Fault"; 2162306a36Sopenharmony_ci case VAS_COP_TYPE_842: return "NX-842 Normal Priority"; 2262306a36Sopenharmony_ci case VAS_COP_TYPE_842_HIPRI: return "NX-842 High Priority"; 2362306a36Sopenharmony_ci case VAS_COP_TYPE_GZIP: return "NX-GZIP Normal Priority"; 2462306a36Sopenharmony_ci case VAS_COP_TYPE_GZIP_HIPRI: return "NX-GZIP High Priority"; 2562306a36Sopenharmony_ci case VAS_COP_TYPE_FTW: return "Fast Thread-wakeup"; 2662306a36Sopenharmony_ci default: return "Unknown"; 2762306a36Sopenharmony_ci } 2862306a36Sopenharmony_ci} 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistatic int info_show(struct seq_file *s, void *private) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci struct pnv_vas_window *window = s->private; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci mutex_lock(&vas_mutex); 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci /* ensure window is not unmapped */ 3762306a36Sopenharmony_ci if (!window->hvwc_map) 3862306a36Sopenharmony_ci goto unlock; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci seq_printf(s, "Type: %s, %s\n", cop_to_str(window->vas_win.cop), 4162306a36Sopenharmony_ci window->tx_win ? "Send" : "Receive"); 4262306a36Sopenharmony_ci seq_printf(s, "Pid : %d\n", vas_window_pid(&window->vas_win)); 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ciunlock: 4562306a36Sopenharmony_ci mutex_unlock(&vas_mutex); 4662306a36Sopenharmony_ci return 0; 4762306a36Sopenharmony_ci} 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(info); 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistatic inline void print_reg(struct seq_file *s, struct pnv_vas_window *win, 5262306a36Sopenharmony_ci char *name, u32 reg) 5362306a36Sopenharmony_ci{ 5462306a36Sopenharmony_ci seq_printf(s, "0x%016llx %s\n", read_hvwc_reg(win, name, reg), name); 5562306a36Sopenharmony_ci} 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_cistatic int hvwc_show(struct seq_file *s, void *private) 5862306a36Sopenharmony_ci{ 5962306a36Sopenharmony_ci struct pnv_vas_window *window = s->private; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci mutex_lock(&vas_mutex); 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci /* ensure window is not unmapped */ 6462306a36Sopenharmony_ci if (!window->hvwc_map) 6562306a36Sopenharmony_ci goto unlock; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci print_reg(s, window, VREG(LPID)); 6862306a36Sopenharmony_ci print_reg(s, window, VREG(PID)); 6962306a36Sopenharmony_ci print_reg(s, window, VREG(XLATE_MSR)); 7062306a36Sopenharmony_ci print_reg(s, window, VREG(XLATE_LPCR)); 7162306a36Sopenharmony_ci print_reg(s, window, VREG(XLATE_CTL)); 7262306a36Sopenharmony_ci print_reg(s, window, VREG(AMR)); 7362306a36Sopenharmony_ci print_reg(s, window, VREG(SEIDR)); 7462306a36Sopenharmony_ci print_reg(s, window, VREG(FAULT_TX_WIN)); 7562306a36Sopenharmony_ci print_reg(s, window, VREG(OSU_INTR_SRC_RA)); 7662306a36Sopenharmony_ci print_reg(s, window, VREG(HV_INTR_SRC_RA)); 7762306a36Sopenharmony_ci print_reg(s, window, VREG(PSWID)); 7862306a36Sopenharmony_ci print_reg(s, window, VREG(LFIFO_BAR)); 7962306a36Sopenharmony_ci print_reg(s, window, VREG(LDATA_STAMP_CTL)); 8062306a36Sopenharmony_ci print_reg(s, window, VREG(LDMA_CACHE_CTL)); 8162306a36Sopenharmony_ci print_reg(s, window, VREG(LRFIFO_PUSH)); 8262306a36Sopenharmony_ci print_reg(s, window, VREG(CURR_MSG_COUNT)); 8362306a36Sopenharmony_ci print_reg(s, window, VREG(LNOTIFY_AFTER_COUNT)); 8462306a36Sopenharmony_ci print_reg(s, window, VREG(LRX_WCRED)); 8562306a36Sopenharmony_ci print_reg(s, window, VREG(LRX_WCRED_ADDER)); 8662306a36Sopenharmony_ci print_reg(s, window, VREG(TX_WCRED)); 8762306a36Sopenharmony_ci print_reg(s, window, VREG(TX_WCRED_ADDER)); 8862306a36Sopenharmony_ci print_reg(s, window, VREG(LFIFO_SIZE)); 8962306a36Sopenharmony_ci print_reg(s, window, VREG(WINCTL)); 9062306a36Sopenharmony_ci print_reg(s, window, VREG(WIN_STATUS)); 9162306a36Sopenharmony_ci print_reg(s, window, VREG(WIN_CTX_CACHING_CTL)); 9262306a36Sopenharmony_ci print_reg(s, window, VREG(TX_RSVD_BUF_COUNT)); 9362306a36Sopenharmony_ci print_reg(s, window, VREG(LRFIFO_WIN_PTR)); 9462306a36Sopenharmony_ci print_reg(s, window, VREG(LNOTIFY_CTL)); 9562306a36Sopenharmony_ci print_reg(s, window, VREG(LNOTIFY_PID)); 9662306a36Sopenharmony_ci print_reg(s, window, VREG(LNOTIFY_LPID)); 9762306a36Sopenharmony_ci print_reg(s, window, VREG(LNOTIFY_TID)); 9862306a36Sopenharmony_ci print_reg(s, window, VREG(LNOTIFY_SCOPE)); 9962306a36Sopenharmony_ci print_reg(s, window, VREG(NX_UTIL_ADDER)); 10062306a36Sopenharmony_ciunlock: 10162306a36Sopenharmony_ci mutex_unlock(&vas_mutex); 10262306a36Sopenharmony_ci return 0; 10362306a36Sopenharmony_ci} 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ciDEFINE_SHOW_ATTRIBUTE(hvwc); 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_civoid vas_window_free_dbgdir(struct pnv_vas_window *pnv_win) 10862306a36Sopenharmony_ci{ 10962306a36Sopenharmony_ci struct vas_window *window = &pnv_win->vas_win; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci if (window->dbgdir) { 11262306a36Sopenharmony_ci debugfs_remove_recursive(window->dbgdir); 11362306a36Sopenharmony_ci kfree(window->dbgname); 11462306a36Sopenharmony_ci window->dbgdir = NULL; 11562306a36Sopenharmony_ci window->dbgname = NULL; 11662306a36Sopenharmony_ci } 11762306a36Sopenharmony_ci} 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_civoid vas_window_init_dbgdir(struct pnv_vas_window *window) 12062306a36Sopenharmony_ci{ 12162306a36Sopenharmony_ci struct dentry *d; 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci if (!window->vinst->dbgdir) 12462306a36Sopenharmony_ci return; 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_ci window->vas_win.dbgname = kzalloc(16, GFP_KERNEL); 12762306a36Sopenharmony_ci if (!window->vas_win.dbgname) 12862306a36Sopenharmony_ci return; 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci snprintf(window->vas_win.dbgname, 16, "w%d", window->vas_win.winid); 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci d = debugfs_create_dir(window->vas_win.dbgname, window->vinst->dbgdir); 13362306a36Sopenharmony_ci window->vas_win.dbgdir = d; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci debugfs_create_file("info", 0444, d, window, &info_fops); 13662306a36Sopenharmony_ci debugfs_create_file("hvwc", 0444, d, window, &hvwc_fops); 13762306a36Sopenharmony_ci} 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_civoid vas_instance_init_dbgdir(struct vas_instance *vinst) 14062306a36Sopenharmony_ci{ 14162306a36Sopenharmony_ci struct dentry *d; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci vas_init_dbgdir(); 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci vinst->dbgname = kzalloc(16, GFP_KERNEL); 14662306a36Sopenharmony_ci if (!vinst->dbgname) 14762306a36Sopenharmony_ci return; 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_ci snprintf(vinst->dbgname, 16, "v%d", vinst->vas_id); 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_ci d = debugfs_create_dir(vinst->dbgname, vas_debugfs); 15262306a36Sopenharmony_ci vinst->dbgdir = d; 15362306a36Sopenharmony_ci} 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci/* 15662306a36Sopenharmony_ci * Set up the "root" VAS debugfs dir. Return if we already set it up 15762306a36Sopenharmony_ci * (or failed to) in an earlier instance of VAS. 15862306a36Sopenharmony_ci */ 15962306a36Sopenharmony_civoid vas_init_dbgdir(void) 16062306a36Sopenharmony_ci{ 16162306a36Sopenharmony_ci static bool first_time = true; 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci if (!first_time) 16462306a36Sopenharmony_ci return; 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci first_time = false; 16762306a36Sopenharmony_ci vas_debugfs = debugfs_create_dir("vas", NULL); 16862306a36Sopenharmony_ci} 169