aboutsummaryrefslogtreecommitdiff
path: root/lib/fdt_dbg.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/fdt_dbg.c')
-rw-r--r--lib/fdt_dbg.c159
1 files changed, 0 insertions, 159 deletions
diff --git a/lib/fdt_dbg.c b/lib/fdt_dbg.c
deleted file mode 100644
index d2d4e7b..0000000
--- a/lib/fdt_dbg.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/* SPDX-License-Identifier: copyleft-next-0.3.1 */
-/* Copyright 2021 - 2022, Kim Kuparinen < kimi.h.kuparinen@gmail.com > */
-
-/**
- * @file fdt_dbg.c
- * Dump fdt info to serial.
- */
-
-#include <kmi/debug.h>
-#include <libfdt.h>
-
-#if defined(DEBUG)
-/**
- * Print single character \c depth number of times.
- *
- * @param c Character to print.
- * @param depth Number of times to print character.
- */
-static void __print_char(char c, int depth)
-{
- /* lol, ugly but good enough for now */
- for (int i = 0; i < depth; ++i)
- dbg("%c", c);
-}
-
-/**
- * Check if ASCII character is in printable range.
- *
- * In this case, printable is anything that isn't a control character, line
- * feed, bell, etc.
- *
- * @param c Character to check.
- * @return \ref true if in printable range, \ref false otherwise.
- */
-static int __printable(char c)
-{
- return (c >= 32) && (c <= 126);
-}
-
-/**
- * Check if \c data and \c len bytes from it form a reasonable string.
- *
- * @param data Pointer to some binary data to check.
- * @param len Assumed length of string.
- * @return \c true if data is likely some string, \c false otherwise.
- */
-static int __is_string(const void *data, int len)
-{
- const char *s = data;
-
- /* zero length is not */
- if (len == 0)
- return 0;
-
- /* must terminate with zero or '\n' */
- if (s[len - 1] != '\0' && s[len - 1] != '\n')
- return 0;
-
- /* printable or a null byte (concatenated strings) */
- while (((*s == '\0') || __printable(*s)) && (len > 0)) {
- /*
- * If we see a null, there are three possibilities:
- * 1) If len == 1, it is the end of the string, printable
- * 2) Next character also a null, not printable.
- * 3) Next character not a null, continue to check.
- */
- if (s[0] == '\0') {
- if (len == 1)
- return 1;
- if (s[1] == '\0')
- return 0;
- }
- s++;
- len--;
- }
-
- /* Not the null termination, or not done yet: not printable */
- if (*s != '\0' || (len != 0))
- return 0;
-
- return 1;
-}
-
-/**
- * Print value of FDT property.
- *
- * @param data Pointer to FDT property.
- * @param len Length of property.
- */
-static void __print_prop_value(const void *data, int len)
-{
- if (len == 0)
- return;
-
- dbg(" = ");
-
- /* heavily inspired by u-boot's fdt print */
- if (__is_string(data, len)) {
- dbg("\"");
- int i = 0;
- while (i < len) {
- if (i > 0)
- dbg("\", \"");
-
- dbg("%s", (const char *)data);
- i += strlen(data) + 1;
- data += strlen(data) + 1;
- }
- dbg("\"");
-
- } else if ((len % 4) == 0) {
- const int32_t *p = (const int32_t *)data;
- dbg("<");
- for (int i = 0; i < len / 4; ++i)
- dbg("%#08x%s", (unsigned int)fdt32_to_cpu(p[i]),
- i < (len / 4 - 1) ? " " : "");
-
- dbg(">");
- } else {
- const int32_t *p = (const int32_t *)data;
- dbg("[");
- for (int i = 0; i < len / 4; ++i)
- dbg("%#02x%s", (unsigned int)fdt32_to_cpu(p[i]),
- i < (len / 4 - 1) ? " " : "");
-
- dbg("]");
- }
-}
-
-void __dbg_fdt(const void *fdt, int node_offset, int depth)
-{
- int node = 0;
- fdt_for_each_subnode(node, fdt, node_offset)
- {
- __print_char('\t', depth);
- dbg("%s: {\n", fdt_get_name(fdt, node, 0));
-
- int property = 0;
- fdt_for_each_property_offset(property, fdt, node)
- {
- int len = 0;
- const char *name = 0;
- const void *data = fdt_getprop_by_offset(fdt, property,
- &name, &len);
-
- __print_char('\t', depth + 1);
- dbg("%s", name);
-
- __print_prop_value(data, len);
- dbg(";\n");
- }
-
- __dbg_fdt(fdt, node, depth + 1);
-
- __print_char('\t', depth);
- dbg("};\n\n");
- }
-}
-#endif