Commit 05ff8c258c76dd469232a03ec8d45f7e7267e0ac
Committed by
David Woodhouse
1 parent
e66e280c36
Exists in
master
and in
20 other branches
mtd: ofpart: support partitions of 4 GiB and larger
Previously, partitions were limited to less than 4 GiB in size because the address and size were read as 32-bit values. Add support for 64-bit values to support devices of 4 GiB and larger. Signed-off-by: Joe Schaack <jschaack@xes-inc.com> Signed-off-by: Nate Case <ncase@xes-inc.com> Signed-off-by: Aaron Sierra <asierra@xes-inc.com> Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Showing 2 changed files with 39 additions and 4 deletions Side-by-side Diff
Documentation/devicetree/bindings/mtd/partition.txt
... | ... | @@ -5,8 +5,12 @@ |
5 | 5 | used for what purposes, but which don't use an on-flash partition table such |
6 | 6 | as RedBoot. |
7 | 7 | |
8 | -#address-cells & #size-cells must both be present in the mtd device and be | |
9 | -equal to 1. | |
8 | +#address-cells & #size-cells must both be present in the mtd device. There are | |
9 | +two valid values for both: | |
10 | +<1>: for partitions that require a single 32-bit cell to represent their | |
11 | + size/address (aka the value is below 4 GiB) | |
12 | +<2>: for partitions that require two 32-bit cells to represent their | |
13 | + size/address (aka the value is 4 GiB or greater). | |
10 | 14 | |
11 | 15 | Required properties: |
12 | 16 | - reg : The partition's offset and size within the mtd bank. |
... | ... | @@ -34,6 +38,34 @@ |
34 | 38 | |
35 | 39 | uimage@100000 { |
36 | 40 | reg = <0x0100000 0x200000>; |
41 | + }; | |
42 | +}; | |
43 | + | |
44 | +flash@1 { | |
45 | + #address-cells = <1>; | |
46 | + #size-cells = <2>; | |
47 | + | |
48 | + /* a 4 GiB partition */ | |
49 | + partition@0 { | |
50 | + label = "filesystem"; | |
51 | + reg = <0x00000000 0x1 0x00000000>; | |
52 | + }; | |
53 | +}; | |
54 | + | |
55 | +flash@2 { | |
56 | + #address-cells = <2>; | |
57 | + #size-cells = <2>; | |
58 | + | |
59 | + /* an 8 GiB partition */ | |
60 | + partition@0 { | |
61 | + label = "filesystem #1"; | |
62 | + reg = <0x0 0x00000000 0x2 0x00000000>; | |
63 | + }; | |
64 | + | |
65 | + /* a 4 GiB partition */ | |
66 | + partition@200000000 { | |
67 | + label = "filesystem #2"; | |
68 | + reg = <0x2 0x00000000 0x1 0x00000000>; | |
37 | 69 | }; |
38 | 70 | }; |
drivers/mtd/ofpart.c
... | ... | @@ -55,6 +55,7 @@ |
55 | 55 | while ((pp = of_get_next_child(node, pp))) { |
56 | 56 | const __be32 *reg; |
57 | 57 | int len; |
58 | + int a_cells, s_cells; | |
58 | 59 | |
59 | 60 | reg = of_get_property(pp, "reg", &len); |
60 | 61 | if (!reg) { |
... | ... | @@ -62,8 +63,10 @@ |
62 | 63 | continue; |
63 | 64 | } |
64 | 65 | |
65 | - (*pparts)[i].offset = be32_to_cpu(reg[0]); | |
66 | - (*pparts)[i].size = be32_to_cpu(reg[1]); | |
66 | + a_cells = of_n_addr_cells(pp); | |
67 | + s_cells = of_n_size_cells(pp); | |
68 | + (*pparts)[i].offset = of_read_number(reg, a_cells); | |
69 | + (*pparts)[i].size = of_read_number(reg + a_cells, s_cells); | |
67 | 70 | |
68 | 71 | partname = of_get_property(pp, "label", &len); |
69 | 72 | if (!partname) |