Commit 2a1a2cb6e2b87ee550e6f27b647d23331dfd5e1b

Authored by Kumar Gala
Committed by Wolfgang Denk
1 parent 3082d2348c

fdt: refactor initrd related code

Created a new fdt_initrd() to deal with setting the initrd properties
in the device tree and fixing up the mem reserve.  We can use this
both in the choosen node handling and lets us remove some duplicated
code when we fixup the initrd info in bootm on PPC.

Signed-off-by: Kumar Gala <galak@kernel.crashing.org>

Showing 3 changed files with 70 additions and 68 deletions Side-by-side Diff

common/fdt_support.c
... ... @@ -99,44 +99,85 @@
99 99 }
100 100 #endif
101 101  
102   -int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force)
  102 +int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force)
103 103 {
104 104 int nodeoffset;
105   - int err;
106   - u32 tmp; /* used to set 32 bit integer properties */
107   - char *str; /* used to set string properties */
  105 + int err, j, total;
  106 + u32 tmp;
108 107 const char *path;
  108 + uint64_t addr, size;
109 109  
110   - err = fdt_check_header(fdt);
111   - if (err < 0) {
112   - printf("fdt_chosen: %s\n", fdt_strerror(err));
113   - return err;
  110 + /* Find the "chosen" node. */
  111 + nodeoffset = fdt_path_offset (fdt, "/chosen");
  112 +
  113 + /* If there is no "chosen" node in the blob return */
  114 + if (nodeoffset < 0) {
  115 + printf("fdt_initrd: %s\n", fdt_strerror(nodeoffset));
  116 + return nodeoffset;
114 117 }
115 118  
116   - if (initrd_start && initrd_end) {
117   - uint64_t addr, size;
118   - int total = fdt_num_mem_rsv(fdt);
119   - int j;
  119 + /* just return if initrd_start/end aren't valid */
  120 + if ((initrd_start == 0) || (initrd_end == 0))
  121 + return 0;
120 122  
121   - /*
122   - * Look for an existing entry and update it. If we don't find
123   - * the entry, we will j be the next available slot.
124   - */
125   - for (j = 0; j < total; j++) {
126   - err = fdt_get_mem_rsv(fdt, j, &addr, &size);
127   - if (addr == initrd_start) {
128   - fdt_del_mem_rsv(fdt, j);
129   - break;
130   - }
  123 + total = fdt_num_mem_rsv(fdt);
  124 +
  125 + /*
  126 + * Look for an existing entry and update it. If we don't find
  127 + * the entry, we will j be the next available slot.
  128 + */
  129 + for (j = 0; j < total; j++) {
  130 + err = fdt_get_mem_rsv(fdt, j, &addr, &size);
  131 + if (addr == initrd_start) {
  132 + fdt_del_mem_rsv(fdt, j);
  133 + break;
131 134 }
  135 + }
132 136  
133   - err = fdt_add_mem_rsv(fdt, initrd_start, initrd_end - initrd_start + 1);
  137 + err = fdt_add_mem_rsv(fdt, initrd_start, initrd_end - initrd_start + 1);
  138 + if (err < 0) {
  139 + printf("fdt_initrd: %s\n", fdt_strerror(err));
  140 + return err;
  141 + }
  142 +
  143 + path = fdt_getprop(fdt, nodeoffset, "linux,initrd-start", NULL);
  144 + if ((path == NULL) || force) {
  145 + tmp = __cpu_to_be32(initrd_start);
  146 + err = fdt_setprop(fdt, nodeoffset,
  147 + "linux,initrd-start", &tmp, sizeof(tmp));
134 148 if (err < 0) {
135   - printf("fdt_chosen: %s\n", fdt_strerror(err));
  149 + printf("WARNING: "
  150 + "could not set linux,initrd-start %s.\n",
  151 + fdt_strerror(err));
136 152 return err;
137 153 }
  154 + tmp = __cpu_to_be32(initrd_end);
  155 + err = fdt_setprop(fdt, nodeoffset,
  156 + "linux,initrd-end", &tmp, sizeof(tmp));
  157 + if (err < 0) {
  158 + printf("WARNING: could not set linux,initrd-end %s.\n",
  159 + fdt_strerror(err));
  160 +
  161 + return err;
  162 + }
138 163 }
139 164  
  165 + return 0;
  166 +}
  167 +
  168 +int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force)
  169 +{
  170 + int nodeoffset;
  171 + int err;
  172 + char *str; /* used to set string properties */
  173 + const char *path;
  174 +
  175 + err = fdt_check_header(fdt);
  176 + if (err < 0) {
  177 + printf("fdt_chosen: %s\n", fdt_strerror(err));
  178 + return err;
  179 + }
  180 +
140 181 /*
141 182 * Find the "chosen" node.
142 183 */
... ... @@ -173,24 +214,8 @@
173 214 fdt_strerror(err));
174 215 }
175 216 }
176   - if (initrd_start && initrd_end) {
177   - path = fdt_getprop(fdt, nodeoffset, "linux,initrd-start", NULL);
178   - if ((path == NULL) || force) {
179   - tmp = __cpu_to_be32(initrd_start);
180   - err = fdt_setprop(fdt, nodeoffset,
181   - "linux,initrd-start", &tmp, sizeof(tmp));
182   - if (err < 0)
183   - printf("WARNING: "
184   - "could not set linux,initrd-start %s.\n",
185   - fdt_strerror(err));
186   - tmp = __cpu_to_be32(initrd_end);
187   - err = fdt_setprop(fdt, nodeoffset,
188   - "linux,initrd-end", &tmp, sizeof(tmp));
189   - if (err < 0)
190   - printf("WARNING: could not set linux,initrd-end %s.\n",
191   - fdt_strerror(err));
192   - }
193   - }
  217 +
  218 + fdt_initrd(fdt, initrd_start, initrd_end, force);
194 219  
195 220 #ifdef CONFIG_OF_STDOUT_VIA_ALIAS
196 221 path = fdt_getprop(fdt, nodeoffset, "linux,stdout-path", NULL);
include/fdt_support.h
... ... @@ -29,6 +29,7 @@
29 29 #include <fdt.h>
30 30  
31 31 int fdt_chosen(void *fdt, ulong initrd_start, ulong initrd_end, int force);
  32 +int fdt_initrd(void *fdt, ulong initrd_start, ulong initrd_end, int force);
32 33 void do_fixup_by_path(void *fdt, const char *path, const char *prop,
33 34 const void *val, int len, int create);
34 35 void do_fixup_by_path_u32(void *fdt, const char *path, const char *prop,
... ... @@ -182,32 +182,8 @@
182 182  
183 183 #if defined(CONFIG_OF_LIBFDT)
184 184 /* fixup the initrd now that we know where it should be */
185   - if ((of_flat_tree) && (initrd_start && initrd_end)) {
186   - uint64_t addr, size;
187   - int total = fdt_num_mem_rsv(of_flat_tree);
188   - int j;
189   -
190   - /* Look for the dummy entry and delete it */
191   - for (j = 0; j < total; j++) {
192   - fdt_get_mem_rsv(of_flat_tree, j, &addr, &size);
193   - if (addr == images->rd_start) {
194   - fdt_del_mem_rsv(of_flat_tree, j);
195   - break;
196   - }
197   - }
198   -
199   - ret = fdt_add_mem_rsv(of_flat_tree, initrd_start,
200   - initrd_end - initrd_start + 1);
201   - if (ret < 0) {
202   - printf("fdt_chosen: %s\n", fdt_strerror(ret));
203   - goto error;
204   - }
205   -
206   - do_fixup_by_path_u32(of_flat_tree, "/chosen",
207   - "linux,initrd-start", initrd_start, 0);
208   - do_fixup_by_path_u32(of_flat_tree, "/chosen",
209   - "linux,initrd-end", initrd_end, 0);
210   - }
  185 + if ((of_flat_tree) && (initrd_start && initrd_end))
  186 + fdt_initrd(of_flat_tree, initrd_start, initrd_end, 1);
211 187 #endif
212 188 debug ("## Transferring control to Linux (at address %08lx) ...\n",
213 189 (ulong)kernel);