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
234 ret = ph->xops->xfer_get_init(ph, PROTOCOL_ATTRIBUTES, in scmi_sensor_attributes_get()
239 attr = t->rx.buf; in scmi_sensor_attributes_get()
241 ret = ph->xops->do_xfer(ph, t); in scmi_sensor_attributes_get()
243 si->num_sensors = le16_to_cpu(attr->num_sensors); in scmi_sensor_attributes_get()
244 si->max_requests = attr->max_requests; in scmi_sensor_attributes_get()
245 si->reg_addr = le32_to_cpu(attr->reg_addr_low) | in scmi_sensor_attributes_get()
246 (u64)le32_to_cpu(attr->reg_addr_high) << 32; in scmi_sensor_attributes_get()
247 si->reg_size = le32_to_cpu(attr->reg_size); in scmi_sensor_attributes_get()
250 ph->xops->xfer_put(ph, t); in scmi_sensor_attributes_get()
253 if (!ph->hops->protocol_msg_check(ph, in scmi_sensor_attributes_get()
255 si->notify_trip_point_cmd = true; in scmi_sensor_attributes_get()
257 if (!ph->hops->protocol_msg_check(ph, in scmi_sensor_attributes_get()
260 si->notify_continuos_update_cmd = true; in scmi_sensor_attributes_get()
269 out->min_range = get_unaligned_le64((void *)&in->min_range_low); in scmi_parse_range_attrs()
270 out->max_range = get_unaligned_le64((void *)&in->max_range_low); in scmi_parse_range_attrs()
285 s = ((const struct scmi_sens_ipriv *)p)->priv; in iter_intervals_prepare_message()
287 msg->id = cpu_to_le32(s->id); in iter_intervals_prepare_message()
288 msg->index = cpu_to_le32(desc_index); in iter_intervals_prepare_message()
295 struct scmi_sensor_info *s = ((struct scmi_sens_ipriv *)p)->priv; in iter_intervals_update_state()
296 struct device *dev = ((struct scmi_sens_ipriv *)p)->dev; in iter_intervals_update_state()
299 flags = le32_to_cpu(r->num_intervals_flags); in iter_intervals_update_state()
300 st->num_returned = NUM_INTERVALS_RETURNED(flags); in iter_intervals_update_state()
301 st->num_remaining = NUM_INTERVALS_REMAINING(flags); in iter_intervals_update_state()
307 if (!st->max_resources) { in iter_intervals_update_state()
308 s->intervals.segmented = SEGMENTED_INTVL_FORMAT(flags); in iter_intervals_update_state()
309 s->intervals.count = st->num_returned + st->num_remaining; in iter_intervals_update_state()
311 if (s->intervals.segmented && in iter_intervals_update_state()
312 (st->num_remaining || st->num_returned != 3)) { in iter_intervals_update_state()
315 s->id, s->intervals.count); in iter_intervals_update_state()
316 s->intervals.segmented = false; in iter_intervals_update_state()
317 s->intervals.count = 0; in iter_intervals_update_state()
318 return -EINVAL; in iter_intervals_update_state()
320 /* Direct allocation when exceeding pre-allocated */ in iter_intervals_update_state()
321 if (s->intervals.count >= SCMI_MAX_PREALLOC_POOL) { in iter_intervals_update_state()
322 s->intervals.desc = in iter_intervals_update_state()
324 s->intervals.count, in iter_intervals_update_state()
325 sizeof(*s->intervals.desc), in iter_intervals_update_state()
327 if (!s->intervals.desc) { in iter_intervals_update_state()
328 s->intervals.segmented = false; in iter_intervals_update_state()
329 s->intervals.count = 0; in iter_intervals_update_state()
330 return -ENOMEM; in iter_intervals_update_state()
334 st->max_resources = s->intervals.count; in iter_intervals_update_state()
346 struct scmi_sensor_info *s = ((struct scmi_sens_ipriv *)p)->priv; in iter_intervals_process_response()
348 s->intervals.desc[st->desc_index + st->loop_idx] = in iter_intervals_process_response()
349 le32_to_cpu(r->intervals[st->loop_idx]); in iter_intervals_process_response()
365 .dev = ph->dev, in scmi_sensor_update_intervals()
368 iter = ph->hops->iter_response_init(ph, &ops, s->intervals.count, in scmi_sensor_update_intervals()
375 return ph->hops->iter_response_run(iter); in scmi_sensor_update_intervals()
391 msg->id = cpu_to_le32(apriv->s->id); in iter_axes_desc_prepare_message()
392 msg->axis_desc_index = cpu_to_le32(desc_index); in iter_axes_desc_prepare_message()
402 flags = le32_to_cpu(r->num_axis_flags); in iter_axes_desc_update_state()
403 st->num_returned = NUM_AXIS_RETURNED(flags); in iter_axes_desc_update_state()
404 st->num_remaining = NUM_AXIS_REMAINING(flags); in iter_axes_desc_update_state()
405 st->priv = (void *)&r->desc[0]; in iter_axes_desc_update_state()
419 const struct scmi_axis_descriptor *adesc = st->priv; in iter_axes_desc_process_response()
421 attrl = le32_to_cpu(adesc->attributes_low); in iter_axes_desc_process_response()
423 apriv->any_axes_support_extended_names = true; in iter_axes_desc_process_response()
425 a = &apriv->s->axis[st->desc_index + st->loop_idx]; in iter_axes_desc_process_response()
426 a->id = le32_to_cpu(adesc->id); in iter_axes_desc_process_response()
427 a->extended_attrs = SUPPORTS_EXTEND_ATTRS(attrl); in iter_axes_desc_process_response()
429 attrh = le32_to_cpu(adesc->attributes_high); in iter_axes_desc_process_response()
430 a->scale = S32_EXT(SENSOR_SCALE(attrh)); in iter_axes_desc_process_response()
431 a->type = SENSOR_TYPE(attrh); in iter_axes_desc_process_response()
432 strscpy(a->name, adesc->name, SCMI_SHORT_NAME_MAX_SIZE); in iter_axes_desc_process_response()
434 if (a->extended_attrs) { in iter_axes_desc_process_response()
435 unsigned int ares = le32_to_cpu(adesc->resolution); in iter_axes_desc_process_response()
437 a->resolution = SENSOR_RES(ares); in iter_axes_desc_process_response()
438 a->exponent = S32_EXT(SENSOR_RES_EXP(ares)); in iter_axes_desc_process_response()
439 dsize += sizeof(adesc->resolution); in iter_axes_desc_process_response()
441 scmi_parse_range_attrs(&a->attrs, &adesc->attrs); in iter_axes_desc_process_response()
442 dsize += sizeof(adesc->attrs); in iter_axes_desc_process_response()
444 st->priv = ((u8 *)adesc + dsize); in iter_axes_desc_process_response()
456 flags = le32_to_cpu(r->num_axis_flags); in iter_axes_extended_name_update_state()
457 st->num_returned = NUM_AXIS_RETURNED(flags); in iter_axes_extended_name_update_state()
458 st->num_remaining = NUM_AXIS_REMAINING(flags); in iter_axes_extended_name_update_state()
459 st->priv = (void *)&r->desc[0]; in iter_axes_extended_name_update_state()
472 struct scmi_sensor_axis_name_descriptor *adesc = st->priv; in iter_axes_extended_name_process_response()
473 u32 axis_id = le32_to_cpu(adesc->axis_id); in iter_axes_extended_name_process_response()
475 if (axis_id >= st->max_resources) in iter_axes_extended_name_process_response()
476 return -EPROTO; in iter_axes_extended_name_process_response()
480 * in the reply since the list of axes supporting extended names in iter_axes_extended_name_process_response()
483 a = &apriv->s->axis[axis_id]; in iter_axes_extended_name_process_response()
484 strscpy(a->name, adesc->name, SCMI_MAX_STR_SIZE); in iter_axes_extended_name_process_response()
485 st->priv = ++adesc; in iter_axes_extended_name_process_response()
506 iter = ph->hops->iter_response_init(ph, &ops, s->num_axis, in scmi_sensor_axis_extended_names_get()
515 * get extended names for axes. in scmi_sensor_axis_extended_names_get()
517 ret = ph->hops->iter_response_run(iter); in scmi_sensor_axis_extended_names_get()
519 dev_warn(ph->dev, in scmi_sensor_axis_extended_names_get()
520 "Failed to get axes extended names for %s (ret:%d).\n", in scmi_sensor_axis_extended_names_get()
521 s->name, ret); in scmi_sensor_axis_extended_names_get()
542 s->axis = devm_kcalloc(ph->dev, s->num_axis, in scmi_sensor_axis_description()
543 sizeof(*s->axis), GFP_KERNEL); in scmi_sensor_axis_description()
544 if (!s->axis) in scmi_sensor_axis_description()
545 return -ENOMEM; in scmi_sensor_axis_description()
547 iter = ph->hops->iter_response_init(ph, &ops, s->num_axis, in scmi_sensor_axis_description()
554 ret = ph->hops->iter_response_run(iter); in scmi_sensor_axis_description()
571 msg->desc_index = cpu_to_le32(desc_index); in iter_sens_descr_prepare_message()
579 st->num_returned = le16_to_cpu(r->num_returned); in iter_sens_descr_update_state()
580 st->num_remaining = le16_to_cpu(r->num_remaining); in iter_sens_descr_update_state()
581 st->priv = (void *)&r->desc[0]; in iter_sens_descr_update_state()
597 const struct scmi_sensor_descriptor *sdesc = st->priv; in iter_sens_descr_process_response()
599 s = &si->sensors[st->desc_index + st->loop_idx]; in iter_sens_descr_process_response()
600 s->id = le32_to_cpu(sdesc->id); in iter_sens_descr_process_response()
602 attrl = le32_to_cpu(sdesc->attributes_low); in iter_sens_descr_process_response()
604 s->async = SUPPORTS_ASYNC_READ(attrl); in iter_sens_descr_process_response()
605 s->num_trip_points = NUM_TRIP_POINTS(attrl); in iter_sens_descr_process_response()
611 if (si->notify_continuos_update_cmd) in iter_sens_descr_process_response()
612 s->update = SUPPORTS_UPDATE_NOTIFY(attrl); in iter_sens_descr_process_response()
613 s->timestamped = SUPPORTS_TIMESTAMP(attrl); in iter_sens_descr_process_response()
614 if (s->timestamped) in iter_sens_descr_process_response()
615 s->tstamp_scale = S32_EXT(SENSOR_TSTAMP_EXP(attrl)); in iter_sens_descr_process_response()
616 s->extended_scalar_attrs = SUPPORTS_EXTEND_ATTRS(attrl); in iter_sens_descr_process_response()
618 attrh = le32_to_cpu(sdesc->attributes_high); in iter_sens_descr_process_response()
620 s->scale = S32_EXT(SENSOR_SCALE(attrh)); in iter_sens_descr_process_response()
621 s->type = SENSOR_TYPE(attrh); in iter_sens_descr_process_response()
622 /* Use pre-allocated pool wherever possible */ in iter_sens_descr_process_response()
623 s->intervals.desc = s->intervals.prealloc_pool; in iter_sens_descr_process_response()
624 if (si->version == SCMIv2_SENSOR_PROTOCOL) { in iter_sens_descr_process_response()
625 s->intervals.segmented = false; in iter_sens_descr_process_response()
626 s->intervals.count = 1; in iter_sens_descr_process_response()
632 s->intervals.desc[0] = (SENSOR_UPDATE_BASE(attrh) << 5) | in iter_sens_descr_process_response()
642 dev_dbg(ph->dev, in iter_sens_descr_process_response()
644 s->id); in iter_sens_descr_process_response()
651 s->num_axis = min_t(unsigned int, in iter_sens_descr_process_response()
655 strscpy(s->name, sdesc->name, SCMI_SHORT_NAME_MAX_SIZE); in iter_sens_descr_process_response()
662 if (PROTOCOL_REV_MAJOR(si->version) >= 0x3 && in iter_sens_descr_process_response()
664 ph->hops->extended_name_get(ph, SENSOR_NAME_GET, s->id, in iter_sens_descr_process_response()
665 NULL, s->name, SCMI_MAX_STR_SIZE); in iter_sens_descr_process_response()
667 if (s->extended_scalar_attrs) { in iter_sens_descr_process_response()
668 s->sensor_power = le32_to_cpu(sdesc->power); in iter_sens_descr_process_response()
669 dsize += sizeof(sdesc->power); in iter_sens_descr_process_response()
672 if (s->num_axis == 0) { in iter_sens_descr_process_response()
673 unsigned int sres = le32_to_cpu(sdesc->resolution); in iter_sens_descr_process_response()
675 s->resolution = SENSOR_RES(sres); in iter_sens_descr_process_response()
676 s->exponent = S32_EXT(SENSOR_RES_EXP(sres)); in iter_sens_descr_process_response()
677 dsize += sizeof(sdesc->resolution); in iter_sens_descr_process_response()
679 scmi_parse_range_attrs(&s->scalar_attrs, in iter_sens_descr_process_response()
680 &sdesc->scalar_attrs); in iter_sens_descr_process_response()
681 dsize += sizeof(sdesc->scalar_attrs); in iter_sens_descr_process_response()
685 if (s->num_axis > 0) in iter_sens_descr_process_response()
686 ret = scmi_sensor_axis_description(ph, s, si->version); in iter_sens_descr_process_response()
688 st->priv = ((u8 *)sdesc + dsize); in iter_sens_descr_process_response()
703 iter = ph->hops->iter_response_init(ph, &ops, si->num_sensors, in scmi_sensor_description_get()
709 return ph->hops->iter_response_run(iter); in scmi_sensor_description_get()
721 ret = ph->xops->xfer_get_init(ph, message_id, sizeof(*cfg), 0, &t); in scmi_sensor_request_notify()
725 cfg = t->tx.buf; in scmi_sensor_request_notify()
726 cfg->id = cpu_to_le32(sensor_id); in scmi_sensor_request_notify()
727 cfg->event_control = cpu_to_le32(evt_cntl); in scmi_sensor_request_notify()
729 ret = ph->xops->do_xfer(ph, t); in scmi_sensor_request_notify()
731 ph->xops->xfer_put(ph, t); in scmi_sensor_request_notify()
761 ret = ph->xops->xfer_get_init(ph, SENSOR_TRIP_POINT_CONFIG, in scmi_sensor_trip_point_config()
766 trip = t->tx.buf; in scmi_sensor_trip_point_config()
767 trip->id = cpu_to_le32(sensor_id); in scmi_sensor_trip_point_config()
768 trip->event_control = cpu_to_le32(evt_cntl | SENSOR_TP_ID(trip_id)); in scmi_sensor_trip_point_config()
769 trip->value_low = cpu_to_le32(trip_value & 0xffffffff); in scmi_sensor_trip_point_config()
770 trip->value_high = cpu_to_le32(trip_value >> 32); in scmi_sensor_trip_point_config()
772 ret = ph->xops->do_xfer(ph, t); in scmi_sensor_trip_point_config()
774 ph->xops->xfer_put(ph, t); in scmi_sensor_trip_point_config()
783 struct sensors_info *si = ph->get_priv(ph); in scmi_sensor_config_get()
785 if (sensor_id >= si->num_sensors) in scmi_sensor_config_get()
786 return -EINVAL; in scmi_sensor_config_get()
788 ret = ph->xops->xfer_get_init(ph, SENSOR_CONFIG_GET, in scmi_sensor_config_get()
793 put_unaligned_le32(sensor_id, t->tx.buf); in scmi_sensor_config_get()
794 ret = ph->xops->do_xfer(ph, t); in scmi_sensor_config_get()
796 struct scmi_sensor_info *s = si->sensors + sensor_id; in scmi_sensor_config_get()
798 *sensor_config = get_unaligned_le64(t->rx.buf); in scmi_sensor_config_get()
799 s->sensor_config = *sensor_config; in scmi_sensor_config_get()
802 ph->xops->xfer_put(ph, t); in scmi_sensor_config_get()
812 struct sensors_info *si = ph->get_priv(ph); in scmi_sensor_config_set()
814 if (sensor_id >= si->num_sensors) in scmi_sensor_config_set()
815 return -EINVAL; in scmi_sensor_config_set()
817 ret = ph->xops->xfer_get_init(ph, SENSOR_CONFIG_SET, in scmi_sensor_config_set()
822 msg = t->tx.buf; in scmi_sensor_config_set()
823 msg->id = cpu_to_le32(sensor_id); in scmi_sensor_config_set()
824 msg->sensor_config = cpu_to_le32(sensor_config); in scmi_sensor_config_set()
826 ret = ph->xops->do_xfer(ph, t); in scmi_sensor_config_set()
828 struct scmi_sensor_info *s = si->sensors + sensor_id; in scmi_sensor_config_set()
830 s->sensor_config = sensor_config; in scmi_sensor_config_set()
833 ph->xops->xfer_put(ph, t); in scmi_sensor_config_set()
838 * scmi_sensor_reading_get - Read scalar sensor value
845 * multiple axis and timestamped-reads, this just returns the first axis while
846 * dropping the timestamp value.
848 * timestamped multi-axis values.
859 struct sensors_info *si = ph->get_priv(ph); in scmi_sensor_reading_get()
861 if (sensor_id >= si->num_sensors) in scmi_sensor_reading_get()
862 return -EINVAL; in scmi_sensor_reading_get()
864 ret = ph->xops->xfer_get_init(ph, SENSOR_READING_GET, in scmi_sensor_reading_get()
869 sensor = t->tx.buf; in scmi_sensor_reading_get()
870 sensor->id = cpu_to_le32(sensor_id); in scmi_sensor_reading_get()
871 s = si->sensors + sensor_id; in scmi_sensor_reading_get()
872 if (s->async) { in scmi_sensor_reading_get()
873 sensor->flags = cpu_to_le32(SENSOR_READ_ASYNC); in scmi_sensor_reading_get()
874 ret = ph->xops->do_xfer_with_response(ph, t); in scmi_sensor_reading_get()
878 resp = t->rx.buf; in scmi_sensor_reading_get()
879 if (le32_to_cpu(resp->id) == sensor_id) in scmi_sensor_reading_get()
881 get_unaligned_le64(&resp->readings_low); in scmi_sensor_reading_get()
883 ret = -EPROTO; in scmi_sensor_reading_get()
886 sensor->flags = cpu_to_le32(0); in scmi_sensor_reading_get()
887 ret = ph->xops->do_xfer(ph, t); in scmi_sensor_reading_get()
889 *value = get_unaligned_le64(t->rx.buf); in scmi_sensor_reading_get()
892 ph->xops->xfer_put(ph, t); in scmi_sensor_reading_get()
900 out->value = get_unaligned_le64((void *)&in->sensor_value_low); in scmi_parse_sensor_readings()
901 out->timestamp = get_unaligned_le64((void *)&in->timestamp_low); in scmi_parse_sensor_readings()
905 * scmi_sensor_reading_get_timestamped - Read multiple-axis timestamped values
909 * @readings: An array of elements each representing a timestamped per-axis
927 struct sensors_info *si = ph->get_priv(ph); in scmi_sensor_reading_get_timestamped()
929 if (sensor_id >= si->num_sensors) in scmi_sensor_reading_get_timestamped()
930 return -EINVAL; in scmi_sensor_reading_get_timestamped()
932 s = si->sensors + sensor_id; in scmi_sensor_reading_get_timestamped()
934 (!s->num_axis && count > 1) || (s->num_axis && count > s->num_axis)) in scmi_sensor_reading_get_timestamped()
935 return -EINVAL; in scmi_sensor_reading_get_timestamped()
937 ret = ph->xops->xfer_get_init(ph, SENSOR_READING_GET, in scmi_sensor_reading_get_timestamped()
942 sensor = t->tx.buf; in scmi_sensor_reading_get_timestamped()
943 sensor->id = cpu_to_le32(sensor_id); in scmi_sensor_reading_get_timestamped()
944 if (s->async) { in scmi_sensor_reading_get_timestamped()
945 sensor->flags = cpu_to_le32(SENSOR_READ_ASYNC); in scmi_sensor_reading_get_timestamped()
946 ret = ph->xops->do_xfer_with_response(ph, t); in scmi_sensor_reading_get_timestamped()
951 resp = t->rx.buf; in scmi_sensor_reading_get_timestamped()
953 if (le32_to_cpu(resp->id) == sensor_id) in scmi_sensor_reading_get_timestamped()
956 &resp->readings[i]); in scmi_sensor_reading_get_timestamped()
958 ret = -EPROTO; in scmi_sensor_reading_get_timestamped()
961 sensor->flags = cpu_to_le32(0); in scmi_sensor_reading_get_timestamped()
962 ret = ph->xops->do_xfer(ph, t); in scmi_sensor_reading_get_timestamped()
967 resp_readings = t->rx.buf; in scmi_sensor_reading_get_timestamped()
974 ph->xops->xfer_put(ph, t); in scmi_sensor_reading_get_timestamped()
981 struct sensors_info *si = ph->get_priv(ph); in scmi_sensor_info_get()
983 if (sensor_id >= si->num_sensors) in scmi_sensor_info_get()
986 return si->sensors + sensor_id; in scmi_sensor_info_get()
991 struct sensors_info *si = ph->get_priv(ph); in scmi_sensor_count_get()
993 return si->num_sensors; in scmi_sensor_count_get()
1011 struct sensors_info *sinfo = ph->get_priv(ph); in scmi_sensor_notify_supported()
1018 supported = sinfo->notify_trip_point_cmd; in scmi_sensor_notify_supported()
1020 supported = s->update; in scmi_sensor_notify_supported()
1038 ret = -EINVAL; in scmi_sensor_set_notify_enabled()
1043 pr_debug("FAIL_ENABLED - evt[%X] dom[%d] - ret:%d\n", in scmi_sensor_set_notify_enabled()
1051 u8 evt_id, ktime_t timestamp, in scmi_sensor_fill_custom_report() argument
1066 r->timestamp = timestamp; in scmi_sensor_fill_custom_report()
1067 r->agent_id = le32_to_cpu(p->agent_id); in scmi_sensor_fill_custom_report()
1068 r->sensor_id = le32_to_cpu(p->sensor_id); in scmi_sensor_fill_custom_report()
1069 r->trip_point_desc = le32_to_cpu(p->trip_point_desc); in scmi_sensor_fill_custom_report()
1070 *src_id = r->sensor_id; in scmi_sensor_fill_custom_report()
1080 struct sensors_info *sinfo = ph->get_priv(ph); in scmi_sensor_fill_custom_report()
1083 r->sensor_id = le32_to_cpu(p->sensor_id); in scmi_sensor_fill_custom_report()
1084 if (r->sensor_id >= sinfo->num_sensors) in scmi_sensor_fill_custom_report()
1086 r->timestamp = timestamp; in scmi_sensor_fill_custom_report()
1087 r->agent_id = le32_to_cpu(p->agent_id); in scmi_sensor_fill_custom_report()
1088 s = &sinfo->sensors[r->sensor_id]; in scmi_sensor_fill_custom_report()
1091 * was pre-allocated to contain up to SCMI_MAX_NUM_SENSOR_AXIS in scmi_sensor_fill_custom_report()
1095 r->readings_count = s->num_axis ?: 1; in scmi_sensor_fill_custom_report()
1096 for (i = 0; i < r->readings_count; i++) in scmi_sensor_fill_custom_report()
1097 scmi_parse_sensor_readings(&r->readings[i], in scmi_sensor_fill_custom_report()
1098 &p->readings[i]); in scmi_sensor_fill_custom_report()
1099 *src_id = r->sensor_id; in scmi_sensor_fill_custom_report()
1112 struct sensors_info *si = ph->get_priv(ph); in scmi_sensor_get_num_sources()
1114 return si->num_sensors; in scmi_sensor_get_num_sources()
1155 ret = ph->xops->version_get(ph, &version); in scmi_sensors_protocol_init()
1159 dev_dbg(ph->dev, "Sensor Version %d.%d\n", in scmi_sensors_protocol_init()
1162 sinfo = devm_kzalloc(ph->dev, sizeof(*sinfo), GFP_KERNEL); in scmi_sensors_protocol_init()
1164 return -ENOMEM; in scmi_sensors_protocol_init()
1165 sinfo->version = version; in scmi_sensors_protocol_init()
1170 sinfo->sensors = devm_kcalloc(ph->dev, sinfo->num_sensors, in scmi_sensors_protocol_init()
1171 sizeof(*sinfo->sensors), GFP_KERNEL); in scmi_sensors_protocol_init()
1172 if (!sinfo->sensors) in scmi_sensors_protocol_init()
1173 return -ENOMEM; in scmi_sensors_protocol_init()
1179 return ph->set_priv(ph, sinfo, version); in scmi_sensors_protocol_init()