From: Sean Anderson <seanga2@gmail.com>
To: u-boot@lists.denx.de
Subject: [PATCH v2 46/46] dm: Print device name in dev_xxx like Linux
Date: Tue, 15 Sep 2020 10:45:22 -0400 [thread overview]
Message-ID: <20200915144522.509493-47-seanga2@gmail.com> (raw)
In-Reply-To: <20200915144522.509493-1-seanga2@gmail.com>
This adorns messages generated by dev_xxx with the device and driver
names. It also redirects dev_xxx to log when it is available. The names
of these functions very roughly take inspiration from Linux, but there is
no deeper correlation.
Both struct udevice and struct device are supported when logging, though
logging with struct device is no better than using log_xxx. The latter is
supported because of the large amount of existing code which logs with
struct device.
Signed-off-by: Sean Anderson <seanga2@gmail.com>
---
Changes in v2:
- Support logging with struct device as well as struct udevice. A lot of
drivers, especially USB gadgets, log with devices and not udevices. There
is no major reason why they can't use udevice, but big changes like that
are outside the scope of this series.
- Add some comments to __dev_printk and dev_printk_emit
- Handle struct device as well as struct udevice
- Match format strings for the NULL path to the regular path. This reduces the
amount of duplicated strings.
- Print the device name before the driver name
include/dm/device_compat.h | 110 +++++++++++++++++++++++++++----------
1 file changed, 82 insertions(+), 28 deletions(-)
diff --git a/include/dm/device_compat.h b/include/dm/device_compat.h
index 7c14aa464d..8f26053b45 100644
--- a/include/dm/device_compat.h
+++ b/include/dm/device_compat.h
@@ -1,5 +1,6 @@
/* SPDX-License-Identifier: GPL-2.0+ */
/*
+ * Copyright (C) 2020 Sean Anderson <seanga2@gmail.com>
* Copyright (c) 2013 Google, Inc
*
* (C) Copyright 2012
@@ -11,6 +12,7 @@
#define _DM_DEVICE_COMPAT_H
#include <log.h>
+#include <linux/build_bug.h>
#include <linux/compat.h>
/*
@@ -34,18 +36,87 @@
#endif
/*
- * REVISIT:
- * print device name like Linux
+ * Define a new identifier which can be tested on by C code. A similar
+ * definition is made for DEBUG in <log.h>.
*/
-#define dev_printk(dev, fmt, ...) \
-({ \
- printk(fmt, ##__VA_ARGS__); \
+#ifdef VERBOSE_DEBUG
+#define _VERBOSE_DEBUG 1
+#else
+#define _VERBOSE_DEBUG 0
+#endif
+
+/**
+ * dev_printk_emit() - Emit a formatted log message
+ * @cat: Category of the message
+ * @level: Log level of the message
+ * @fmt: Format string
+ * @...: Arguments for @fmt
+ *
+ * This macro logs a message through the appropriate channel. It is a macro so
+ * the if statements can be optimized out (as @level should be a constant known
+ * at compile-time).
+ *
+ * If DEBUG or VERBOSE_DEBUG is defined, then some messages are always printed
+ * (through printf()). This is to match the historical behavior of the dev_xxx
+ * functions.
+ *
+ * If LOG is enabled, use log() to emit the message, otherwise print it based on
+ * the console loglevel.
+ */
+#define dev_printk_emit(cat, level, fmt, ...) \
+({ \
+ if ((_DEBUG && level == LOGL_DEBUG) || \
+ (_VERBOSE_DEBUG && level == LOGL_DEBUG_CONTENT)) \
+ printf(fmt, ##__VA_ARGS__); \
+ else if (CONFIG_IS_ENABLED(LOG)) \
+ log(cat, level, fmt, ##__VA_ARGS__); \
+ else if (level < CONFIG_VAL(LOGLEVEL)) \
+ printf(fmt, ##__VA_ARGS__); \
})
-#define __dev_printk(level, dev, fmt, ...) \
-({ \
- if (level < CONFIG_VAL(LOGLEVEL)) \
- dev_printk(dev, fmt, ##__VA_ARGS__); \
+/**
+ * __dev_printk() - Log a message for a device
+ * @level: Log level of the message
+ * @dev: A &struct udevice or &struct device
+ * @fmt: Format string
+ * @...: Arguments for @fmt
+ *
+ * This macro formats and prints dev_xxx log messages. It is done as a macro
+ * because working with variadic argument is much easier this way, we can
+ * interrogate the type of device we are passed (and whether it *is* a &struct
+ * udevice or &struct device), and dev_printk_emit() can optimize out unused if
+ * branches.
+ *
+ * Because this is a macro, we must enforce type checks ourselves. Ideally, we
+ * would only accept udevices, but there is a significant amount of code (mostly
+ * USB) which calls dev_xxx with &struct device. When assigning ``__dev``, we
+ * must first cast ``dev`` to ``void *`` so we don't get warned when ``dev`` is
+ * a &struct device. Even though the latter branch is not taken, it will still
+ * get compiled and type-checked.
+ *
+ * The format strings in case of a ``NULL`` ``dev`` MUST be kept the same.
+ * Otherwise, @fmt will be duplicated in the data section (with slightly
+ * different prefixes). This is why ``(NULL udevice *)`` is printed as two
+ * string arguments, and not by string pasting.
+ */
+#define __dev_printk(level, dev, fmt, ...) \
+({ \
+ if (__same_type(dev, struct device *)) { \
+ dev_printk_emit(LOG_CATEGORY, level, fmt, ##__VA_ARGS__); \
+ } else { \
+ BUILD_BUG_ON(!__same_type(dev, struct udevice *)); \
+ struct udevice *__dev = (void *)dev; \
+ if (__dev) \
+ dev_printk_emit(__dev->driver->id, level, \
+ "%s %s: " fmt, \
+ __dev->driver->name, __dev->name, \
+ ##__VA_ARGS__); \
+ else \
+ dev_printk_emit(LOG_CATEGORY, level, \
+ "%s %s: " fmt, \
+ "(NULL", "udevice *)", \
+ ##__VA_ARGS__); \
+ } \
})
#define dev_emerg(dev, fmt, ...) \
@@ -62,26 +133,9 @@
__dev_printk(LOGL_NOTICE, dev, fmt, ##__VA_ARGS__)
#define dev_info(dev, fmt, ...) \
__dev_printk(LOGL_INFO, dev, fmt, ##__VA_ARGS__)
-
-#ifdef DEBUG
#define dev_dbg(dev, fmt, ...) \
__dev_printk(LOGL_DEBUG, dev, fmt, ##__VA_ARGS__)
-#else
-#define dev_dbg(dev, fmt, ...) \
-({ \
- if (0) \
- __dev_printk(LOGL_DEBUG, dev, fmt, ##__VA_ARGS__); \
-})
-#endif
-
-#ifdef VERBOSE_DEBUG
-#define dev_vdbg dev_dbg
-#else
-#define dev_vdbg(dev, fmt, ...) \
-({ \
- if (0) \
- __dev_printk(LOGL_DEBUG, dev, fmt, ##__VA_ARGS__); \
-})
-#endif
+#define dev_vdbg(dev, fmt, ...) \
+ __dev_printk(LOGL_DEBUG_CONTENT, dev, fmt, ##__VA_ARGS__)
#endif
--
2.28.0
next prev parent reply other threads:[~2020-09-15 14:45 UTC|newest]
Thread overview: 79+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-09-15 14:44 [PATCH v2 00/46] dm: Print device name in dev_xxx like Linux Sean Anderson
2020-09-15 14:44 ` [PATCH v2 01/46] dm: syscon: Fix calling dev_dbg with an uninitialized device Sean Anderson
2020-09-16 12:44 ` Patrick DELAUNAY
2020-09-16 12:51 ` Sean Anderson
2020-09-15 14:44 ` [PATCH v2 02/46] firmware: ti_sci: Fix not calling dev_err with a device Sean Anderson
2020-09-16 1:26 ` Nishanth Menon
2020-09-15 14:44 ` [PATCH v2 03/46] i2c: mxc: Fix dev_err being called on a nonexistant variable Sean Anderson
2020-09-17 1:10 ` Simon Glass
2020-09-17 7:50 ` Heiko Schocher
2020-09-15 14:44 ` [PATCH v2 04/46] mtd: nand: pxa3xx: Fix not calling dev_xxx with a device Sean Anderson
2020-09-15 14:44 ` [PATCH v2 05/46] mtd: nand: sunxi: Fix not calling dev_err " Sean Anderson
2020-09-15 14:44 ` [PATCH v2 06/46] mtd: spi: Include dm.h in spi-nor-core.c Sean Anderson
2020-09-15 14:44 ` [PATCH v2 07/46] mtd: spi: Fix logging in spi-nor-tiny Sean Anderson
2020-09-15 14:44 ` [PATCH v2 08/46] mtd: spi-nand: Fix not calling dev_err with a device Sean Anderson
2020-09-17 1:10 ` Simon Glass
2020-09-15 14:44 ` [PATCH v2 09/46] mmc: Add mmc_dev() Sean Anderson
2020-09-17 1:10 ` Simon Glass
2020-09-15 14:44 ` [PATCH v2 10/46] mmc: bcm2835-host: Fix not calling dev_dbg with a device Sean Anderson
2020-09-15 14:44 ` [PATCH v2 11/46] mmc: mtk-sd: Fix not calling dev_err " Sean Anderson
2020-09-17 1:10 ` Simon Glass
2020-09-15 14:44 ` [PATCH v2 12/46] mailbox: k3: " Sean Anderson
2020-09-17 1:10 ` Simon Glass
2020-09-15 14:44 ` [PATCH v2 13/46] nand: atmel: Fix not calling dev_xxx " Sean Anderson
2020-09-17 1:10 ` Simon Glass
2020-09-15 14:44 ` [PATCH v2 14/46] nand: brcmnand: Fix not calling dev_err() " Sean Anderson
2020-09-15 14:44 ` [PATCH v2 15/46] nand: vybrid: Re-introduce vf610_nfc.dev Sean Anderson
2020-09-15 14:44 ` [PATCH v2 16/46] net: bcm6368: Fix not calling dev_info with a device Sean Anderson
2020-09-15 14:44 ` [PATCH v2 17/46] net: mdio: Fix not calling dev_dbg " Sean Anderson
2020-09-15 14:44 ` [PATCH v2 18/46] net: mvneta: Fix not always calling dev_err " Sean Anderson
2020-09-17 1:10 ` Simon Glass
2020-09-15 14:44 ` [PATCH v2 19/46] net: mvneta: Convert netdev_xxx to dev_xxx Sean Anderson
2020-09-17 1:10 ` Simon Glass
2020-09-15 14:44 ` [PATCH v2 20/46] net: mvpp2: Fix not calling dev_xxx with a device Sean Anderson
2020-09-17 1:10 ` Simon Glass
2020-09-15 14:44 ` [PATCH v2 21/46] net: mvpp2: Convert netdev_xxx to dev_xxx Sean Anderson
2020-09-17 1:10 ` Simon Glass
2020-09-15 14:44 ` [PATCH v2 22/46] linux/compat.h: Remove netdev_xxx functions Sean Anderson
2020-09-17 1:10 ` Simon Glass
2020-09-15 14:44 ` [PATCH v2 23/46] net: sunxi: Fix not calling dev_xxx with a device Sean Anderson
2020-09-17 1:10 ` Simon Glass
2020-09-15 14:45 ` [PATCH v2 24/46] net: sun8i_emac: " Sean Anderson
2020-09-17 1:10 ` Simon Glass
2020-09-15 14:45 ` [PATCH v2 25/46] net: ti: cpsw: Fix not calling dev_dbg " Sean Anderson
2020-09-15 14:45 ` [PATCH v2 26/46] phy: marvell: Fix not calling dev_err " Sean Anderson
2020-09-15 14:45 ` [PATCH v2 27/46] phy: rockchip: " Sean Anderson
2020-09-28 2:43 ` Kever Yang
2020-09-15 14:45 ` [PATCH v2 28/46] phy: sun4i-usb: " Sean Anderson
2020-09-15 14:45 ` [PATCH v2 29/46] phy: ti: " Sean Anderson
2020-09-15 14:45 ` [PATCH v2 30/46] phy: usbphyc: " Sean Anderson
2020-09-16 7:47 ` Patrice CHOTARD
2020-09-16 12:45 ` Patrick DELAUNAY
2020-09-15 14:45 ` [PATCH v2 31/46] remoteproc: Remove unused function rproc_elf_sanity_check Sean Anderson
2020-09-15 14:45 ` [PATCH v2 32/46] remoteproc: k3-r5: Fix not calling dev_xxx with a device Sean Anderson
2020-09-15 14:45 ` [PATCH v2 33/46] remoteproc: k3: " Sean Anderson
2020-09-15 14:45 ` [PATCH v2 34/46] soc: qualcomm: Fix not calling dev_err " Sean Anderson
2020-09-17 1:10 ` Simon Glass
2020-09-15 14:45 ` [PATCH v2 35/46] spi: sunxi: " Sean Anderson
2020-09-15 14:45 ` [PATCH v2 36/46] spi: zynqmp_gqspi: " Sean Anderson
2020-09-16 7:45 ` Michal Simek
2020-09-15 14:45 ` [PATCH v2 37/46] sysreset: ti: " Sean Anderson
2020-09-15 14:45 ` [PATCH v2 38/46] usb: cdns3: Fix not calling dev_xxx " Sean Anderson
2020-09-15 14:45 ` [PATCH v2 39/46] usb: dwc2: " Sean Anderson
2020-09-16 7:51 ` Patrice CHOTARD
2020-09-16 12:52 ` Sean Anderson
2020-09-16 13:30 ` Patrick DELAUNAY
2020-09-16 13:43 ` Sean Anderson
2020-09-17 7:33 ` Patrick DELAUNAY
2020-09-15 14:45 ` [PATCH v2 40/46] usb: dwc3: " Sean Anderson
2020-09-15 14:45 ` [PATCH v2 41/46] usb: dwc3: ti: Fix not calling dev_err " Sean Anderson
2020-09-15 14:45 ` [PATCH v2 42/46] usb: dwc3: Don't include asm-generic/io.h Sean Anderson
2020-09-15 14:45 ` [PATCH v2 43/46] usb: musb-new: sunxi: Fix not calling dev_err with a device Sean Anderson
2020-09-15 14:45 ` [PATCH v2 44/46] video: stm32: Fix not calling dev_xxx " Sean Anderson
2020-09-16 13:19 ` Patrick DELAUNAY
2020-09-15 14:45 ` [PATCH v2 45/46] dm: Use symbolic constants for log levels in dev_xxx Sean Anderson
2020-09-17 1:10 ` Simon Glass
2020-09-15 14:45 ` Sean Anderson [this message]
2020-09-16 13:43 ` [PATCH v2 00/46] dm: Print device name in dev_xxx like Linux Patrick DELAUNAY
2020-09-30 13:01 ` Tom Rini
2020-09-30 13:08 ` Tom Rini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200915144522.509493-47-seanga2@gmail.com \
--to=seanga2@gmail.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox