119 lines
4.2 KiB
C
119 lines
4.2 KiB
C
|
/*
|
||
|
* drivers/platform/tegra/nvdumper/nvdumper-footprint.h
|
||
|
*
|
||
|
* Copyright (c) 2014-2018, NVIDIA CORPORATION. All rights reserved.
|
||
|
*
|
||
|
* This software is licensed under the terms of the GNU General Public
|
||
|
* License version 2, as published by the Free Software Foundation, and
|
||
|
* may be copied, distributed, and modified under those terms.
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU General Public License for more details.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef __MACH_TEGRA_NVFOOTPRINT_H
|
||
|
#define __MACH_TEGRA_NVFOOTPRINT_H
|
||
|
|
||
|
/*
|
||
|
* The below debug footprint structure is used to
|
||
|
* save debug information to.
|
||
|
*/
|
||
|
#define DBG_FOOTPRINT_NAME_LEN 16
|
||
|
struct dbg_footprint_element_cpu {
|
||
|
volatile char name[DBG_FOOTPRINT_NAME_LEN];
|
||
|
volatile uint32_t data[NR_CPUS];/* NR_CPUS is defined in config file. */
|
||
|
};
|
||
|
|
||
|
struct dbg_footprint_element_default {
|
||
|
volatile char name[DBG_FOOTPRINT_NAME_LEN];
|
||
|
volatile uint32_t data[1];
|
||
|
};
|
||
|
|
||
|
#define DECLARE_DBG_FOOTPRINT_DATA_CPU(name) \
|
||
|
struct dbg_footprint_element_cpu name
|
||
|
#define DECLARE_DBG_FOOTPRINT_DATA(name) \
|
||
|
struct dbg_footprint_element_default name
|
||
|
|
||
|
struct dbg_footprint_data_cpu {
|
||
|
/* CPU related */
|
||
|
DECLARE_DBG_FOOTPRINT_DATA_CPU(kernel_footprint_cpu);
|
||
|
DECLARE_DBG_FOOTPRINT_DATA_CPU(exit_counter_from_cpu);
|
||
|
DECLARE_DBG_FOOTPRINT_DATA_CPU(reset_vector_for_cpu);
|
||
|
DECLARE_DBG_FOOTPRINT_DATA_CPU(cpu_reset_vector_address);
|
||
|
DECLARE_DBG_FOOTPRINT_DATA_CPU(cpu_reset_vector_address_value);
|
||
|
DECLARE_DBG_FOOTPRINT_DATA_CPU(cpu_frequency);
|
||
|
DECLARE_DBG_FOOTPRINT_DATA_CPU(acpuclk_set_rate_footprint_cpu);
|
||
|
DECLARE_DBG_FOOTPRINT_DATA_CPU(cpu_prev_frequency);
|
||
|
DECLARE_DBG_FOOTPRINT_DATA_CPU(cpu_new_frequency);
|
||
|
DECLARE_DBG_FOOTPRINT_DATA_CPU(cpu_hotplug_on);
|
||
|
};
|
||
|
|
||
|
struct dbg_footprint_data_soc {
|
||
|
/* SOC */
|
||
|
DECLARE_DBG_FOOTPRINT_DATA(emc_frequency);
|
||
|
DECLARE_DBG_FOOTPRINT_DATA(lp_state_current);
|
||
|
DECLARE_DBG_FOOTPRINT_DATA(lp_state_prev);
|
||
|
DECLARE_DBG_FOOTPRINT_DATA(lp_state_next);
|
||
|
DECLARE_DBG_FOOTPRINT_DATA(core_voltage);
|
||
|
DECLARE_DBG_FOOTPRINT_DATA(soc_voltage);
|
||
|
DECLARE_DBG_FOOTPRINT_DATA(gpu_voltage);
|
||
|
DECLARE_DBG_FOOTPRINT_DATA(mem_voltage);
|
||
|
|
||
|
/* customized debug purpose */
|
||
|
DECLARE_DBG_FOOTPRINT_DATA(debug_data);
|
||
|
|
||
|
/* Please add more if necessary */
|
||
|
};
|
||
|
|
||
|
#define INIT_DBG_FOOTPRINT(var, element, stringname) do {\
|
||
|
memset((void *) var.element.data, 0, \
|
||
|
sizeof(var.element.data)); \
|
||
|
if (strlen(stringname) < DBG_FOOTPRINT_NAME_LEN - 1) \
|
||
|
strlcpy((char *) var.element.name, stringname, \
|
||
|
DBG_FOOTPRINT_NAME_LEN - 1); \
|
||
|
else \
|
||
|
strlcpy((char *) var.element.name, "error in name", \
|
||
|
DBG_FOOTPRINT_NAME_LEN - 1); \
|
||
|
} while (0)
|
||
|
|
||
|
#define GET_DBG_FP_DATA_CPU(element, core) (dbp_fp_cpu.element.data[core])
|
||
|
#define SET_DBG_FP_DATA_CPU(element, core, value) \
|
||
|
dbp_fp_cpu.element.data[core] = (uint32_t) value;
|
||
|
#define GET_DBG_FP_DATA_DEFAULT(element) (dbp_fp_soc.element.data[0])
|
||
|
#define SET_DBG_FP_DATA_DEFAULT(element, value) \
|
||
|
dbp_fp_soc.element.data[0] = (uint32_t) value;
|
||
|
|
||
|
#define CPU_CORE_COUNT_LIMIT_CHECK(c) do { \
|
||
|
if (unlikely(c >= num_possible_cpus())) { \
|
||
|
pr_err("Only %d cores but try to access core %d\n", \
|
||
|
num_possible_cpus(), c); \
|
||
|
return; \
|
||
|
} \
|
||
|
} while (0)
|
||
|
|
||
|
void nvdumper_dbg_footprint_init(void);
|
||
|
void nvdumper_dbg_footprint_exit(void);
|
||
|
void dbg_set_kernel_footprint_cpu(int core, uint32_t value);
|
||
|
void dbg_set_exit_counter_from_cpu(int core, uint32_t value);
|
||
|
void dbg_set_reset_vector_for_cpu(int core, uint32_t value);
|
||
|
void dbg_set_cpu_reset_vector_address(int core, uint32_t value);
|
||
|
void dbg_set_cpu_frequency(int core, uint32_t value);
|
||
|
void dbg_set_acpuclk_set_rate_footprint_cpu(int core, uint32_t value);
|
||
|
void dbg_set_cpu_prev_frequency(int core, uint32_t value);
|
||
|
void dbg_set_cpu_new_frequency(int core, uint32_t value);
|
||
|
void dbg_set_cpu_hotplug_on(int core, uint32_t value);
|
||
|
void dbg_set_emc_frequency(uint32_t value);
|
||
|
void dbg_set_lp_state_current(uint32_t value);
|
||
|
void dbg_set_lp_state_prev(uint32_t value);
|
||
|
void dbg_set_lp_state_next(uint32_t value);
|
||
|
void dbg_set_core_voltage(uint32_t value);
|
||
|
void dbg_set_soc_voltage(uint32_t value);
|
||
|
void dbg_set_gpu_voltage(uint32_t value);
|
||
|
void dbg_set_mem_voltage(uint32_t value);
|
||
|
void dbg_set_debug_data(uint32_t value);
|
||
|
|
||
|
#endif
|