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

debugfs.c (5967B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Debugfs support for hosts and cards
      4 *
      5 * Copyright (C) 2008 Atmel Corporation
      6 */
      7#include <linux/moduleparam.h>
      8#include <linux/export.h>
      9#include <linux/debugfs.h>
     10#include <linux/fs.h>
     11#include <linux/seq_file.h>
     12#include <linux/slab.h>
     13#include <linux/stat.h>
     14#include <linux/fault-inject.h>
     15
     16#include <linux/mmc/card.h>
     17#include <linux/mmc/host.h>
     18
     19#include "core.h"
     20#include "card.h"
     21#include "host.h"
     22#include "mmc_ops.h"
     23
     24#ifdef CONFIG_FAIL_MMC_REQUEST
     25
     26static DECLARE_FAULT_ATTR(fail_default_attr);
     27static char *fail_request;
     28module_param(fail_request, charp, 0);
     29MODULE_PARM_DESC(fail_request, "default fault injection attributes");
     30
     31#endif /* CONFIG_FAIL_MMC_REQUEST */
     32
     33/* The debugfs functions are optimized away when CONFIG_DEBUG_FS isn't set. */
     34static int mmc_ios_show(struct seq_file *s, void *data)
     35{
     36	static const char *vdd_str[] = {
     37		[8]	= "2.0",
     38		[9]	= "2.1",
     39		[10]	= "2.2",
     40		[11]	= "2.3",
     41		[12]	= "2.4",
     42		[13]	= "2.5",
     43		[14]	= "2.6",
     44		[15]	= "2.7",
     45		[16]	= "2.8",
     46		[17]	= "2.9",
     47		[18]	= "3.0",
     48		[19]	= "3.1",
     49		[20]	= "3.2",
     50		[21]	= "3.3",
     51		[22]	= "3.4",
     52		[23]	= "3.5",
     53		[24]	= "3.6",
     54	};
     55	struct mmc_host	*host = s->private;
     56	struct mmc_ios	*ios = &host->ios;
     57	const char *str;
     58
     59	seq_printf(s, "clock:\t\t%u Hz\n", ios->clock);
     60	if (host->actual_clock)
     61		seq_printf(s, "actual clock:\t%u Hz\n", host->actual_clock);
     62	seq_printf(s, "vdd:\t\t%u ", ios->vdd);
     63	if ((1 << ios->vdd) & MMC_VDD_165_195)
     64		seq_printf(s, "(1.65 - 1.95 V)\n");
     65	else if (ios->vdd < (ARRAY_SIZE(vdd_str) - 1)
     66			&& vdd_str[ios->vdd] && vdd_str[ios->vdd + 1])
     67		seq_printf(s, "(%s ~ %s V)\n", vdd_str[ios->vdd],
     68				vdd_str[ios->vdd + 1]);
     69	else
     70		seq_printf(s, "(invalid)\n");
     71
     72	switch (ios->bus_mode) {
     73	case MMC_BUSMODE_OPENDRAIN:
     74		str = "open drain";
     75		break;
     76	case MMC_BUSMODE_PUSHPULL:
     77		str = "push-pull";
     78		break;
     79	default:
     80		str = "invalid";
     81		break;
     82	}
     83	seq_printf(s, "bus mode:\t%u (%s)\n", ios->bus_mode, str);
     84
     85	switch (ios->chip_select) {
     86	case MMC_CS_DONTCARE:
     87		str = "don't care";
     88		break;
     89	case MMC_CS_HIGH:
     90		str = "active high";
     91		break;
     92	case MMC_CS_LOW:
     93		str = "active low";
     94		break;
     95	default:
     96		str = "invalid";
     97		break;
     98	}
     99	seq_printf(s, "chip select:\t%u (%s)\n", ios->chip_select, str);
    100
    101	switch (ios->power_mode) {
    102	case MMC_POWER_OFF:
    103		str = "off";
    104		break;
    105	case MMC_POWER_UP:
    106		str = "up";
    107		break;
    108	case MMC_POWER_ON:
    109		str = "on";
    110		break;
    111	default:
    112		str = "invalid";
    113		break;
    114	}
    115	seq_printf(s, "power mode:\t%u (%s)\n", ios->power_mode, str);
    116	seq_printf(s, "bus width:\t%u (%u bits)\n",
    117			ios->bus_width, 1 << ios->bus_width);
    118
    119	switch (ios->timing) {
    120	case MMC_TIMING_LEGACY:
    121		str = "legacy";
    122		break;
    123	case MMC_TIMING_MMC_HS:
    124		str = "mmc high-speed";
    125		break;
    126	case MMC_TIMING_SD_HS:
    127		str = "sd high-speed";
    128		break;
    129	case MMC_TIMING_UHS_SDR12:
    130		str = "sd uhs SDR12";
    131		break;
    132	case MMC_TIMING_UHS_SDR25:
    133		str = "sd uhs SDR25";
    134		break;
    135	case MMC_TIMING_UHS_SDR50:
    136		str = "sd uhs SDR50";
    137		break;
    138	case MMC_TIMING_UHS_SDR104:
    139		str = "sd uhs SDR104";
    140		break;
    141	case MMC_TIMING_UHS_DDR50:
    142		str = "sd uhs DDR50";
    143		break;
    144	case MMC_TIMING_MMC_DDR52:
    145		str = "mmc DDR52";
    146		break;
    147	case MMC_TIMING_MMC_HS200:
    148		str = "mmc HS200";
    149		break;
    150	case MMC_TIMING_MMC_HS400:
    151		str = mmc_card_hs400es(host->card) ?
    152			"mmc HS400 enhanced strobe" : "mmc HS400";
    153		break;
    154	default:
    155		str = "invalid";
    156		break;
    157	}
    158	seq_printf(s, "timing spec:\t%u (%s)\n", ios->timing, str);
    159
    160	switch (ios->signal_voltage) {
    161	case MMC_SIGNAL_VOLTAGE_330:
    162		str = "3.30 V";
    163		break;
    164	case MMC_SIGNAL_VOLTAGE_180:
    165		str = "1.80 V";
    166		break;
    167	case MMC_SIGNAL_VOLTAGE_120:
    168		str = "1.20 V";
    169		break;
    170	default:
    171		str = "invalid";
    172		break;
    173	}
    174	seq_printf(s, "signal voltage:\t%u (%s)\n", ios->signal_voltage, str);
    175
    176	switch (ios->drv_type) {
    177	case MMC_SET_DRIVER_TYPE_A:
    178		str = "driver type A";
    179		break;
    180	case MMC_SET_DRIVER_TYPE_B:
    181		str = "driver type B";
    182		break;
    183	case MMC_SET_DRIVER_TYPE_C:
    184		str = "driver type C";
    185		break;
    186	case MMC_SET_DRIVER_TYPE_D:
    187		str = "driver type D";
    188		break;
    189	default:
    190		str = "invalid";
    191		break;
    192	}
    193	seq_printf(s, "driver type:\t%u (%s)\n", ios->drv_type, str);
    194
    195	return 0;
    196}
    197DEFINE_SHOW_ATTRIBUTE(mmc_ios);
    198
    199static int mmc_clock_opt_get(void *data, u64 *val)
    200{
    201	struct mmc_host *host = data;
    202
    203	*val = host->ios.clock;
    204
    205	return 0;
    206}
    207
    208static int mmc_clock_opt_set(void *data, u64 val)
    209{
    210	struct mmc_host *host = data;
    211
    212	/* We need this check due to input value is u64 */
    213	if (val != 0 && (val > host->f_max || val < host->f_min))
    214		return -EINVAL;
    215
    216	mmc_claim_host(host);
    217	mmc_set_clock(host, (unsigned int) val);
    218	mmc_release_host(host);
    219
    220	return 0;
    221}
    222
    223DEFINE_DEBUGFS_ATTRIBUTE(mmc_clock_fops, mmc_clock_opt_get, mmc_clock_opt_set,
    224	"%llu\n");
    225
    226void mmc_add_host_debugfs(struct mmc_host *host)
    227{
    228	struct dentry *root;
    229
    230	root = debugfs_create_dir(mmc_hostname(host), NULL);
    231	host->debugfs_root = root;
    232
    233	debugfs_create_file("ios", S_IRUSR, root, host, &mmc_ios_fops);
    234	debugfs_create_x32("caps", S_IRUSR, root, &host->caps);
    235	debugfs_create_x32("caps2", S_IRUSR, root, &host->caps2);
    236	debugfs_create_file_unsafe("clock", S_IRUSR | S_IWUSR, root, host,
    237				   &mmc_clock_fops);
    238
    239#ifdef CONFIG_FAIL_MMC_REQUEST
    240	if (fail_request)
    241		setup_fault_attr(&fail_default_attr, fail_request);
    242	host->fail_mmc_request = fail_default_attr;
    243	fault_create_debugfs_attr("fail_mmc_request", root,
    244				  &host->fail_mmc_request);
    245#endif
    246}
    247
    248void mmc_remove_host_debugfs(struct mmc_host *host)
    249{
    250	debugfs_remove_recursive(host->debugfs_root);
    251}
    252
    253void mmc_add_card_debugfs(struct mmc_card *card)
    254{
    255	struct mmc_host	*host = card->host;
    256	struct dentry	*root;
    257
    258	if (!host->debugfs_root)
    259		return;
    260
    261	root = debugfs_create_dir(mmc_card_id(card), host->debugfs_root);
    262	card->debugfs_root = root;
    263
    264	debugfs_create_x32("state", S_IRUSR, root, &card->state);
    265}
    266
    267void mmc_remove_card_debugfs(struct mmc_card *card)
    268{
    269	debugfs_remove_recursive(card->debugfs_root);
    270	card->debugfs_root = NULL;
    271}