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 \ --subject='Re: [PATCH v6 4/5] mmc: block: Support alternative_gpt_sector() operation' \ /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
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).