1*d5528cc1SGeert Uytterhoeven // SPDX-License-Identifier: GPL-2.0-only 2*d5528cc1SGeert Uytterhoeven /* 3*d5528cc1SGeert Uytterhoeven * Dhrystone benchmark test module 4*d5528cc1SGeert Uytterhoeven * 5*d5528cc1SGeert Uytterhoeven * Copyright (C) 2022 Glider bv 6*d5528cc1SGeert Uytterhoeven */ 7*d5528cc1SGeert Uytterhoeven 8*d5528cc1SGeert Uytterhoeven #include "dhry.h" 9*d5528cc1SGeert Uytterhoeven 10*d5528cc1SGeert Uytterhoeven #include <linux/kernel.h> 11*d5528cc1SGeert Uytterhoeven #include <linux/module.h> 12*d5528cc1SGeert Uytterhoeven #include <linux/moduleparam.h> 13*d5528cc1SGeert Uytterhoeven #include <linux/mutex.h> 14*d5528cc1SGeert Uytterhoeven #include <linux/smp.h> 15*d5528cc1SGeert Uytterhoeven 16*d5528cc1SGeert Uytterhoeven #define DHRY_VAX 1757 17*d5528cc1SGeert Uytterhoeven 18*d5528cc1SGeert Uytterhoeven static int dhry_run_set(const char *val, const struct kernel_param *kp); 19*d5528cc1SGeert Uytterhoeven static const struct kernel_param_ops run_ops = { 20*d5528cc1SGeert Uytterhoeven .flags = KERNEL_PARAM_OPS_FL_NOARG, 21*d5528cc1SGeert Uytterhoeven .set = dhry_run_set, 22*d5528cc1SGeert Uytterhoeven }; 23*d5528cc1SGeert Uytterhoeven static bool dhry_run; 24*d5528cc1SGeert Uytterhoeven module_param_cb(run, &run_ops, &dhry_run, 0200); 25*d5528cc1SGeert Uytterhoeven MODULE_PARM_DESC(run, "Run the test (default: false)"); 26*d5528cc1SGeert Uytterhoeven 27*d5528cc1SGeert Uytterhoeven static int iterations = -1; 28*d5528cc1SGeert Uytterhoeven module_param(iterations, int, 0644); 29*d5528cc1SGeert Uytterhoeven MODULE_PARM_DESC(iterations, 30*d5528cc1SGeert Uytterhoeven "Number of iterations through the benchmark (default: auto)"); 31*d5528cc1SGeert Uytterhoeven 32*d5528cc1SGeert Uytterhoeven static void dhry_benchmark(void) 33*d5528cc1SGeert Uytterhoeven { 34*d5528cc1SGeert Uytterhoeven int i, n; 35*d5528cc1SGeert Uytterhoeven 36*d5528cc1SGeert Uytterhoeven if (iterations > 0) { 37*d5528cc1SGeert Uytterhoeven n = dhry(iterations); 38*d5528cc1SGeert Uytterhoeven goto report; 39*d5528cc1SGeert Uytterhoeven } 40*d5528cc1SGeert Uytterhoeven 41*d5528cc1SGeert Uytterhoeven for (i = DHRY_VAX; i > 0; i <<= 1) { 42*d5528cc1SGeert Uytterhoeven n = dhry(i); 43*d5528cc1SGeert Uytterhoeven if (n != -EAGAIN) 44*d5528cc1SGeert Uytterhoeven break; 45*d5528cc1SGeert Uytterhoeven } 46*d5528cc1SGeert Uytterhoeven 47*d5528cc1SGeert Uytterhoeven report: 48*d5528cc1SGeert Uytterhoeven if (n >= 0) 49*d5528cc1SGeert Uytterhoeven pr_info("CPU%u: Dhrystones per Second: %d (%d DMIPS)\n", 50*d5528cc1SGeert Uytterhoeven smp_processor_id(), n, n / DHRY_VAX); 51*d5528cc1SGeert Uytterhoeven else if (n == -EAGAIN) 52*d5528cc1SGeert Uytterhoeven pr_err("Please increase the number of iterations\n"); 53*d5528cc1SGeert Uytterhoeven else 54*d5528cc1SGeert Uytterhoeven pr_err("Dhrystone benchmark failed error %pe\n", ERR_PTR(n)); 55*d5528cc1SGeert Uytterhoeven } 56*d5528cc1SGeert Uytterhoeven 57*d5528cc1SGeert Uytterhoeven static int dhry_run_set(const char *val, const struct kernel_param *kp) 58*d5528cc1SGeert Uytterhoeven { 59*d5528cc1SGeert Uytterhoeven int ret; 60*d5528cc1SGeert Uytterhoeven 61*d5528cc1SGeert Uytterhoeven if (val) { 62*d5528cc1SGeert Uytterhoeven ret = param_set_bool(val, kp); 63*d5528cc1SGeert Uytterhoeven if (ret) 64*d5528cc1SGeert Uytterhoeven return ret; 65*d5528cc1SGeert Uytterhoeven } else { 66*d5528cc1SGeert Uytterhoeven dhry_run = true; 67*d5528cc1SGeert Uytterhoeven } 68*d5528cc1SGeert Uytterhoeven 69*d5528cc1SGeert Uytterhoeven if (dhry_run && system_state == SYSTEM_RUNNING) 70*d5528cc1SGeert Uytterhoeven dhry_benchmark(); 71*d5528cc1SGeert Uytterhoeven 72*d5528cc1SGeert Uytterhoeven return 0; 73*d5528cc1SGeert Uytterhoeven } 74*d5528cc1SGeert Uytterhoeven 75*d5528cc1SGeert Uytterhoeven static int __init dhry_init(void) 76*d5528cc1SGeert Uytterhoeven { 77*d5528cc1SGeert Uytterhoeven if (dhry_run) 78*d5528cc1SGeert Uytterhoeven dhry_benchmark(); 79*d5528cc1SGeert Uytterhoeven 80*d5528cc1SGeert Uytterhoeven return 0; 81*d5528cc1SGeert Uytterhoeven } 82*d5528cc1SGeert Uytterhoeven module_init(dhry_init); 83*d5528cc1SGeert Uytterhoeven 84*d5528cc1SGeert Uytterhoeven MODULE_AUTHOR("Geert Uytterhoeven <geert+renesas@glider.be>"); 85*d5528cc1SGeert Uytterhoeven MODULE_LICENSE("GPL"); 86