mirror of
https://github.com/riscv-software-src/opensbi.git
synced 2025-08-25 15:51:41 +01:00
lib: utils/fdt: Allow dynamic registration of FDT fixup callbacks
It should possible to fixup FDT from any part of OpenSBI so add fdt_register_general_fixup() which allows dynamic registration of FDT fixup callbacks. Signed-off-by: Anup Patel <apatel@ventanamicro.com>
This commit is contained in:
@@ -9,6 +9,8 @@
|
|||||||
#ifndef __FDT_FIXUP_H__
|
#ifndef __FDT_FIXUP_H__
|
||||||
#define __FDT_FIXUP_H__
|
#define __FDT_FIXUP_H__
|
||||||
|
|
||||||
|
#include <sbi/sbi_list.h>
|
||||||
|
|
||||||
struct sbi_cpu_idle_state {
|
struct sbi_cpu_idle_state {
|
||||||
const char *name;
|
const char *name;
|
||||||
uint32_t suspend_param;
|
uint32_t suspend_param;
|
||||||
@@ -93,6 +95,19 @@ void fdt_plic_fixup(void *fdt);
|
|||||||
*/
|
*/
|
||||||
int fdt_reserved_memory_fixup(void *fdt);
|
int fdt_reserved_memory_fixup(void *fdt);
|
||||||
|
|
||||||
|
/** Representation of a general fixup */
|
||||||
|
struct fdt_general_fixup {
|
||||||
|
struct sbi_dlist head;
|
||||||
|
const char *name;
|
||||||
|
void (*do_fixup)(struct fdt_general_fixup *f, void *fdt);
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Register a general fixup */
|
||||||
|
int fdt_register_general_fixup(struct fdt_general_fixup *fixup);
|
||||||
|
|
||||||
|
/** UnRegister a general fixup */
|
||||||
|
void fdt_unregister_general_fixup(struct fdt_general_fixup *fixup);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* General device tree fix-up
|
* General device tree fix-up
|
||||||
*
|
*
|
||||||
|
@@ -401,8 +401,38 @@ void fdt_config_fixup(void *fdt)
|
|||||||
fdt_nop_node(fdt, config_offset);
|
fdt_nop_node(fdt, config_offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SBI_LIST_HEAD(fixup_list);
|
||||||
|
|
||||||
|
int fdt_register_general_fixup(struct fdt_general_fixup *fixup)
|
||||||
|
{
|
||||||
|
struct fdt_general_fixup *f;
|
||||||
|
|
||||||
|
if (!fixup || !fixup->name || !fixup->do_fixup)
|
||||||
|
return SBI_EINVAL;
|
||||||
|
|
||||||
|
sbi_list_for_each_entry(f, &fixup_list, head) {
|
||||||
|
if (f == fixup)
|
||||||
|
return SBI_EALREADY;
|
||||||
|
}
|
||||||
|
|
||||||
|
SBI_INIT_LIST_HEAD(&fixup->head);
|
||||||
|
sbi_list_add_tail(&fixup->head, &fixup_list);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void fdt_unregister_general_fixup(struct fdt_general_fixup *fixup)
|
||||||
|
{
|
||||||
|
if (!fixup)
|
||||||
|
return;
|
||||||
|
|
||||||
|
sbi_list_del(&fixup->head);
|
||||||
|
}
|
||||||
|
|
||||||
void fdt_fixups(void *fdt)
|
void fdt_fixups(void *fdt)
|
||||||
{
|
{
|
||||||
|
struct fdt_general_fixup *f;
|
||||||
|
|
||||||
fdt_aplic_fixup(fdt);
|
fdt_aplic_fixup(fdt);
|
||||||
|
|
||||||
fdt_imsic_fixup(fdt);
|
fdt_imsic_fixup(fdt);
|
||||||
@@ -416,4 +446,7 @@ void fdt_fixups(void *fdt)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
fdt_config_fixup(fdt);
|
fdt_config_fixup(fdt);
|
||||||
|
|
||||||
|
sbi_list_for_each_entry(f, &fixup_list, head)
|
||||||
|
f->do_fixup(f, fdt);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user