* Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* 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 FMS_DTM_H
#define FMS_DTM_H
#include <linux/list.h>
#include <linux/types.h>
#include <linux/mutex.h>
#include <linux/wait.h>
#include <linux/version.h>
#include <linux/timer.h>
#include <linux/ktime.h>
#include "dms/dms_cmd_def.h"
#include "ascend_dev_num.h"
#include "dms_device_node_type.h"
#define DEVICE_NODE_NUM_MAX 4
#define DMS_MAX_DEV_NAME_LEN 16
#define DMS_SENSOR_DESCRIPT_LENGTH 20
#define DMS_MAX_TIME_RECORD_COUNT 20
#define DMS_MAX_SENSOR_EVENT_COUNT 16
#ifndef DMS_MAX_EVENT_DATA_LENGTH
#define DMS_MAX_EVENT_DATA_LENGTH 32
#endif
#define DMS_NOT_USED 0x1
#define DMS_IN_USED 0x2
#ifndef ASCEND_DEV_MAX_NUM
#define ASCEND_DEV_MAX_NUM 64
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 5, 0)
#ifndef STRUCT_TIMEVAL_SPEC
#define STRUCT_TIMEVAL_SPEC
struct timespec {
__kernel_old_time_t tv_sec;
long tv_nsec;
};
struct timeval {
__kernel_old_time_t tv_sec;
__kernel_suseconds_t tv_usec;
};
#endif
#endif
typedef enum {
DMS_DEV_NODE0 = 0x0,
DMS_DEV_NODE1 = 0x1,
DMS_DEV_ID_MAX
} DMS_DEVICE_NODE_ID;
typedef enum {
HAL_DMS_DEV_TYPE_BASE_SERVCIE = 0x600,
HAL_DMS_DEV_TYPE_PROC_MGR = 0x601,
HAL_DMS_DEV_TYPE_IAMMGR = 0x602,
HAL_DMS_DEV_TYPE_PROC_LAUNCHER = 0x603,
HAL_DMS_DEV_TYPE_ADDA = 0x604,
HAL_DMS_DEV_TYPE_DMP_DAEMON = 0x605,
HAL_DMS_DEV_TYPE_SKLOGD = 0x606,
HAL_DMS_DEV_TYPE_SLOGD = 0x607,
HAL_DMS_DEV_TYPE_LOG_DAEMON = 0x608,
HAL_DMS_DEV_TYPE_HDCD = 0x609,
HAL_DMS_DEV_TYPE_AICPU_SCH = 0x60B,
HAL_DMS_DEV_TYPE_QUEUE_SCH = 0x60C,
HAL_DMS_DEV_TYPE_AICPU_CUST_SCH = 0x60E,
HAL_DMS_DEV_TYPE_HCCP = 0x60F,
HAL_DMS_DEV_TYPE_TSD_DAEMON = 0x610,
HAL_DMS_DEV_TYPE_TIMER_SERVER = 0x616,
HAL_DMS_DEV_TYPE_OS_LINUX = 0x617,
HAL_DMS_DEV_TYPE_DATA_MASTER = 0x619,
HAL_DMS_DEV_TYPE_CFG_MGR = 0x61A,
HAL_DMS_DEV_TYPE_DATA_GW = 0x61D,
HAL_DMS_DEV_TYPE_RESMGR = 0x623,
HAL_DMS_DEV_TYPE_MAMI_DEV_CTRL = 0x624,
HAL_DMS_DEV_TYPE_DRV_KERNEL = 0x625,
HAL_DMS_DEV_TYPE_UBCFGLITE = 0x626,
HAL_DMS_DEV_TYPE_MAX
} HAL_DMS_DEVICE_NODE_TYPE;
#define DMS_EVENT_OBJ_KERNEL (0x0)
#define DMS_EVENT_OBJ_USER (0x6)
#define DMS_EVENT_OBJ_PRODUCT (0x7)
#define DMS_EVENT_OBJ_TYPE(node_type) (((node_type) >> 8) & 0x7)
typedef enum {
POWER_STATE_SUSPEND,
POWER_STATE_POWEROFF,
POWER_STATE_RESET,
POWER_STATE_BIST,
POWER_STATE_MAX
} DSMI_POWER_STATE;
typedef enum {
DMS_EVENT_OK = 0,
DMS_EVENT_MINOR = 1,
DMS_EVENT_MAJOR = 2,
DMS_EVENT_CRITICAL = 3,
DMS_EVENT_MAX
} DMS_SEVERITY_T;
typedef enum {
DMS_RC_MODE,
DMS_EP_MODE
} DMS_MODE_T;
#define DMS_FAULT_CONVERGE_CONFIG(sub_id, mod_id, sec_type, code, s_type, err_type, str) \
{ \
.subsys_id = (sub_id), \
.module_id = (mod_id), \
.section_type = (sec_type), \
.ras_code.err_status = (code), \
.describe = (str), \
.sensor_type = (s_type), \
.error_type = (err_type), \
}, \
struct ras_fault_converge_item {
unsigned char subsys_id;
unsigned char module_id;
unsigned int section_type;
union {
unsigned int err_type;
unsigned int int_status;
unsigned long long err_status;
} ras_code;
unsigned char describe[DMS_MAX_EVENT_DATA_LENGTH];
unsigned char sensor_type;
unsigned char error_type;
};
typedef struct dms_fault_inject_info {
unsigned int device_id;
unsigned int node_type;
unsigned int node_id;
unsigned int sub_node_type;
unsigned int sub_node_id;
unsigned int fault_index;
unsigned int event_id;
unsigned int reserve1;
unsigned int reserve2;
} dms_fault_inject_t;
struct dms_dev_data_attr {
int info_type;
int info_life;
int read_permission;
int write_permission;
};
struct dms_node_operations;
struct dms_node {
struct list_head list;
int node_type;
int node_id;
int pid;
char node_name[DMS_MAX_DEV_NAME_LEN];
unsigned long long capacity;
int permission;
int owner_devid;
struct dms_node *owner_device;
int inner_node_id;
struct dms_node *sub_node[DEVICE_NODE_NUM_MAX];
int state;
struct dms_node_operations *ops;
};
struct dms_node_operations {
int (*init)(struct dms_node *device);
void (*uninit)(struct dms_node *device);
int (*get_info_list)(struct dms_node *device, struct dms_dev_data_attr *InfoList);
int (*get_state)(struct dms_node *device, unsigned int *state);
int (*get_init_state)(struct dms_node *device, unsigned int *init_state);
int (*get_capacity)(struct dms_node *device, unsigned long long *Capacity);
int (*set_power_state)(struct dms_node *device, DSMI_POWER_STATE power_state);
int (*scan)(struct dms_node *device, int *state);
int (*fault_diag)(struct dms_node *device, int *state);
int (*event_notify)(struct dms_node *device, int event);
int (*get_link_state)(struct dms_node *device1,
struct dms_node *device2, unsigned int *state);
int (*set_link_state)(struct dms_node *device1,
struct dms_node *device2, unsigned int state);
int (*fault_inject)(dms_fault_inject_t info);
int (*get_fault_inject_info)(struct dms_node *node, dms_fault_inject_t *buf,
unsigned int buf_cnt, unsigned int *real_cnt);
int (*enable_device)(struct dms_node *device);
int (*disable_device)(struct dms_node *device);
int (*set_power_info)(struct dms_node *device, void *buf, unsigned int size);
int (*get_power_info)(struct dms_node *device, void *buf, unsigned int size);
};
struct dms_converge_event_list {
struct list_head head;
unsigned int event_num;
unsigned int health_code;
struct mutex lock;
};
struct dms_sensor_reported_list {
struct list_head head;
unsigned int reported_num;
struct mutex lock;
};
struct dms_general_sensor {
unsigned int attribute;
Six types, including:DMS_SENSOR_THRES_LOW_MINOR_SERIES,DMS_SENSOR_THRES_LOW_MAJOR_SERIES
DMS_SENSOR_THRES_LOW_CRITICAL_SERIES,DMS_SENSOR_THRES_UP_MINOR_SERIES,
DMS_SENSOR_THRES_UP_MAJOR_SERIES, DMS_SENSOR_THRES_UP_CRITICAL_SERIES */
unsigned int thres_series;
int low_critical;
int low_major;
int low_minor;
int up_critical;
int up_major;
int up_minor;
* serious, minor) is restored, the difference between the sensor value and the lower threshold after restoration */
int pos_thd_hysteresis;
* serious, minor) fault is restored, the upper threshold minus the difference of the sensor value after
* restoration */
int neg_thd_hysteresis;
int max_thres;
int min_thres;
};
struct dms_discrete_sensor {
unsigned int attribute;
unsigned int debounce_time;
};
struct dms_statistic_sensor {
unsigned short occur_thres_type;
unsigned short resume_thres_type;
unsigned int max_stat_time;
unsigned int min_stat_time;
unsigned int occur_stat_time;
unsigned int resume_stat_time;
unsigned int attribute;
unsigned int max_occur_thres;
unsigned int min_occur_thres;
unsigned int max_resume_thres;
unsigned int min_resume_thres;
unsigned int occur_thres;
unsigned int resume_thres;
};
union dms_sensor_union {
struct dms_discrete_sensor discrete_sensor;
struct dms_general_sensor general_sensor;
struct dms_statistic_sensor statistic_sensor;
};
#define DMS_MAX_EVENT_INFO_LENGTH 4
struct dms_sensor_event_data_item {
int current_value;
unsigned short data_size;
unsigned char event_data[DMS_MAX_EVENT_DATA_LENGTH];
Now just support on discrete sensor,
statistical sensor and general threshold type sensor, temporarily */
unsigned char event_info[DMS_MAX_EVENT_INFO_LENGTH];
};
struct dms_sensor_event_data {
unsigned char event_count;
struct dms_sensor_event_data_item sensor_data[DMS_MAX_SENSOR_EVENT_COUNT];
};
enum {
DMS_SERSOR_SCAN_PERIOD = 0,
DMS_SERSOR_SCAN_NOTIFY = 1,
DMS_SERSOR_SCAN_MODULE_MAX
};
struct dms_sensor_object_cfg {
unsigned char sensor_type;
char sensor_name[DMS_SENSOR_DESCRIPT_LENGTH];
unsigned short sensor_class;
union dms_sensor_union sensor_class_cfg;
unsigned int scan_module;
unsigned int scan_interval;
unsigned int proc_flag;
unsigned int enable_flag;
int (*pf_scan_func)(unsigned long long private_data, struct dms_sensor_event_data *pevent_data);
unsigned long long private_data;
unsigned int assert_event_mask;
unsigned int deassert_event_mask;
int pid;
int (*pf_clear_event_func)(unsigned long long private_data);
};
typedef struct dms_sys_time {
unsigned short year;
the scope is 1970 ~ 2100 */
unsigned char month;
unsigned char date;
unsigned char hour;
unsigned char minute;
unsigned char second;
unsigned char week;
} SYS_TIME;
typedef struct tag_dms_event_list_item {
unsigned char in_use : 1;
the old event 1 = Old event 0 = New event, used when comparing event lists */
unsigned char is_report : 7;
unsigned char event_data;
unsigned int sensor_num;
char sensor_name[DMS_SENSOR_DESCRIPT_LENGTH];
unsigned long long timestamp;
unsigned int alarm_serial_num;
struct tag_dms_event_list_item *p_next;
unsigned short para_len;
unsigned char *event_paras;
unsigned char event_info[DMS_MAX_EVENT_INFO_LENGTH];
unsigned char continued_count;
} DMS_EVENT_LIST_ITEM;
union dms_sensor_class_cb {
struct dms_discrete_sen_cb {
unsigned int pre_status;
} discrete_cb;
struct dms_general_sen_cb {
unsigned int pre_status;
} general_cb;
struct dms_statistic_sen_cb {
updated by the alarm processing module have a fixed length of 20 bytes, and the effective data length is
determined by the length of the event parameters above. The first part of the parameter stores the key field
parameters.
*/
unsigned char stat_event_paras[DMS_MAX_EVENT_DATA_LENGTH];
which is less than the statistics cycle. After the sensor state changes
or the statistical period arrives, the DMS common module sets the initial value.
*/
unsigned int stat_time_counter;
each bit represents the state once,
the previous 32 states are cached at most, and the lowest bit is the most recent state
*/
unsigned int current_bit_count;
unsigned int alarm_clear_times;
in the normal state, it indicates the count of the fault state */
unsigned int status_counter;
SYS_TIME object_op_state_ch_time;
unsigned int object_op_state_chg_cause;
} statistic_cb;
};
struct dms_sensor_object_cb {
unsigned short object_index;
unsigned int sensor_num;
unsigned int owner_node_id;
unsigned int owner_node_type;
struct dms_node_sensor_cb *p_owner_cb;
struct dms_sensor_object_cfg sensor_object_cfg;
struct dms_sensor_object_cfg orig_obj_cfg;
unsigned int remain_time;
Discrete sensor: is the event offset value of the sensor
Threshold sensor: the actual reading of the sensor, such as temperature value
Statistics sensor: is the value of statistics */
int current_value;
unsigned int event_status;
and the most serious level as the status of the sensor */
unsigned int fault_status;
struct list_head list;
DMS_EVENT_LIST_ITEM *p_event_list;
fixed length of 20 bytes, and the effective data length is determined by the length of the above event parameter.
The first part of the parameter stores the key field parameters.
*/
unsigned int paras_len;
unsigned char event_paras[DMS_MAX_EVENT_DATA_LENGTH];
union dms_sensor_class_cb class_cb;
};
struct dms_sensor_scan_fail_record {
unsigned int node_type;
unsigned int node_id;
unsigned int current_handle;
void *current_scan_func;
unsigned int syn_sema_fail;
unsigned int mux_sema_fail;
unsigned int get_data_from_node_fail;
unsigned int table_error_fail;
unsigned int null_scan_func_fail;
unsigned int call_scan_func_fail;
unsigned int scan_func_date_error;
unsigned int null_object_fail;
unsigned int sensor_process_fail;
unsigned int report_event_fail;
};
struct dms_dev_sensor_cb;
struct dms_sensor_scan_time_recorder {
* recording */
unsigned int record_scan_time_flag;
unsigned int sensor_out_time_count;
unsigned int sensor_record_index;
struct dms_sensor_scan_time_item {
char sensor_name[DMS_SENSOR_DESCRIPT_LENGTH];
* milliseconds */
unsigned long exec_time;
} sensor_scan_time_record[DMS_MAX_TIME_RECORD_COUNT], max_sensor_scan_record;
unsigned int dev_out_time_count;
unsigned long max_dev_scan_record;
unsigned int dev_record_index;
unsigned long dev_scan_time_record[DMS_MAX_TIME_RECORD_COUNT];
void (*start_sensor_scan_record)(struct dms_dev_sensor_cb *dev_sensor_cb);
void (*stop_sensor_scan_record)(struct dms_dev_sensor_cb *dev_sensor_cb,
struct dms_sensor_object_cb *psensor_obj_cb);
void (*start_dev_scan_record)(struct dms_dev_sensor_cb *dev_sensor_cb);
void (*stop_dev_scan_record)(struct dms_dev_sensor_cb *dev_sensor_cb);
ktime_t sensor_start_time;
ktime_t dev_start_time;
};
* this type of table pointer */
struct dms_node_sensor_cb {
unsigned int node_id;
unsigned short node_type;
int pid;
unsigned short env_type;
unsigned short version;
struct dms_node *owner_node;
struct list_head list;
unsigned int sensor_object_num;
unsigned short health;
struct list_head sensor_object_table;
};
struct dms_dev_sensor_cb {
int deviceid;
struct mutex dms_sensor_mutex;
int node_cb_num;
unsigned short health;
* 1 device, 910 SMP is 4 devices */
struct list_head dms_node_sensor_cb_list;
struct dms_sensor_scan_fail_record sensor_scan_fail_record;
struct dms_sensor_scan_time_recorder scan_time_recorder;
};
enum {
DMS_EVENT_TYPE_RESUME = 0,
DMS_EVENT_TYPE_OCCUR = 1,
DMS_EVENT_TYPE_ONE_TIME = 2,
DMS_EVENT_TYPE_MAX
};
struct dms_event_dfx_table {
atomic_t recv_from_sensor[DMS_EVENT_TYPE_MAX];
atomic_t report_to_consumer[DMS_EVENT_TYPE_MAX];
struct list_head mask_list;
struct mutex lock;
};
struct dms_event_ctrl {
struct dms_converge_event_list event_list;
struct dms_sensor_reported_list reported_list;
struct dms_event_dfx_table dfx_table;
};
struct dms_dev_ctrl_block {
u32 state;
void *dev_info;
atomic_t work_count;
int sub_node_num;
struct dms_event_ctrl dev_event_cb;
struct mutex node_lock;
struct list_head dev_node_list;
struct dms_dev_sensor_cb dev_sensor_cb;
};
struct dms_system_ctrl_block {
int dev_id;
struct task_struct *sensor_scan_task;
wait_queue_head_t sensor_scan_wait;
atomic_t sensor_scan_task_state;
int sensor_scan_suspend_flag;
struct timer_list dms_sensor_check_timer;
* Device data group, initial allocation, call for 1 device (device id = 0x1000) on the host side,
* if device, AMP is 1 device, 910 SMP is 4 devices
*/
struct dms_dev_ctrl_block base_cb;
struct dms_dev_ctrl_block dev_cb_table[ASCEND_DEV_MAX_NUM];
};
struct state_item {
uint32_t node_type;
uint32_t node_id;
struct dms_node *node;
};
struct dms_state_table {
uint32_t num;
struct state_item *item;
};
struct dms_state_table *dms_get_state_table(void);
struct dms_system_ctrl_block *dms_get_sys_ctrl_cb(void);
int dms_check_device_id(int dev_id);
DMS_MODE_T dms_get_rc_ep_mode(void);
struct dms_dev_ctrl_block *dms_get_dev_cb(int dev_id);
bool dms_is_devid_valid(int dev_id);
#define POWER_INFO_RESERVE_LEN 8
struct dsmi_dtm_node_s {
int node_type;
int node_id;
unsigned int reserve[POWER_INFO_RESERVE_LEN];
};
int dms_check_node_type(int node_type);
void dev_node_release(int owner_pid);
int dms_register_dev_node(struct dms_node *node);
int dms_unregister_dev_node(struct dms_node *node);
struct dms_node *dms_get_devnode_cb(u32 dev_id, int node_type, int node_id);
int dms_update_devnode_cb(u32 dev_id, int node_type, int node_id,
int (*update_dms_node)(struct dms_node *node));
int dms_traverse_devnode_get_capacity(u32 dev_id, struct dsmi_dtm_node_s node_info[],
unsigned int size, unsigned int *out_size);
int dms_devnode_enable_device(u32 dev_id, int node_type, int node_id);
int dms_devnode_disable_device(u32 dev_id, int node_type, int node_id);
int dms_devnode_get_power_info(u32 dev_id, int node_type, int node_id, void *buf, unsigned int size);
int dms_devnode_set_power_info(u32 dev_id, int node_type, int node_id, void *buf, unsigned int size);
ssize_t dms_devnode_print_node_list(char *buf);
int dms_get_node_type_str(unsigned short node_type, char *node_str, unsigned int str_len);
extern int memset_s(void *dest, size_t destMax, int c, size_t count);
extern int memcpy_s(void *dest, size_t destMax, const void *src, size_t count);
extern int strcpy_s(char *strDest, size_t destMax, const char *strSrc);
extern int strcat_s(char *strDest, size_t destMax, const char *strSrc);
extern int strncat_s(char *strDest, size_t destMax, const char *strSrc, size_t count);
extern int snprintf_s(char *strDest, size_t destMax, size_t count, const char *format, ...);
#endif