]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
vsprintf: add %pOF
authorCasey Connolly <casey.connolly@linaro.org>
Wed, 1 Apr 2026 14:15:17 +0000 (16:15 +0200)
committerTom Rini <trini@konsulko.com>
Tue, 21 Apr 2026 17:19:49 +0000 (11:19 -0600)
This prints a full ofnode path.

Signed-off-by: Casey Connolly <casey.connolly@linaro.org>
lib/vsprintf.c

index c7340a047b2e9385b9366d90e1363c99882db398..49dc9c38c6522d647ddf36f7e9484f1c7b269844 100644 (file)
 #include <linux/types.h>
 #include <linux/string.h>
 
+/* For %pOF */
+#if CONFIG_IS_ENABLED(OF_CONTROL)
+#include <dm/ofnode.h>
+#endif
+
 /* we use this so that we can do without the ctype library */
 #define is_digit(c)    ((c) >= '0' && (c) <= '9')
 
@@ -438,6 +443,30 @@ static char *uuid_string(char *buf, char *end, u8 *addr, int field_width,
 }
 #endif
 
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !defined(API_BUILD)
+static char *ofnode_string(char *buf, char *end, ofnode *dp, int field_width,
+                               int precision, int flags)
+{
+#define NP_PATH_MAX 64
+       char str[NP_PATH_MAX] = { 0 };
+       const char *err = "...";
+
+       /* If dp == NULL output the string '<NULL>' */
+       if (!dp || !ofnode_valid(*dp))
+               return string(buf, end, NULL, field_width, precision, flags);
+
+       /* Get the path and indicate if it got cut off */
+       if (ofnode_get_path(*dp, str, NP_PATH_MAX)) {
+               str[NP_PATH_MAX - 1] = '\0';
+               char *p = str + min((NP_PATH_MAX - 2) - strlen(err), strlen(str));
+               memcpy(p, err, strlen(err) + 1);
+       }
+
+       return string(buf, end, str, field_width, precision, flags);
+#undef NP_PATH_MAX
+}
+#endif
+
 /*
  * Show a '%p' thing.  A kernel extension is that the '%p' is followed
  * by an extra set of alphanumeric characters that are extended format
@@ -473,6 +502,14 @@ static char *pointer(const char *fmt, char *buf, char *end, void *ptr,
        case 'D':
                return device_path_string(buf, end, ptr, field_width,
                                          precision, flags);
+#endif
+/* Device paths only exist in the EFI context. */
+#if CONFIG_IS_ENABLED(OF_CONTROL) && !defined(API_BUILD)
+       case 'O':
+               if (fmt[1] == 'F')
+                       return ofnode_string(buf, end, ptr, field_width,
+                                         precision, flags);
+               break;
 #endif
        case 'a':
                flags |= SPECIAL | ZEROPAD;