162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Kernel module for testing dynamic_debug 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Authors: 662306a36Sopenharmony_ci * Jim Cromie <jim.cromie@gmail.com> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#define pr_fmt(fmt) "test_dd: " fmt 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/module.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci/* run tests by reading or writing sysfs node: do_prints */ 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cistatic void do_prints(void); /* device under test */ 1662306a36Sopenharmony_cistatic int param_set_do_prints(const char *instr, const struct kernel_param *kp) 1762306a36Sopenharmony_ci{ 1862306a36Sopenharmony_ci do_prints(); 1962306a36Sopenharmony_ci return 0; 2062306a36Sopenharmony_ci} 2162306a36Sopenharmony_cistatic int param_get_do_prints(char *buffer, const struct kernel_param *kp) 2262306a36Sopenharmony_ci{ 2362306a36Sopenharmony_ci do_prints(); 2462306a36Sopenharmony_ci return scnprintf(buffer, PAGE_SIZE, "did do_prints\n"); 2562306a36Sopenharmony_ci} 2662306a36Sopenharmony_cistatic const struct kernel_param_ops param_ops_do_prints = { 2762306a36Sopenharmony_ci .set = param_set_do_prints, 2862306a36Sopenharmony_ci .get = param_get_do_prints, 2962306a36Sopenharmony_ci}; 3062306a36Sopenharmony_cimodule_param_cb(do_prints, ¶m_ops_do_prints, NULL, 0600); 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci/* 3362306a36Sopenharmony_ci * Using the CLASSMAP api: 3462306a36Sopenharmony_ci * - classmaps must have corresponding enum 3562306a36Sopenharmony_ci * - enum symbols must match/correlate with class-name strings in the map. 3662306a36Sopenharmony_ci * - base must equal enum's 1st value 3762306a36Sopenharmony_ci * - multiple maps must set their base to share the 0-30 class_id space !! 3862306a36Sopenharmony_ci * (build-bug-on tips welcome) 3962306a36Sopenharmony_ci * Additionally, here: 4062306a36Sopenharmony_ci * - tie together sysname, mapname, bitsname, flagsname 4162306a36Sopenharmony_ci */ 4262306a36Sopenharmony_ci#define DD_SYS_WRAP(_model, _flags) \ 4362306a36Sopenharmony_ci static unsigned long bits_##_model; \ 4462306a36Sopenharmony_ci static struct ddebug_class_param _flags##_model = { \ 4562306a36Sopenharmony_ci .bits = &bits_##_model, \ 4662306a36Sopenharmony_ci .flags = #_flags, \ 4762306a36Sopenharmony_ci .map = &map_##_model, \ 4862306a36Sopenharmony_ci }; \ 4962306a36Sopenharmony_ci module_param_cb(_flags##_##_model, ¶m_ops_dyndbg_classes, &_flags##_model, 0600) 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci/* numeric input, independent bits */ 5262306a36Sopenharmony_cienum cat_disjoint_bits { 5362306a36Sopenharmony_ci D2_CORE = 0, 5462306a36Sopenharmony_ci D2_DRIVER, 5562306a36Sopenharmony_ci D2_KMS, 5662306a36Sopenharmony_ci D2_PRIME, 5762306a36Sopenharmony_ci D2_ATOMIC, 5862306a36Sopenharmony_ci D2_VBL, 5962306a36Sopenharmony_ci D2_STATE, 6062306a36Sopenharmony_ci D2_LEASE, 6162306a36Sopenharmony_ci D2_DP, 6262306a36Sopenharmony_ci D2_DRMRES }; 6362306a36Sopenharmony_ciDECLARE_DYNDBG_CLASSMAP(map_disjoint_bits, DD_CLASS_TYPE_DISJOINT_BITS, 0, 6462306a36Sopenharmony_ci "D2_CORE", 6562306a36Sopenharmony_ci "D2_DRIVER", 6662306a36Sopenharmony_ci "D2_KMS", 6762306a36Sopenharmony_ci "D2_PRIME", 6862306a36Sopenharmony_ci "D2_ATOMIC", 6962306a36Sopenharmony_ci "D2_VBL", 7062306a36Sopenharmony_ci "D2_STATE", 7162306a36Sopenharmony_ci "D2_LEASE", 7262306a36Sopenharmony_ci "D2_DP", 7362306a36Sopenharmony_ci "D2_DRMRES"); 7462306a36Sopenharmony_ciDD_SYS_WRAP(disjoint_bits, p); 7562306a36Sopenharmony_ciDD_SYS_WRAP(disjoint_bits, T); 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci/* symbolic input, independent bits */ 7862306a36Sopenharmony_cienum cat_disjoint_names { LOW = 11, MID, HI }; 7962306a36Sopenharmony_ciDECLARE_DYNDBG_CLASSMAP(map_disjoint_names, DD_CLASS_TYPE_DISJOINT_NAMES, 10, 8062306a36Sopenharmony_ci "LOW", "MID", "HI"); 8162306a36Sopenharmony_ciDD_SYS_WRAP(disjoint_names, p); 8262306a36Sopenharmony_ciDD_SYS_WRAP(disjoint_names, T); 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci/* numeric verbosity, V2 > V1 related */ 8562306a36Sopenharmony_cienum cat_level_num { V0 = 14, V1, V2, V3, V4, V5, V6, V7 }; 8662306a36Sopenharmony_ciDECLARE_DYNDBG_CLASSMAP(map_level_num, DD_CLASS_TYPE_LEVEL_NUM, 14, 8762306a36Sopenharmony_ci "V0", "V1", "V2", "V3", "V4", "V5", "V6", "V7"); 8862306a36Sopenharmony_ciDD_SYS_WRAP(level_num, p); 8962306a36Sopenharmony_ciDD_SYS_WRAP(level_num, T); 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci/* symbolic verbosity */ 9262306a36Sopenharmony_cienum cat_level_names { L0 = 22, L1, L2, L3, L4, L5, L6, L7 }; 9362306a36Sopenharmony_ciDECLARE_DYNDBG_CLASSMAP(map_level_names, DD_CLASS_TYPE_LEVEL_NAMES, 22, 9462306a36Sopenharmony_ci "L0", "L1", "L2", "L3", "L4", "L5", "L6", "L7"); 9562306a36Sopenharmony_ciDD_SYS_WRAP(level_names, p); 9662306a36Sopenharmony_ciDD_SYS_WRAP(level_names, T); 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci/* stand-in for all pr_debug etc */ 9962306a36Sopenharmony_ci#define prdbg(SYM) __pr_debug_cls(SYM, #SYM " msg\n") 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_cistatic void do_cats(void) 10262306a36Sopenharmony_ci{ 10362306a36Sopenharmony_ci pr_debug("doing categories\n"); 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ci prdbg(LOW); 10662306a36Sopenharmony_ci prdbg(MID); 10762306a36Sopenharmony_ci prdbg(HI); 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_ci prdbg(D2_CORE); 11062306a36Sopenharmony_ci prdbg(D2_DRIVER); 11162306a36Sopenharmony_ci prdbg(D2_KMS); 11262306a36Sopenharmony_ci prdbg(D2_PRIME); 11362306a36Sopenharmony_ci prdbg(D2_ATOMIC); 11462306a36Sopenharmony_ci prdbg(D2_VBL); 11562306a36Sopenharmony_ci prdbg(D2_STATE); 11662306a36Sopenharmony_ci prdbg(D2_LEASE); 11762306a36Sopenharmony_ci prdbg(D2_DP); 11862306a36Sopenharmony_ci prdbg(D2_DRMRES); 11962306a36Sopenharmony_ci} 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_cistatic void do_levels(void) 12262306a36Sopenharmony_ci{ 12362306a36Sopenharmony_ci pr_debug("doing levels\n"); 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci prdbg(V1); 12662306a36Sopenharmony_ci prdbg(V2); 12762306a36Sopenharmony_ci prdbg(V3); 12862306a36Sopenharmony_ci prdbg(V4); 12962306a36Sopenharmony_ci prdbg(V5); 13062306a36Sopenharmony_ci prdbg(V6); 13162306a36Sopenharmony_ci prdbg(V7); 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci prdbg(L1); 13462306a36Sopenharmony_ci prdbg(L2); 13562306a36Sopenharmony_ci prdbg(L3); 13662306a36Sopenharmony_ci prdbg(L4); 13762306a36Sopenharmony_ci prdbg(L5); 13862306a36Sopenharmony_ci prdbg(L6); 13962306a36Sopenharmony_ci prdbg(L7); 14062306a36Sopenharmony_ci} 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_cistatic void do_prints(void) 14362306a36Sopenharmony_ci{ 14462306a36Sopenharmony_ci do_cats(); 14562306a36Sopenharmony_ci do_levels(); 14662306a36Sopenharmony_ci} 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_cistatic int __init test_dynamic_debug_init(void) 14962306a36Sopenharmony_ci{ 15062306a36Sopenharmony_ci pr_debug("init start\n"); 15162306a36Sopenharmony_ci do_prints(); 15262306a36Sopenharmony_ci pr_debug("init done\n"); 15362306a36Sopenharmony_ci return 0; 15462306a36Sopenharmony_ci} 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_cistatic void __exit test_dynamic_debug_exit(void) 15762306a36Sopenharmony_ci{ 15862306a36Sopenharmony_ci pr_debug("exited\n"); 15962306a36Sopenharmony_ci} 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_cimodule_init(test_dynamic_debug_init); 16262306a36Sopenharmony_cimodule_exit(test_dynamic_debug_exit); 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ciMODULE_AUTHOR("Jim Cromie <jim.cromie@gmail.com>"); 16562306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 166