| 394 | } |
| 395 | |
| 396 | static 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 | { |
no test coverage detected