/* * infra_debugfs.c * Description: PP Infrastructure Driver Debug FS Interface * * SPDX-License-Identifier: GPL-2.0-only * Copyright (C) 2018 Intel Corporation */ #include #include #include #include #include #include #include #include #include "pp_logger.h" #include "pp_common.h" #include "pp_debugfs_common.h" #include "infra.h" #include "infra_internal.h" /* Infra Debug FS directory */ static struct dentry *dbgfs; /** * @brief Prints into seq_file PP boot and config relevant * registers information * @param f seq_file * @note Used ONLY for debugfs prints */ static void __infra_bootcfg_show(struct seq_file *f) { u32 version; bool sess_cache, cntrs_cache; bool rpb_done, port_dist_done; bool eg_uc_timers, ing_uc_timers; version = infra_version_get(); sess_cache = infra_cls_sess_cache_en_get(); cntrs_cache = infra_cls_cntrs_cache_en_get(); rpb_done = infra_rpb_init_done_get(); port_dist_done = infra_port_dist_init_done_get(); eg_uc_timers = infra_eg_uc_timers_clk_en_get(); ing_uc_timers = infra_ing_uc_timers_clk_en_get(); seq_printf(f, " %-25s: \t0x%x\n", "Boot config version", version); seq_printf(f, " %-25s: \t%s\n", "Session cache", BOOL2EN(sess_cache)); seq_printf(f, " %-25s: \t%s\n", "Counters cache", BOOL2EN(cntrs_cache)); seq_printf(f, " %-25s: \t%s\n", "Port Dist Memory Init", port_dist_done ? "Done" : "No done"); seq_printf(f, " %-25s: \t%s\n", "RPB Memory Init", rpb_done ? "Done" : "No done"); seq_printf(f, " %-25s: \t%s\n", "Egress UC Timers", BOOL2EN(eg_uc_timers)); seq_printf(f, " %-25s: \t%s\n", "Ingress UC Timers", BOOL2EN(ing_uc_timers)); } /** * @brief Prints into buffer PP clock control relevant registers * information * @param f seq_file * @param offset * @note Used ONLY for debugfs prints */ static void __infra_clock_ctrl_show(struct seq_file *f) { u32 state, m; for_each_infra_cru_module(m) { infra_cru_mod_state_get(m, &state); seq_printf(f, " %-13s CRU State : \t%s(%u)\n", infra_cru_module_str(m), infra_cru_state_str(state), state); } } static void __infra_dynamic_clk_show(struct seq_file *f) { u32 m, grace; bool en, on; infra_dclk_grace_get(&grace); seq_printf(f, " %-25s: \t%u\n", "Grace", grace); for_each_infra_dclk_mod(m) { infra_mod_dclk_get(m, &en); infra_mod_dclk_status_get(m, &on); seq_printf(f, " %-10s Dynamic Clock : \t%-7s, clock status: %s\n", infra_dclk_module_str(m), BOOL2EN(en), on ? "on" : "off"); } } /** * @brief Debugfs status attribute show API, prints driver * status including relevant registers information. * @param f seq_file * @param offset * @note Used ONLY for debugfs prints */ static void __infra_status_show(struct seq_file *f) { seq_puts(f, "\n"); seq_puts(f, " Infrastructure\n"); seq_puts(f, " ===============================\n"); seq_puts(f, " Boot and Config Info\n"); seq_puts(f, " ------------------------------\n"); __infra_bootcfg_show(f); seq_puts(f, " ------------------------------\n"); seq_puts(f, " Clock Control Info\n"); seq_puts(f, " ------------------------------\n"); __infra_clock_ctrl_show(f); seq_puts(f, " ------------------------------\n"); seq_puts(f, " Dynamic Clock Info\n"); seq_puts(f, " ------------------------------\n"); __infra_dynamic_clk_show(f); seq_puts(f, " ------------------------------\n"); seq_puts(f, "\n\n"); } PP_DEFINE_DEBUGFS(status, __infra_status_show, NULL); enum mod_cru_rst_opts { mod_cru_rst_opt_help = 1, mod_cru_rst_opt_mod, }; static const match_table_t mod_cru_rst_tokens = { { mod_cru_rst_opt_help, "help" }, { mod_cru_rst_opt_mod, "mod=%u" }, }; /** * @brief Session delete help */ static void __infra_mod_cru_rst_help(void) { u32 m; pr_info("\n"); pr_info(" Usage: echo