162306a36Sopenharmony_ci/* Broadcom NetXtreme-C/E network driver. 262306a36Sopenharmony_ci * 362306a36Sopenharmony_ci * Copyright (c) 2017-2018 Broadcom Limited 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * This program is free software; you can redistribute it and/or modify 662306a36Sopenharmony_ci * it under the terms of the GNU General Public License as published by 762306a36Sopenharmony_ci * the Free Software Foundation. 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/debugfs.h> 1162306a36Sopenharmony_ci#include <linux/module.h> 1262306a36Sopenharmony_ci#include <linux/pci.h> 1362306a36Sopenharmony_ci#include "bnxt_hsi.h" 1462306a36Sopenharmony_ci#include <linux/dim.h> 1562306a36Sopenharmony_ci#include "bnxt.h" 1662306a36Sopenharmony_ci#include "bnxt_debugfs.h" 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cistatic struct dentry *bnxt_debug_mnt; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cistatic ssize_t debugfs_dim_read(struct file *filep, 2162306a36Sopenharmony_ci char __user *buffer, 2262306a36Sopenharmony_ci size_t count, loff_t *ppos) 2362306a36Sopenharmony_ci{ 2462306a36Sopenharmony_ci struct dim *dim = filep->private_data; 2562306a36Sopenharmony_ci int len; 2662306a36Sopenharmony_ci char *buf; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci if (*ppos) 2962306a36Sopenharmony_ci return 0; 3062306a36Sopenharmony_ci if (!dim) 3162306a36Sopenharmony_ci return -ENODEV; 3262306a36Sopenharmony_ci buf = kasprintf(GFP_KERNEL, 3362306a36Sopenharmony_ci "state = %d\n" \ 3462306a36Sopenharmony_ci "profile_ix = %d\n" \ 3562306a36Sopenharmony_ci "mode = %d\n" \ 3662306a36Sopenharmony_ci "tune_state = %d\n" \ 3762306a36Sopenharmony_ci "steps_right = %d\n" \ 3862306a36Sopenharmony_ci "steps_left = %d\n" \ 3962306a36Sopenharmony_ci "tired = %d\n", 4062306a36Sopenharmony_ci dim->state, 4162306a36Sopenharmony_ci dim->profile_ix, 4262306a36Sopenharmony_ci dim->mode, 4362306a36Sopenharmony_ci dim->tune_state, 4462306a36Sopenharmony_ci dim->steps_right, 4562306a36Sopenharmony_ci dim->steps_left, 4662306a36Sopenharmony_ci dim->tired); 4762306a36Sopenharmony_ci if (!buf) 4862306a36Sopenharmony_ci return -ENOMEM; 4962306a36Sopenharmony_ci if (count < strlen(buf)) { 5062306a36Sopenharmony_ci kfree(buf); 5162306a36Sopenharmony_ci return -ENOSPC; 5262306a36Sopenharmony_ci } 5362306a36Sopenharmony_ci len = simple_read_from_buffer(buffer, count, ppos, buf, strlen(buf)); 5462306a36Sopenharmony_ci kfree(buf); 5562306a36Sopenharmony_ci return len; 5662306a36Sopenharmony_ci} 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_cistatic const struct file_operations debugfs_dim_fops = { 5962306a36Sopenharmony_ci .owner = THIS_MODULE, 6062306a36Sopenharmony_ci .open = simple_open, 6162306a36Sopenharmony_ci .read = debugfs_dim_read, 6262306a36Sopenharmony_ci}; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistatic void debugfs_dim_ring_init(struct dim *dim, int ring_idx, 6562306a36Sopenharmony_ci struct dentry *dd) 6662306a36Sopenharmony_ci{ 6762306a36Sopenharmony_ci static char qname[16]; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_ci snprintf(qname, 10, "%d", ring_idx); 7062306a36Sopenharmony_ci debugfs_create_file(qname, 0600, dd, dim, &debugfs_dim_fops); 7162306a36Sopenharmony_ci} 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_civoid bnxt_debug_dev_init(struct bnxt *bp) 7462306a36Sopenharmony_ci{ 7562306a36Sopenharmony_ci const char *pname = pci_name(bp->pdev); 7662306a36Sopenharmony_ci struct dentry *dir; 7762306a36Sopenharmony_ci int i; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci bp->debugfs_pdev = debugfs_create_dir(pname, bnxt_debug_mnt); 8062306a36Sopenharmony_ci dir = debugfs_create_dir("dim", bp->debugfs_pdev); 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci /* create files for each rx ring */ 8362306a36Sopenharmony_ci for (i = 0; i < bp->cp_nr_rings; i++) { 8462306a36Sopenharmony_ci struct bnxt_cp_ring_info *cpr = &bp->bnapi[i]->cp_ring; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci if (cpr && bp->bnapi[i]->rx_ring) 8762306a36Sopenharmony_ci debugfs_dim_ring_init(&cpr->dim, i, dir); 8862306a36Sopenharmony_ci } 8962306a36Sopenharmony_ci} 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_civoid bnxt_debug_dev_exit(struct bnxt *bp) 9262306a36Sopenharmony_ci{ 9362306a36Sopenharmony_ci if (bp) { 9462306a36Sopenharmony_ci debugfs_remove_recursive(bp->debugfs_pdev); 9562306a36Sopenharmony_ci bp->debugfs_pdev = NULL; 9662306a36Sopenharmony_ci } 9762306a36Sopenharmony_ci} 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_civoid bnxt_debug_init(void) 10062306a36Sopenharmony_ci{ 10162306a36Sopenharmony_ci bnxt_debug_mnt = debugfs_create_dir("bnxt_en", NULL); 10262306a36Sopenharmony_ci} 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_civoid bnxt_debug_exit(void) 10562306a36Sopenharmony_ci{ 10662306a36Sopenharmony_ci debugfs_remove_recursive(bnxt_debug_mnt); 10762306a36Sopenharmony_ci} 108