Lines Matching +full:freq +full:- +full:domain
1 // SPDX-License-Identifier: GPL-2.0
5 * Copyright (C) 2018-2023 ARM Ltd.
8 #define pr_fmt(fmt) "SCMI Notifications PERF - " fmt
86 __le32 domain; member
91 __le32 domain; member
102 __le32 domain; member
107 __le32 domain; member
174 if (_opp->indicative_freq == f_) \
200 ret = ph->xops->xfer_get_init(ph, PROTOCOL_ATTRIBUTES, 0, in scmi_perf_attributes_get()
205 attr = t->rx.buf; in scmi_perf_attributes_get()
207 ret = ph->xops->do_xfer(ph, t); in scmi_perf_attributes_get()
209 u16 flags = le16_to_cpu(attr->flags); in scmi_perf_attributes_get()
211 pi->num_domains = le16_to_cpu(attr->num_domains); in scmi_perf_attributes_get()
214 pi->power_scale = SCMI_POWER_MILLIWATTS; in scmi_perf_attributes_get()
215 if (PROTOCOL_REV_MAJOR(pi->version) >= 0x3) in scmi_perf_attributes_get()
217 pi->power_scale = SCMI_POWER_MICROWATTS; in scmi_perf_attributes_get()
219 pi->stats_addr = le32_to_cpu(attr->stats_addr_low) | in scmi_perf_attributes_get()
220 (u64)le32_to_cpu(attr->stats_addr_high) << 32; in scmi_perf_attributes_get()
221 pi->stats_size = le32_to_cpu(attr->stats_size); in scmi_perf_attributes_get()
224 ph->xops->xfer_put(ph, t); in scmi_perf_attributes_get()
230 int domain; in scmi_perf_xa_destroy() local
233 for (domain = 0; domain < pinfo->num_domains; domain++) { in scmi_perf_xa_destroy()
234 xa_destroy(&((pinfo->dom_info + domain)->opps_by_idx)); in scmi_perf_xa_destroy()
235 xa_destroy(&((pinfo->dom_info + domain)->opps_by_lvl)); in scmi_perf_xa_destroy()
249 ret = ph->xops->xfer_get_init(ph, PERF_DOMAIN_ATTRIBUTES, in scmi_perf_domain_attributes_get()
250 sizeof(dom_info->id), sizeof(*attr), &t); in scmi_perf_domain_attributes_get()
254 put_unaligned_le32(dom_info->id, t->tx.buf); in scmi_perf_domain_attributes_get()
255 attr = t->rx.buf; in scmi_perf_domain_attributes_get()
257 ret = ph->xops->do_xfer(ph, t); in scmi_perf_domain_attributes_get()
259 flags = le32_to_cpu(attr->flags); in scmi_perf_domain_attributes_get()
261 dom_info->set_limits = SUPPORTS_SET_LIMITS(flags); in scmi_perf_domain_attributes_get()
262 dom_info->info.set_perf = SUPPORTS_SET_PERF_LVL(flags); in scmi_perf_domain_attributes_get()
263 dom_info->perf_limit_notify = SUPPORTS_PERF_LIMIT_NOTIFY(flags); in scmi_perf_domain_attributes_get()
264 dom_info->perf_level_notify = SUPPORTS_PERF_LEVEL_NOTIFY(flags); in scmi_perf_domain_attributes_get()
265 dom_info->perf_fastchannels = SUPPORTS_PERF_FASTCHANNELS(flags); in scmi_perf_domain_attributes_get()
267 dom_info->level_indexing_mode = in scmi_perf_domain_attributes_get()
269 dom_info->sustained_freq_khz = in scmi_perf_domain_attributes_get()
270 le32_to_cpu(attr->sustained_freq_khz); in scmi_perf_domain_attributes_get()
271 dom_info->sustained_perf_level = in scmi_perf_domain_attributes_get()
272 le32_to_cpu(attr->sustained_perf_level); in scmi_perf_domain_attributes_get()
273 if (!dom_info->sustained_freq_khz || in scmi_perf_domain_attributes_get()
274 !dom_info->sustained_perf_level || in scmi_perf_domain_attributes_get()
275 dom_info->level_indexing_mode) in scmi_perf_domain_attributes_get()
277 dom_info->mult_factor = 1000; in scmi_perf_domain_attributes_get()
279 dom_info->mult_factor = in scmi_perf_domain_attributes_get()
280 (dom_info->sustained_freq_khz * 1000UL) in scmi_perf_domain_attributes_get()
281 / dom_info->sustained_perf_level; in scmi_perf_domain_attributes_get()
282 strscpy(dom_info->info.name, attr->name, in scmi_perf_domain_attributes_get()
286 ph->xops->xfer_put(ph, t); in scmi_perf_domain_attributes_get()
294 ph->hops->extended_name_get(ph, PERF_DOMAIN_NAME_GET, in scmi_perf_domain_attributes_get()
295 dom_info->id, NULL, dom_info->info.name, in scmi_perf_domain_attributes_get()
298 if (dom_info->level_indexing_mode) { in scmi_perf_domain_attributes_get()
299 xa_init(&dom_info->opps_by_idx); in scmi_perf_domain_attributes_get()
300 xa_init(&dom_info->opps_by_lvl); in scmi_perf_domain_attributes_get()
301 hash_init(dom_info->opps_by_freq); in scmi_perf_domain_attributes_get()
311 return t1->perf - t2->perf; in opp_cmp_func()
326 msg->domain = cpu_to_le32(p->perf_dom->id); in iter_perf_levels_prepare_message()
328 msg->level_index = cpu_to_le32(desc_index); in iter_perf_levels_prepare_message()
336 st->num_returned = le16_to_cpu(r->num_returned); in iter_perf_levels_update_state()
337 st->num_remaining = le16_to_cpu(r->num_remaining); in iter_perf_levels_update_state()
346 opp->perf = le32_to_cpu(r->opp[loop_idx].perf_val); in process_response_opp()
347 opp->power = le32_to_cpu(r->opp[loop_idx].power); in process_response_opp()
348 opp->trans_latency_us = in process_response_opp()
349 le16_to_cpu(r->opp[loop_idx].transition_latency_us); in process_response_opp()
357 opp->perf = le32_to_cpu(r->opp[loop_idx].perf_val); in process_response_opp_v4()
358 opp->power = le32_to_cpu(r->opp[loop_idx].power); in process_response_opp_v4()
359 opp->trans_latency_us = in process_response_opp_v4()
360 le16_to_cpu(r->opp[loop_idx].transition_latency_us); in process_response_opp_v4()
362 /* Note that PERF v4 reports always five 32-bit words */ in process_response_opp_v4()
363 opp->indicative_freq = le32_to_cpu(r->opp[loop_idx].indicative_freq); in process_response_opp_v4()
364 if (dom->level_indexing_mode) { in process_response_opp_v4()
367 opp->level_index = le32_to_cpu(r->opp[loop_idx].level_index); in process_response_opp_v4()
369 ret = xa_insert(&dom->opps_by_idx, opp->level_index, opp, in process_response_opp_v4()
373 "Failed to add opps_by_idx at %d - ret:%d\n", in process_response_opp_v4()
374 opp->level_index, ret); in process_response_opp_v4()
376 ret = xa_insert(&dom->opps_by_lvl, opp->perf, opp, GFP_KERNEL); in process_response_opp_v4()
379 "Failed to add opps_by_lvl at %d - ret:%d\n", in process_response_opp_v4()
380 opp->perf, ret); in process_response_opp_v4()
382 hash_add(dom->opps_by_freq, &opp->hash, opp->indicative_freq); in process_response_opp_v4()
394 opp = &p->perf_dom->opp[st->desc_index + st->loop_idx]; in iter_perf_levels_process_response()
395 if (PROTOCOL_REV_MAJOR(p->version) <= 0x3) in iter_perf_levels_process_response()
396 process_response_opp(opp, st->loop_idx, response); in iter_perf_levels_process_response()
398 process_response_opp_v4(ph->dev, p->perf_dom, opp, st->loop_idx, in iter_perf_levels_process_response()
400 p->perf_dom->opp_count++; in iter_perf_levels_process_response()
402 dev_dbg(ph->dev, "Level %d Power %d Latency %dus Ifreq %d Index %d\n", in iter_perf_levels_process_response()
403 opp->perf, opp->power, opp->trans_latency_us, in iter_perf_levels_process_response()
404 opp->indicative_freq, opp->level_index); in iter_perf_levels_process_response()
425 iter = ph->hops->iter_response_init(ph, &ops, MAX_OPPS, in scmi_perf_describe_levels_get()
432 ret = ph->hops->iter_response_run(iter); in scmi_perf_describe_levels_get()
436 if (perf_dom->opp_count) in scmi_perf_describe_levels_get()
437 sort(perf_dom->opp, perf_dom->opp_count, in scmi_perf_describe_levels_get()
445 struct scmi_perf_info *pi = ph->get_priv(ph); in scmi_perf_num_domains_get()
447 return pi->num_domains; in scmi_perf_num_domains_get()
451 scmi_perf_domain_lookup(const struct scmi_protocol_handle *ph, u32 domain) in scmi_perf_domain_lookup() argument
453 struct scmi_perf_info *pi = ph->get_priv(ph); in scmi_perf_domain_lookup()
455 if (domain >= pi->num_domains) in scmi_perf_domain_lookup()
456 return ERR_PTR(-EINVAL); in scmi_perf_domain_lookup()
458 return pi->dom_info + domain; in scmi_perf_domain_lookup()
462 scmi_perf_info_get(const struct scmi_protocol_handle *ph, u32 domain) in scmi_perf_info_get() argument
466 dom = scmi_perf_domain_lookup(ph, domain); in scmi_perf_info_get()
468 return ERR_PTR(-EINVAL); in scmi_perf_info_get()
470 return &dom->info; in scmi_perf_info_get()
474 u32 domain, u32 max_perf, u32 min_perf) in scmi_perf_msg_limits_set() argument
480 ret = ph->xops->xfer_get_init(ph, PERF_LIMITS_SET, in scmi_perf_msg_limits_set()
485 limits = t->tx.buf; in scmi_perf_msg_limits_set()
486 limits->domain = cpu_to_le32(domain); in scmi_perf_msg_limits_set()
487 limits->max_level = cpu_to_le32(max_perf); in scmi_perf_msg_limits_set()
488 limits->min_level = cpu_to_le32(min_perf); in scmi_perf_msg_limits_set()
490 ret = ph->xops->do_xfer(ph, t); in scmi_perf_msg_limits_set()
492 ph->xops->xfer_put(ph, t); in scmi_perf_msg_limits_set()
500 if (dom->fc_info && dom->fc_info[PERF_FC_LIMIT].set_addr) { in __scmi_perf_limits_set()
501 struct scmi_fc_info *fci = &dom->fc_info[PERF_FC_LIMIT]; in __scmi_perf_limits_set()
504 dom->id, min_perf, max_perf); in __scmi_perf_limits_set()
505 iowrite32(max_perf, fci->set_addr); in __scmi_perf_limits_set()
506 iowrite32(min_perf, fci->set_addr + 4); in __scmi_perf_limits_set()
507 ph->hops->fastchannel_db_ring(fci->set_db); in __scmi_perf_limits_set()
511 return scmi_perf_msg_limits_set(ph, dom->id, max_perf, min_perf); in __scmi_perf_limits_set()
515 u32 domain, u32 max_perf, u32 min_perf) in scmi_perf_limits_set() argument
517 struct scmi_perf_info *pi = ph->get_priv(ph); in scmi_perf_limits_set()
520 dom = scmi_perf_domain_lookup(ph, domain); in scmi_perf_limits_set()
524 if (!dom->set_limits) in scmi_perf_limits_set()
525 return -EOPNOTSUPP; in scmi_perf_limits_set()
527 if (PROTOCOL_REV_MAJOR(pi->version) >= 0x3 && !max_perf && !min_perf) in scmi_perf_limits_set()
528 return -EINVAL; in scmi_perf_limits_set()
530 if (dom->level_indexing_mode) { in scmi_perf_limits_set()
534 opp = xa_load(&dom->opps_by_lvl, min_perf); in scmi_perf_limits_set()
536 return -EIO; in scmi_perf_limits_set()
538 min_perf = opp->level_index; in scmi_perf_limits_set()
542 opp = xa_load(&dom->opps_by_lvl, max_perf); in scmi_perf_limits_set()
544 return -EIO; in scmi_perf_limits_set()
546 max_perf = opp->level_index; in scmi_perf_limits_set()
554 u32 domain, u32 *max_perf, u32 *min_perf) in scmi_perf_msg_limits_get() argument
560 ret = ph->xops->xfer_get_init(ph, PERF_LIMITS_GET, in scmi_perf_msg_limits_get()
565 put_unaligned_le32(domain, t->tx.buf); in scmi_perf_msg_limits_get()
567 ret = ph->xops->do_xfer(ph, t); in scmi_perf_msg_limits_get()
569 limits = t->rx.buf; in scmi_perf_msg_limits_get()
571 *max_perf = le32_to_cpu(limits->max_level); in scmi_perf_msg_limits_get()
572 *min_perf = le32_to_cpu(limits->min_level); in scmi_perf_msg_limits_get()
575 ph->xops->xfer_put(ph, t); in scmi_perf_msg_limits_get()
583 if (dom->fc_info && dom->fc_info[PERF_FC_LIMIT].get_addr) { in __scmi_perf_limits_get()
584 struct scmi_fc_info *fci = &dom->fc_info[PERF_FC_LIMIT]; in __scmi_perf_limits_get()
586 *max_perf = ioread32(fci->get_addr); in __scmi_perf_limits_get()
587 *min_perf = ioread32(fci->get_addr + 4); in __scmi_perf_limits_get()
589 dom->id, *min_perf, *max_perf); in __scmi_perf_limits_get()
593 return scmi_perf_msg_limits_get(ph, dom->id, max_perf, min_perf); in __scmi_perf_limits_get()
597 u32 domain, u32 *max_perf, u32 *min_perf) in scmi_perf_limits_get() argument
602 dom = scmi_perf_domain_lookup(ph, domain); in scmi_perf_limits_get()
610 if (dom->level_indexing_mode) { in scmi_perf_limits_get()
613 opp = xa_load(&dom->opps_by_idx, *min_perf); in scmi_perf_limits_get()
615 return -EIO; in scmi_perf_limits_get()
617 *min_perf = opp->perf; in scmi_perf_limits_get()
619 opp = xa_load(&dom->opps_by_idx, *max_perf); in scmi_perf_limits_get()
621 return -EIO; in scmi_perf_limits_get()
623 *max_perf = opp->perf; in scmi_perf_limits_get()
630 u32 domain, u32 level, bool poll) in scmi_perf_msg_level_set() argument
636 ret = ph->xops->xfer_get_init(ph, PERF_LEVEL_SET, sizeof(*lvl), 0, &t); in scmi_perf_msg_level_set()
640 t->hdr.poll_completion = poll; in scmi_perf_msg_level_set()
641 lvl = t->tx.buf; in scmi_perf_msg_level_set()
642 lvl->domain = cpu_to_le32(domain); in scmi_perf_msg_level_set()
643 lvl->level = cpu_to_le32(level); in scmi_perf_msg_level_set()
645 ret = ph->xops->do_xfer(ph, t); in scmi_perf_msg_level_set()
647 ph->xops->xfer_put(ph, t); in scmi_perf_msg_level_set()
655 if (dom->fc_info && dom->fc_info[PERF_FC_LEVEL].set_addr) { in __scmi_perf_level_set()
656 struct scmi_fc_info *fci = &dom->fc_info[PERF_FC_LEVEL]; in __scmi_perf_level_set()
659 dom->id, level, 0); in __scmi_perf_level_set()
660 iowrite32(level, fci->set_addr); in __scmi_perf_level_set()
661 ph->hops->fastchannel_db_ring(fci->set_db); in __scmi_perf_level_set()
665 return scmi_perf_msg_level_set(ph, dom->id, level, poll); in __scmi_perf_level_set()
669 u32 domain, u32 level, bool poll) in scmi_perf_level_set() argument
673 dom = scmi_perf_domain_lookup(ph, domain); in scmi_perf_level_set()
677 if (!dom->info.set_perf) in scmi_perf_level_set()
678 return -EOPNOTSUPP; in scmi_perf_level_set()
680 if (dom->level_indexing_mode) { in scmi_perf_level_set()
683 opp = xa_load(&dom->opps_by_lvl, level); in scmi_perf_level_set()
685 return -EIO; in scmi_perf_level_set()
687 level = opp->level_index; in scmi_perf_level_set()
694 u32 domain, u32 *level, bool poll) in scmi_perf_msg_level_get() argument
699 ret = ph->xops->xfer_get_init(ph, PERF_LEVEL_GET, in scmi_perf_msg_level_get()
704 t->hdr.poll_completion = poll; in scmi_perf_msg_level_get()
705 put_unaligned_le32(domain, t->tx.buf); in scmi_perf_msg_level_get()
707 ret = ph->xops->do_xfer(ph, t); in scmi_perf_msg_level_get()
709 *level = get_unaligned_le32(t->rx.buf); in scmi_perf_msg_level_get()
711 ph->xops->xfer_put(ph, t); in scmi_perf_msg_level_get()
719 if (dom->fc_info && dom->fc_info[PERF_FC_LEVEL].get_addr) { in __scmi_perf_level_get()
720 *level = ioread32(dom->fc_info[PERF_FC_LEVEL].get_addr); in __scmi_perf_level_get()
722 dom->id, *level, 0); in __scmi_perf_level_get()
726 return scmi_perf_msg_level_get(ph, dom->id, level, poll); in __scmi_perf_level_get()
730 u32 domain, u32 *level, bool poll) in scmi_perf_level_get() argument
735 dom = scmi_perf_domain_lookup(ph, domain); in scmi_perf_level_get()
743 if (dom->level_indexing_mode) { in scmi_perf_level_get()
746 opp = xa_load(&dom->opps_by_idx, *level); in scmi_perf_level_get()
748 return -EIO; in scmi_perf_level_get()
750 *level = opp->perf; in scmi_perf_level_get()
757 u32 domain, int message_id, in scmi_perf_level_limits_notify() argument
764 ret = ph->xops->xfer_get_init(ph, message_id, sizeof(*notify), 0, &t); in scmi_perf_level_limits_notify()
768 notify = t->tx.buf; in scmi_perf_level_limits_notify()
769 notify->domain = cpu_to_le32(domain); in scmi_perf_level_limits_notify()
770 notify->notify_enable = enable ? cpu_to_le32(BIT(0)) : 0; in scmi_perf_level_limits_notify()
772 ret = ph->xops->do_xfer(ph, t); in scmi_perf_level_limits_notify()
774 ph->xops->xfer_put(ph, t); in scmi_perf_level_limits_notify()
783 fc = devm_kcalloc(ph->dev, PERF_FC_MAX, sizeof(*fc), GFP_KERNEL); in scmi_perf_domain_init_fc()
787 ph->hops->fastchannel_init(ph, PERF_DESCRIBE_FASTCHANNEL, in scmi_perf_domain_init_fc()
788 PERF_LEVEL_GET, 4, dom->id, in scmi_perf_domain_init_fc()
791 ph->hops->fastchannel_init(ph, PERF_DESCRIBE_FASTCHANNEL, in scmi_perf_domain_init_fc()
792 PERF_LIMITS_GET, 8, dom->id, in scmi_perf_domain_init_fc()
795 if (dom->info.set_perf) in scmi_perf_domain_init_fc()
796 ph->hops->fastchannel_init(ph, PERF_DESCRIBE_FASTCHANNEL, in scmi_perf_domain_init_fc()
797 PERF_LEVEL_SET, 4, dom->id, in scmi_perf_domain_init_fc()
801 if (dom->set_limits) in scmi_perf_domain_init_fc()
802 ph->hops->fastchannel_init(ph, PERF_DESCRIBE_FASTCHANNEL, in scmi_perf_domain_init_fc()
803 PERF_LIMITS_SET, 8, dom->id, in scmi_perf_domain_init_fc()
807 dom->fc_info = fc; in scmi_perf_domain_init_fc()
811 struct device *dev, u32 domain) in scmi_dvfs_device_opps_add() argument
814 unsigned long freq; in scmi_dvfs_device_opps_add() local
818 dom = scmi_perf_domain_lookup(ph, domain); in scmi_dvfs_device_opps_add()
822 for (idx = 0; idx < dom->opp_count; idx++) { in scmi_dvfs_device_opps_add()
823 if (!dom->level_indexing_mode) in scmi_dvfs_device_opps_add()
824 freq = dom->opp[idx].perf * dom->mult_factor; in scmi_dvfs_device_opps_add()
826 freq = dom->opp[idx].indicative_freq * dom->mult_factor; in scmi_dvfs_device_opps_add()
828 data.level = dom->opp[idx].perf; in scmi_dvfs_device_opps_add()
829 data.freq = freq; in scmi_dvfs_device_opps_add()
833 dev_warn(dev, "failed to add opp %luHz\n", freq); in scmi_dvfs_device_opps_add()
839 domain, dom->info.name, idx, freq); in scmi_dvfs_device_opps_add()
846 u32 domain) in scmi_dvfs_transition_latency_get() argument
850 dom = scmi_perf_domain_lookup(ph, domain); in scmi_dvfs_transition_latency_get()
855 return dom->opp[dom->opp_count - 1].trans_latency_us * 1000; in scmi_dvfs_transition_latency_get()
858 static int scmi_dvfs_freq_set(const struct scmi_protocol_handle *ph, u32 domain, in scmi_dvfs_freq_set() argument
859 unsigned long freq, bool poll) in scmi_dvfs_freq_set() argument
864 dom = scmi_perf_domain_lookup(ph, domain); in scmi_dvfs_freq_set()
868 if (!dom->level_indexing_mode) { in scmi_dvfs_freq_set()
869 level = freq / dom->mult_factor; in scmi_dvfs_freq_set()
873 opp = LOOKUP_BY_FREQ(dom->opps_by_freq, in scmi_dvfs_freq_set()
874 freq / dom->mult_factor); in scmi_dvfs_freq_set()
876 return -EIO; in scmi_dvfs_freq_set()
878 level = opp->level_index; in scmi_dvfs_freq_set()
884 static int scmi_dvfs_freq_get(const struct scmi_protocol_handle *ph, u32 domain, in scmi_dvfs_freq_get() argument
885 unsigned long *freq, bool poll) in scmi_dvfs_freq_get() argument
891 dom = scmi_perf_domain_lookup(ph, domain); in scmi_dvfs_freq_get()
899 if (!dom->level_indexing_mode) { in scmi_dvfs_freq_get()
900 *freq = level * dom->mult_factor; in scmi_dvfs_freq_get()
904 opp = xa_load(&dom->opps_by_idx, level); in scmi_dvfs_freq_get()
906 return -EIO; in scmi_dvfs_freq_get()
908 *freq = opp->indicative_freq * dom->mult_factor; in scmi_dvfs_freq_get()
915 u32 domain, unsigned long *freq, in scmi_dvfs_est_power_get() argument
920 int idx, ret = -EINVAL; in scmi_dvfs_est_power_get()
923 dom = scmi_perf_domain_lookup(ph, domain); in scmi_dvfs_est_power_get()
927 for (opp = dom->opp, idx = 0; idx < dom->opp_count; idx++, opp++) { in scmi_dvfs_est_power_get()
928 if (!dom->level_indexing_mode) in scmi_dvfs_est_power_get()
929 opp_freq = opp->perf * dom->mult_factor; in scmi_dvfs_est_power_get()
931 opp_freq = opp->indicative_freq * dom->mult_factor; in scmi_dvfs_est_power_get()
933 if (opp_freq < *freq) in scmi_dvfs_est_power_get()
936 *freq = opp_freq; in scmi_dvfs_est_power_get()
937 *power = opp->power; in scmi_dvfs_est_power_get()
946 u32 domain) in scmi_fast_switch_possible() argument
950 dom = scmi_perf_domain_lookup(ph, domain); in scmi_fast_switch_possible()
954 return dom->fc_info && dom->fc_info[PERF_FC_LEVEL].set_addr; in scmi_fast_switch_possible()
960 struct scmi_perf_info *pi = ph->get_priv(ph); in scmi_power_scale_get()
962 return pi->power_scale; in scmi_power_scale_get()
987 return -EINVAL; in scmi_perf_set_notify_enabled()
992 pr_debug("FAIL_ENABLED - evt[%X] dom[%d] - ret:%d\n", in scmi_perf_set_notify_enabled()
1014 r->timestamp = timestamp; in scmi_perf_fill_custom_report()
1015 r->agent_id = le32_to_cpu(p->agent_id); in scmi_perf_fill_custom_report()
1016 r->domain_id = le32_to_cpu(p->domain_id); in scmi_perf_fill_custom_report()
1017 r->range_max = le32_to_cpu(p->range_max); in scmi_perf_fill_custom_report()
1018 r->range_min = le32_to_cpu(p->range_min); in scmi_perf_fill_custom_report()
1019 *src_id = r->domain_id; in scmi_perf_fill_custom_report()
1031 r->timestamp = timestamp; in scmi_perf_fill_custom_report()
1032 r->agent_id = le32_to_cpu(p->agent_id); in scmi_perf_fill_custom_report()
1033 r->domain_id = le32_to_cpu(p->domain_id); in scmi_perf_fill_custom_report()
1034 r->performance_level = le32_to_cpu(p->performance_level); in scmi_perf_fill_custom_report()
1035 *src_id = r->domain_id; in scmi_perf_fill_custom_report()
1048 struct scmi_perf_info *pi = ph->get_priv(ph); in scmi_perf_get_num_sources()
1051 return -EINVAL; in scmi_perf_get_num_sources()
1053 return pi->num_domains; in scmi_perf_get_num_sources()
1084 int domain, ret; in scmi_perf_protocol_init() local
1088 ret = ph->xops->version_get(ph, &version); in scmi_perf_protocol_init()
1092 dev_dbg(ph->dev, "Performance Version %d.%d\n", in scmi_perf_protocol_init()
1095 pinfo = devm_kzalloc(ph->dev, sizeof(*pinfo), GFP_KERNEL); in scmi_perf_protocol_init()
1097 return -ENOMEM; in scmi_perf_protocol_init()
1099 pinfo->version = version; in scmi_perf_protocol_init()
1105 pinfo->dom_info = devm_kcalloc(ph->dev, pinfo->num_domains, in scmi_perf_protocol_init()
1106 sizeof(*pinfo->dom_info), GFP_KERNEL); in scmi_perf_protocol_init()
1107 if (!pinfo->dom_info) in scmi_perf_protocol_init()
1108 return -ENOMEM; in scmi_perf_protocol_init()
1110 for (domain = 0; domain < pinfo->num_domains; domain++) { in scmi_perf_protocol_init()
1111 struct perf_dom_info *dom = pinfo->dom_info + domain; in scmi_perf_protocol_init()
1113 dom->id = domain; in scmi_perf_protocol_init()
1117 if (dom->perf_fastchannels) in scmi_perf_protocol_init()
1121 ret = devm_add_action_or_reset(ph->dev, scmi_perf_xa_destroy, pinfo); in scmi_perf_protocol_init()
1125 return ph->set_priv(ph, pinfo, version); in scmi_perf_protocol_init()