Skip to content

Commit 117e6ed

Browse files
GuEe-GUImysterywolf
authored andcommitted
[FEATURE/FDT] Add bootargs select in early
Maybe use for memory/DMA buffer init before ofw_node unflatten. Signed-off-by: GuEe-GUI <[email protected]>
1 parent cb665f9 commit 117e6ed

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

components/drivers/include/drivers/ofw_fdt.h

+1
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ rt_err_t rt_fdt_boot_dump(void);
7070
void rt_fdt_earlycon_output(const char *str);
7171
void rt_fdt_earlycon_kick(int why);
7272
rt_err_t rt_fdt_scan_chosen_stdout(void);
73+
rt_err_t rt_fdt_bootargs_select(const char *key, int index, const char **out_result);
7374
rt_err_t rt_fdt_unflatten(void);
7475

7576
struct rt_ofw_node *rt_fdt_unflatten_single(void *fdt);

components/drivers/ofw/fdt.c

+49
Original file line numberDiff line numberDiff line change
@@ -793,6 +793,55 @@ rt_err_t rt_fdt_scan_chosen_stdout(void)
793793
return err;
794794
}
795795

796+
rt_err_t rt_fdt_bootargs_select(const char *key, int index, const char **out_result)
797+
{
798+
rt_err_t err;
799+
800+
if (key && index >= 0 && out_result)
801+
{
802+
int offset = fdt_path_offset(_fdt, "/chosen");
803+
804+
if (offset >= 0)
805+
{
806+
int len, key_len = rt_strlen(key);
807+
const char *bootargs = fdt_getprop(_fdt, offset, "bootargs", &len), *end;
808+
809+
end = bootargs + len;
810+
err = -RT_EEMPTY;
811+
812+
for (int i = 0; bootargs < end; ++i)
813+
{
814+
bootargs = rt_strstr(bootargs, key);
815+
816+
if (!bootargs)
817+
{
818+
break;
819+
}
820+
821+
bootargs += key_len;
822+
823+
if (i == index)
824+
{
825+
*out_result = bootargs;
826+
827+
err = -RT_EOK;
828+
break;
829+
}
830+
}
831+
}
832+
else
833+
{
834+
err = -RT_ERROR;
835+
}
836+
}
837+
else
838+
{
839+
err = -RT_EINVAL;
840+
}
841+
842+
return err;
843+
}
844+
796845
static void system_node_init_flag(struct rt_ofw_node *np)
797846
{
798847
if (np)

0 commit comments

Comments
 (0)