MCPcopy Create free account
hub / github.com/RT-Thread/rt-thread / fdt_scan_initrd

Function fdt_scan_initrd

components/drivers/ofw/fdt.c:396–489  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

394}
395
396static rt_err_t fdt_scan_initrd(rt_uint64_t *ranges, const char *name, const char *oem)
397{
398 char tmp_name[32];
399 rt_err_t err = -RT_EEMPTY;
400
401 if (_fdt && ranges)
402 {
403 int offset = fdt_path_offset(_fdt, "/chosen");
404
405 if (offset >= 0)
406 {
407 int s_len, e_len;
408 const fdt32_t *start = RT_NULL, *end = RT_NULL;
409
410 rt_snprintf(tmp_name, sizeof(tmp_name), "%s,%s-start", oem, name);
411 start = fdt_getprop(_fdt, offset, tmp_name, &s_len);
412 rt_snprintf(tmp_name, sizeof(tmp_name), "%s,%s-end", oem, name);
413 end = fdt_getprop(_fdt, offset, tmp_name, &e_len);
414
415 if (start && end)
416 {
417 s_len /= sizeof(*start);
418 e_len /= sizeof(*end);
419
420 ranges[0] = rt_fdt_read_number(start, s_len);
421 ranges[1] = rt_fdt_read_number(end, e_len);
422
423 err = RT_EOK;
424 }
425 }
426
427 if (err)
428 {
429 int len;
430 const char *options, *bootargs = fdt_getprop(_fdt, offset, "bootargs", &len);
431
432 rt_snprintf(tmp_name, sizeof(tmp_name), "%s=", name);
433
434 if (bootargs && (options = rt_strstr(bootargs, tmp_name)))
435 {
436 rt_uint64_t value;
437
438 options += rt_strlen(tmp_name) + sizeof("0x") - 1;
439 err = RT_EOK;
440
441 for (int i = 0; i < 2 && !err; ++i)
442 {
443 value = 0;
444
445 while (*options && *options != ',' && *options != ' ')
446 {
447 /* To lowercase or keep number */
448 char ch = *options | ' ';
449
450 value *= 16;
451
452 if (ch >= '0' && ch <= '9')
453 {

Callers 1

rt_fdt_scan_initrdFunction · 0.85

Calls 7

rt_snprintfFunction · 0.85
rt_fdt_read_numberFunction · 0.85
rt_strstrFunction · 0.85
rt_strlenFunction · 0.85
fdt_path_offsetFunction · 0.50
fdt_getpropFunction · 0.50

Tested by

no test coverage detected