/* SPDX-License-Identifier: Apache-2.0 * Copyright (c) 2024 Cisco Systems, Inc. */ #ifndef CLIB_DEVICETREE_H_ #define CLIB_DEVICETREE_H_ #include #include #ifdef __linux #define CLIB_DT_LINUX_PREFIX "/sys/firmware/devicetree/base" #endif typedef struct { char name[32]; u32 size; u8 data[]; } clib_dt_property_t; typedef struct clib_dt_main clib_dt_main_t; typedef struct clib_dt_node { u8 *path; struct clib_dt_node *parent; struct clib_dt_node *prev; struct clib_dt_node *next; struct clib_dt_node **child_nodes; u8 depth; clib_dt_property_t *name; clib_dt_property_t **properties; clib_dt_main_t *dt_main; } clib_dt_node_t; typedef struct clib_dt_main { clib_dt_node_t **nodes; clib_dt_node_t *root; uword *node_by_path; uword *node_by_phandle; } clib_dt_main_t; clib_dt_node_t *clib_dt_get_node_with_path (clib_dt_main_t *dm, char *fmt, ...); clib_dt_property_t *clib_dt_get_node_property_by_name (clib_dt_node_t *, char *); int clib_dt_node_is_compatible (clib_dt_node_t *, char *); clib_dt_node_t *clib_dt_dereference_node (clib_dt_node_t *, char *); #ifdef __linux clib_error_t *clib_dt_read_from_sysfs (clib_dt_main_t *dm); #endif format_function_t format_clib_dt_desc; format_function_t format_clib_dt_property_data; static_always_inline int clib_dt_proprerty_is_u32 (clib_dt_property_t *p) { if (p == 0 || p->size != 4) return 0; return 1; } static_always_inline u32 clib_dt_proprerty_get_u32 (clib_dt_property_t *p) { return clib_net_to_host_u32 (*(u32u *) p->data); } #endif /* CLIB_DEVICETREE_H_ */