Software APIs
dif_sensor_ctrl.c
1 // Copyright lowRISC contributors (OpenTitan project).
2 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
3 // SPDX-License-Identifier: Apache-2.0
4 
6 
7 #include <assert.h>
8 
11 #include "sw/device/lib/base/multibits.h"
13 
14 #include "sensor_ctrl_regs.h" // Generated
15 
16 /**
17  * Helper function to determine if a higher than supported event was supplied
18  * as an argument. This check is used in multiple places so use a helper
19  * function.
20  */
21 static inline bool is_ast_event_invalid(dif_sensor_ctrl_event_idx_t event_idx) {
22  return event_idx > SENSOR_CTRL_PARAM_NUM_ALERT_EVENTS;
23 }
24 
25 /**
26  * Helper function to get CFG_REGWEN
27  */
28 static bool is_locked(const dif_sensor_ctrl_t *sensor_ctrl) {
29  return (mmio_region_read32(sensor_ctrl->base_addr,
30  SENSOR_CTRL_CFG_REGWEN_REG_OFFSET) == 0);
31 }
32 
35  if (sensor_ctrl == NULL) {
36  return kDifBadArg;
37  }
38 
39  mmio_region_write32(sensor_ctrl->base_addr, SENSOR_CTRL_CFG_REGWEN_REG_OFFSET,
40  0);
41 
42  return kDifOk;
43 }
44 
47  const dif_sensor_ctrl_t *sensor_ctrl, dif_sensor_ctrl_event_idx_t event_idx,
48  dif_toggle_t *enable) {
49  if (sensor_ctrl == NULL || is_ast_event_invalid(event_idx) ||
50  enable == NULL) {
51  return kDifBadArg;
52  };
53 
54  uint32_t reg = mmio_region_read32(sensor_ctrl->base_addr,
55  SENSOR_CTRL_ALERT_TRIG_REG_OFFSET);
56  *enable = dif_bool_to_toggle(bitfield_bit32_read(reg, event_idx));
57 
58  return kDifOk;
59 }
60 
63  const dif_sensor_ctrl_t *sensor_ctrl, dif_sensor_ctrl_event_idx_t event_idx,
64  dif_toggle_t enable) {
65  if (sensor_ctrl == NULL || is_ast_event_invalid(event_idx)) {
66  return kDifBadArg;
67  };
68 
69  uint32_t reg = mmio_region_read32(sensor_ctrl->base_addr,
70  SENSOR_CTRL_ALERT_TRIG_REG_OFFSET);
71  reg = bitfield_bit32_write(reg, event_idx, dif_toggle_to_bool(enable));
72  mmio_region_write32(sensor_ctrl->base_addr, SENSOR_CTRL_ALERT_TRIG_REG_OFFSET,
73  reg);
74 
75  return kDifOk;
76 }
77 
81  dif_toggle_t en) {
82  if (sensor_ctrl == NULL || is_ast_event_invalid(event_idx)) {
83  return kDifBadArg;
84  };
85 
86  if (is_locked(sensor_ctrl)) {
87  return kDifLocked;
88  }
89 
90  mmio_region_write32(
91  sensor_ctrl->base_addr,
92  SENSOR_CTRL_ALERT_EN_0_REG_OFFSET + ((ptrdiff_t)event_idx << 2),
94 
95  return kDifOk;
96 }
97 
100  const dif_sensor_ctrl_t *sensor_ctrl, dif_sensor_ctrl_event_idx_t event_idx,
101  dif_toggle_t en_fatal) {
102  if (sensor_ctrl == NULL || is_ast_event_invalid(event_idx)) {
103  return kDifBadArg;
104  };
105 
106  if (is_locked(sensor_ctrl)) {
107  return kDifLocked;
108  }
109 
110  uint32_t reg = mmio_region_read32(sensor_ctrl->base_addr,
111  SENSOR_CTRL_FATAL_ALERT_EN_REG_OFFSET);
112  reg = bitfield_bit32_write(reg, event_idx, dif_toggle_to_bool(en_fatal));
113  mmio_region_write32(sensor_ctrl->base_addr,
114  SENSOR_CTRL_FATAL_ALERT_EN_REG_OFFSET, reg);
115 
116  return kDifOk;
117 }
118 
121  const dif_sensor_ctrl_t *sensor_ctrl, dif_sensor_ctrl_events_t *events) {
122  if (sensor_ctrl == NULL || events == NULL) {
123  return kDifBadArg;
124  };
125 
126  *events = mmio_region_read32(sensor_ctrl->base_addr,
127  SENSOR_CTRL_RECOV_ALERT_REG_OFFSET);
128 
129  return kDifOk;
130 };
131 
134  const dif_sensor_ctrl_t *sensor_ctrl,
135  dif_sensor_ctrl_event_idx_t event_idx) {
136  if (sensor_ctrl == NULL || is_ast_event_invalid(event_idx)) {
137  return kDifBadArg;
138  };
139 
140  uint32_t reg = bitfield_bit32_write(0, event_idx, 1);
141  mmio_region_write32(sensor_ctrl->base_addr,
142  SENSOR_CTRL_RECOV_ALERT_REG_OFFSET, reg);
143 
144  return kDifOk;
145 }
146 
149  const dif_sensor_ctrl_t *sensor_ctrl, dif_sensor_ctrl_events_t *events) {
150  if (sensor_ctrl == NULL || events == NULL) {
151  return kDifBadArg;
152  };
153 
154  *events = mmio_region_read32(sensor_ctrl->base_addr,
155  SENSOR_CTRL_FATAL_ALERT_REG_OFFSET);
156 
157  return kDifOk;
158 };
159 
162  const dif_sensor_ctrl_t *sensor_ctrl, dif_toggle_t *done) {
163  if (sensor_ctrl == NULL || done == NULL) {
164  return kDifBadArg;
165  };
166 
167  uint32_t reg =
168  mmio_region_read32(sensor_ctrl->base_addr, SENSOR_CTRL_STATUS_REG_OFFSET);
169  *done = dif_bool_to_toggle(
170  bitfield_bit32_read(reg, SENSOR_CTRL_STATUS_AST_INIT_DONE_BIT));
171 
172  return kDifOk;
173 }
174 
177  const dif_sensor_ctrl_t *sensor_ctrl,
178  dif_sensor_ctrl_io_power_status_t *io_power_status) {
179  if (sensor_ctrl == NULL || io_power_status == NULL) {
180  return kDifBadArg;
181  };
182 
183  uint32_t reg =
184  mmio_region_read32(sensor_ctrl->base_addr, SENSOR_CTRL_STATUS_REG_OFFSET);
185  *io_power_status =
186  bitfield_field32_read(reg, SENSOR_CTRL_STATUS_IO_POK_FIELD);
187 
188  return kDifOk;
189 }