blob: f99eca4b9c60cfba568b426fa75c0fde1977a021 [file] [log] [blame]
/* arch/arm64/mach-exynos/include/mach/apm-exynos.h
*
* Copyright (c) 2014 Samsung Electronics Co., Ltd.
* http://www.samsung.com
*
* AP Parameter definitions
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#ifndef __ECT_PARSER_H
#define __ECT_PARSER_H __FILE__
#include <linux/slab.h>
#include <linux/device.h>
#include <linux/errno.h>
#include <linux/string.h>
#include <linux/module.h>
#include <linux/stat.h>
#include <linux/fs.h>
#include <linux/debugfs.h>
#define BLOCK_HEADER "HEADER"
#define BLOCK_AP_THERMAL "THERMAL"
#define BLOCK_MIF_THERMAL "MR4"
#define BLOCK_DVFS "DVFS"
#define BLOCK_ASV "ASV"
#define BLOCK_TIMING_PARAM "TIMING"
#define BLOCK_RCC "RCC"
#define BLOCK_PLL "PLL"
#define BLOCK_MARGIN "MARGIN"
#define BLOCK_MINLOCK "MINLOCK"
#define BLOCK_GEN_PARAM "GEN"
#define BLOCK_BIN "BIN"
#define BLOCK_NEW_TIMING_PARAM "NEWTIME"
#define BLOCK_PIDTM "PIDTM"
#define SYSFS_NODE_HEADER "header"
#define SYSFS_NODE_AP_THERMAL "ap_thermal"
#define SYSFS_NODE_MIF_THERMAL "mr4"
#define SYSFS_NODE_DVFS "dvfs_table"
#define SYSFS_NODE_ASV "asv_table"
#define SYSFS_NODE_TIMING_PARAM "mif_timing_parameter"
#define SYSFS_NODE_RCC "rcc_table"
#define SYSFS_NODE_PLL "pll_list"
#define SYSFS_NODE_MARGIN "margin_table"
#define SYSFS_NODE_MINLOCK "minlock_table"
#define SYSFS_NODE_GEN_PARAM "general_parameter"
#define SYSFS_NODE_BIN "binary"
#define SYSFS_NODE_NEW_TIMING_PARAM "new_timing_parameter"
#define SYSFS_NODE_PIDTM "pidtm"
#define PMIC_VOLTAGE_STEP (6250)
#define MINMAX_ASV_FUSING (0)
#define MINMAX_ASV_TABLE (1)
#define MINMAX_MIN_FREQ (2)
#define MINMAX_MAX_FREQ (3)
#define MINMAX_BOOT_FREQ (4)
#define MINMAX_RESUME_FREQ (5)
#define MINMAX_COL (6)
struct ect_header
{
char sign[4];
char version[4];
unsigned int total_size;
int num_of_header;
};
enum e_dvfs_mode_flag {
e_dvfs_mode_clock_name = 0x1,
e_dvfs_mode_sfr_address = 0x2,
};
struct ect_dvfs_level
{
unsigned int level;
int level_en;
};
struct ect_dvfs_domain
{
char *domain_name;
unsigned int domain_offset;
unsigned int max_frequency;
unsigned int min_frequency;
int boot_level_idx;
int resume_level_idx;
int num_of_clock;
int num_of_level;
enum e_dvfs_mode_flag mode;
char **list_clock;
unsigned int *list_sfr;
struct ect_dvfs_level *list_level;
unsigned int *list_dvfs_value;
};
struct ect_dvfs_header
{
int parser_version;
char version[4];
int num_of_domain;
struct ect_dvfs_domain *domain_list;
};
struct ect_pll_frequency
{
unsigned int frequency;
unsigned int p;
unsigned int m;
unsigned int s;
unsigned int k;
};
struct ect_pll
{
char *pll_name;
unsigned int pll_offset;
unsigned int type_pll;
int num_of_frequency;
struct ect_pll_frequency *frequency_list;
};
struct ect_pll_header
{
int parser_version;
char version[4];
int num_of_pll;
struct ect_pll *pll_list;
};
struct ect_voltage_table
{
int table_version;
int boot_level_idx;
int resume_level_idx;
int *level_en;
unsigned int *voltages;
unsigned char *voltages_step;
unsigned int volt_step;
};
struct ect_voltage_domain
{
char *domain_name;
unsigned int domain_offset;
int num_of_group;
int num_of_level;
int num_of_table;
unsigned int *level_list;
struct ect_voltage_table *table_list;
};
struct ect_voltage_header
{
int parser_version;
char version[4];
int num_of_domain;
struct ect_voltage_domain *domain_list;
};
struct ect_rcc_table
{
int table_version;
unsigned int *rcc;
unsigned char *rcc_compact;
};
struct ect_rcc_domain
{
char *domain_name;
unsigned int domain_offset;
int num_of_group;
int num_of_level;
int num_of_table;
unsigned int *level_list;
struct ect_rcc_table *table_list;
};
struct ect_rcc_header
{
int parser_version;
char version[4];
int num_of_domain;
struct ect_rcc_domain *domain_list;
};
struct ect_mif_thermal_level
{
int mr4_level;
unsigned int max_frequency;
unsigned int min_frequency;
unsigned int refresh_rate_value;
unsigned int polling_period;
unsigned int sw_trip;
};
struct ect_mif_thermal_header
{
int parser_version;
char version[4];
int num_of_level;
struct ect_mif_thermal_level *level;
};
struct ect_ap_thermal_range
{
unsigned int lower_bound_temperature;
unsigned int upper_bound_temperature;
unsigned int max_frequency;
unsigned int sw_trip;
unsigned int flag;
};
struct ect_ap_thermal_function
{
char *function_name;
unsigned int function_offset;
int num_of_range;
struct ect_ap_thermal_range *range_list;
};
struct ect_ap_thermal_header
{
int parser_version;
char version[4];
int num_of_function;
struct ect_ap_thermal_function *function_list;
};
struct ect_margin_domain
{
char *domain_name;
unsigned int domain_offset;
int num_of_group;
int num_of_level;
unsigned int *offset;
unsigned char *offset_compact;
unsigned int volt_step;
};
struct ect_margin_header
{
int parser_version;
char version[4];
int num_of_domain;
struct ect_margin_domain *domain_list;
};
struct ect_timing_param_size
{
unsigned int memory_size;
unsigned long long parameter_key;
unsigned int offset;
int num_of_timing_param;
int num_of_level;
unsigned int *timing_parameter;
};
struct ect_timing_param_header
{
int parser_version;
char version[4];
int num_of_size;
struct ect_timing_param_size *size_list;
};
struct ect_minlock_frequency
{
unsigned int main_frequencies;
unsigned int sub_frequencies;
};
struct ect_minlock_domain
{
char *domain_name;
unsigned int domain_offset;
int num_of_level;
struct ect_minlock_frequency *level;
};
struct ect_minlock_header
{
int parser_version;
char version[4];
int num_of_domain;
struct ect_minlock_domain *domain_list;
};
struct ect_gen_param_table
{
char *table_name;
unsigned int offset;
int num_of_col;
int num_of_row;
unsigned int *parameter;
};
struct ect_gen_param_header
{
int parser_version;
char version[4];
int num_of_table;
struct ect_gen_param_table *table_list;
};
struct ect_bin
{
char *binary_name;
unsigned int offset;
int binary_size;
void *ptr;
};
struct ect_bin_header
{
int parser_version;
char version[4];
int num_of_binary;
struct ect_bin *binary_list;
};
enum e_new_timing_parameter_mode
{
e_mode_normal_value = 0x1,
e_mode_extend_value = 0x2,
};
struct ect_new_timing_param_size
{
unsigned long long parameter_key;
unsigned int offset;
enum e_new_timing_parameter_mode mode;
int num_of_timing_param;
int num_of_level;
unsigned int *timing_parameter;
};
struct ect_new_timing_param_header
{
int parser_version;
char version[4];
int num_of_size;
struct ect_new_timing_param_size *size_list;
};
struct ect_pidtm_block
{
char *block_name;
unsigned int offset;
int num_of_temperature;
int *temperature_list;
int num_of_parameter;
char **param_name_list;
int *param_value_list;
};
struct ect_pidtm_header
{
int parser_version;
char version[4];
int num_of_block;
struct ect_pidtm_block *block_list;
};
struct ect_info
{
char *block_name;
int block_name_length;
int (*parser)(void *address, struct ect_info *info);
int (*dump)(struct seq_file *s, void *data);
struct file_operations dump_ops;
char *dump_node_name;
void *block_handle;
int block_precedence;
};
#if defined(CONFIG_ECT)
void ect_init(phys_addr_t address, phys_addr_t size);
int ect_parse_binary_header(void);
void* ect_get_block(char *block_name);
struct ect_dvfs_domain *ect_dvfs_get_domain(void *block, char *domain_name);
struct ect_pll *ect_pll_get_pll(void *block, char *pll_name);
struct ect_voltage_domain *ect_asv_get_domain(void *block, char *domain_name);
struct ect_rcc_domain *ect_rcc_get_domain(void *block, char *domain_name);
struct ect_mif_thermal_level *ect_mif_thermal_get_level(void *block, int mr4_level);
struct ect_ap_thermal_function *ect_ap_thermal_get_function(void *block, char *function_name);
struct ect_margin_domain *ect_margin_get_domain(void *block, char *domain_name);
struct ect_timing_param_size *ect_timing_param_get_size(void *block, int size);
struct ect_timing_param_size *ect_timing_param_get_key(void *block, unsigned long long key);
struct ect_minlock_domain *ect_minlock_get_domain(void *block, char *domain_name);
struct ect_gen_param_table *ect_gen_param_get_table(void *block, char *table_name);
struct ect_bin *ect_binary_get_bin(void *block, char *binary_name);
struct ect_new_timing_param_size *ect_new_timing_param_get_key(void *block, unsigned long long key);
struct ect_pidtm_block *ect_pidtm_get_block(void *block, char *block_name);
void ect_init_map_io(void);
int ect_strcmp(char *src1, char *src2);
int ect_strncmp(char *src1, char *src2, int length);
unsigned long long ect_read_value64(unsigned int *address, int index);
#else
static inline void ect_init(phys_addr_t address, phys_addr_t size) {}
static inline int ect_parse_binary_header(void) { return 0; }
static inline void* ect_get_block(char *block_name) { return NULL; }
static inline struct ect_dvfs_domain *ect_dvfs_get_domain(void *block, char *domain_name) { return NULL; }
static inline struct ect_pll *ect_pll_get_pll(void *block, char *pll_name) { return NULL; }
static inline struct ect_voltage_domain *ect_asv_get_domain(void *block, char *domain_name) { return NULL; }
static inline struct ect_rcc_domain *ect_rcc_get_domain(void *block, char *domain_name) { return NULL; }
static inline struct ect_mif_thermal_level *ect_mif_thermal_get_level(void *block, int mr4_level) { return NULL; }
static inline struct ect_ap_thermal_function *ect_ap_thermal_get_function(void *block, char *function_name) { return NULL; }
static inline struct ect_margin_domain *ect_margin_get_domain(void *block, char *domain_name) { return NULL; }
static inline struct ect_timing_param_size *ect_timing_param_get_size(void *block, int size) { return NULL; }
static inline struct ect_timing_param_size *ect_timing_param_get_key(void *block, unsigned long long key) { return NULL; }
static inline struct ect_minlock_domain *ect_minlock_get_domain(void *block, char *domain_name) { return NULL; }
static inline struct ect_gen_param_table *ect_gen_param_get_table(void *block, char *table_name) { return NULL; }
static inline struct ect_bin *ect_binary_get_bin(void *block, char *binary_name) { return NULL; }
static inline struct ect_new_timing_param_size *ect_new_timing_param_get_key(void *block, unsigned long long key) { return NULL; }
static inline struct ect_pidtm_block *ect_pidtm_get_block(void *block, char *block_name) { return NULL; }
static inline void ect_init_map_io(void) {}
static inline int ect_strcmp(char *src1, char *src2) { return -1; }
static inline int ect_strncmp(char *src1, char *src2, int length) { return -1; }
static inline unsigned long long ect_read_value64(unsigned int *address, int index) { return 0; }
#endif
#endif