From: Boris Brezillon <boris.brezillon@free-electrons.com>
To: "Rafał Miłecki" <zajec5@gmail.com>
Cc: "David Woodhouse" <dwmw2@infradead.org>,
"Brian Norris" <computersforpeace@gmail.com>,
"Marek Vasut" <marek.vasut@gmail.com>,
"Richard Weinberger" <richard@nod.at>,
"Cyrille Pitchen" <cyrille.pitchen@atmel.com>,
"Rob Herring" <robh+dt@kernel.org>,
"Mark Rutland" <mark.rutland@arm.com>,
"Frank Rowand" <frowand.list@gmail.com>,
"Linus Walleij" <linus.walleij@linaro.org>,
linux-mtd@lists.infradead.org, devicetree@vger.kernel.org,
"Rafał Miłecki" <rafal@milecki.pl>
Subject: Re: [PATCH V3 2/3] mtd: add core code reading DT specified part probes
Date: Sun, 9 Apr 2017 13:04:06 +0200 [thread overview]
Message-ID: <20170409130406.564802a4@bbrezillon> (raw)
In-Reply-To: <20170331114016.26858-2-zajec5@gmail.com>
Hi Rafal,
On Fri, 31 Mar 2017 13:40:15 +0200
Rafał Miłecki <zajec5@gmail.com> wrote:
> From: Rafał Miłecki <rafal@milecki.pl>
>
> Handling (creating) partitions for flash devices requires using a proper
> driver that will read partition table (out of somewhere). We can't
> simply try all existing drivers one by one:
> 1) It would increase boot time
> 2) The order could be a problem
> 3) In some corner cases parsers could misinterpret some data as a table
> Due to this MTD subsystem allows drivers to specify a list of applicable
> part probes.
>
> So far physmap_of was the only driver with support for linux,part-probe
> DT property. Other ones had list or probes hardcoded which wasn't making
> them really flexible. It prevented using common flash drivers on
> platforms that required some specific partition table access.
>
> This commit adds support for mentioned DT property directly to the MTD
> core. It's a rewritten implementation of physmap_of's code and it makes
> original code obsolete. Thanks to calling it on device parse
> registration (as suggested by Boris) all drivers gain support for it for
> free.
>
> Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
> ---
> drivers/mtd/mtdcore.c | 36 +++++++++++++++++++++++++++++++++++-
> 1 file changed, 35 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
> index 66a9dedd1062..917def28c756 100644
> --- a/drivers/mtd/mtdcore.c
> +++ b/drivers/mtd/mtdcore.c
> @@ -664,6 +664,32 @@ static void mtd_set_dev_defaults(struct mtd_info *mtd)
> }
> }
>
> +static const char * const *mtd_of_get_probes(struct device_node *np)
To be consistent with NAND DT helpers, can you put the of_get_ prefix
at the beginning: of_get_mtd_probes().
And get_probes() is a bit too generic IMHO, how about
of_get_mtd_part_probes() (or any other name clearly showing that this
is about partition parsers/probes).
> +{
> + const char **res;
> + int count;
> +
> + count = of_property_count_strings(np, "linux,part-probe");
> + if (count < 0)
> + return NULL;
> +
> + res = kzalloc((count + 1) * sizeof(*res), GFP_KERNEL);
> + if (!res)
> + return NULL;
> +
> + count = of_property_read_string_array(np, "linux,part-probe", res,
> + count);
> + if (count < 0)
> + return NULL;
> +
> + return res;
> +}
> +
> +static inline void mtd_of_free_probes(const char * const *probes)
Drop the inline, the compiler is smart enough to decide by itself.
> +{
> + kfree(probes);
> +}
This is not really DT specific, and we might want to extract the list
of probes by other means in the future (cmdline, ACPI?).
How about declaring these 2 functions:
static char **mtd_alloc_part_type_table(int nentries)
{
return kzalloc((nentries + 1) * sizeof(*res), GFP_KERNEL);
}
static void mtd_free_part_type_table(const char * const *table)
{
kfree(table);
}
You can then use mtd_alloc_part_type_table() in
of_get_mtd_part_probes() to allocate your partition type table.
> +
> /**
> * mtd_device_parse_register - parse partitions and register an MTD device.
> *
> @@ -698,14 +724,19 @@ int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types,
> const struct mtd_partition *parts,
> int nr_parts)
> {
> + const char * const *part_probe_types;
> struct mtd_partitions parsed;
> int ret;
>
> mtd_set_dev_defaults(mtd);
>
> + part_probe_types = mtd_of_get_probes(mtd_get_of_node(mtd));
> + if (!part_probe_types)
> + part_probe_types = types;
> +
How about doing it the other way around:
if (part_probe_types)
types = part_probe_types;
> memset(&parsed, 0, sizeof(parsed));
>
> - ret = parse_mtd_partitions(mtd, types, &parsed, parser_data);
> + ret = parse_mtd_partitions(mtd, part_probe_types, &parsed, parser_data);
this way you don't need this change
> if ((ret < 0 || parsed.nr_parts == 0) && parts && nr_parts) {
> /* Fall back to driver-provided partitions */
> parsed = (struct mtd_partitions){
> @@ -720,6 +751,9 @@ int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types,
> memset(&parsed, 0, sizeof(parsed));
> }
>
> + if (part_probe_types != types)
> + mtd_of_free_probes(part_probe_types);
and here you simply have:
mtd_of_free_probes(part_probe_types);
> +
> ret = mtd_add_device_partitions(mtd, &parsed);
> if (ret)
> goto out;
WARNING: multiple messages have this Message-ID (diff)
From: Boris Brezillon <boris.brezillon-wi1+55ScJUtKEb57/3fJTNBPR1lH4CV8@public.gmane.org>
To: "Rafał Miłecki" <zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Cc: "David Woodhouse" <dwmw2-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>,
"Brian Norris"
<computersforpeace-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
"Marek Vasut"
<marek.vasut-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
"Richard Weinberger" <richard-/L3Ra7n9ekc@public.gmane.org>,
"Cyrille Pitchen"
<cyrille.pitchen-AIFe0yeh4nAAvxtiuMwx3w@public.gmane.org>,
"Rob Herring" <robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
"Mark Rutland" <mark.rutland-5wv7dgnIgG8@public.gmane.org>,
"Frank Rowand"
<frowand.list-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
"Linus Walleij"
<linus.walleij-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>,
linux-mtd-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
"Rafał Miłecki" <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
Subject: Re: [PATCH V3 2/3] mtd: add core code reading DT specified part probes
Date: Sun, 9 Apr 2017 13:04:06 +0200 [thread overview]
Message-ID: <20170409130406.564802a4@bbrezillon> (raw)
In-Reply-To: <20170331114016.26858-2-zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
Hi Rafal,
On Fri, 31 Mar 2017 13:40:15 +0200
Rafał Miłecki <zajec5-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
> From: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
>
> Handling (creating) partitions for flash devices requires using a proper
> driver that will read partition table (out of somewhere). We can't
> simply try all existing drivers one by one:
> 1) It would increase boot time
> 2) The order could be a problem
> 3) In some corner cases parsers could misinterpret some data as a table
> Due to this MTD subsystem allows drivers to specify a list of applicable
> part probes.
>
> So far physmap_of was the only driver with support for linux,part-probe
> DT property. Other ones had list or probes hardcoded which wasn't making
> them really flexible. It prevented using common flash drivers on
> platforms that required some specific partition table access.
>
> This commit adds support for mentioned DT property directly to the MTD
> core. It's a rewritten implementation of physmap_of's code and it makes
> original code obsolete. Thanks to calling it on device parse
> registration (as suggested by Boris) all drivers gain support for it for
> free.
>
> Signed-off-by: Rafał Miłecki <rafal-g1n6cQUeyibVItvQsEIGlw@public.gmane.org>
> ---
> drivers/mtd/mtdcore.c | 36 +++++++++++++++++++++++++++++++++++-
> 1 file changed, 35 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
> index 66a9dedd1062..917def28c756 100644
> --- a/drivers/mtd/mtdcore.c
> +++ b/drivers/mtd/mtdcore.c
> @@ -664,6 +664,32 @@ static void mtd_set_dev_defaults(struct mtd_info *mtd)
> }
> }
>
> +static const char * const *mtd_of_get_probes(struct device_node *np)
To be consistent with NAND DT helpers, can you put the of_get_ prefix
at the beginning: of_get_mtd_probes().
And get_probes() is a bit too generic IMHO, how about
of_get_mtd_part_probes() (or any other name clearly showing that this
is about partition parsers/probes).
> +{
> + const char **res;
> + int count;
> +
> + count = of_property_count_strings(np, "linux,part-probe");
> + if (count < 0)
> + return NULL;
> +
> + res = kzalloc((count + 1) * sizeof(*res), GFP_KERNEL);
> + if (!res)
> + return NULL;
> +
> + count = of_property_read_string_array(np, "linux,part-probe", res,
> + count);
> + if (count < 0)
> + return NULL;
> +
> + return res;
> +}
> +
> +static inline void mtd_of_free_probes(const char * const *probes)
Drop the inline, the compiler is smart enough to decide by itself.
> +{
> + kfree(probes);
> +}
This is not really DT specific, and we might want to extract the list
of probes by other means in the future (cmdline, ACPI?).
How about declaring these 2 functions:
static char **mtd_alloc_part_type_table(int nentries)
{
return kzalloc((nentries + 1) * sizeof(*res), GFP_KERNEL);
}
static void mtd_free_part_type_table(const char * const *table)
{
kfree(table);
}
You can then use mtd_alloc_part_type_table() in
of_get_mtd_part_probes() to allocate your partition type table.
> +
> /**
> * mtd_device_parse_register - parse partitions and register an MTD device.
> *
> @@ -698,14 +724,19 @@ int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types,
> const struct mtd_partition *parts,
> int nr_parts)
> {
> + const char * const *part_probe_types;
> struct mtd_partitions parsed;
> int ret;
>
> mtd_set_dev_defaults(mtd);
>
> + part_probe_types = mtd_of_get_probes(mtd_get_of_node(mtd));
> + if (!part_probe_types)
> + part_probe_types = types;
> +
How about doing it the other way around:
if (part_probe_types)
types = part_probe_types;
> memset(&parsed, 0, sizeof(parsed));
>
> - ret = parse_mtd_partitions(mtd, types, &parsed, parser_data);
> + ret = parse_mtd_partitions(mtd, part_probe_types, &parsed, parser_data);
this way you don't need this change
> if ((ret < 0 || parsed.nr_parts == 0) && parts && nr_parts) {
> /* Fall back to driver-provided partitions */
> parsed = (struct mtd_partitions){
> @@ -720,6 +751,9 @@ int mtd_device_parse_register(struct mtd_info *mtd, const char * const *types,
> memset(&parsed, 0, sizeof(parsed));
> }
>
> + if (part_probe_types != types)
> + mtd_of_free_probes(part_probe_types);
and here you simply have:
mtd_of_free_probes(part_probe_types);
> +
> ret = mtd_add_device_partitions(mtd, &parsed);
> if (ret)
> goto out;
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2017-04-09 11:04 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-31 11:40 [PATCH V3 1/3] dt-bindings: mtd: document linux,part-probe property Rafał Miłecki
2017-03-31 11:40 ` Rafał Miłecki
2017-03-31 11:40 ` [PATCH V3 2/3] mtd: add core code reading DT specified part probes Rafał Miłecki
2017-03-31 11:40 ` Rafał Miłecki
2017-04-09 11:04 ` Boris Brezillon [this message]
2017-04-09 11:04 ` Boris Brezillon
2017-04-09 13:28 ` Boris Brezillon
2017-04-09 13:28 ` Boris Brezillon
2017-03-31 11:40 ` [PATCH V3 3/3] mtd: physmap_of: drop duplicated support for linux, part-probe property Rafał Miłecki
2017-03-31 11:40 ` [PATCH V3 3/3] mtd: physmap_of: drop duplicated support for linux,part-probe property Rafał Miłecki
2017-04-09 11:04 ` Boris Brezillon
2017-04-09 11:04 ` Boris Brezillon
2017-04-03 16:40 ` [PATCH V3 1/3] dt-bindings: mtd: document " Rob Herring
2017-04-03 16:40 ` Rob Herring
2017-04-09 10:40 ` Boris Brezillon
2017-04-09 10:40 ` Boris Brezillon
2017-04-17 18:28 ` [PATCH V4 " Rafał Miłecki
2017-04-17 18:28 ` Rafał Miłecki
2017-04-17 18:28 ` [PATCH V4 2/3] mtd: add core code reading DT specified part probes Rafał Miłecki
2017-04-17 18:28 ` Rafał Miłecki
2017-04-17 19:31 ` Boris Brezillon
2017-04-17 19:31 ` Boris Brezillon
2017-04-17 18:28 ` [PATCH V4 3/3] mtd: physmap_of: drop duplicated support for linux, part-probe property Rafał Miłecki
2017-04-17 18:28 ` Rafał Miłecki
2017-04-17 19:47 ` [PATCH V5 1/3] dt-bindings: mtd: document linux,part-probe property Rafał Miłecki
2017-04-17 19:47 ` Rafał Miłecki
2017-04-17 19:47 ` [PATCH V5 2/3] mtd: add core code reading DT specified part probes Rafał Miłecki
2017-04-17 19:47 ` Rafał Miłecki
2017-04-17 19:47 ` [PATCH V5 3/3] mtd: physmap_of: drop duplicated support for linux, part-probe property Rafał Miłecki
2017-04-17 19:47 ` Rafał Miłecki
2017-04-19 20:37 ` [PATCH V5 1/3] dt-bindings: mtd: document linux,part-probe property Brian Norris
2017-04-19 20:37 ` Brian Norris
2017-04-19 20:55 ` Boris Brezillon
2017-04-19 20:55 ` Boris Brezillon
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=20170409130406.564802a4@bbrezillon \
--to=boris.brezillon@free-electrons.com \
--cc=computersforpeace@gmail.com \
--cc=cyrille.pitchen@atmel.com \
--cc=devicetree@vger.kernel.org \
--cc=dwmw2@infradead.org \
--cc=frowand.list@gmail.com \
--cc=linus.walleij@linaro.org \
--cc=linux-mtd@lists.infradead.org \
--cc=marek.vasut@gmail.com \
--cc=mark.rutland@arm.com \
--cc=rafal@milecki.pl \
--cc=richard@nod.at \
--cc=robh+dt@kernel.org \
--cc=zajec5@gmail.com \
/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.