Skip to content

Commit 411c32d

Browse files
committed
drivers: sensor: tenstorrent: pvt: refactor driver
* Basic refactoring * Remove streaming implementation * Use q31_t instead of the deprecated sensor_value * Remove sensor_value conversion functions Signed-off-by: Alex Apostolu <aapostolu@tenstorrent.com>
1 parent 5a7e016 commit 411c32d

File tree

8 files changed

+175
-476
lines changed

8 files changed

+175
-476
lines changed

drivers/sensor/tenstorrent/pvt/pvt_tt_bh.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -428,8 +428,7 @@ static int pvt_tt_bh_init(const struct device *dev)
428428

429429
/* Initialize the single thermal calibration fuse value from TS0's 25 degree data */
430430

431-
const struct sensor_value celcius25 = {.val1 = 25, .val2 = 0};
432-
uint16_t celcius25_raw = pvt_tt_bh_temp_to_raw(&celcius25);
431+
uint16_t celcius25_raw = 1142;
433432

434433
for (uint8_t id = 0; id < pvt_cfg->num_ts; ++id) {
435434
uint32_t deg25_start = 2240 + (id * 64);

drivers/sensor/tenstorrent/pvt/pvt_tt_bh_decoder.c

Lines changed: 3 additions & 103 deletions
Original file line numberDiff line numberDiff line change
@@ -20,25 +20,6 @@ float pvt_tt_bh_raw_to_temp(uint16_t raw)
2020
return 83.09f + 262.5f * eqbs;
2121
}
2222

23-
uint16_t pvt_tt_bh_temp_to_raw(const struct sensor_value *value)
24-
{
25-
float temp = sensor_value_to_float(value);
26-
27-
/* Reverse equation: temp = 83.09 + 262.5 * (raw / 4096 - 0.5) */
28-
float eqbs = (temp - 83.09f) / 262.5f;
29-
float raw_f = (eqbs + 0.5f) * 4096.0f;
30-
31-
/* Clamp to valid 16-bit range */
32-
if (raw_f < 0.0f) {
33-
raw_f = 0.0f;
34-
}
35-
if (raw_f > 65535.0f) {
36-
raw_f = 65535.0f;
37-
}
38-
39-
return (uint16_t)(raw_f + 0.5f);
40-
}
41-
4223
float pvt_tt_bh_raw_to_volt(uint16_t raw)
4324
{
4425
float k1 = VM_VREF * 6 / (5 * 16384);
@@ -47,25 +28,6 @@ float pvt_tt_bh_raw_to_volt(uint16_t raw)
4728
return k1 * raw - offset;
4829
}
4930

50-
uint16_t pvt_tt_bh_volt_to_raw(const struct sensor_value *value)
51-
{
52-
float volt = sensor_value_to_float(value);
53-
54-
float k1 = VM_VREF * 6 / (5 * 16384);
55-
float offset = VM_VREF / 5 * (3.0f / 256.0f + 1.0f);
56-
57-
float raw_f = (volt + offset) / k1;
58-
59-
if (raw_f < 0.0f) {
60-
raw_f = 0.0f;
61-
}
62-
if (raw_f > 65535.0f) {
63-
raw_f = 65535.0f;
64-
}
65-
66-
return (uint16_t)(raw_f + 0.5f);
67-
}
68-
6931
float pvt_tt_bh_raw_to_freq(uint16_t raw)
7032
{
7133
float a = 4.0;
@@ -76,78 +38,16 @@ float pvt_tt_bh_raw_to_freq(uint16_t raw)
7638
return raw * a * b * fclk / w;
7739
}
7840

79-
uint16_t pvt_tt_bh_freq_to_raw(const struct sensor_value *value)
80-
{
81-
float freq = sensor_value_to_float(value);
82-
83-
float a = 4.0f;
84-
float b = 1.0f;
85-
float w = 255.0f;
86-
float fclk = 5.0f;
87-
88-
float raw_f = freq * w / (a * b * fclk);
89-
90-
if (raw_f < 0.0f) {
91-
raw_f = 0.0f;
92-
}
93-
if (raw_f > 65535.0f) {
94-
raw_f = 65535.0f;
95-
}
96-
97-
return (uint16_t)(raw_f + 0.5f);
98-
}
99-
100-
void pvt_tt_bh_float_to_sensor_value(float data, struct sensor_value *val)
101-
{
102-
val->val1 = (int32_t)data;
103-
val->val2 = (int32_t)roundf((data - (float)val->val1) * 1000000.0f);
104-
105-
/* Handle carry/borrow if val2 rounded to 1e6 or -1e6 */
106-
if (val->val2 >= 1000000) {
107-
val->val1 += 1;
108-
val->val2 -= 1000000;
109-
} else if (val->val2 <= -1000000) {
110-
val->val1 -= 1;
111-
val->val2 += 1000000;
112-
}
113-
}
114-
11541
static int pvt_tt_bh_decode_sample(const uint8_t *buf, struct sensor_chan_spec chan_spec,
11642
uint32_t *fit, uint16_t max_count, void *data_out)
11743
{
118-
struct sensor_value *out = data_out;
119-
const struct pvt_tt_bh_rtio_data *data;
120-
float data_converted = 0;
44+
uint16_t *out = data_out;
45+
const struct pvt_tt_bh_rtio_data *data = (const struct pvt_tt_bh_rtio_data *)buf;
12146

12247
for (int i = 0; i < max_count; ++i) {
123-
data = &(((const struct pvt_tt_bh_rtio_data *)buf)[i]);
124-
if (data->spec.chan_type != chan_spec.chan_type ||
125-
data->spec.chan_idx != chan_spec.chan_idx) {
126-
continue;
127-
}
128-
129-
switch (chan_spec.chan_type) {
130-
case SENSOR_CHAN_PVT_TT_BH_PD: {
131-
data_converted = pvt_tt_bh_raw_to_freq(data->raw);
132-
break;
133-
}
134-
case SENSOR_CHAN_PVT_TT_BH_VM: {
135-
data_converted = pvt_tt_bh_raw_to_volt(data->raw);
136-
break;
137-
}
138-
case SENSOR_CHAN_PVT_TT_BH_TS:
139-
case SENSOR_CHAN_PVT_TT_BH_TS_AVG: {
140-
data_converted = pvt_tt_bh_raw_to_temp(data->raw);
141-
break;
142-
}
143-
default:
144-
return -ENOTSUP;
145-
}
146-
147-
break;
48+
out[i] = data[i].raw;
14849
}
14950

150-
pvt_tt_bh_float_to_sensor_value(data_converted, out);
15151
return 0;
15252
}
15353

drivers/sensor/tenstorrent/pvt/pvt_tt_bh_rtio.c

Lines changed: 19 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -229,23 +229,6 @@ static ReadStatus read_ts(const struct device *dev, uint8_t chan, uint16_t *data
229229
return status;
230230
}
231231

232-
static ReadStatus read_ts_avg(const struct device *dev, uint16_t *sum)
233-
{
234-
struct pvt_tt_bh_config *pvt_cfg = (struct pvt_tt_bh_config *)dev->config;
235-
236-
*sum = 0;
237-
for (int i = 0; i < 8; i++) {
238-
uint16_t data;
239-
240-
read_pvt_auto_mode(TS, i, &data, PVT_CNTL_TS_00_SDIF_DONE_REG_ADDR,
241-
PVT_CNTL_TS_00_SDIF_DATA_REG_ADDR);
242-
243-
*sum += data - pvt_cfg->therm_cali_delta[i];
244-
}
245-
*sum /= 8;
246-
return ReadOk;
247-
}
248-
249232
/* can not readback supply check in auto mode, use manual read instead */
250233
static ReadStatus read_vm(uint32_t id, uint16_t *data)
251234
{
@@ -276,7 +259,7 @@ static ReadStatus read_pd(uint32_t id, uint32_t delay_chain, uint16_t *data)
276259
PVT_CNTL_PD_00_SDIF_DATA_REG_ADDR);
277260
}
278261

279-
static void pvt_tt_bh_submit_sample(struct rtio_iodev_sqe *iodev_sqe)
262+
static void pvt_tt_bh_submit_sample(const struct device *dev, struct rtio_iodev_sqe *iodev_sqe)
280263
{
281264
const struct sensor_read_config *sensor_cfg =
282265
(const struct sensor_read_config *)iodev_sqe->sqe.iodev->data;
@@ -285,76 +268,46 @@ static void pvt_tt_bh_submit_sample(struct rtio_iodev_sqe *iodev_sqe)
285268
uint32_t buf_len;
286269
int ret;
287270

288-
/* Get RTIO output buffer. */
289271
ret = rtio_sqe_rx_buf(iodev_sqe, min_buffer_len, min_buffer_len, &buf, &buf_len);
290272
if (ret != 0) {
291273
LOG_ERR("Failed to get a read buffer of size %u bytes", min_buffer_len);
292274
rtio_iodev_sqe_err(iodev_sqe, ret);
293275
return;
294276
}
295277

296-
/* struct pvt_tt_bh_rtio_data *data = (struct pvt_tt_bh_rtio_data *)buf; */
297278
struct pvt_tt_bh_rtio_data *data = (struct pvt_tt_bh_rtio_data *)buf;
298279
ReadStatus status;
299280

300281
const struct pvt_tt_bh_config *pvt_cfg =
301282
(const struct pvt_tt_bh_config *)sensor_cfg->sensor->config;
302283

303-
for (size_t i = 0; i < sensor_cfg->count; i++) {
304-
const struct sensor_chan_spec *chan = &sensor_cfg->channels[i];
284+
const struct sensor_chan_spec *chan = &sensor_cfg->channels[0];
305285

306-
data[i].spec = *chan;
307-
308-
/* Validate channel index bounds and read data */
309-
switch (chan->chan_type) {
310-
case SENSOR_CHAN_PVT_TT_BH_PD:
311-
if (chan->chan_idx >= pvt_cfg->num_pd) {
312-
LOG_ERR("Invalid channel index %d out of %d sensors",
313-
chan->chan_idx, pvt_cfg->num_pd);
314-
rtio_iodev_sqe_err(iodev_sqe, -EINVAL);
315-
return;
316-
}
286+
switch (chan->chan_type) {
287+
case SENSOR_CHAN_PVT_TT_BH_PD: {
288+
for (int i = 0; i < pvt_cfg->num_pd; ++i) {
317289
status = read_pd(chan->chan_idx, new_delay_chain, &data[i].raw);
318-
break;
319-
case SENSOR_CHAN_PVT_TT_BH_VM:
320-
if (chan->chan_idx >= pvt_cfg->num_vm) {
321-
LOG_ERR("Invalid channel index %d out of %d sensors",
322-
chan->chan_idx, pvt_cfg->num_vm);
323-
rtio_iodev_sqe_err(iodev_sqe, -EINVAL);
324-
return;
325-
}
290+
}
291+
break;
292+
}
293+
case SENSOR_CHAN_PVT_TT_BH_VM: {
294+
for (int i = 0; i < pvt_cfg->num_vm; ++i) {
326295
status = read_vm(chan->chan_idx, &data[i].raw);
327-
break;
328-
case SENSOR_CHAN_PVT_TT_BH_TS:
329-
if (chan->chan_idx >= pvt_cfg->num_ts) {
330-
LOG_ERR("Invalid channel index %d out of %d sensors",
331-
chan->chan_idx, pvt_cfg->num_ts);
332-
rtio_iodev_sqe_err(iodev_sqe, -EINVAL);
333-
return;
334-
}
335-
status = read_ts(sensor_cfg->sensor, chan->chan_idx, &data[i].raw);
336-
break;
337-
case SENSOR_CHAN_PVT_TT_BH_TS_AVG:
338-
/* Channel index is ignored as this is the average for all TS channels. */
339-
status = read_ts_avg(sensor_cfg->sensor, &data[i].raw);
340-
break;
341-
default:
342-
LOG_ERR("Unsupported channel type: %d", chan->chan_type);
343-
rtio_iodev_sqe_err(iodev_sqe, -ENOTSUP);
344-
return;
345296
}
346-
347-
if (status != ReadOk) {
348-
LOG_ERR("Failed to read data %d", status);
349-
rtio_iodev_sqe_err(iodev_sqe, status);
350-
return;
297+
break;
298+
}
299+
case SENSOR_CHAN_PVT_TT_BH_TS: {
300+
for (int i = 0; i < pvt_cfg->num_vm; ++i) {
301+
status = read_ts(sensor_cfg->sensor, chan->chan_idx, &data[i].raw);
351302
}
303+
break;
304+
}
352305
}
353306

354307
rtio_iodev_sqe_ok(iodev_sqe, 0);
355308
}
356309

357-
void pvt_tt_bh_submit(const struct device *sensor, struct rtio_iodev_sqe *sqe)
310+
void pvt_tt_bh_submit(const struct device *dev, struct rtio_iodev_sqe *sqe)
358311
{
359312
const struct rtio_sqe *event = &sqe->sqe;
360313

@@ -370,9 +323,7 @@ void pvt_tt_bh_submit(const struct device *sensor, struct rtio_iodev_sqe *sqe)
370323
return;
371324
}
372325

373-
struct rtio_work_req *req = rtio_work_req_alloc();
374-
375-
rtio_work_req_submit(req, sqe, pvt_tt_bh_submit_sample);
326+
pvt_tt_bh_submit_sample(dev, sqe);
376327
}
377328

378329
void pvt_tt_bh_delay_chain_set(uint32_t new_delay_chain_)

include/zephyr/drivers/sensor/tenstorrent/pvt_tt_bh.h

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,19 @@
99

1010
#include <zephyr/drivers/sensor.h>
1111

12+
#define FLOAT_TO_Q31(value, min_val, range) \
13+
((q31_t)(((value) - (min_val)) * (2147483647.0f / (range))))
14+
15+
#define Q31_TO_FLOAT(q31, min_val, range) ((min_val) + (q31) * ((range) / 2147483647.0f))
16+
17+
#define TEMP_TO_Q31(t) FLOAT_TO_Q31(t, 40.0f, 40.0f)
18+
#define FREQ_TO_Q31(f) FLOAT_TO_Q31(f, 100.0f, 140.0f)
19+
#define VOLT_TO_Q31(v) FLOAT_TO_Q31(v, 0.0f, 1.0f)
20+
21+
#define Q31_TO_TEMP(q) Q31_TO_FLOAT(q, 40.0f, 40.0f)
22+
#define Q31_TO_FREQ(q) Q31_TO_FLOAT(q, 100.0f, 140.0f)
23+
#define Q31_TO_VOLT(q) Q31_TO_FLOAT(q, 0.0f, 1.0f)
24+
1225
enum pvt_tt_bh_attribute {
1326
SENSOR_ATTR_PVT_TT_BH_NUM_PD = SENSOR_ATTR_PRIV_START,
1427
SENSOR_ATTR_PVT_TT_BH_NUM_VM,
@@ -22,8 +35,7 @@ enum pvt_tt_bh_attribute {
2235
enum pvt_tt_bh_channel {
2336
SENSOR_CHAN_PVT_TT_BH_PD = SENSOR_CHAN_PRIV_START,
2437
SENSOR_CHAN_PVT_TT_BH_VM,
25-
SENSOR_CHAN_PVT_TT_BH_TS,
26-
SENSOR_CHAN_PVT_TT_BH_TS_AVG,
38+
SENSOR_CHAN_PVT_TT_BH_TS
2739
};
2840

2941
typedef enum {
@@ -82,36 +94,16 @@ struct pvt_tt_bh_rtio_data {
8294
*/
8395
float pvt_tt_bh_raw_to_temp(uint16_t raw);
8496

85-
/*
86-
* Convert celcius into raw temperature sensor data.
87-
*/
88-
uint16_t pvt_tt_bh_temp_to_raw(const struct sensor_value *value);
89-
9097
/*
9198
* Convert raw voltage monitor data to volts.
9299
*/
93100
float pvt_tt_bh_raw_to_volt(uint16_t raw);
94101

95-
/*
96-
* Convert voltage insto raw voltage monitor data;
97-
*/
98-
uint16_t pvt_tt_bh_volt_to_raw(const struct sensor_value *value);
99-
100102
/*
101103
* Convert raw process detector data to MHz.
102104
*/
103105
float pvt_tt_bh_raw_to_freq(uint16_t raw);
104106

105-
/*
106-
* Convert frequency into raw process detector data.
107-
*/
108-
uint16_t pvt_tt_bh_freq_to_raw(const struct sensor_value *value);
109-
110-
/*
111-
* Represent float data as two integers in struct sensor_value.
112-
*/
113-
void pvt_tt_bh_float_to_sensor_value(float data, struct sensor_value *val);
114-
115107
int pvt_tt_bh_get_decoder(const struct device *dev, const struct sensor_decoder_api **api);
116108

117109
void pvt_tt_bh_submit(const struct device *sensor, struct rtio_iodev_sqe *sqe);

lib/tenstorrent/bh_arc/cat.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ typedef union {
5050

5151
static const struct device *const pvt = DEVICE_DT_GET_OR_NULL(DT_NODELABEL(pvt));
5252

53-
SENSOR_DT_READ_IODEV(cat_ts_avg_iodev, DT_NODELABEL(pvt), {SENSOR_CHAN_PVT_TT_BH_TS_AVG, 0});
53+
SENSOR_DT_READ_IODEV(cat_ts_avg_iodev, DT_NODELABEL(pvt), {SENSOR_CHAN_PVT_TT_BH_TS, 0});
5454

5555
RTIO_DEFINE(cat_ts_avg_ctx, 1, 1);
5656

@@ -169,16 +169,18 @@ static float CalibrateCAT(void)
169169
float ts_temp = 0;
170170

171171
#ifdef CONFIG_DT_HAS_TENSTORRENT_BH_PVT_ENABLED
172-
struct sensor_value avg_tmp;
172+
uint16_t avg_tmp[8];
173173
const struct sensor_decoder_api *decoder;
174174

175175
sensor_get_decoder(pvt, &decoder);
176176
sensor_read(&cat_ts_avg_iodev, &cat_ts_avg_ctx, cat_ts_avg_buf, sizeof(cat_ts_avg_buf));
177177

178-
decoder->decode(cat_ts_avg_buf, (struct sensor_chan_spec){SENSOR_CHAN_PVT_TT_BH_TS_AVG, 0},
179-
NULL, 1, &avg_tmp);
178+
decoder->decode(cat_ts_avg_buf, (struct sensor_chan_spec){SENSOR_CHAN_PVT_TT_BH_TS, 0},
179+
NULL, 1, avg_tmp);
180180

181-
ts_temp = sensor_value_to_float(&avg_tmp);
181+
ts_temp = pvt_tt_bh_raw_to_temp(avg_tmp[0]);
182+
if (ts_temp < 25 || ts_temp > 70)
183+
ts_temp = 50;
182184
#endif
183185

184186
float catmon_error = catmon_temp - ts_temp;

0 commit comments

Comments
 (0)