14
14
#include <asm/prom.h>
15
15
#include <asm/drmem.h>
16
16
17
+ static int n_root_addr_cells , n_root_size_cells ;
18
+
17
19
static struct drmem_lmb_info __drmem_info ;
18
20
struct drmem_lmb_info * drmem_info = & __drmem_info ;
19
21
@@ -189,12 +191,13 @@ int drmem_update_dt(void)
189
191
return rc ;
190
192
}
191
193
192
- static void __init read_drconf_v1_cell (struct drmem_lmb * lmb ,
194
+ static void read_drconf_v1_cell (struct drmem_lmb * lmb ,
193
195
const __be32 * * prop )
194
196
{
195
197
const __be32 * p = * prop ;
196
198
197
- lmb -> base_addr = dt_mem_next_cell (dt_root_addr_cells , & p );
199
+ lmb -> base_addr = of_read_number (p , n_root_addr_cells );
200
+ p += n_root_addr_cells ;
198
201
lmb -> drc_index = of_read_number (p ++ , 1 );
199
202
200
203
p ++ ; /* skip reserved field */
@@ -205,47 +208,50 @@ static void __init read_drconf_v1_cell(struct drmem_lmb *lmb,
205
208
* prop = p ;
206
209
}
207
210
208
- static void __init __walk_drmem_v1_lmbs (const __be32 * prop , const __be32 * usm ,
209
- void (* func )(struct drmem_lmb * , const __be32 * * ))
211
+ static int
212
+ __walk_drmem_v1_lmbs (const __be32 * prop , const __be32 * usm , void * data ,
213
+ int (* func )(struct drmem_lmb * , const __be32 * * , void * ))
210
214
{
211
215
struct drmem_lmb lmb ;
212
216
u32 i , n_lmbs ;
217
+ int ret = 0 ;
213
218
214
219
n_lmbs = of_read_number (prop ++ , 1 );
215
- if (n_lmbs == 0 )
216
- return ;
217
-
218
220
for (i = 0 ; i < n_lmbs ; i ++ ) {
219
221
read_drconf_v1_cell (& lmb , & prop );
220
- func (& lmb , & usm );
222
+ ret = func (& lmb , & usm , data );
223
+ if (ret )
224
+ break ;
221
225
}
226
+
227
+ return ret ;
222
228
}
223
229
224
- static void __init read_drconf_v2_cell (struct of_drconf_cell_v2 * dr_cell ,
230
+ static void read_drconf_v2_cell (struct of_drconf_cell_v2 * dr_cell ,
225
231
const __be32 * * prop )
226
232
{
227
233
const __be32 * p = * prop ;
228
234
229
235
dr_cell -> seq_lmbs = of_read_number (p ++ , 1 );
230
- dr_cell -> base_addr = dt_mem_next_cell (dt_root_addr_cells , & p );
236
+ dr_cell -> base_addr = of_read_number (p , n_root_addr_cells );
237
+ p += n_root_addr_cells ;
231
238
dr_cell -> drc_index = of_read_number (p ++ , 1 );
232
239
dr_cell -> aa_index = of_read_number (p ++ , 1 );
233
240
dr_cell -> flags = of_read_number (p ++ , 1 );
234
241
235
242
* prop = p ;
236
243
}
237
244
238
- static void __init __walk_drmem_v2_lmbs (const __be32 * prop , const __be32 * usm ,
239
- void (* func )(struct drmem_lmb * , const __be32 * * ))
245
+ static int
246
+ __walk_drmem_v2_lmbs (const __be32 * prop , const __be32 * usm , void * data ,
247
+ int (* func )(struct drmem_lmb * , const __be32 * * , void * ))
240
248
{
241
249
struct of_drconf_cell_v2 dr_cell ;
242
250
struct drmem_lmb lmb ;
243
251
u32 i , j , lmb_sets ;
252
+ int ret = 0 ;
244
253
245
254
lmb_sets = of_read_number (prop ++ , 1 );
246
- if (lmb_sets == 0 )
247
- return ;
248
-
249
255
for (i = 0 ; i < lmb_sets ; i ++ ) {
250
256
read_drconf_v2_cell (& dr_cell , & prop );
251
257
@@ -259,42 +265,51 @@ static void __init __walk_drmem_v2_lmbs(const __be32 *prop, const __be32 *usm,
259
265
lmb .aa_index = dr_cell .aa_index ;
260
266
lmb .flags = dr_cell .flags ;
261
267
262
- func (& lmb , & usm );
268
+ ret = func (& lmb , & usm , data );
269
+ if (ret )
270
+ break ;
263
271
}
264
272
}
273
+
274
+ return ret ;
265
275
}
266
276
267
277
#ifdef CONFIG_PPC_PSERIES
268
- void __init walk_drmem_lmbs_early (unsigned long node ,
269
- void (* func )(struct drmem_lmb * , const __be32 * * ))
278
+ int __init walk_drmem_lmbs_early (unsigned long node , void * data ,
279
+ int (* func )(struct drmem_lmb * , const __be32 * * , void * ))
270
280
{
271
281
const __be32 * prop , * usm ;
272
- int len ;
282
+ int len , ret = - ENODEV ;
273
283
274
284
prop = of_get_flat_dt_prop (node , "ibm,lmb-size" , & len );
275
285
if (!prop || len < dt_root_size_cells * sizeof (__be32 ))
276
- return ;
286
+ return ret ;
287
+
288
+ /* Get the address & size cells */
289
+ n_root_addr_cells = dt_root_addr_cells ;
290
+ n_root_size_cells = dt_root_size_cells ;
277
291
278
292
drmem_info -> lmb_size = dt_mem_next_cell (dt_root_size_cells , & prop );
279
293
280
294
usm = of_get_flat_dt_prop (node , "linux,drconf-usable-memory" , & len );
281
295
282
296
prop = of_get_flat_dt_prop (node , "ibm,dynamic-memory" , & len );
283
297
if (prop ) {
284
- __walk_drmem_v1_lmbs (prop , usm , func );
298
+ ret = __walk_drmem_v1_lmbs (prop , usm , data , func );
285
299
} else {
286
300
prop = of_get_flat_dt_prop (node , "ibm,dynamic-memory-v2" ,
287
301
& len );
288
302
if (prop )
289
- __walk_drmem_v2_lmbs (prop , usm , func );
303
+ ret = __walk_drmem_v2_lmbs (prop , usm , data , func );
290
304
}
291
305
292
306
memblock_dump_all ();
307
+ return ret ;
293
308
}
294
309
295
310
#endif
296
311
297
- static int __init init_drmem_lmb_size (struct device_node * dn )
312
+ static int init_drmem_lmb_size (struct device_node * dn )
298
313
{
299
314
const __be32 * prop ;
300
315
int len ;
@@ -303,12 +318,12 @@ static int __init init_drmem_lmb_size(struct device_node *dn)
303
318
return 0 ;
304
319
305
320
prop = of_get_property (dn , "ibm,lmb-size" , & len );
306
- if (!prop || len < dt_root_size_cells * sizeof (__be32 )) {
321
+ if (!prop || len < n_root_size_cells * sizeof (__be32 )) {
307
322
pr_info ("Could not determine LMB size\n" );
308
323
return -1 ;
309
324
}
310
325
311
- drmem_info -> lmb_size = dt_mem_next_cell ( dt_root_size_cells , & prop );
326
+ drmem_info -> lmb_size = of_read_number ( prop , n_root_size_cells );
312
327
return 0 ;
313
328
}
314
329
@@ -329,24 +344,36 @@ static const __be32 *of_get_usable_memory(struct device_node *dn)
329
344
return prop ;
330
345
}
331
346
332
- void __init walk_drmem_lmbs (struct device_node * dn ,
333
- void (* func )(struct drmem_lmb * , const __be32 * * ))
347
+ int walk_drmem_lmbs (struct device_node * dn , void * data ,
348
+ int (* func )(struct drmem_lmb * , const __be32 * * , void * ))
334
349
{
335
350
const __be32 * prop , * usm ;
351
+ int ret = - ENODEV ;
352
+
353
+ if (!of_root )
354
+ return ret ;
355
+
356
+ /* Get the address & size cells */
357
+ of_node_get (of_root );
358
+ n_root_addr_cells = of_n_addr_cells (of_root );
359
+ n_root_size_cells = of_n_size_cells (of_root );
360
+ of_node_put (of_root );
336
361
337
362
if (init_drmem_lmb_size (dn ))
338
- return ;
363
+ return ret ;
339
364
340
365
usm = of_get_usable_memory (dn );
341
366
342
367
prop = of_get_property (dn , "ibm,dynamic-memory" , NULL );
343
368
if (prop ) {
344
- __walk_drmem_v1_lmbs (prop , usm , func );
369
+ ret = __walk_drmem_v1_lmbs (prop , usm , data , func );
345
370
} else {
346
371
prop = of_get_property (dn , "ibm,dynamic-memory-v2" , NULL );
347
372
if (prop )
348
- __walk_drmem_v2_lmbs (prop , usm , func );
373
+ ret = __walk_drmem_v2_lmbs (prop , usm , data , func );
349
374
}
375
+
376
+ return ret ;
350
377
}
351
378
352
379
static void __init init_drmem_v1_lmbs (const __be32 * prop )
0 commit comments