Documentation/block/cmdline-partition.rst | 5 +- .../devicetree/bindings/mmc/mmc-card.yaml | 52 ++++++ block/blk.h | 1 + block/partitions/Kconfig | 9 ++ block/partitions/Makefile | 1 + block/partitions/check.h | 1 + block/partitions/cmdline.c | 3 + block/partitions/core.c | 6 + block/partitions/of.c | 151 ++++++++++++++++++ include/linux/string.h | 13 ++ 10 files changed, 241 insertions(+), 1 deletion(-) create mode 100644 block/partitions/of.c
Hi, this is an initial proposal to complete support for manually defining partition table. Some background on this. Many OEM on embedded device (modem, router...) are starting to migrate from NOR/NAND flash to eMMC. The reason for this is that OEM are starting to require more and more space for the firmware and price difference is becoming so little that using eMMC is only benefits and no cons. Given these reason, OEM are also using very custom way to provide a partition table and doesn't relay on common method like writing a table on the eMMC. One way that is commonly used is to hardcode the partition table and pass it to the system via various way (cmdline, special glue driver, block2mtd...) This way is also used on Android where the partition table is passed from the bootloader via cmdline. One reason to use this method is to save space on the device and to permit more flexibility on partition handling. What this series does is complete support for this feature. It's possible to use the cmdline to define a partition table similar to how it's done for MTD but this is problematic for a number of device where tweaking the cmdline is not possible. This series adds OF support to make it possible to define a partition table in the Device Tree. We implement a similar schema to the MTD fixed-partition, where we define a "label" and a "reg" with "offset" and "size". A new block partition parser is introduced that check if the block device have an OF node attached and check if a fixed-partition table is defined. If a correct node is found, then partition table is filled. cmdline will still have priority to this new parser. Some block device also implement boot1 and boot2 additional disk. Similar to the cmdline parser, these disk can have OF support using the "partitions-boot0" and "partitions-boot1" additional node. It's also completed support for declaring partition as read-only as this feature was introduced but never finished in the cmdline parser. Posting as RFC for any comments or additional checks on OF parser code. I hope this solution is better accepted as downstream this is becoming a real problem with a growing number of strange solution for the simple task of providing a fixed partition table. Changes v4: - Fix wrong description and title in Kconfig - Validate reg len with addr and size cells - Drop offset 0 constraint (not needed) - Rework bytes to sector conversion - Follow common logic with ignore partitions after state->limit - Better handle device_node put - Add suggested strends string helper Changes v3: - Out of RFC - Drop partition schema generalization and simplify it - Require fixed-partitions compatible to adapt to MTD schema - Make label property optional and fallback to node name Changes v2: - Reference bytes in DT instead of Sector Size - Validate offset and size after Sector Size conversion - Limit boot0 and boot1 to eMMC and add comments about JEDEC spec - Generalize MTD partition schema and introduce block partitions schema - Add missing code to actually attach the OF parser to block partition core - Add reviewed by tag for read-only patch Christian Marangi (5): block: add support for defining read-only partitions docs: block: Document support for read-only partition in cmdline part string: add strends() helper to check if a string ends with a suffix block: add support for partition table defined in OF dt-bindings: mmc: Document support for partition table in mmc-card Documentation/block/cmdline-partition.rst | 5 +- .../devicetree/bindings/mmc/mmc-card.yaml | 52 ++++++ block/blk.h | 1 + block/partitions/Kconfig | 9 ++ block/partitions/Makefile | 1 + block/partitions/check.h | 1 + block/partitions/cmdline.c | 3 + block/partitions/core.c | 6 + block/partitions/of.c | 151 ++++++++++++++++++ include/linux/string.h | 13 ++ 10 files changed, 241 insertions(+), 1 deletion(-) create mode 100644 block/partitions/of.c -- 2.45.2
On Mon, Sep 30, 2024 at 01:30:07PM +0200, Christian Marangi wrote: > Hi, > this is an initial proposal to complete support for manually defining > partition table. > > Some background on this. Many OEM on embedded device (modem, router...) > are starting to migrate from NOR/NAND flash to eMMC. The reason for this > is that OEM are starting to require more and more space for the firmware > and price difference is becoming so little that using eMMC is only benefits > and no cons. > > Given these reason, OEM are also using very custom way to provide a > partition table and doesn't relay on common method like writing a table > on the eMMC. > > One way that is commonly used is to hardcode the partition table and > pass it to the system via various way (cmdline, special glue driver, > block2mtd...) > This way is also used on Android where the partition table > is passed from the bootloader via cmdline. > > One reason to use this method is to save space on the device and to > permit more flexibility on partition handling. > > What this series does is complete support for this feature. > It's possible to use the cmdline to define a partition table similar > to how it's done for MTD but this is problematic for a number of device > where tweaking the cmdline is not possible. This series adds OF support > to make it possible to define a partition table in the Device Tree. > > We implement a similar schema to the MTD fixed-partition, where we define > a "label" and a "reg" with "offset" and "size". > > A new block partition parser is introduced that check if the block device > have an OF node attached and check if a fixed-partition table is defined. > > If a correct node is found, then partition table is filled. cmdline will > still have priority to this new parser. > > Some block device also implement boot1 and boot2 additional disk. Similar > to the cmdline parser, these disk can have OF support using the > "partitions-boot0" and "partitions-boot1" additional node. > > It's also completed support for declaring partition as read-only as this > feature was introduced but never finished in the cmdline parser. I'm not sure I fully understood the problem you are trying to solve. I have a device at hand that uses eMMC (and was produced almost ten years ago). This device has a regular GPT on eMMC and no kernel needs to be patched for that. So, why is it a problem for the mentioned OEMs to use standard GPT approach? -- With Best Regards, Andy Shevchenko
Andy Shevchenko <andy@kernel.org> writes: > On Mon, Sep 30, 2024 at 01:30:07PM +0200, Christian Marangi wrote: >> Hi, >> this is an initial proposal to complete support for manually defining >> partition table. >> >> >> Some block device also implement boot1 and boot2 additional disk. Similar >> to the cmdline parser, these disk can have OF support using the >> "partitions-boot0" and "partitions-boot1" additional node. >> >> It's also completed support for declaring partition as read-only as this >> feature was introduced but never finished in the cmdline parser. > > > I'm not sure I fully understood the problem you are trying to solve. > I have a device at hand that uses eMMC (and was produced almost ten years ago). > This device has a regular GPT on eMMC and no kernel needs to be patched for that. > So, why is it a problem for the mentioned OEMs to use standard GPT approach? For the user area (main block device), yes, a GPT can often be used, but not always. For the boot partitions, the particular SOC/cpu/bootrom may make it impossible to use a standard partition table, because the bootrom expects to find a bootloader at offset 0 on the active boot partition. In such a case, there's no way you can write a regular MBR or GPT, but it is nevertheless nice to have a machine-readable definition of which data goes where in the boot partitions. With these patches, one can do partitions-boot0 { partition@0 { label = "bootloader"; reg = <0 0x...>; // 2 MB } partition@... { label = "device-data"; reg = <...> // 4 MB } } and describe that layout. Rasmus
On Wed, Oct 02, 2024 at 11:20:37AM +0200, Rasmus Villemoes wrote: > Andy Shevchenko <andy@kernel.org> writes: > > On Mon, Sep 30, 2024 at 01:30:07PM +0200, Christian Marangi wrote: ... > >> this is an initial proposal to complete support for manually defining > >> partition table. > >> > >> Some block device also implement boot1 and boot2 additional disk. Similar > >> to the cmdline parser, these disk can have OF support using the > >> "partitions-boot0" and "partitions-boot1" additional node. > >> > >> It's also completed support for declaring partition as read-only as this > >> feature was introduced but never finished in the cmdline parser. > > > > I'm not sure I fully understood the problem you are trying to solve. > > I have a device at hand that uses eMMC (and was produced almost ten years ago). > > This device has a regular GPT on eMMC and no kernel needs to be patched for that. > > So, why is it a problem for the mentioned OEMs to use standard GPT approach? > > For the user area (main block device), yes, a GPT can often be used, but > not always. For the boot partitions, the particular SOC/cpu/bootrom may > make it impossible to use a standard partition table, because the > bootrom expects to find a bootloader at offset 0 on the active boot > partition. In such a case, there's no way you can write a regular MBR or > GPT, but it is nevertheless nice to have a machine-readable definition > of which data goes where in the boot partitions. With these patches, one > can do > > partitions-boot0 { > partition@0 { > label = "bootloader"; > reg = <0 0x...>; // 2 MB > } > partition@... { > label = "device-data"; > reg = <...> // 4 MB > } > } > > and describe that layout. I see now, on the device I mentioned the firmware is located on a boot partition, so the user ones are being used for bootloader and the OS. -- With Best Regards, Andy Shevchenko
© 2016 - 2024 Red Hat, Inc.