Invoke DRM_CLASSMAP_DEFINE to create a classmap of
class-ids/categories for ivpu_dbg().

This brings static-key optimized-off benefits to the ivpu_dbg()
callsites.  DRM_CLASSMAP_PARAM_REF wires the sysfs kparam to the
classmap.

This is the 1st real-world example of a module avoiding another
module's classmap's class_id range reservation.

Its also something of an oddity: it "is" a DRM module only cuz

1. CONFIG_DRM_ACCEL_IVPU exists.

2. code therefore uses CONFIG_DRM_USE_DYNAMIC_DEBUG, so must also use
   it's dependent wrappers: DRM_CLASSMAP_*

accel/amdxdna is already using drm.debug via dev_dbg(), so it is more
fully DRM but iirc its a single call.

Anyway, to play nice with DRM, we change all the constants, from
macros calling BIT(X), to an explicit "enum ivpu_dbg_category"
starting at 16 to avoid DRM_UT_CORE..RES.  This is all in an indef to
avoid changing the constants for the non-dyndbg case.

Signed-off-by: Jim Cromie <[email protected]>
---
 drivers/accel/ivpu/ivpu_drv.c | 27 +++++++++++++++++++--
 drivers/accel/ivpu/ivpu_drv.h | 45 ++++++++++++++++++++++++++++++-----
 2 files changed, 64 insertions(+), 8 deletions(-)

diff --git a/drivers/accel/ivpu/ivpu_drv.c b/drivers/accel/ivpu/ivpu_drv.c
index 3d6fccdefdd6..1c7bb6de78cc 100644
--- a/drivers/accel/ivpu/ivpu_drv.c
+++ b/drivers/accel/ivpu/ivpu_drv.c
@@ -3,6 +3,7 @@
  * Copyright (C) 2020-2025 Intel Corporation
  */
 
+#include <linux/dynamic_debug.h>
 #include <linux/firmware.h>
 #include <linux/module.h>
 #include <linux/pci.h>
@@ -37,8 +38,30 @@
 #define DRIVER_VERSION_STR "1.0.0 " UTS_RELEASE
 #endif
 
-int ivpu_dbg_mask;
-module_param_named(dbg_mask, ivpu_dbg_mask, int, 0644);
+long unsigned int ivpu_dbg_mask;
+
+#if !defined(CONFIG_DRM_USE_DYNAMIC_DEBUG)
+
+module_param_named(dbg_mask, ivpu_dbg_mask, ulong, 0644);
+#else
+DRM_CLASSMAP_DEFINE(ivpu_dbg_classes, DD_CLASS_TYPE_DISJOINT_BITS,
+               IVPU_DBG_REG,
+               "IVPU_DBG_REG",
+               "IVPU_DBG_IRQ",
+               "IVPU_DBG_MMU",
+               "IVPU_DBG_FILE",
+               "IVPU_DBG_MISC",
+               "IVPU_DBG_FW_BOOT",
+               "IVPU_DBG_PM",
+               "IVPU_DBG_IPC",
+               "IVPU_DBG_BO",
+               "IVPU_DBG_JOB",
+               "IVPU_DBG_JSM",
+               "IVPU_DBG_KREF",
+               "IVPU_DBG_RPM",
+               "IVPU_DBG_MMU_MAP");
+DRM_CLASSMAP_PARAM_REF(dbg_mask, ivpu_dbg_mask, ivpu_dbg_classes, p);
+#endif
 MODULE_PARM_DESC(dbg_mask, "Driver debug mask. See IVPU_DBG_* macros.");
 
 int ivpu_test_mode;
diff --git a/drivers/accel/ivpu/ivpu_drv.h b/drivers/accel/ivpu/ivpu_drv.h
index 5b34b6f50e69..5a6279705651 100644
--- a/drivers/accel/ivpu/ivpu_drv.h
+++ b/drivers/accel/ivpu/ivpu_drv.h
@@ -65,6 +65,10 @@
 
 #define IVPU_SCHED_MODE_AUTO -1
 
+extern long unsigned int ivpu_dbg_mask;
+
+#if !defined(CONFIG_DRM_USE_DYNAMIC_DEBUG)
+
 #define IVPU_DBG_REG    BIT(0)
 #define IVPU_DBG_IRQ    BIT(1)
 #define IVPU_DBG_MMU    BIT(2)
@@ -81,6 +85,41 @@
 #define IVPU_DBG_MMU_MAP BIT(13)
 #define IVPU_DBG_IOCTL   BIT(14)
 
+#define ivpu_dbg(vdev, type, fmt, args...) do {                                
\
+       if (unlikely(IVPU_DBG_##type & ivpu_dbg_mask))                  \
+               dev_dbg((vdev)->drm.dev, "[%s] " fmt, #type, ##args);   \
+} while (0)
+
+#else /* !!CONFIG_DRM_USE_DYNAMIC_DEBUG */
+
+enum ivpu_dbg_category {
+       /*
+        * since accels are drm-devices (CONFIG_DRM_ACCEL_*), adjust
+        * IVPU_DBG_* to avoid DRMs 0..10 class_id reservations.
+        */
+       IVPU_DBG_REG = 16,
+       IVPU_DBG_IRQ,
+       IVPU_DBG_MMU,
+       IVPU_DBG_FILE,
+       IVPU_DBG_MISC,
+       IVPU_DBG_FW_BOOT,
+       IVPU_DBG_PM,
+       IVPU_DBG_IPC,
+       IVPU_DBG_BO,
+       IVPU_DBG_JOB,
+       IVPU_DBG_JSM,
+       IVPU_DBG_KREF,
+       IVPU_DBG_RPM,
+       IVPU_DBG_MMU_MAP,
+       IVPU_DBG_IOCTL
+};
+
+#define ivpu_dbg(vdev, type, fmt, ...)                    \
+       _dynamic_func_call_cls(IVPU_DBG_##type, fmt, __dynamic_dev_dbg, \
+                               (vdev)->drm.dev, fmt, ##__VA_ARGS__)
+
+#endif /* !!CONFIG_DRM_USE_DYNAMIC_DEBUG */
+
 #define ivpu_err(vdev, fmt, ...) \
        drm_err(&(vdev)->drm, "%s(): " fmt, __func__, ##__VA_ARGS__)
 
@@ -95,11 +134,6 @@
 
 #define ivpu_info(vdev, fmt, ...) drm_info(&(vdev)->drm, fmt, ##__VA_ARGS__)
 
-#define ivpu_dbg(vdev, type, fmt, args...) do {                                
\
-       if (unlikely(IVPU_DBG_##type & ivpu_dbg_mask))                         \
-               dev_dbg((vdev)->drm.dev, "[%s] " fmt, #type, ##args);          \
-} while (0)
-
 #define IVPU_WA(wa_name) (vdev->wa.wa_name)
 
 #define IVPU_PRINT_WA(wa_name) do {                                    \
@@ -197,7 +231,6 @@ struct ivpu_file_priv {
        bool aborted;
 };
 
-extern int ivpu_dbg_mask;
 extern u8 ivpu_pll_min_ratio;
 extern u8 ivpu_pll_max_ratio;
 extern int ivpu_sched_mode;
-- 
2.53.0

Reply via email to