1*e63819f2SJacky Bai /* SPDX-License-Identifier: BSD-3-Clause */ 2*e63819f2SJacky Bai /* 3*e63819f2SJacky Bai * Copyright 2023-2024 NXP 4*e63819f2SJacky Bai */ 5*e63819f2SJacky Bai 6*e63819f2SJacky Bai #ifndef SCMI_MSG_SENSOR_H 7*e63819f2SJacky Bai #define SCMI_MSG_SENSOR_H 8*e63819f2SJacky Bai 9*e63819f2SJacky Bai #include <stdint.h> 10*e63819f2SJacky Bai 11*e63819f2SJacky Bai #include <lib/utils_def.h> 12*e63819f2SJacky Bai 13*e63819f2SJacky Bai #define SCMI_PROTOCOL_VERSION_SENSOR 0x20000U 14*e63819f2SJacky Bai 15*e63819f2SJacky Bai /* 16*e63819f2SJacky Bai * Identifiers of the SCMI SENSOR Protocol commands 17*e63819f2SJacky Bai */ 18*e63819f2SJacky Bai enum scmi_sensor_command_id { 19*e63819f2SJacky Bai SCMI_SENSOR_DESCRIPTION_GET = 0x003, 20*e63819f2SJacky Bai SCMI_SENSOR_TRIP_POINT_NOTIFY = 0x004, 21*e63819f2SJacky Bai SCMI_SENSOR_TRIP_POINT_CONFIG = 0x005, 22*e63819f2SJacky Bai SCMI_SENSOR_READING_GET = 0x006, 23*e63819f2SJacky Bai SCMI_SENSOR_AXIS_DESCRIPTION_GET = 0x007, 24*e63819f2SJacky Bai SCMI_SENSOR_LIST_UPDATE_INTERVALS = 0x008, 25*e63819f2SJacky Bai SCMI_SENSOR_CONFIG_GET = 0x009, 26*e63819f2SJacky Bai SCMI_SENSOR_CONFIG_SET = 0x00A, 27*e63819f2SJacky Bai SCMI_SENSOR_CONTINUOUS_UPDATE_NOTIFY = 0x00B, 28*e63819f2SJacky Bai SCMI_SENSOR_MAX = 0x00C, 29*e63819f2SJacky Bai }; 30*e63819f2SJacky Bai 31*e63819f2SJacky Bai /* Protocol attributes */ 32*e63819f2SJacky Bai struct scmi_protocol_attributes_p2a_sensor { 33*e63819f2SJacky Bai int32_t status; 34*e63819f2SJacky Bai int16_t num_sensors; 35*e63819f2SJacky Bai uint8_t max_reqs; 36*e63819f2SJacky Bai uint8_t res; 37*e63819f2SJacky Bai uint32_t sensor_reg_low; 38*e63819f2SJacky Bai uint32_t sensor_reg_high; 39*e63819f2SJacky Bai uint32_t sensor_reg_len; 40*e63819f2SJacky Bai }; 41*e63819f2SJacky Bai 42*e63819f2SJacky Bai #define SCMI_SENSOR_NAME_LENGTH_MAX 16U 43*e63819f2SJacky Bai 44*e63819f2SJacky Bai struct scmi_sensor_desc { 45*e63819f2SJacky Bai uint32_t id; 46*e63819f2SJacky Bai uint32_t attr_low; 47*e63819f2SJacky Bai uint32_t attr_high; 48*e63819f2SJacky Bai uint8_t name[SCMI_SENSOR_NAME_LENGTH_MAX]; 49*e63819f2SJacky Bai uint32_t power; 50*e63819f2SJacky Bai uint32_t resolution; 51*e63819f2SJacky Bai int32_t min_range_low; 52*e63819f2SJacky Bai int32_t min_range_high; 53*e63819f2SJacky Bai int32_t max_range_low; 54*e63819f2SJacky Bai int32_t max_range_high; 55*e63819f2SJacky Bai }; 56*e63819f2SJacky Bai 57*e63819f2SJacky Bai struct scmi_sensor_description_get_a2p { 58*e63819f2SJacky Bai uint32_t desc_index; 59*e63819f2SJacky Bai }; 60*e63819f2SJacky Bai 61*e63819f2SJacky Bai struct scmi_sensor_description_get_p2a { 62*e63819f2SJacky Bai int32_t status; 63*e63819f2SJacky Bai uint32_t num_sensor_flags; 64*e63819f2SJacky Bai }; 65*e63819f2SJacky Bai 66*e63819f2SJacky Bai struct scmi_sensor_config_get_a2p { 67*e63819f2SJacky Bai uint32_t sensor_id; 68*e63819f2SJacky Bai }; 69*e63819f2SJacky Bai 70*e63819f2SJacky Bai struct scmi_sensor_config_get_p2a { 71*e63819f2SJacky Bai int32_t status; 72*e63819f2SJacky Bai uint32_t sensor_config; 73*e63819f2SJacky Bai }; 74*e63819f2SJacky Bai 75*e63819f2SJacky Bai /* 76*e63819f2SJacky Bai * Sensor Reading Get 77*e63819f2SJacky Bai */ 78*e63819f2SJacky Bai struct scmi_sensor_reading_get_a2p { 79*e63819f2SJacky Bai uint32_t sensor_id; 80*e63819f2SJacky Bai uint32_t flags; 81*e63819f2SJacky Bai }; 82*e63819f2SJacky Bai 83*e63819f2SJacky Bai struct scmi_sensor_val { 84*e63819f2SJacky Bai uint32_t value_low; 85*e63819f2SJacky Bai uint32_t value_high; 86*e63819f2SJacky Bai uint32_t timestap_low; 87*e63819f2SJacky Bai uint32_t timestap_high; 88*e63819f2SJacky Bai }; 89*e63819f2SJacky Bai 90*e63819f2SJacky Bai struct scmi_sensor_reading_get_p2a { 91*e63819f2SJacky Bai int32_t status; 92*e63819f2SJacky Bai struct scmi_sensor_val val; 93*e63819f2SJacky Bai }; 94*e63819f2SJacky Bai 95*e63819f2SJacky Bai typedef struct { 96*e63819f2SJacky Bai uint16_t (*sensor_count)(unsigned int agent_id); 97*e63819f2SJacky Bai uint8_t (*sensor_max_request)(unsigned int agent_id); 98*e63819f2SJacky Bai uint32_t (*get_sensor_req)(unsigned int agent_id, unsigned int *addr); 99*e63819f2SJacky Bai int32_t (*sensor_reading_get)(uint32_t agent_id, uint16_t sensor_id, 100*e63819f2SJacky Bai uint32_t *val); 101*e63819f2SJacky Bai uint32_t (*sensor_description_get)(unsigned int agent_id, uint16_t sensor_id, 102*e63819f2SJacky Bai struct scmi_sensor_desc *desc); 103*e63819f2SJacky Bai uint32_t (*sensor_update_interval)(uint32_t agent_id, uint16_t sensor_id); 104*e63819f2SJacky Bai uint32_t (*sensor_state)(uint32_t agent_id, uint16_t sensor_id); 105*e63819f2SJacky Bai uint16_t (*sensor_timestamped)(uint32_t agent_id, uint16_t sensor_id); 106*e63819f2SJacky Bai } plat_scmi_sensor_ops_t; 107*e63819f2SJacky Bai 108*e63819f2SJacky Bai #define REGISTER_SCMI_SENSOR_OPS(_sensor_count, _sensor_max_request, \ 109*e63819f2SJacky Bai _get_sensor_req, _sensor_reading_get, \ 110*e63819f2SJacky Bai _sensor_description_get, _sensor_update_interval, \ 111*e63819f2SJacky Bai _sensor_state, _sensor_timestamped) \ 112*e63819f2SJacky Bai const plat_scmi_sensor_ops_t sensor_ops = { \ 113*e63819f2SJacky Bai .sensor_count = _sensor_count, \ 114*e63819f2SJacky Bai .sensor_max_request = _sensor_max_request, \ 115*e63819f2SJacky Bai .get_sensor_req = _get_sensor_req, \ 116*e63819f2SJacky Bai .sensor_reading_get = _sensor_reading_get, \ 117*e63819f2SJacky Bai .sensor_description_get = _sensor_description_get, \ 118*e63819f2SJacky Bai .sensor_update_interval = _sensor_update_interval, \ 119*e63819f2SJacky Bai .sensor_state = _sensor_state, \ 120*e63819f2SJacky Bai .sensor_timestamped = _sensor_timestamped, \ 121*e63819f2SJacky Bai } 122*e63819f2SJacky Bai 123*e63819f2SJacky Bai extern const plat_scmi_sensor_ops_t sensor_ops; 124*e63819f2SJacky Bai 125*e63819f2SJacky Bai #endif /* SCMI_MSG_SENSOR_H */ 126