1 /*
2  * Arm SCP/MCP Software
3  * Copyright (c) 2021, Arm Limited and Contributors. All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #include <morello_alarm_idx.h>
9 
10 #include <mod_morello_sensor.h>
11 #include <mod_sensor.h>
12 #include <mod_timer.h>
13 
14 #include <fwk_element.h>
15 #include <fwk_id.h>
16 #include <fwk_module.h>
17 #include <fwk_module_idx.h>
18 
19 #include <stddef.h>
20 
21 /*
22  * MORELLO sensor driver config
23  */
24 
25 static struct mod_sensor_info info_temp_sensor = {
26     .type = MOD_SENSOR_TYPE_DEGREES_C,
27     .update_interval = 0,
28     .update_interval_multiplier = 0,
29     .unit_multiplier = 0,
30 };
31 
32 static struct mod_sensor_info info_volt_sensor = {
33     .type = MOD_SENSOR_TYPE_VOLTS,
34     .update_interval = 0,
35     .update_interval_multiplier = 0,
36     .unit_multiplier = 0,
37 };
38 
39 static const struct fwk_element
40     morello_sensor_element_table[MOD_MORELLO_VOLT_SENSOR_COUNT + 1] = {
41     [MOD_MORELLO_TEMP_SENSOR_IDX_CLUSTER0] = {
42         .name = "CLUS0 Temperature",
43         .data = &((struct mod_morello_temp_sensor_config) {
44             .alarm_threshold = 70,
45             .shutdown_threshold = 80,
46             .info = &info_temp_sensor,
47         }),
48     },
49     [MOD_MORELLO_TEMP_SENSOR_IDX_CLUSTER1] = {
50         .name = "CLUS1 Temperature",
51         .data = &((struct mod_morello_temp_sensor_config) {
52             .alarm_threshold = 70,
53             .shutdown_threshold = 80,
54             .info = &info_temp_sensor,
55         }),
56     },
57     [MOD_MORELLO_TEMP_SENSOR_IDX_SYSTEM] = {
58         .name = "SYS Temperature",
59         .data = &((struct mod_morello_temp_sensor_config) {
60             .alarm_threshold = 70,
61             .shutdown_threshold = 80,
62             .info = &info_temp_sensor,
63         }),
64     },
65     [MOD_MORELLO_VOLT_SENSOR_IDX_CLUS0CORE0] = {
66         .name = "CLUS0CORE0 Voltage",
67         .data = &((struct mod_morello_volt_sensor_config) {
68             .info = &info_volt_sensor,
69         }),
70     },
71     [MOD_MORELLO_VOLT_SENSOR_IDX_CLUS0CORE1] = {
72         .name = "CLUS0CORE1 Voltage",
73         .data = &((struct mod_morello_volt_sensor_config) {
74             .info = &info_volt_sensor,
75         }),
76     },
77     [MOD_MORELLO_VOLT_SENSOR_IDX_CLUS1CORE0] = {
78         .name = "CLUS1CORE0 Voltage",
79         .data = &((struct mod_morello_volt_sensor_config) {
80             .info = &info_volt_sensor,
81         }),
82     },
83     [MOD_MORELLO_VOLT_SENSOR_IDX_CLUS1CORE1] = {
84         .name = "CLUS1CORE1 Voltage",
85         .data = &((struct mod_morello_volt_sensor_config) {
86             .info = &info_volt_sensor,
87         }),
88     },
89     [MOD_MORELLO_VOLT_SENSOR_COUNT] = { 0 },
90 };
91 
get_morello_sensor_element_table(fwk_id_t id)92 static const struct fwk_element *get_morello_sensor_element_table(fwk_id_t id)
93 {
94     return morello_sensor_element_table;
95 }
96 
97 struct fwk_module_config config_morello_sensor = {
98     .data =
99         &(struct mod_morello_sensor_config){
100             .alarm_id = FWK_ID_SUB_ELEMENT_INIT(
101                 FWK_MODULE_IDX_TIMER,
102                 0,
103                 MORELLO_SENSOR_ALARM_IDX),
104             .alarm_api =
105                 FWK_ID_API_INIT(FWK_MODULE_IDX_TIMER, MOD_TIMER_API_IDX_ALARM),
106             .t_sensor_count = 3,
107             .v_sensor_count = 4,
108         },
109 
110     .elements = FWK_MODULE_DYNAMIC_ELEMENTS(get_morello_sensor_element_table),
111 };
112 
113 /*
114  * Sensor module config
115  */
116 static const struct fwk_element
117     sensor_element_table[MOD_MORELLO_VOLT_SENSOR_COUNT + 1] = {
118     [MOD_MORELLO_TEMP_SENSOR_IDX_CLUSTER0] = {
119         .name = "CLUS0 Temperature",
120         .data = &((struct mod_sensor_dev_config) {
121             .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_MORELLO_SENSOR,
122                              MOD_MORELLO_TEMP_SENSOR_IDX_CLUSTER0),
123             .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_MORELLO_SENSOR, 0),
124         }),
125     },
126     [MOD_MORELLO_TEMP_SENSOR_IDX_CLUSTER1] = {
127         .name = "CLUS1 Temperature",
128         .data = &((struct mod_sensor_dev_config) {
129             .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_MORELLO_SENSOR,
130                              MOD_MORELLO_TEMP_SENSOR_IDX_CLUSTER1),
131             .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_MORELLO_SENSOR, 0),
132         }),
133     },
134     [MOD_MORELLO_TEMP_SENSOR_IDX_SYSTEM] = {
135         .name = "SYS Temperature",
136         .data = &((struct mod_sensor_dev_config) {
137             .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_MORELLO_SENSOR,
138                              MOD_MORELLO_TEMP_SENSOR_IDX_SYSTEM),
139             .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_MORELLO_SENSOR, 0),
140         }),
141     },
142     [MOD_MORELLO_VOLT_SENSOR_IDX_CLUS0CORE0] = {
143         .name = "CLUS0CORE0 Voltage",
144         .data = &((struct mod_sensor_dev_config) {
145             .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_MORELLO_SENSOR,
146                              MOD_MORELLO_VOLT_SENSOR_IDX_CLUS0CORE0),
147             .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_MORELLO_SENSOR, 0),
148         }),
149     },
150     [MOD_MORELLO_VOLT_SENSOR_IDX_CLUS0CORE1] = {
151         .name = "CLUS0CORE1 Voltage",
152         .data = &((struct mod_sensor_dev_config) {
153             .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_MORELLO_SENSOR,
154                              MOD_MORELLO_VOLT_SENSOR_IDX_CLUS0CORE1),
155             .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_MORELLO_SENSOR, 0),
156         }),
157     },
158     [MOD_MORELLO_VOLT_SENSOR_IDX_CLUS1CORE0] = {
159         .name = "CLUS1CORE0 Voltage",
160         .data = &((struct mod_sensor_dev_config) {
161             .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_MORELLO_SENSOR,
162                              MOD_MORELLO_VOLT_SENSOR_IDX_CLUS1CORE0),
163             .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_MORELLO_SENSOR, 0),
164         }),
165     },
166     [MOD_MORELLO_VOLT_SENSOR_IDX_CLUS1CORE1] = {
167         .name = "CLUS1CORE1 Voltage",
168         .data = &((struct mod_sensor_dev_config) {
169             .driver_id = FWK_ID_ELEMENT_INIT(FWK_MODULE_IDX_MORELLO_SENSOR,
170                              MOD_MORELLO_VOLT_SENSOR_IDX_CLUS1CORE1),
171             .driver_api_id = FWK_ID_API_INIT(FWK_MODULE_IDX_MORELLO_SENSOR, 0),
172         }),
173     },
174     [MOD_MORELLO_VOLT_SENSOR_COUNT] = { 0 },
175 };
176 
get_sensor_element_table(fwk_id_t module_id)177 static const struct fwk_element *get_sensor_element_table(fwk_id_t module_id)
178 {
179     return sensor_element_table;
180 }
181 
182 struct fwk_module_config config_sensor = {
183     .elements = FWK_MODULE_DYNAMIC_ELEMENTS(get_sensor_element_table),
184 };
185