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

bus.c (8764B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 *  linux/drivers/mmc/core/bus.c
      4 *
      5 *  Copyright (C) 2003 Russell King, All Rights Reserved.
      6 *  Copyright (C) 2007 Pierre Ossman
      7 *
      8 *  MMC card bus driver model
      9 */
     10
     11#include <linux/export.h>
     12#include <linux/device.h>
     13#include <linux/err.h>
     14#include <linux/slab.h>
     15#include <linux/stat.h>
     16#include <linux/of.h>
     17#include <linux/pm_runtime.h>
     18#include <linux/sysfs.h>
     19
     20#include <linux/mmc/card.h>
     21#include <linux/mmc/host.h>
     22
     23#include "core.h"
     24#include "card.h"
     25#include "host.h"
     26#include "sdio_cis.h"
     27#include "bus.h"
     28
     29#define to_mmc_driver(d)	container_of(d, struct mmc_driver, drv)
     30
     31static ssize_t type_show(struct device *dev,
     32	struct device_attribute *attr, char *buf)
     33{
     34	struct mmc_card *card = mmc_dev_to_card(dev);
     35
     36	switch (card->type) {
     37	case MMC_TYPE_MMC:
     38		return sysfs_emit(buf, "MMC\n");
     39	case MMC_TYPE_SD:
     40		return sysfs_emit(buf, "SD\n");
     41	case MMC_TYPE_SDIO:
     42		return sysfs_emit(buf, "SDIO\n");
     43	case MMC_TYPE_SD_COMBO:
     44		return sysfs_emit(buf, "SDcombo\n");
     45	default:
     46		return -EFAULT;
     47	}
     48}
     49static DEVICE_ATTR_RO(type);
     50
     51static struct attribute *mmc_dev_attrs[] = {
     52	&dev_attr_type.attr,
     53	NULL,
     54};
     55ATTRIBUTE_GROUPS(mmc_dev);
     56
     57static int
     58mmc_bus_uevent(struct device *dev, struct kobj_uevent_env *env)
     59{
     60	struct mmc_card *card = mmc_dev_to_card(dev);
     61	const char *type;
     62	unsigned int i;
     63	int retval = 0;
     64
     65	switch (card->type) {
     66	case MMC_TYPE_MMC:
     67		type = "MMC";
     68		break;
     69	case MMC_TYPE_SD:
     70		type = "SD";
     71		break;
     72	case MMC_TYPE_SDIO:
     73		type = "SDIO";
     74		break;
     75	case MMC_TYPE_SD_COMBO:
     76		type = "SDcombo";
     77		break;
     78	default:
     79		type = NULL;
     80	}
     81
     82	if (type) {
     83		retval = add_uevent_var(env, "MMC_TYPE=%s", type);
     84		if (retval)
     85			return retval;
     86	}
     87
     88	if (card->type == MMC_TYPE_SDIO || card->type == MMC_TYPE_SD_COMBO) {
     89		retval = add_uevent_var(env, "SDIO_ID=%04X:%04X",
     90					card->cis.vendor, card->cis.device);
     91		if (retval)
     92			return retval;
     93
     94		retval = add_uevent_var(env, "SDIO_REVISION=%u.%u",
     95					card->major_rev, card->minor_rev);
     96		if (retval)
     97			return retval;
     98
     99		for (i = 0; i < card->num_info; i++) {
    100			retval = add_uevent_var(env, "SDIO_INFO%u=%s", i+1, card->info[i]);
    101			if (retval)
    102				return retval;
    103		}
    104	}
    105
    106	/*
    107	 * SDIO (non-combo) cards are not handled by mmc_block driver and do not
    108	 * have accessible CID register which used by mmc_card_name() function.
    109	 */
    110	if (card->type == MMC_TYPE_SDIO)
    111		return 0;
    112
    113	retval = add_uevent_var(env, "MMC_NAME=%s", mmc_card_name(card));
    114	if (retval)
    115		return retval;
    116
    117	/*
    118	 * Request the mmc_block device.  Note: that this is a direct request
    119	 * for the module it carries no information as to what is inserted.
    120	 */
    121	retval = add_uevent_var(env, "MODALIAS=mmc:block");
    122
    123	return retval;
    124}
    125
    126static int mmc_bus_probe(struct device *dev)
    127{
    128	struct mmc_driver *drv = to_mmc_driver(dev->driver);
    129	struct mmc_card *card = mmc_dev_to_card(dev);
    130
    131	return drv->probe(card);
    132}
    133
    134static void mmc_bus_remove(struct device *dev)
    135{
    136	struct mmc_driver *drv = to_mmc_driver(dev->driver);
    137	struct mmc_card *card = mmc_dev_to_card(dev);
    138
    139	drv->remove(card);
    140}
    141
    142static void mmc_bus_shutdown(struct device *dev)
    143{
    144	struct mmc_driver *drv = to_mmc_driver(dev->driver);
    145	struct mmc_card *card = mmc_dev_to_card(dev);
    146	struct mmc_host *host = card->host;
    147	int ret;
    148
    149	if (dev->driver && drv->shutdown)
    150		drv->shutdown(card);
    151
    152	if (host->bus_ops->shutdown) {
    153		ret = host->bus_ops->shutdown(host);
    154		if (ret)
    155			pr_warn("%s: error %d during shutdown\n",
    156				mmc_hostname(host), ret);
    157	}
    158}
    159
    160#ifdef CONFIG_PM_SLEEP
    161static int mmc_bus_suspend(struct device *dev)
    162{
    163	struct mmc_card *card = mmc_dev_to_card(dev);
    164	struct mmc_host *host = card->host;
    165	int ret;
    166
    167	ret = pm_generic_suspend(dev);
    168	if (ret)
    169		return ret;
    170
    171	ret = host->bus_ops->suspend(host);
    172	if (ret)
    173		pm_generic_resume(dev);
    174
    175	return ret;
    176}
    177
    178static int mmc_bus_resume(struct device *dev)
    179{
    180	struct mmc_card *card = mmc_dev_to_card(dev);
    181	struct mmc_host *host = card->host;
    182	int ret;
    183
    184	ret = host->bus_ops->resume(host);
    185	if (ret)
    186		pr_warn("%s: error %d during resume (card was removed?)\n",
    187			mmc_hostname(host), ret);
    188
    189	ret = pm_generic_resume(dev);
    190	return ret;
    191}
    192#endif
    193
    194#ifdef CONFIG_PM
    195static int mmc_runtime_suspend(struct device *dev)
    196{
    197	struct mmc_card *card = mmc_dev_to_card(dev);
    198	struct mmc_host *host = card->host;
    199
    200	return host->bus_ops->runtime_suspend(host);
    201}
    202
    203static int mmc_runtime_resume(struct device *dev)
    204{
    205	struct mmc_card *card = mmc_dev_to_card(dev);
    206	struct mmc_host *host = card->host;
    207
    208	return host->bus_ops->runtime_resume(host);
    209}
    210#endif /* !CONFIG_PM */
    211
    212static const struct dev_pm_ops mmc_bus_pm_ops = {
    213	SET_RUNTIME_PM_OPS(mmc_runtime_suspend, mmc_runtime_resume, NULL)
    214	SET_SYSTEM_SLEEP_PM_OPS(mmc_bus_suspend, mmc_bus_resume)
    215};
    216
    217static struct bus_type mmc_bus_type = {
    218	.name		= "mmc",
    219	.dev_groups	= mmc_dev_groups,
    220	.uevent		= mmc_bus_uevent,
    221	.probe		= mmc_bus_probe,
    222	.remove		= mmc_bus_remove,
    223	.shutdown	= mmc_bus_shutdown,
    224	.pm		= &mmc_bus_pm_ops,
    225};
    226
    227int mmc_register_bus(void)
    228{
    229	return bus_register(&mmc_bus_type);
    230}
    231
    232void mmc_unregister_bus(void)
    233{
    234	bus_unregister(&mmc_bus_type);
    235}
    236
    237/**
    238 *	mmc_register_driver - register a media driver
    239 *	@drv: MMC media driver
    240 */
    241int mmc_register_driver(struct mmc_driver *drv)
    242{
    243	drv->drv.bus = &mmc_bus_type;
    244	return driver_register(&drv->drv);
    245}
    246
    247EXPORT_SYMBOL(mmc_register_driver);
    248
    249/**
    250 *	mmc_unregister_driver - unregister a media driver
    251 *	@drv: MMC media driver
    252 */
    253void mmc_unregister_driver(struct mmc_driver *drv)
    254{
    255	drv->drv.bus = &mmc_bus_type;
    256	driver_unregister(&drv->drv);
    257}
    258
    259EXPORT_SYMBOL(mmc_unregister_driver);
    260
    261static void mmc_release_card(struct device *dev)
    262{
    263	struct mmc_card *card = mmc_dev_to_card(dev);
    264
    265	sdio_free_common_cis(card);
    266
    267	kfree(card->info);
    268
    269	kfree(card);
    270}
    271
    272/*
    273 * Allocate and initialise a new MMC card structure.
    274 */
    275struct mmc_card *mmc_alloc_card(struct mmc_host *host, struct device_type *type)
    276{
    277	struct mmc_card *card;
    278
    279	card = kzalloc(sizeof(struct mmc_card), GFP_KERNEL);
    280	if (!card)
    281		return ERR_PTR(-ENOMEM);
    282
    283	card->host = host;
    284
    285	device_initialize(&card->dev);
    286
    287	card->dev.parent = mmc_classdev(host);
    288	card->dev.bus = &mmc_bus_type;
    289	card->dev.release = mmc_release_card;
    290	card->dev.type = type;
    291
    292	return card;
    293}
    294
    295/*
    296 * Register a new MMC card with the driver model.
    297 */
    298int mmc_add_card(struct mmc_card *card)
    299{
    300	int ret;
    301	const char *type;
    302	const char *uhs_bus_speed_mode = "";
    303	static const char *const uhs_speeds[] = {
    304		[UHS_SDR12_BUS_SPEED] = "SDR12 ",
    305		[UHS_SDR25_BUS_SPEED] = "SDR25 ",
    306		[UHS_SDR50_BUS_SPEED] = "SDR50 ",
    307		[UHS_SDR104_BUS_SPEED] = "SDR104 ",
    308		[UHS_DDR50_BUS_SPEED] = "DDR50 ",
    309	};
    310
    311
    312	dev_set_name(&card->dev, "%s:%04x", mmc_hostname(card->host), card->rca);
    313
    314	switch (card->type) {
    315	case MMC_TYPE_MMC:
    316		type = "MMC";
    317		break;
    318	case MMC_TYPE_SD:
    319		type = "SD";
    320		if (mmc_card_blockaddr(card)) {
    321			if (mmc_card_ext_capacity(card))
    322				type = "SDXC";
    323			else
    324				type = "SDHC";
    325		}
    326		break;
    327	case MMC_TYPE_SDIO:
    328		type = "SDIO";
    329		break;
    330	case MMC_TYPE_SD_COMBO:
    331		type = "SD-combo";
    332		if (mmc_card_blockaddr(card))
    333			type = "SDHC-combo";
    334		break;
    335	default:
    336		type = "?";
    337		break;
    338	}
    339
    340	if (mmc_card_uhs(card) &&
    341		(card->sd_bus_speed < ARRAY_SIZE(uhs_speeds)))
    342		uhs_bus_speed_mode = uhs_speeds[card->sd_bus_speed];
    343
    344	if (mmc_host_is_spi(card->host)) {
    345		pr_info("%s: new %s%s%s card on SPI\n",
    346			mmc_hostname(card->host),
    347			mmc_card_hs(card) ? "high speed " : "",
    348			mmc_card_ddr52(card) ? "DDR " : "",
    349			type);
    350	} else {
    351		pr_info("%s: new %s%s%s%s%s%s card at address %04x\n",
    352			mmc_hostname(card->host),
    353			mmc_card_uhs(card) ? "ultra high speed " :
    354			(mmc_card_hs(card) ? "high speed " : ""),
    355			mmc_card_hs400(card) ? "HS400 " :
    356			(mmc_card_hs200(card) ? "HS200 " : ""),
    357			mmc_card_hs400es(card) ? "Enhanced strobe " : "",
    358			mmc_card_ddr52(card) ? "DDR " : "",
    359			uhs_bus_speed_mode, type, card->rca);
    360	}
    361
    362#ifdef CONFIG_DEBUG_FS
    363	mmc_add_card_debugfs(card);
    364#endif
    365	card->dev.of_node = mmc_of_find_child_device(card->host, 0);
    366
    367	device_enable_async_suspend(&card->dev);
    368
    369	ret = device_add(&card->dev);
    370	if (ret)
    371		return ret;
    372
    373	mmc_card_set_present(card);
    374
    375	return 0;
    376}
    377
    378/*
    379 * Unregister a new MMC card with the driver model, and
    380 * (eventually) free it.
    381 */
    382void mmc_remove_card(struct mmc_card *card)
    383{
    384	struct mmc_host *host = card->host;
    385
    386#ifdef CONFIG_DEBUG_FS
    387	mmc_remove_card_debugfs(card);
    388#endif
    389
    390	if (mmc_card_present(card)) {
    391		if (mmc_host_is_spi(card->host)) {
    392			pr_info("%s: SPI card removed\n",
    393				mmc_hostname(card->host));
    394		} else {
    395			pr_info("%s: card %04x removed\n",
    396				mmc_hostname(card->host), card->rca);
    397		}
    398		device_del(&card->dev);
    399		of_node_put(card->dev.of_node);
    400	}
    401
    402	if (host->cqe_enabled) {
    403		host->cqe_ops->cqe_disable(host);
    404		host->cqe_enabled = false;
    405	}
    406
    407	put_device(&card->dev);
    408}