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>,
"Stephen Warren" <swarren@wwwdotorg.org>,
"Nicolas Chauvet" <kwizart@gmail.com>,
"Ulf Hansson" <ulf.hansson@linaro.org>,
"Adrian Hunter" <adrian.hunter@intel.com>,
"Billy Laws" <blaws05@gmail.com>,
"Nils Östlund" <nils@naltan.com>,
"Christoph Hellwig" <hch@infradead.org>,
"Ard Biesheuvel" <ard.biesheuvel@linaro.org>,
"Davidlohr Bueso" <dave@stgolabs.net>
Cc: linux-tegra@vger.kernel.org, linux-block@vger.kernel.org,
Andrey Danin <danindrey@mail.ru>,
Gilles Grandou <gilles@grandou.net>,
Ryan Grachek <ryan@edited.us>,
linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-efi <linux-efi@vger.kernel.org>
Subject: [PATCH v4 5/6] partitions/tegra: Support gpt_sector= command line option
Date: Fri, 15 May 2020 04:41:42 +0300 [thread overview]
Message-ID: <20200515014143.12984-6-digetx@gmail.com> (raw)
In-Reply-To: <20200515014143.12984-1-digetx@gmail.com>
The gpt_sector=<sector> causes the GPT partition parser to look at the
specified sector for a valid GPT header if the GPT is not found at the
beginning or the end of a block device. This is needed by Tegra-based
devices that have TegraPT and GPT placed in inaccessible by kernel
locations. The GPT entry duplicates TegraPT partitions.
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
block/partitions/check.h | 1 +
block/partitions/core.c | 1 +
block/partitions/efi.c | 6 ++++++
block/partitions/tegra.c | 38 ++++++++++++++++++++++++++++++++++++++
4 files changed, 46 insertions(+)
diff --git a/block/partitions/check.h b/block/partitions/check.h
index ffa01cc4b0b0..ff07435b3ac3 100644
--- a/block/partitions/check.h
+++ b/block/partitions/check.h
@@ -67,5 +67,6 @@ int osf_partition(struct parsed_partitions *state);
int sgi_partition(struct parsed_partitions *state);
int sun_partition(struct parsed_partitions *state);
int sysv68_partition(struct parsed_partitions *state);
+int tegra_partition_gpt(struct parsed_partitions *state);
int tegra_partition(struct parsed_partitions *state);
int ultrix_partition(struct parsed_partitions *state);
diff --git a/block/partitions/core.c b/block/partitions/core.c
index 0b4720372f07..ece70f15f24d 100644
--- a/block/partitions/core.c
+++ b/block/partitions/core.c
@@ -83,6 +83,7 @@ static int (*check_part[])(struct parsed_partitions *) = {
sysv68_partition,
#endif
#ifdef CONFIG_TEGRA_PARTITION
+ tegra_partition_gpt,
tegra_partition,
#endif
NULL
diff --git a/block/partitions/efi.c b/block/partitions/efi.c
index 48e4c2aeeded..f3b26be2bd6e 100644
--- a/block/partitions/efi.c
+++ b/block/partitions/efi.c
@@ -98,6 +98,12 @@ static int force_gpt;
static int __init
force_gpt_fn(char *str)
{
+ /* This check allows to parse "gpt gpt_sector=" properly since
+ * "gpt" overlaps with "gpt_sector", see tegra_gpt_sector_fn().
+ */
+ if (force_gpt)
+ return 0;
+
force_gpt = 1;
return 1;
}
diff --git a/block/partitions/tegra.c b/block/partitions/tegra.c
index d1b84fff362c..c2dae0f32c2a 100644
--- a/block/partitions/tegra.c
+++ b/block/partitions/tegra.c
@@ -30,6 +30,7 @@
#include <soc/tegra/common.h>
#include <soc/tegra/partition.h>
+#include "efi.h"
#include "check.h"
#define TEGRA_PT_SECTOR_SIZE(ptp) ((ptp)->logical_sector_size / SZ_512)
@@ -563,3 +564,40 @@ int tegra_partition(struct parsed_partitions *state)
return ret;
}
+
+/*
+ * This allows a kernel command line option 'gpt_sector=<sector>' to
+ * enable GPT header lookup at a non-standard location. This option
+ * is given to kernel by a proprietary bootloader, which is used by
+ * *most* (but not all) of NVIDIA Tegra-based devices.
+ */
+static sector_t tegra_gpt_sector;
+static int __init tegra_gpt_sector_fn(char *str)
+{
+ WARN_ON(kstrtoull(str, 10, &tegra_gpt_sector) < 0);
+ return 1;
+}
+__setup("gpt_sector=", tegra_gpt_sector_fn);
+
+int tegra_partition_gpt(struct parsed_partitions *state)
+{
+ int ret = 0;
+
+#ifdef CONFIG_EFI_PARTITION
+ struct tegra_partition_table_parser ptp = {};
+
+ if (!soc_is_tegra() || !tegra_boot_sdmmc || !tegra_gpt_sector)
+ return 0;
+
+ ptp.state = state;
+
+ ptp.boot_offset = tegra_partition_table_emmc_boot_offset(&ptp);
+ if (ptp.boot_offset < 0)
+ return 0;
+
+ force_gpt_sector = tegra_gpt_sector;
+ ret = efi_partition(ptp.state);
+ force_gpt_sector = 0;
+#endif
+ return ret;
+}
--
2.26.0
next prev parent reply other threads:[~2020-05-15 1:43 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-05-15 1:41 [PATCH v4 0/6] Introduce NVIDIA Tegra Partition Table Dmitry Osipenko
2020-05-15 1:41 ` Dmitry Osipenko
2020-05-15 1:41 ` [PATCH v4 1/6] mmc: core: Add raw_boot_mult field to mmc_ext_csd Dmitry Osipenko
2020-05-15 1:41 ` [PATCH v4 2/6] mmc: block: Add mmc_bdev_to_card() helper Dmitry Osipenko
2020-05-15 1:41 ` Dmitry Osipenko
2020-05-15 1:41 ` [PATCH v4 3/6] partitions: Introduce NVIDIA Tegra Partition Table Dmitry Osipenko
2020-05-15 1:41 ` Dmitry Osipenko
2020-05-15 1:58 ` Randy Dunlap
2020-05-15 1:58 ` Randy Dunlap
2020-05-15 2:02 ` Dmitry Osipenko
2020-05-15 1:41 ` [PATCH v4 4/6] partitions/efi: Support GPT entry lookup at a non-standard location Dmitry Osipenko
2020-05-15 10:03 ` Steve McIntyre
2020-05-15 10:03 ` Steve McIntyre
2020-05-15 15:52 ` Dmitry Osipenko
2020-05-15 15:52 ` Dmitry Osipenko
2020-05-15 1:41 ` Dmitry Osipenko [this message]
2020-05-15 1:41 ` [PATCH v4 6/6] soc/tegra: Expose Boot Configuration Table via sysfs Dmitry Osipenko
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=20200515014143.12984-6-digetx@gmail.com \
--to=digetx@gmail.com \
--cc=adrian.hunter@intel.com \
--cc=ard.biesheuvel@linaro.org \
--cc=axboe@kernel.dk \
--cc=blaws05@gmail.com \
--cc=danindrey@mail.ru \
--cc=dave@stgolabs.net \
--cc=david@ixit.cz \
--cc=gilles@grandou.net \
--cc=hch@infradead.org \
--cc=jonathanh@nvidia.com \
--cc=kwizart@gmail.com \
--cc=linux-block@vger.kernel.org \
--cc=linux-efi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mmc@vger.kernel.org \
--cc=linux-tegra@vger.kernel.org \
--cc=mirq-linux@rere.qmqm.pl \
--cc=nils@naltan.com \
--cc=pgwipeout@gmail.com \
--cc=ryan@edited.us \
--cc=swarren@wwwdotorg.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.