Lines Matching +full:timestamp +full:- +full:names

1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2018-2022 ARM Ltd.
8 #define pr_fmt(fmt) "SCMI Notifications SENSOR - " fmt
232 ret = ph->xops->xfer_get_init(ph, PROTOCOL_ATTRIBUTES, in scmi_sensor_attributes_get()
237 attr = t->rx.buf; in scmi_sensor_attributes_get()
239 ret = ph->xops->do_xfer(ph, t); in scmi_sensor_attributes_get()
241 si->num_sensors = le16_to_cpu(attr->num_sensors); in scmi_sensor_attributes_get()
242 si->max_requests = attr->max_requests; in scmi_sensor_attributes_get()
243 si->reg_addr = le32_to_cpu(attr->reg_addr_low) | in scmi_sensor_attributes_get()
244 (u64)le32_to_cpu(attr->reg_addr_high) << 32; in scmi_sensor_attributes_get()
245 si->reg_size = le32_to_cpu(attr->reg_size); in scmi_sensor_attributes_get()
248 ph->xops->xfer_put(ph, t); in scmi_sensor_attributes_get()
255 out->min_range = get_unaligned_le64((void *)&in->min_range_low); in scmi_parse_range_attrs()
256 out->max_range = get_unaligned_le64((void *)&in->max_range_low); in scmi_parse_range_attrs()
271 s = ((const struct scmi_sens_ipriv *)p)->priv; in iter_intervals_prepare_message()
273 msg->id = cpu_to_le32(s->id); in iter_intervals_prepare_message()
274 msg->index = cpu_to_le32(desc_index); in iter_intervals_prepare_message()
281 struct scmi_sensor_info *s = ((struct scmi_sens_ipriv *)p)->priv; in iter_intervals_update_state()
282 struct device *dev = ((struct scmi_sens_ipriv *)p)->dev; in iter_intervals_update_state()
285 flags = le32_to_cpu(r->num_intervals_flags); in iter_intervals_update_state()
286 st->num_returned = NUM_INTERVALS_RETURNED(flags); in iter_intervals_update_state()
287 st->num_remaining = NUM_INTERVALS_REMAINING(flags); in iter_intervals_update_state()
293 if (!st->max_resources) { in iter_intervals_update_state()
294 s->intervals.segmented = SEGMENTED_INTVL_FORMAT(flags); in iter_intervals_update_state()
295 s->intervals.count = st->num_returned + st->num_remaining; in iter_intervals_update_state()
297 if (s->intervals.segmented && in iter_intervals_update_state()
298 (st->num_remaining || st->num_returned != 3)) { in iter_intervals_update_state()
301 s->id, s->intervals.count); in iter_intervals_update_state()
302 s->intervals.segmented = false; in iter_intervals_update_state()
303 s->intervals.count = 0; in iter_intervals_update_state()
304 return -EINVAL; in iter_intervals_update_state()
306 /* Direct allocation when exceeding pre-allocated */ in iter_intervals_update_state()
307 if (s->intervals.count >= SCMI_MAX_PREALLOC_POOL) { in iter_intervals_update_state()
308 s->intervals.desc = in iter_intervals_update_state()
310 s->intervals.count, in iter_intervals_update_state()
311 sizeof(*s->intervals.desc), in iter_intervals_update_state()
313 if (!s->intervals.desc) { in iter_intervals_update_state()
314 s->intervals.segmented = false; in iter_intervals_update_state()
315 s->intervals.count = 0; in iter_intervals_update_state()
316 return -ENOMEM; in iter_intervals_update_state()
320 st->max_resources = s->intervals.count; in iter_intervals_update_state()
332 struct scmi_sensor_info *s = ((struct scmi_sens_ipriv *)p)->priv; in iter_intervals_process_response()
334 s->intervals.desc[st->desc_index + st->loop_idx] = in iter_intervals_process_response()
335 le32_to_cpu(r->intervals[st->loop_idx]); in iter_intervals_process_response()
351 .dev = ph->dev, in scmi_sensor_update_intervals()
354 iter = ph->hops->iter_response_init(ph, &ops, s->intervals.count, in scmi_sensor_update_intervals()
361 return ph->hops->iter_response_run(iter); in scmi_sensor_update_intervals()
377 msg->id = cpu_to_le32(apriv->s->id); in iter_axes_desc_prepare_message()
378 msg->axis_desc_index = cpu_to_le32(desc_index); in iter_axes_desc_prepare_message()
388 flags = le32_to_cpu(r->num_axis_flags); in iter_axes_desc_update_state()
389 st->num_returned = NUM_AXIS_RETURNED(flags); in iter_axes_desc_update_state()
390 st->num_remaining = NUM_AXIS_REMAINING(flags); in iter_axes_desc_update_state()
391 st->priv = (void *)&r->desc[0]; in iter_axes_desc_update_state()
405 const struct scmi_axis_descriptor *adesc = st->priv; in iter_axes_desc_process_response()
407 attrl = le32_to_cpu(adesc->attributes_low); in iter_axes_desc_process_response()
409 apriv->any_axes_support_extended_names = true; in iter_axes_desc_process_response()
411 a = &apriv->s->axis[st->desc_index + st->loop_idx]; in iter_axes_desc_process_response()
412 a->id = le32_to_cpu(adesc->id); in iter_axes_desc_process_response()
413 a->extended_attrs = SUPPORTS_EXTEND_ATTRS(attrl); in iter_axes_desc_process_response()
415 attrh = le32_to_cpu(adesc->attributes_high); in iter_axes_desc_process_response()
416 a->scale = S32_EXT(SENSOR_SCALE(attrh)); in iter_axes_desc_process_response()
417 a->type = SENSOR_TYPE(attrh); in iter_axes_desc_process_response()
418 strscpy(a->name, adesc->name, SCMI_SHORT_NAME_MAX_SIZE); in iter_axes_desc_process_response()
420 if (a->extended_attrs) { in iter_axes_desc_process_response()
421 unsigned int ares = le32_to_cpu(adesc->resolution); in iter_axes_desc_process_response()
423 a->resolution = SENSOR_RES(ares); in iter_axes_desc_process_response()
424 a->exponent = S32_EXT(SENSOR_RES_EXP(ares)); in iter_axes_desc_process_response()
425 dsize += sizeof(adesc->resolution); in iter_axes_desc_process_response()
427 scmi_parse_range_attrs(&a->attrs, &adesc->attrs); in iter_axes_desc_process_response()
428 dsize += sizeof(adesc->attrs); in iter_axes_desc_process_response()
430 st->priv = ((u8 *)adesc + dsize); in iter_axes_desc_process_response()
442 flags = le32_to_cpu(r->num_axis_flags); in iter_axes_extended_name_update_state()
443 st->num_returned = NUM_AXIS_RETURNED(flags); in iter_axes_extended_name_update_state()
444 st->num_remaining = NUM_AXIS_REMAINING(flags); in iter_axes_extended_name_update_state()
445 st->priv = (void *)&r->desc[0]; in iter_axes_extended_name_update_state()
458 struct scmi_sensor_axis_name_descriptor *adesc = st->priv; in iter_axes_extended_name_process_response()
459 u32 axis_id = le32_to_cpu(adesc->axis_id); in iter_axes_extended_name_process_response()
461 if (axis_id >= st->max_resources) in iter_axes_extended_name_process_response()
462 return -EPROTO; in iter_axes_extended_name_process_response()
466 * in the reply since the list of axes supporting extended names in iter_axes_extended_name_process_response()
469 a = &apriv->s->axis[axis_id]; in iter_axes_extended_name_process_response()
470 strscpy(a->name, adesc->name, SCMI_MAX_STR_SIZE); in iter_axes_extended_name_process_response()
471 st->priv = ++adesc; in iter_axes_extended_name_process_response()
492 iter = ph->hops->iter_response_init(ph, &ops, s->num_axis, in scmi_sensor_axis_extended_names_get()
501 * get extended names for axes. in scmi_sensor_axis_extended_names_get()
503 ret = ph->hops->iter_response_run(iter); in scmi_sensor_axis_extended_names_get()
505 dev_warn(ph->dev, in scmi_sensor_axis_extended_names_get()
506 "Failed to get axes extended names for %s (ret:%d).\n", in scmi_sensor_axis_extended_names_get()
507 s->name, ret); in scmi_sensor_axis_extended_names_get()
528 s->axis = devm_kcalloc(ph->dev, s->num_axis, in scmi_sensor_axis_description()
529 sizeof(*s->axis), GFP_KERNEL); in scmi_sensor_axis_description()
530 if (!s->axis) in scmi_sensor_axis_description()
531 return -ENOMEM; in scmi_sensor_axis_description()
533 iter = ph->hops->iter_response_init(ph, &ops, s->num_axis, in scmi_sensor_axis_description()
540 ret = ph->hops->iter_response_run(iter); in scmi_sensor_axis_description()
557 msg->desc_index = cpu_to_le32(desc_index); in iter_sens_descr_prepare_message()
565 st->num_returned = le16_to_cpu(r->num_returned); in iter_sens_descr_update_state()
566 st->num_remaining = le16_to_cpu(r->num_remaining); in iter_sens_descr_update_state()
567 st->priv = (void *)&r->desc[0]; in iter_sens_descr_update_state()
583 const struct scmi_sensor_descriptor *sdesc = st->priv; in iter_sens_descr_process_response()
585 s = &si->sensors[st->desc_index + st->loop_idx]; in iter_sens_descr_process_response()
586 s->id = le32_to_cpu(sdesc->id); in iter_sens_descr_process_response()
588 attrl = le32_to_cpu(sdesc->attributes_low); in iter_sens_descr_process_response()
590 s->async = SUPPORTS_ASYNC_READ(attrl); in iter_sens_descr_process_response()
591 s->num_trip_points = NUM_TRIP_POINTS(attrl); in iter_sens_descr_process_response()
597 s->update = SUPPORTS_UPDATE_NOTIFY(attrl); in iter_sens_descr_process_response()
598 s->timestamped = SUPPORTS_TIMESTAMP(attrl); in iter_sens_descr_process_response()
599 if (s->timestamped) in iter_sens_descr_process_response()
600 s->tstamp_scale = S32_EXT(SENSOR_TSTAMP_EXP(attrl)); in iter_sens_descr_process_response()
601 s->extended_scalar_attrs = SUPPORTS_EXTEND_ATTRS(attrl); in iter_sens_descr_process_response()
603 attrh = le32_to_cpu(sdesc->attributes_high); in iter_sens_descr_process_response()
605 s->scale = S32_EXT(SENSOR_SCALE(attrh)); in iter_sens_descr_process_response()
606 s->type = SENSOR_TYPE(attrh); in iter_sens_descr_process_response()
607 /* Use pre-allocated pool wherever possible */ in iter_sens_descr_process_response()
608 s->intervals.desc = s->intervals.prealloc_pool; in iter_sens_descr_process_response()
609 if (si->version == SCMIv2_SENSOR_PROTOCOL) { in iter_sens_descr_process_response()
610 s->intervals.segmented = false; in iter_sens_descr_process_response()
611 s->intervals.count = 1; in iter_sens_descr_process_response()
617 s->intervals.desc[0] = (SENSOR_UPDATE_BASE(attrh) << 5) | in iter_sens_descr_process_response()
627 dev_dbg(ph->dev, in iter_sens_descr_process_response()
629 s->id); in iter_sens_descr_process_response()
636 s->num_axis = min_t(unsigned int, in iter_sens_descr_process_response()
640 strscpy(s->name, sdesc->name, SCMI_SHORT_NAME_MAX_SIZE); in iter_sens_descr_process_response()
647 if (PROTOCOL_REV_MAJOR(si->version) >= 0x3 && in iter_sens_descr_process_response()
649 ph->hops->extended_name_get(ph, SENSOR_NAME_GET, s->id, in iter_sens_descr_process_response()
650 NULL, s->name, SCMI_MAX_STR_SIZE); in iter_sens_descr_process_response()
652 if (s->extended_scalar_attrs) { in iter_sens_descr_process_response()
653 s->sensor_power = le32_to_cpu(sdesc->power); in iter_sens_descr_process_response()
654 dsize += sizeof(sdesc->power); in iter_sens_descr_process_response()
657 if (s->num_axis == 0) { in iter_sens_descr_process_response()
658 unsigned int sres = le32_to_cpu(sdesc->resolution); in iter_sens_descr_process_response()
660 s->resolution = SENSOR_RES(sres); in iter_sens_descr_process_response()
661 s->exponent = S32_EXT(SENSOR_RES_EXP(sres)); in iter_sens_descr_process_response()
662 dsize += sizeof(sdesc->resolution); in iter_sens_descr_process_response()
664 scmi_parse_range_attrs(&s->scalar_attrs, in iter_sens_descr_process_response()
665 &sdesc->scalar_attrs); in iter_sens_descr_process_response()
666 dsize += sizeof(sdesc->scalar_attrs); in iter_sens_descr_process_response()
670 if (s->num_axis > 0) in iter_sens_descr_process_response()
671 ret = scmi_sensor_axis_description(ph, s, si->version); in iter_sens_descr_process_response()
673 st->priv = ((u8 *)sdesc + dsize); in iter_sens_descr_process_response()
688 iter = ph->hops->iter_response_init(ph, &ops, si->num_sensors, in scmi_sensor_description_get()
694 return ph->hops->iter_response_run(iter); in scmi_sensor_description_get()
706 ret = ph->xops->xfer_get_init(ph, message_id, sizeof(*cfg), 0, &t); in scmi_sensor_request_notify()
710 cfg = t->tx.buf; in scmi_sensor_request_notify()
711 cfg->id = cpu_to_le32(sensor_id); in scmi_sensor_request_notify()
712 cfg->event_control = cpu_to_le32(evt_cntl); in scmi_sensor_request_notify()
714 ret = ph->xops->do_xfer(ph, t); in scmi_sensor_request_notify()
716 ph->xops->xfer_put(ph, t); in scmi_sensor_request_notify()
746 ret = ph->xops->xfer_get_init(ph, SENSOR_TRIP_POINT_CONFIG, in scmi_sensor_trip_point_config()
751 trip = t->tx.buf; in scmi_sensor_trip_point_config()
752 trip->id = cpu_to_le32(sensor_id); in scmi_sensor_trip_point_config()
753 trip->event_control = cpu_to_le32(evt_cntl | SENSOR_TP_ID(trip_id)); in scmi_sensor_trip_point_config()
754 trip->value_low = cpu_to_le32(trip_value & 0xffffffff); in scmi_sensor_trip_point_config()
755 trip->value_high = cpu_to_le32(trip_value >> 32); in scmi_sensor_trip_point_config()
757 ret = ph->xops->do_xfer(ph, t); in scmi_sensor_trip_point_config()
759 ph->xops->xfer_put(ph, t); in scmi_sensor_trip_point_config()
768 struct sensors_info *si = ph->get_priv(ph); in scmi_sensor_config_get()
770 if (sensor_id >= si->num_sensors) in scmi_sensor_config_get()
771 return -EINVAL; in scmi_sensor_config_get()
773 ret = ph->xops->xfer_get_init(ph, SENSOR_CONFIG_GET, in scmi_sensor_config_get()
778 put_unaligned_le32(sensor_id, t->tx.buf); in scmi_sensor_config_get()
779 ret = ph->xops->do_xfer(ph, t); in scmi_sensor_config_get()
781 struct scmi_sensor_info *s = si->sensors + sensor_id; in scmi_sensor_config_get()
783 *sensor_config = get_unaligned_le64(t->rx.buf); in scmi_sensor_config_get()
784 s->sensor_config = *sensor_config; in scmi_sensor_config_get()
787 ph->xops->xfer_put(ph, t); in scmi_sensor_config_get()
797 struct sensors_info *si = ph->get_priv(ph); in scmi_sensor_config_set()
799 if (sensor_id >= si->num_sensors) in scmi_sensor_config_set()
800 return -EINVAL; in scmi_sensor_config_set()
802 ret = ph->xops->xfer_get_init(ph, SENSOR_CONFIG_SET, in scmi_sensor_config_set()
807 msg = t->tx.buf; in scmi_sensor_config_set()
808 msg->id = cpu_to_le32(sensor_id); in scmi_sensor_config_set()
809 msg->sensor_config = cpu_to_le32(sensor_config); in scmi_sensor_config_set()
811 ret = ph->xops->do_xfer(ph, t); in scmi_sensor_config_set()
813 struct scmi_sensor_info *s = si->sensors + sensor_id; in scmi_sensor_config_set()
815 s->sensor_config = sensor_config; in scmi_sensor_config_set()
818 ph->xops->xfer_put(ph, t); in scmi_sensor_config_set()
823 * scmi_sensor_reading_get - Read scalar sensor value
830 * multiple axis and timestamped-reads, this just returns the first axis while
831 * dropping the timestamp value.
833 * timestamped multi-axis values.
844 struct sensors_info *si = ph->get_priv(ph); in scmi_sensor_reading_get()
846 if (sensor_id >= si->num_sensors) in scmi_sensor_reading_get()
847 return -EINVAL; in scmi_sensor_reading_get()
849 ret = ph->xops->xfer_get_init(ph, SENSOR_READING_GET, in scmi_sensor_reading_get()
854 sensor = t->tx.buf; in scmi_sensor_reading_get()
855 sensor->id = cpu_to_le32(sensor_id); in scmi_sensor_reading_get()
856 s = si->sensors + sensor_id; in scmi_sensor_reading_get()
857 if (s->async) { in scmi_sensor_reading_get()
858 sensor->flags = cpu_to_le32(SENSOR_READ_ASYNC); in scmi_sensor_reading_get()
859 ret = ph->xops->do_xfer_with_response(ph, t); in scmi_sensor_reading_get()
863 resp = t->rx.buf; in scmi_sensor_reading_get()
864 if (le32_to_cpu(resp->id) == sensor_id) in scmi_sensor_reading_get()
866 get_unaligned_le64(&resp->readings_low); in scmi_sensor_reading_get()
868 ret = -EPROTO; in scmi_sensor_reading_get()
871 sensor->flags = cpu_to_le32(0); in scmi_sensor_reading_get()
872 ret = ph->xops->do_xfer(ph, t); in scmi_sensor_reading_get()
874 *value = get_unaligned_le64(t->rx.buf); in scmi_sensor_reading_get()
877 ph->xops->xfer_put(ph, t); in scmi_sensor_reading_get()
885 out->value = get_unaligned_le64((void *)&in->sensor_value_low); in scmi_parse_sensor_readings()
886 out->timestamp = get_unaligned_le64((void *)&in->timestamp_low); in scmi_parse_sensor_readings()
890 * scmi_sensor_reading_get_timestamped - Read multiple-axis timestamped values
894 * @readings: An array of elements each representing a timestamped per-axis
912 struct sensors_info *si = ph->get_priv(ph); in scmi_sensor_reading_get_timestamped()
914 if (sensor_id >= si->num_sensors) in scmi_sensor_reading_get_timestamped()
915 return -EINVAL; in scmi_sensor_reading_get_timestamped()
917 s = si->sensors + sensor_id; in scmi_sensor_reading_get_timestamped()
919 (!s->num_axis && count > 1) || (s->num_axis && count > s->num_axis)) in scmi_sensor_reading_get_timestamped()
920 return -EINVAL; in scmi_sensor_reading_get_timestamped()
922 ret = ph->xops->xfer_get_init(ph, SENSOR_READING_GET, in scmi_sensor_reading_get_timestamped()
927 sensor = t->tx.buf; in scmi_sensor_reading_get_timestamped()
928 sensor->id = cpu_to_le32(sensor_id); in scmi_sensor_reading_get_timestamped()
929 if (s->async) { in scmi_sensor_reading_get_timestamped()
930 sensor->flags = cpu_to_le32(SENSOR_READ_ASYNC); in scmi_sensor_reading_get_timestamped()
931 ret = ph->xops->do_xfer_with_response(ph, t); in scmi_sensor_reading_get_timestamped()
936 resp = t->rx.buf; in scmi_sensor_reading_get_timestamped()
938 if (le32_to_cpu(resp->id) == sensor_id) in scmi_sensor_reading_get_timestamped()
941 &resp->readings[i]); in scmi_sensor_reading_get_timestamped()
943 ret = -EPROTO; in scmi_sensor_reading_get_timestamped()
946 sensor->flags = cpu_to_le32(0); in scmi_sensor_reading_get_timestamped()
947 ret = ph->xops->do_xfer(ph, t); in scmi_sensor_reading_get_timestamped()
952 resp_readings = t->rx.buf; in scmi_sensor_reading_get_timestamped()
959 ph->xops->xfer_put(ph, t); in scmi_sensor_reading_get_timestamped()
966 struct sensors_info *si = ph->get_priv(ph); in scmi_sensor_info_get()
968 if (sensor_id >= si->num_sensors) in scmi_sensor_info_get()
971 return si->sensors + sensor_id; in scmi_sensor_info_get()
976 struct sensors_info *si = ph->get_priv(ph); in scmi_sensor_count_get()
978 return si->num_sensors; in scmi_sensor_count_get()
1004 ret = -EINVAL; in scmi_sensor_set_notify_enabled()
1009 pr_debug("FAIL_ENABLED - evt[%X] dom[%d] - ret:%d\n", in scmi_sensor_set_notify_enabled()
1017 u8 evt_id, ktime_t timestamp, in scmi_sensor_fill_custom_report() argument
1032 r->timestamp = timestamp; in scmi_sensor_fill_custom_report()
1033 r->agent_id = le32_to_cpu(p->agent_id); in scmi_sensor_fill_custom_report()
1034 r->sensor_id = le32_to_cpu(p->sensor_id); in scmi_sensor_fill_custom_report()
1035 r->trip_point_desc = le32_to_cpu(p->trip_point_desc); in scmi_sensor_fill_custom_report()
1036 *src_id = r->sensor_id; in scmi_sensor_fill_custom_report()
1046 struct sensors_info *sinfo = ph->get_priv(ph); in scmi_sensor_fill_custom_report()
1049 r->sensor_id = le32_to_cpu(p->sensor_id); in scmi_sensor_fill_custom_report()
1050 if (r->sensor_id >= sinfo->num_sensors) in scmi_sensor_fill_custom_report()
1052 r->timestamp = timestamp; in scmi_sensor_fill_custom_report()
1053 r->agent_id = le32_to_cpu(p->agent_id); in scmi_sensor_fill_custom_report()
1054 s = &sinfo->sensors[r->sensor_id]; in scmi_sensor_fill_custom_report()
1057 * was pre-allocated to contain up to SCMI_MAX_NUM_SENSOR_AXIS in scmi_sensor_fill_custom_report()
1061 r->readings_count = s->num_axis ?: 1; in scmi_sensor_fill_custom_report()
1062 for (i = 0; i < r->readings_count; i++) in scmi_sensor_fill_custom_report()
1063 scmi_parse_sensor_readings(&r->readings[i], in scmi_sensor_fill_custom_report()
1064 &p->readings[i]); in scmi_sensor_fill_custom_report()
1065 *src_id = r->sensor_id; in scmi_sensor_fill_custom_report()
1078 struct sensors_info *si = ph->get_priv(ph); in scmi_sensor_get_num_sources()
1080 return si->num_sensors; in scmi_sensor_get_num_sources()
1120 ret = ph->xops->version_get(ph, &version); in scmi_sensors_protocol_init()
1124 dev_dbg(ph->dev, "Sensor Version %d.%d\n", in scmi_sensors_protocol_init()
1127 sinfo = devm_kzalloc(ph->dev, sizeof(*sinfo), GFP_KERNEL); in scmi_sensors_protocol_init()
1129 return -ENOMEM; in scmi_sensors_protocol_init()
1130 sinfo->version = version; in scmi_sensors_protocol_init()
1135 sinfo->sensors = devm_kcalloc(ph->dev, sinfo->num_sensors, in scmi_sensors_protocol_init()
1136 sizeof(*sinfo->sensors), GFP_KERNEL); in scmi_sensors_protocol_init()
1137 if (!sinfo->sensors) in scmi_sensors_protocol_init()
1138 return -ENOMEM; in scmi_sensors_protocol_init()
1144 return ph->set_priv(ph, sinfo, version); in scmi_sensors_protocol_init()