cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mpt3sas_debugfs.c (3747B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Debugfs interface Support for MPT (Message Passing Technology) based
      4 * controllers.
      5 *
      6 * Copyright (C) 2020  Broadcom Inc.
      7 *
      8 * Authors: Broadcom Inc.
      9 * Sreekanth Reddy  <sreekanth.reddy@broadcom.com>
     10 * Suganath Prabu <suganath-prabu.subramani@broadcom.com>
     11 *
     12 * Send feedback to : MPT-FusionLinux.pdl@broadcom.com)
     13 *
     14 **/
     15
     16#include <linux/kernel.h>
     17#include <linux/types.h>
     18#include <linux/pci.h>
     19#include <linux/interrupt.h>
     20#include <linux/compat.h>
     21#include <linux/uio.h>
     22
     23#include <scsi/scsi.h>
     24#include <scsi/scsi_device.h>
     25#include <scsi/scsi_host.h>
     26#include "mpt3sas_base.h"
     27#include <linux/debugfs.h>
     28
     29static struct dentry *mpt3sas_debugfs_root;
     30
     31/*
     32 * _debugfs_iocdump_read - copy ioc dump from debugfs buffer
     33 * @filep:	File Pointer
     34 * @ubuf:	Buffer to fill data
     35 * @cnt:	Length of the buffer
     36 * @ppos:	Offset in the file
     37 */
     38
     39static ssize_t
     40_debugfs_iocdump_read(struct file *filp, char __user *ubuf, size_t cnt,
     41	loff_t *ppos)
     42
     43{
     44	struct mpt3sas_debugfs_buffer *debug = filp->private_data;
     45
     46	if (!debug || !debug->buf)
     47		return 0;
     48
     49	return simple_read_from_buffer(ubuf, cnt, ppos, debug->buf, debug->len);
     50}
     51
     52/*
     53 * _debugfs_iocdump_open :	open the ioc_dump debugfs attribute file
     54 */
     55static int
     56_debugfs_iocdump_open(struct inode *inode, struct file *file)
     57{
     58	struct MPT3SAS_ADAPTER *ioc = inode->i_private;
     59	struct mpt3sas_debugfs_buffer *debug;
     60
     61	debug = kzalloc(sizeof(struct mpt3sas_debugfs_buffer), GFP_KERNEL);
     62	if (!debug)
     63		return -ENOMEM;
     64
     65	debug->buf = (void *)ioc;
     66	debug->len = sizeof(struct MPT3SAS_ADAPTER);
     67	file->private_data = debug;
     68	return 0;
     69}
     70
     71/*
     72 * _debugfs_iocdump_release :	release the ioc_dump debugfs attribute
     73 * @inode: inode structure to the corresponds device
     74 * @file: File pointer
     75 */
     76static int
     77_debugfs_iocdump_release(struct inode *inode, struct file *file)
     78{
     79	struct mpt3sas_debugfs_buffer *debug = file->private_data;
     80
     81	if (!debug)
     82		return 0;
     83
     84	file->private_data = NULL;
     85	kfree(debug);
     86	return 0;
     87}
     88
     89static const struct file_operations mpt3sas_debugfs_iocdump_fops = {
     90	.owner		= THIS_MODULE,
     91	.open           = _debugfs_iocdump_open,
     92	.read           = _debugfs_iocdump_read,
     93	.release        = _debugfs_iocdump_release,
     94};
     95
     96/*
     97 * mpt3sas_init_debugfs :	Create debugfs root for mpt3sas driver
     98 */
     99void mpt3sas_init_debugfs(void)
    100{
    101	mpt3sas_debugfs_root = debugfs_create_dir("mpt3sas", NULL);
    102	if (!mpt3sas_debugfs_root)
    103		pr_info("mpt3sas: Cannot create debugfs root\n");
    104}
    105
    106/*
    107 * mpt3sas_exit_debugfs :	Remove debugfs root for mpt3sas driver
    108 */
    109void mpt3sas_exit_debugfs(void)
    110{
    111	debugfs_remove_recursive(mpt3sas_debugfs_root);
    112}
    113
    114/*
    115 * mpt3sas_setup_debugfs :	Setup debugfs per HBA adapter
    116 * ioc:				MPT3SAS_ADAPTER object
    117 */
    118void
    119mpt3sas_setup_debugfs(struct MPT3SAS_ADAPTER *ioc)
    120{
    121	char name[64];
    122
    123	snprintf(name, sizeof(name), "scsi_host%d", ioc->shost->host_no);
    124	if (!ioc->debugfs_root) {
    125		ioc->debugfs_root =
    126		    debugfs_create_dir(name, mpt3sas_debugfs_root);
    127		if (!ioc->debugfs_root) {
    128			dev_err(&ioc->pdev->dev,
    129			    "Cannot create per adapter debugfs directory\n");
    130			return;
    131		}
    132	}
    133
    134	snprintf(name, sizeof(name), "ioc_dump");
    135	ioc->ioc_dump =	debugfs_create_file(name, 0444,
    136	    ioc->debugfs_root, ioc, &mpt3sas_debugfs_iocdump_fops);
    137	if (!ioc->ioc_dump) {
    138		dev_err(&ioc->pdev->dev,
    139		    "Cannot create ioc_dump debugfs file\n");
    140		debugfs_remove(ioc->debugfs_root);
    141		return;
    142	}
    143
    144	snprintf(name, sizeof(name), "host_recovery");
    145	debugfs_create_u8(name, 0444, ioc->debugfs_root, &ioc->shost_recovery);
    146
    147}
    148
    149/*
    150 * mpt3sas_destroy_debugfs :	Destroy debugfs per HBA adapter
    151 * @ioc:	MPT3SAS_ADAPTER object
    152 */
    153void mpt3sas_destroy_debugfs(struct MPT3SAS_ADAPTER *ioc)
    154{
    155	debugfs_remove_recursive(ioc->debugfs_root);
    156}
    157