17.05.2020 05:12, Dmitry Osipenko пишет: > NVIDIA Tegra Partition Table takes into account MMC card's BOOT_SIZE_MULT > parameter, and thus, the partition parser needs to retrieve that EXT_CSD > value from the block device. There are also some other parts of struct > mmc_card that are needed for the partition parser in order to calculate > the eMMC offset and verify different things. This patch introduces new > helper which takes block device for the input argument and returns the > corresponding MMC card. > > Signed-off-by: Dmitry Osipenko <dig...@gmail.com> > --- > drivers/mmc/core/block.c | 15 +++++++++++++++ > include/linux/mmc/blkdev.h | 13 +++++++++++++ > 2 files changed, 28 insertions(+) > create mode 100644 include/linux/mmc/blkdev.h > > diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c > index c5367e2c8487..99298e888381 100644 > --- a/drivers/mmc/core/block.c > +++ b/drivers/mmc/core/block.c > @@ -40,6 +40,7 @@ > #include <linux/debugfs.h> > > #include <linux/mmc/ioctl.h> > +#include <linux/mmc/blkdev.h> > #include <linux/mmc/card.h> > #include <linux/mmc/host.h> > #include <linux/mmc/mmc.h> > @@ -305,6 +306,20 @@ static ssize_t force_ro_store(struct device *dev, struct > device_attribute *attr, > return ret; > } > > +struct mmc_card *mmc_bdev_to_card(struct block_device *bdev) > +{ > + struct mmc_blk_data *md; > + > + if (bdev->bd_disk->major != MMC_BLOCK_MAJOR) > + return NULL; > + > + md = mmc_blk_get(bdev->bd_disk); > + if (!md) > + return NULL; > + > + return md->queue.card; > +} > + > static int mmc_blk_open(struct block_device *bdev, fmode_t mode) > { > struct mmc_blk_data *md = mmc_blk_get(bdev->bd_disk); > diff --git a/include/linux/mmc/blkdev.h b/include/linux/mmc/blkdev.h > new file mode 100644 > index 000000000000..67608c58de70 > --- /dev/null > +++ b/include/linux/mmc/blkdev.h > @@ -0,0 +1,13 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > +/* > + * linux/include/linux/mmc/blkdev.h > + */ > +#ifndef LINUX_MMC_BLOCK_DEVICE_H > +#define LINUX_MMC_BLOCK_DEVICE_H > + > +struct block_device; > +struct mmc_card; > + > +struct mmc_card *mmc_bdev_to_card(struct block_device *bdev); > + > +#endif /* LINUX_MMC_BLOCK_DEVICE_H */ >
Hello Ulf / Jens and everyone, Guys, what do you think about this change? Currently it's not allowed to compile MMC_BLOCK as a loadable kernel module if TEGRA_PARTITION is enabled because it depends on MMC_BLOCK presence. I'm curious if this situation could be improved by moving mmc_bdev_to_card() to linux/mmc/blkdev.h and then: 1. Moving all private mmc/core/block.c structs to the public linux/mmc/blkdev.h. 2. Or adding a "private opaque" pointer to a struct block_device and setting it to md->queue.card, for example. 3. I see that struct block_device already has some bd_private field, but I'm not sure whether it could be used for what I'm trying to achieve. Actually I don't see where bd_private is used in kernel at all. I'd like get yours feedback, thanks in advance.