diff --git a/product/n1sdp/module/n1sdp_sensor/include/mod_n1sdp_sensor.h b/product/n1sdp/module/n1sdp_sensor/include/mod_n1sdp_sensor.h new file mode 100644 index 0000000000000000000000000000000000000000..0e8e030d93f1f0da25d1894f4e0d3a2b5868e6d1 --- /dev/null +++ b/product/n1sdp/module/n1sdp_sensor/include/mod_n1sdp_sensor.h @@ -0,0 +1,97 @@ +/* + * Arm SCP/MCP Software + * Copyright (c) 2019, Arm Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef MOD_N1SDP_SENSOR_H +#define MOD_N1SDP_SENSOR_H + +#include +#include + +/*! + * \addtogroup GroupN1SDPModule N1SDP Product Modules + * @{ + */ + +/*! + * \defgroup GroupN1SDPSensor N1SDP Sensor Support + * + * \brief Driver for reading on-chip temperature & voltage sensor values. + * @{ + */ + +/*! + * \brief Temperature sensor indices. + */ +enum mod_n1sdp_temp_sensor_idx { + /*! Cluster 0 temperature sensor */ + MOD_N1SDP_TEMP_SENSOR_IDX_CLUSTER0, + + /*! Cluster 1 temperature sensor */ + MOD_N1SDP_TEMP_SENSOR_IDX_CLUSTER1, + + /*! SYSTOP temperature sensor */ + MOD_N1SDP_TEMP_SENSOR_IDX_SYSTEM, + + /*! Temperature sensor count */ + MOD_N1SDP_TEMP_SENSOR_COUNT, +}; + +/*! + * \brief Voltage sensor indices. + */ +enum mod_n1sdp_volt_sensor_idx { + /*! Cluster 0 Core 0 voltage sensor */ + MOD_N1SDP_VOLT_SENSOR_IDX_CLUS0CORE0 = MOD_N1SDP_TEMP_SENSOR_COUNT, + + /*! Cluster 0 Core 1 voltage sensor */ + MOD_N1SDP_VOLT_SENSOR_IDX_CLUS0CORE1, + + /*! Cluster 1 Core 0 voltage sensor */ + MOD_N1SDP_VOLT_SENSOR_IDX_CLUS1CORE0, + + /*! Cluster 1 Core 1 voltage sensor */ + MOD_N1SDP_VOLT_SENSOR_IDX_CLUS1CORE1, + + /*! SYSTOP voltage sensor */ + MOD_N1SDP_VOLT_SENSOR_IDX_SYSTEM, + + /*! Voltage sensor count */ + MOD_N1SDP_VOLT_SENSOR_COUNT, +}; + + +/*! + * \brief Temperature sensor element configuration. + */ +struct mod_n1sdp_temp_sensor_config { + /*! Threshold value to raise an alarm */ + int32_t alarm_threshold; + + /*! Threshold value to shutdown the temperature domain */ + int32_t shutdown_threshold; + + /*! Auxiliary sensor information */ + struct mod_sensor_info *info; +}; + +/*! + * \brief Voltage sensor element configuration. + */ +struct mod_n1sdp_volt_sensor_config { + /*! Auxiliary sensor information */ + struct mod_sensor_info *info; +}; + +/*! + * @} + */ + +/*! + * @} + */ + +#endif /* MOD_N1SDP_SENSOR_H */ diff --git a/product/n1sdp/module/n1sdp_sensor/lib/mod_n1sdp_sensor.a b/product/n1sdp/module/n1sdp_sensor/lib/mod_n1sdp_sensor.a new file mode 100644 index 0000000000000000000000000000000000000000..83e99202b70e9ed9f7b8deb5ca94d9650b314854 Binary files /dev/null and b/product/n1sdp/module/n1sdp_sensor/lib/mod_n1sdp_sensor.a differ diff --git a/product/n1sdp/scp_ramfw/config_sensor.c b/product/n1sdp/scp_ramfw/config_sensor.c new file mode 100644 index 0000000000000000000000000000000000000000..783c6e783b7d429bae33330b7d551e554f96b1be --- /dev/null +++ b/product/n1sdp/scp_ramfw/config_sensor.c @@ -0,0 +1,137 @@ +/* + * Arm SCP/MCP Software + * Copyright (c) 2019, Arm Limited and Contributors. All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include +#include +#include +#include +#include +#include + +/* + * N1SDP sensor driver config + */ + +static struct mod_sensor_info info_temp_sensor = { + .type = MOD_SENSOR_TYPE_DEGREES_C, + .update_interval = 0, + .update_interval_multiplier = 0, + .unit_multiplier = 0, +}; + +static struct mod_sensor_info info_volt_sensor = { + .type = MOD_SENSOR_TYPE_VOLTS, + .update_interval = 0, + .update_interval_multiplier = 0, + .unit_multiplier = 0, +}; + +static const struct fwk_element n1sdp_sensor_element_table[] = { + [MOD_N1SDP_TEMP_SENSOR_IDX_CLUSTER0] = { + .name = "CLUS0 Temperature", + .data = &((struct mod_n1sdp_temp_sensor_config) { + .alarm_threshold = 70, + .shutdown_threshold = 80, + .info = &info_temp_sensor, + }), + }, + [MOD_N1SDP_TEMP_SENSOR_IDX_CLUSTER1] = { + .name = "CLUS1 Temperature", + .data = &((struct mod_n1sdp_temp_sensor_config) { + .alarm_threshold = 70, + .shutdown_threshold = 80, + .info = &info_temp_sensor, + }), + }, + [MOD_N1SDP_TEMP_SENSOR_IDX_SYSTEM] = { + .name = "SYS Temperature", + .data = &((struct mod_n1sdp_temp_sensor_config) { + .alarm_threshold = 70, + .shutdown_threshold = 80, + .info = &info_temp_sensor, + }), + }, + [MOD_N1SDP_VOLT_SENSOR_IDX_CLUS0CORE0] = { + .name = "CLUS0CORE0 Voltage", + .data = &((struct mod_n1sdp_volt_sensor_config) { + .info = &info_volt_sensor, + }), + }, + [MOD_N1SDP_VOLT_SENSOR_IDX_CLUS0CORE1] = { + .name = "CLUS0CORE1 Voltage", + .data = &((struct mod_n1sdp_volt_sensor_config) { + .info = &info_volt_sensor, + }), + }, + [MOD_N1SDP_VOLT_SENSOR_IDX_CLUS1CORE0] = { + .name = "CLUS1CORE0 Voltage", + .data = &((struct mod_n1sdp_volt_sensor_config) { + .info = &info_volt_sensor, + }), + }, + [MOD_N1SDP_VOLT_SENSOR_IDX_CLUS1CORE1] = { + .name = "CLUS1CORE1 Voltage", + .data = &((struct mod_n1sdp_volt_sensor_config) { + .info = &info_volt_sensor, + }), + }, + [MOD_N1SDP_VOLT_SENSOR_IDX_SYSTEM] = { + .name = "SYS Voltage", + .data = &((struct mod_n1sdp_volt_sensor_config) { + .info = &info_volt_sensor, + }), + }, + [MOD_N1SDP_VOLT_SENSOR_COUNT] = { 0 }, +}; + +static const struct fwk_element *get_n1sdp_sensor_element_table(fwk_id_t id) +{ + return n1sdp_sensor_element_table; +} + +struct fwk_module_config config_n1sdp_sensor = { + .get_element_table = get_n1sdp_sensor_element_table, +}; + + +/* + * Sensor module config + */ +static const struct fwk_element sensor_element_table[] = { + [MOD_N1SDP_TEMP_SENSOR_IDX_CLUSTER0] = { + .name = "CLUS0 Temperature", + .data = &((struct mod_sensor_dev_config) { + .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_N1SDP_SENSOR, + MOD_N1SDP_TEMP_SENSOR_IDX_CLUSTER0), + }), + }, + [MOD_N1SDP_TEMP_SENSOR_IDX_CLUSTER1] = { + .name = "CLUS1 Temperature", + .data = &((struct mod_sensor_dev_config) { + .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_N1SDP_SENSOR, + MOD_N1SDP_TEMP_SENSOR_IDX_CLUSTER1), + }), + }, + [MOD_N1SDP_TEMP_SENSOR_IDX_SYSTEM] = { + .name = "SYS Temperature", + .data = &((struct mod_sensor_dev_config) { + .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_N1SDP_SENSOR, + MOD_N1SDP_TEMP_SENSOR_IDX_SYSTEM), + }), + }, + [MOD_N1SDP_TEMP_SENSOR_COUNT] = { 0 }, +}; + +static const struct fwk_element *get_sensor_element_table(fwk_id_t module_id) +{ + return sensor_element_table; +} + +struct fwk_module_config config_sensor = { + .get_element_table = get_sensor_element_table, + .data = NULL, +}; diff --git a/product/n1sdp/scp_ramfw/firmware.mk b/product/n1sdp/scp_ramfw/firmware.mk index 989bfba6b959d27e91a149323acfdf7fbe1a40f1..e395547e2808656a53a66c572c99aba992599f8b 100644 --- a/product/n1sdp/scp_ramfw/firmware.mk +++ b/product/n1sdp/scp_ramfw/firmware.mk @@ -35,7 +35,10 @@ BS_FIRMWARE_MODULES := \ clock \ gtimer \ timer \ + n1sdp_sensor \ + sensor \ scmi_power_domain \ + scmi_sensor \ scmi_system_power \ scmi_management \ n1sdp_flash \ @@ -66,6 +69,7 @@ BS_FIRMWARE_SOURCES := \ config_clock.c \ config_n1sdp_flash.c \ config_n1sdp_pcie.c \ + config_sensor.c \ config_apcontext.c include $(BS_DIR)/firmware.mk