From: Dmitry Osipenko <digetx@gmail.com>
To: "Jens Axboe" <axboe@kernel.dk>,
"Thierry Reding" <thierry.reding@gmail.com>,
"Jonathan Hunter" <jonathanh@nvidia.com>,
"Michał Mirosław" <mirq-linux@rere.qmqm.pl>,
"David Heidelberg" <david@ixit.cz>,
"Peter Geis" <pgwipeout@gmail.com>,
"Ulf Hansson" <ulf.hansson@linaro.org>,
"Adrian Hunter" <adrian.hunter@intel.com>,
"Christoph Hellwig" <hch@infradead.org>,
"Davidlohr Bueso" <dave@stgolabs.net>,
"Rob Herring" <robh+dt@kernel.org>,
"Ion Agorria" <AG0RRIA@yahoo.com>,
"Svyatoslav Ryhel" <clamor95@gmail.com>
Cc: linux-tegra@vger.kernel.org, linux-block@vger.kernel.org,
linux-efi <linux-efi@vger.kernel.org>
Subject: [PATCH v6 4/5] mmc: block: Support alternative_gpt_sector() operation
Date: Thu, 19 Aug 2021 01:19:19 +0300 [thread overview]
Message-ID: <20210818221920.3893-5-digetx@gmail.com> (raw)
In-Reply-To: <20210818221920.3893-1-digetx@gmail.com>
Support generic alternative_gpt_sector() block device operation which
calculates custom GPT location. Add new MMC_CAP2_ALTERNATIVE_GPT_SECTOR
flag that enables scanning of the alternative sector.
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
drivers/mmc/core/block.c | 21 +++++++++++++++++++++
drivers/mmc/core/core.c | 35 +++++++++++++++++++++++++++++++++++
drivers/mmc/core/core.h | 2 ++
include/linux/mmc/host.h | 1 +
4 files changed, 59 insertions(+)
diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c
index 672cc505ce37..edd26164be06 100644
--- a/drivers/mmc/core/block.c
+++ b/drivers/mmc/core/block.c
@@ -801,6 +801,26 @@ static int mmc_blk_compat_ioctl(struct block_device *bdev, fmode_t mode,
}
#endif
+static int mmc_blk_alternative_gpt_sector(struct gendisk *disk,
+ sector_t *sector)
+{
+ struct mmc_blk_data *md;
+ int ret;
+
+ md = mmc_blk_get(disk);
+ if (!md)
+ return -EINVAL;
+
+ if (md->queue.card)
+ ret = mmc_card_alternative_gpt_sector(md->queue.card, sector);
+ else
+ ret = -ENODEV;
+
+ mmc_blk_put(md);
+
+ return ret;
+}
+
static const struct block_device_operations mmc_bdops = {
.open = mmc_blk_open,
.release = mmc_blk_release,
@@ -810,6 +830,7 @@ static const struct block_device_operations mmc_bdops = {
#ifdef CONFIG_COMPAT
.compat_ioctl = mmc_blk_compat_ioctl,
#endif
+ .alternative_gpt_sector = mmc_blk_alternative_gpt_sector,
};
static int mmc_blk_part_switch_pre(struct mmc_card *card,
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
index 6249c83d616f..c5cdd56051cb 100644
--- a/drivers/mmc/core/core.c
+++ b/drivers/mmc/core/core.c
@@ -2150,6 +2150,41 @@ int mmc_detect_card_removed(struct mmc_host *host)
}
EXPORT_SYMBOL(mmc_detect_card_removed);
+int mmc_card_alternative_gpt_sector(struct mmc_card *card, sector_t *gpt_sector)
+{
+ unsigned int boot_sectors_num;
+
+ if ((!(card->host->caps2 & MMC_CAP2_ALT_GPT_SECTOR)))
+ return -EOPNOTSUPP;
+
+ /* filter out unrelated cards */
+ if (card->ext_csd.rev < 3 ||
+ !mmc_card_mmc(card) ||
+ !mmc_card_is_blockaddr(card) ||
+ mmc_card_is_removable(card->host))
+ return -ENOENT;
+
+ /*
+ * eMMC storage has two special boot partitions in addition to the
+ * main one. NVIDIA's bootloader linearizes eMMC boot0->boot1->main
+ * accesses, this means that the partition table addresses are shifted
+ * by the size of boot partitions. In accordance with the eMMC
+ * specification, the boot partition size is calculated as follows:
+ *
+ * boot partition size = 128K byte x BOOT_SIZE_MULT
+ *
+ * Calculate number of sectors occupied by the both boot partitions.
+ */
+ boot_sectors_num = card->ext_csd.raw_boot_mult * SZ_128K /
+ SZ_512 * MMC_NUM_BOOT_PARTITION;
+
+ /* Defined by NVIDIA and used by Android devices. */
+ *gpt_sector = card->ext_csd.sectors - boot_sectors_num - 1;
+
+ return 0;
+}
+EXPORT_SYMBOL(mmc_card_alternative_gpt_sector);
+
void mmc_rescan(struct work_struct *work)
{
struct mmc_host *host =
diff --git a/drivers/mmc/core/core.h b/drivers/mmc/core/core.h
index 0c4de2030b3f..7931a4f0137d 100644
--- a/drivers/mmc/core/core.h
+++ b/drivers/mmc/core/core.h
@@ -119,6 +119,8 @@ void mmc_release_host(struct mmc_host *host);
void mmc_get_card(struct mmc_card *card, struct mmc_ctx *ctx);
void mmc_put_card(struct mmc_card *card, struct mmc_ctx *ctx);
+int mmc_card_alternative_gpt_sector(struct mmc_card *card, sector_t *sector);
+
/**
* mmc_claim_host - exclusively claim a host
* @host: mmc host to claim
diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h
index 0abd47e9ef9b..73a4cc063bb0 100644
--- a/include/linux/mmc/host.h
+++ b/include/linux/mmc/host.h
@@ -398,6 +398,7 @@ struct mmc_host {
#else
#define MMC_CAP2_CRYPTO 0
#endif
+#define MMC_CAP2_ALT_GPT_SECTOR (1 << 28) /* Host with eMMC card that has GPT entry at a non-standard location */
int fixed_drv_type; /* fixed driver type for non-removable media */
--
2.32.0
next prev parent reply other threads:[~2021-08-18 22:19 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-18 22:19 [PATCH v6 0/5] Support EFI partition on NVIDIA Tegra devices Dmitry Osipenko
2021-08-18 22:19 ` [PATCH v6 1/5] block: Add alternative_gpt_sector() operation Dmitry Osipenko
2021-08-19 7:08 ` Christoph Hellwig
2021-08-18 22:19 ` [PATCH v6 2/5] partitions/efi: Support non-standard GPT location Dmitry Osipenko
2021-08-19 7:11 ` Christoph Hellwig
2021-08-19 15:17 ` Davidlohr Bueso
2021-08-20 22:45 ` Michał Mirosław
2021-08-21 17:26 ` Dmitry Osipenko
2021-08-18 22:19 ` [PATCH v6 3/5] mmc: core: Add raw_boot_mult field to mmc_ext_csd Dmitry Osipenko
2021-08-18 22:19 ` Dmitry Osipenko [this message]
2021-08-18 22:19 ` [PATCH v6 5/5] mmc: sdhci-tegra: Enable MMC_CAP2_ALT_GPT_SECTOR Dmitry Osipenko
2021-08-19 17:18 ` [PATCH v6 0/5] Support EFI partition on NVIDIA Tegra devices Davidlohr Bueso
2021-08-19 22:27 ` Dmitry Osipenko
2021-08-20 22:41 ` Michał Mirosław
2021-08-21 17:27 ` Dmitry Osipenko
2021-08-23 23:40 ` Michał Mirosław
2021-08-24 10:38 ` Michał Mirosław
2021-08-24 16:06 ` Dmitry Osipenko
2021-08-24 17:03 ` Michał Mirosław
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210818221920.3893-5-digetx@gmail.com \
--to=digetx@gmail.com \
--cc=AG0RRIA@yahoo.com \
--cc=adrian.hunter@intel.com \
--cc=axboe@kernel.dk \
--cc=clamor95@gmail.com \
--cc=dave@stgolabs.net \
--cc=david@ixit.cz \
--cc=hch@infradead.org \
--cc=jonathanh@nvidia.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-efi@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=mirq-linux@rere.qmqm.pl \
--cc=pgwipeout@gmail.com \
--cc=robh+dt@kernel.org \
--cc=thierry.reding@gmail.com \
--cc=ulf.hansson@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.