Lines Matching +full:comp +full:- +full:disable
1 // SPDX-License-Identifier: GPL-2.0
44 * mpam_enabled key is enabled these lists are read-only,
78 * All mpam error interrupts indicate a software bug. On receipt, disable the
88 * mpam_is_enabled(). The disable call after an error interrupt makes
96 * their RIS index. These share a base-address, interrupts and some MMIO
102 * are from different MSC, so have different base-address, interrupts etc.
114 * e.g. The L2 may have one MSC and two RIS, one for cache-controls another
126 * The same MSC may exist under different class->component->vmsc paths, but the
136 init_llist_node(&garbage->llist); in init_garbage()
142 _x->garbage.to_free = _x; \
143 llist_add(&_x->garbage.llist, &mpam_garbage); \
157 if (iter->pdev) in mpam_free_garbage()
158 devm_kfree(&iter->pdev->dev, iter->to_free); in mpam_free_garbage()
160 kfree(iter->to_free); in mpam_free_garbage()
182 WARN_ON_ONCE(!cpumask_test_cpu(smp_processor_id(), &msc->accessibility)); in __mpam_read_reg()
184 return readl_relaxed(msc->mapped_hwpage + reg); in __mpam_read_reg()
189 lockdep_assert_held_once(&msc->part_sel_lock); in _mpam_read_partsel_reg()
197 WARN_ON_ONCE(reg + sizeof(u32) > msc->mapped_hwpage_sz); in __mpam_write_reg()
198 WARN_ON_ONCE(!cpumask_test_cpu(smp_processor_id(), &msc->accessibility)); in __mpam_write_reg()
200 writel_relaxed(val, msc->mapped_hwpage + reg); in __mpam_write_reg()
205 lockdep_assert_held_once(&msc->part_sel_lock); in _mpam_write_partsel_reg()
249 lockdep_assert_held(&msc->part_sel_lock); in mpam_msc_read_idr()
271 if (msc->has_extd_esr) in mpam_msc_clear_esr()
281 if (msc->has_extd_esr) in mpam_msc_read_esr()
289 lockdep_assert_held(&msc->part_sel_lock); in __mpam_part_sel_raw()
324 return -EBUSY; in mpam_register_requestor()
340 return ERR_PTR(-ENOMEM); in mpam_class_alloc()
341 init_garbage(&class->garbage); in mpam_class_alloc()
343 INIT_LIST_HEAD_RCU(&class->components); in mpam_class_alloc()
345 class->level = level_idx; in mpam_class_alloc()
346 class->type = type; in mpam_class_alloc()
347 INIT_LIST_HEAD_RCU(&class->classes_list); in mpam_class_alloc()
348 ida_init(&class->ida_csu_mon); in mpam_class_alloc()
349 ida_init(&class->ida_mbwu_mon); in mpam_class_alloc()
351 list_add_rcu(&class->classes_list, &mpam_classes); in mpam_class_alloc()
360 list_del_rcu(&class->classes_list); in mpam_class_destroy()
372 if (class->type == type && class->level == level_idx) in mpam_class_find()
382 struct mpam_component *comp; in mpam_component_alloc() local
386 comp = kzalloc_obj(*comp); in mpam_component_alloc()
387 if (!comp) in mpam_component_alloc()
388 return ERR_PTR(-ENOMEM); in mpam_component_alloc()
389 init_garbage(&comp->garbage); in mpam_component_alloc()
391 comp->comp_id = id; in mpam_component_alloc()
392 INIT_LIST_HEAD_RCU(&comp->vmsc); in mpam_component_alloc()
394 INIT_LIST_HEAD_RCU(&comp->class_list); in mpam_component_alloc()
395 comp->class = class; in mpam_component_alloc()
397 list_add_rcu(&comp->class_list, &class->components); in mpam_component_alloc()
399 return comp; in mpam_component_alloc()
402 static void __destroy_component_cfg(struct mpam_component *comp);
404 static void mpam_component_destroy(struct mpam_component *comp) in mpam_component_destroy() argument
406 struct mpam_class *class = comp->class; in mpam_component_destroy()
410 __destroy_component_cfg(comp); in mpam_component_destroy()
412 list_del_rcu(&comp->class_list); in mpam_component_destroy()
413 add_to_garbage(comp); in mpam_component_destroy()
415 if (list_empty(&class->components)) in mpam_component_destroy()
422 struct mpam_component *comp; in mpam_component_find() local
426 list_for_each_entry(comp, &class->components, class_list) { in mpam_component_find()
427 if (comp->comp_id == id) in mpam_component_find()
428 return comp; in mpam_component_find()
435 mpam_vmsc_alloc(struct mpam_component *comp, struct mpam_msc *msc) in mpam_vmsc_alloc() argument
443 return ERR_PTR(-ENOMEM); in mpam_vmsc_alloc()
444 init_garbage(&vmsc->garbage); in mpam_vmsc_alloc()
446 INIT_LIST_HEAD_RCU(&vmsc->ris); in mpam_vmsc_alloc()
447 INIT_LIST_HEAD_RCU(&vmsc->comp_list); in mpam_vmsc_alloc()
448 vmsc->comp = comp; in mpam_vmsc_alloc()
449 vmsc->msc = msc; in mpam_vmsc_alloc()
451 list_add_rcu(&vmsc->comp_list, &comp->vmsc); in mpam_vmsc_alloc()
458 struct mpam_component *comp = vmsc->comp; in mpam_vmsc_destroy() local
462 list_del_rcu(&vmsc->comp_list); in mpam_vmsc_destroy()
465 if (list_empty(&comp->vmsc)) in mpam_vmsc_destroy()
466 mpam_component_destroy(comp); in mpam_vmsc_destroy()
470 mpam_vmsc_find(struct mpam_component *comp, struct mpam_msc *msc) in mpam_vmsc_find() argument
476 list_for_each_entry(vmsc, &comp->vmsc, comp_list) { in mpam_vmsc_find()
477 if (vmsc->msc->id == msc->id) in mpam_vmsc_find()
481 return mpam_vmsc_alloc(comp, msc); in mpam_vmsc_find()
511 struct mpam_component *comp) in mpam_ris_get_affinity() argument
517 err = mpam_get_cpumask_from_cache_id(comp->comp_id, class->level, in mpam_ris_get_affinity()
520 dev_warn_once(&msc->pdev->dev, in mpam_ris_get_affinity()
526 dev_warn_once(&msc->pdev->dev, "no CPUs associated with cache node\n"); in mpam_ris_get_affinity()
530 get_cpumask_from_node_id(comp->comp_id, affinity); in mpam_ris_get_affinity()
531 /* affinity may be empty for CPU-less memory nodes */ in mpam_ris_get_affinity()
537 cpumask_and(affinity, affinity, &msc->accessibility); in mpam_ris_get_affinity()
550 struct mpam_component *comp; in mpam_ris_create_locked() local
551 struct platform_device *pdev = msc->pdev; in mpam_ris_create_locked()
556 return -EINVAL; in mpam_ris_create_locked()
558 if (test_and_set_bit(ris_idx, &msc->ris_idxs)) in mpam_ris_create_locked()
559 return -EBUSY; in mpam_ris_create_locked()
561 ris = devm_kzalloc(&msc->pdev->dev, sizeof(*ris), GFP_KERNEL); in mpam_ris_create_locked()
563 return -ENOMEM; in mpam_ris_create_locked()
564 init_garbage(&ris->garbage); in mpam_ris_create_locked()
565 ris->garbage.pdev = pdev; in mpam_ris_create_locked()
571 comp = mpam_component_find(class, component_id); in mpam_ris_create_locked()
572 if (IS_ERR(comp)) { in mpam_ris_create_locked()
573 if (list_empty(&class->components)) in mpam_ris_create_locked()
575 return PTR_ERR(comp); in mpam_ris_create_locked()
578 vmsc = mpam_vmsc_find(comp, msc); in mpam_ris_create_locked()
580 if (list_empty(&comp->vmsc)) in mpam_ris_create_locked()
581 mpam_component_destroy(comp); in mpam_ris_create_locked()
585 err = mpam_ris_get_affinity(msc, &ris->affinity, type, class, comp); in mpam_ris_create_locked()
587 if (list_empty(&vmsc->ris)) in mpam_ris_create_locked()
592 ris->ris_idx = ris_idx; in mpam_ris_create_locked()
593 INIT_LIST_HEAD_RCU(&ris->msc_list); in mpam_ris_create_locked()
594 INIT_LIST_HEAD_RCU(&ris->vmsc_list); in mpam_ris_create_locked()
595 ris->vmsc = vmsc; in mpam_ris_create_locked()
597 cpumask_or(&comp->affinity, &comp->affinity, &ris->affinity); in mpam_ris_create_locked()
598 cpumask_or(&class->affinity, &class->affinity, &ris->affinity); in mpam_ris_create_locked()
599 list_add_rcu(&ris->vmsc_list, &vmsc->ris); in mpam_ris_create_locked()
600 list_add_rcu(&ris->msc_list, &msc->ris); in mpam_ris_create_locked()
607 struct mpam_vmsc *vmsc = ris->vmsc; in mpam_ris_destroy()
608 struct mpam_msc *msc = vmsc->msc; in mpam_ris_destroy()
609 struct mpam_component *comp = vmsc->comp; in mpam_ris_destroy() local
610 struct mpam_class *class = comp->class; in mpam_ris_destroy()
618 cpumask_andnot(&class->affinity, &class->affinity, &ris->affinity); in mpam_ris_destroy()
619 cpumask_andnot(&comp->affinity, &comp->affinity, &ris->affinity); in mpam_ris_destroy()
620 clear_bit(ris->ris_idx, &msc->ris_idxs); in mpam_ris_destroy()
621 list_del_rcu(&ris->msc_list); in mpam_ris_destroy()
622 list_del_rcu(&ris->vmsc_list); in mpam_ris_destroy()
625 if (list_empty(&vmsc->ris)) in mpam_ris_destroy()
652 if (!test_bit(ris_idx, &msc->ris_idxs)) { in mpam_get_or_create_ris()
659 list_for_each_entry(ris, &msc->ris, msc_list) { in mpam_get_or_create_ris()
660 if (ris->ris_idx == ris_idx) in mpam_get_or_create_ris()
664 return ERR_PTR(-ENOENT); in mpam_get_or_create_ris()
679 return -EINVAL; in mpam_enable_quirk_nvidia_t241_1()
681 r = platform_get_resource(msc->pdev, IORESOURCE_MEM, 0); in mpam_enable_quirk_nvidia_t241_1()
683 return -EINVAL; in mpam_enable_quirk_nvidia_t241_1()
686 msc->t241_id = T241_CHIP_ID(r->start); in mpam_enable_quirk_nvidia_t241_1()
687 phys = FIELD_PREP(GENMASK_ULL(45, 44), msc->t241_id) | 0x19000000ULL; in mpam_enable_quirk_nvidia_t241_1()
689 t241_scratch_regs[msc->t241_id] = ioremap(phys, SZ_8M); in mpam_enable_quirk_nvidia_t241_1()
690 if (WARN_ON_ONCE(!t241_scratch_regs[msc->t241_id])) in mpam_enable_quirk_nvidia_t241_1()
691 return -EINVAL; in mpam_enable_quirk_nvidia_t241_1()
693 pr_info_once("Enabled workaround for NVIDIA T241 erratum T241-MPAM-1\n"); in mpam_enable_quirk_nvidia_t241_1()
700 /* NVIDIA t241 erratum T241-MPAM-1 */
707 /* NVIDIA t241 erratum T241-MPAM-4 */
713 /* NVIDIA t241 erratum T241-MPAM-6 */
719 /* ARM CMN-650 CSU erratum 3642720 */
731 for (quirk = &mpam_quirks[0]; quirk->iidr_mask; quirk++) { in mpam_enable_quirks()
734 if (quirk->iidr != (msc->iidr & quirk->iidr_mask)) in mpam_enable_quirks()
737 if (quirk->init) in mpam_enable_quirks()
738 err = quirk->init(msc, quirk); in mpam_enable_quirks()
743 mpam_set_quirk(quirk->workaround, msc); in mpam_enable_quirks()
749 * of NRDY, software can use this bit for any purpose" - so hardware might not
750 * implement this - but it isn't RES0.
759 struct mpam_msc *msc = ris->vmsc->msc; in mpam_ris_hw_probe_csu_nrdy()
765 FIELD_PREP(MSMON_CFG_MON_SEL_RIS, ris->ris_idx); in mpam_ris_hw_probe_csu_nrdy()
793 struct mpam_msc *msc = ris->vmsc->msc; in mpam_ris_hw_probe()
794 struct device *dev = &msc->pdev->dev; in mpam_ris_hw_probe()
795 struct mpam_props *props = &ris->props; in mpam_ris_hw_probe()
796 struct mpam_class *class = ris->vmsc->comp->class; in mpam_ris_hw_probe()
798 lockdep_assert_held(&msc->probe_lock); in mpam_ris_hw_probe()
799 lockdep_assert_held(&msc->part_sel_lock); in mpam_ris_hw_probe()
802 if (FIELD_GET(MPAMF_IDR_HAS_CCAP_PART, ris->idr)) { in mpam_ris_hw_probe()
805 props->cmax_wd = FIELD_GET(MPAMF_CCAP_IDR_CMAX_WD, ccap_features); in mpam_ris_hw_probe()
806 if (props->cmax_wd && in mpam_ris_hw_probe()
810 if (props->cmax_wd && in mpam_ris_hw_probe()
814 if (props->cmax_wd && in mpam_ris_hw_probe()
818 props->cassoc_wd = FIELD_GET(MPAMF_CCAP_IDR_CASSOC_WD, ccap_features); in mpam_ris_hw_probe()
819 if (props->cassoc_wd && in mpam_ris_hw_probe()
825 if (FIELD_GET(MPAMF_IDR_HAS_CPOR_PART, ris->idr)) { in mpam_ris_hw_probe()
828 props->cpbm_wd = FIELD_GET(MPAMF_CPOR_IDR_CPBM_WD, cpor_features); in mpam_ris_hw_probe()
829 if (props->cpbm_wd) in mpam_ris_hw_probe()
834 if (FIELD_GET(MPAMF_IDR_HAS_MBW_PART, ris->idr)) { in mpam_ris_hw_probe()
838 props->mbw_pbm_bits = FIELD_GET(MPAMF_MBW_IDR_BWPBM_WD, mbw_features); in mpam_ris_hw_probe()
839 if (props->mbw_pbm_bits && in mpam_ris_hw_probe()
843 props->bwa_wd = FIELD_GET(MPAMF_MBW_IDR_BWA_WD, mbw_features); in mpam_ris_hw_probe()
846 * The BWA_WD field can represent 0-63, but the control fields it in mpam_ris_hw_probe()
849 props->bwa_wd = min(props->bwa_wd, 16); in mpam_ris_hw_probe()
851 if (props->bwa_wd && FIELD_GET(MPAMF_MBW_IDR_HAS_MAX, mbw_features)) in mpam_ris_hw_probe()
854 if (props->bwa_wd && FIELD_GET(MPAMF_MBW_IDR_HAS_MIN, mbw_features)) in mpam_ris_hw_probe()
857 if (props->bwa_wd && FIELD_GET(MPAMF_MBW_IDR_HAS_PROP, mbw_features)) in mpam_ris_hw_probe()
862 if (FIELD_GET(MPAMF_IDR_HAS_PRI_PART, ris->idr)) { in mpam_ris_hw_probe()
865 props->intpri_wd = FIELD_GET(MPAMF_PRI_IDR_INTPRI_WD, pri_features); in mpam_ris_hw_probe()
866 if (props->intpri_wd && FIELD_GET(MPAMF_PRI_IDR_HAS_INTPRI, pri_features)) { in mpam_ris_hw_probe()
872 props->dspri_wd = FIELD_GET(MPAMF_PRI_IDR_DSPRI_WD, pri_features); in mpam_ris_hw_probe()
873 if (props->dspri_wd && FIELD_GET(MPAMF_PRI_IDR_HAS_DSPRI, pri_features)) { in mpam_ris_hw_probe()
881 if (FIELD_GET(MPAMF_IDR_HAS_MSMON, ris->idr)) { in mpam_ris_hw_probe()
885 * If the firmware max-nrdy-us property is missing, the in mpam_ris_hw_probe()
888 err = device_property_read_u32(&msc->pdev->dev, in mpam_ris_hw_probe()
889 "arm,not-ready-us", in mpam_ris_hw_probe()
890 &msc->nrdy_usec); in mpam_ris_hw_probe()
896 props->num_csu_mon = FIELD_GET(MPAMF_CSUMON_IDR_NUM_MON, csumonidr); in mpam_ris_hw_probe()
897 if (props->num_csu_mon) { in mpam_ris_hw_probe()
910 * un-implemented. in mpam_ris_hw_probe()
913 …dev_err_once(dev, "Counters are not usable because not-ready timeout was not provided by firmware.… in mpam_ris_hw_probe()
920 props->num_mbwu_mon = FIELD_GET(MPAMF_MBWUMON_IDR_NUM_MON, mbwumon_idr); in mpam_ris_hw_probe()
921 if (props->num_mbwu_mon) { in mpam_ris_hw_probe()
946 if (FIELD_GET(MPAMF_IDR_HAS_PARTID_NRW, ris->idr) && in mpam_ris_hw_probe()
947 class->type != MPAM_CLASS_UNKNOWN) { in mpam_ris_hw_probe()
952 msc->partid_max = min(msc->partid_max, partid_max); in mpam_ris_hw_probe()
962 struct device *dev = &msc->pdev->dev; in mpam_msc_hw_probe()
964 lockdep_assert_held(&msc->probe_lock); in mpam_msc_hw_probe()
968 return -EIO; in mpam_msc_hw_probe()
972 mutex_lock(&msc->part_sel_lock); in mpam_msc_hw_probe()
974 msc->iidr = mpam_read_partsel_reg(msc, IIDR); in mpam_msc_hw_probe()
975 mutex_unlock(&msc->part_sel_lock); in mpam_msc_hw_probe()
979 msc->ris_max = FIELD_GET(MPAMF_IDR_RIS_MAX, idr); in mpam_msc_hw_probe()
982 msc->partid_max = FIELD_GET(MPAMF_IDR_PARTID_MAX, idr); in mpam_msc_hw_probe()
983 msc->pmg_max = FIELD_GET(MPAMF_IDR_PMG_MAX, idr); in mpam_msc_hw_probe()
985 for (ris_idx = 0; ris_idx <= msc->ris_max; ris_idx++) { in mpam_msc_hw_probe()
986 mutex_lock(&msc->part_sel_lock); in mpam_msc_hw_probe()
989 mutex_unlock(&msc->part_sel_lock); in mpam_msc_hw_probe()
993 msc->partid_max = min(msc->partid_max, partid_max); in mpam_msc_hw_probe()
994 msc->pmg_max = min(msc->pmg_max, pmg_max); in mpam_msc_hw_probe()
995 msc->has_extd_esr = FIELD_GET(MPAMF_IDR_HAS_EXTD_ESR, idr); in mpam_msc_hw_probe()
1002 ris->idr = idr; in mpam_msc_hw_probe()
1004 mutex_lock(&msc->part_sel_lock); in mpam_msc_hw_probe()
1007 mutex_unlock(&msc->part_sel_lock); in mpam_msc_hw_probe()
1014 mpam_partid_max = min(mpam_partid_max, msc->partid_max); in mpam_msc_hw_probe()
1015 mpam_pmg_max = min(mpam_pmg_max, msc->pmg_max); in mpam_msc_hw_probe()
1018 msc->probed = true; in mpam_msc_hw_probe()
1034 return (mpam_has_feature(mpam_feat_msmon_mbwu_63counter, &ris->props) || in mpam_ris_has_mbwu_long_counter()
1035 mpam_has_feature(mpam_feat_msmon_mbwu_44counter, &ris->props)); in mpam_ris_has_mbwu_long_counter()
1046 WARN_ON_ONCE((MSMON_MBWU_L + sizeof(u64)) > msc->mapped_hwpage_sz); in mpam_msc_read_mbwu_l()
1047 WARN_ON_ONCE(!cpumask_test_cpu(smp_processor_id(), &msc->accessibility)); in mpam_msc_read_mbwu_l()
1055 retry--; in mpam_msc_read_mbwu_l()
1069 WARN_ON_ONCE((MSMON_MBWU_L + sizeof(u64)) > msc->mapped_hwpage_sz); in mpam_msc_zero_mbwu_l()
1070 WARN_ON_ONCE(!cpumask_test_cpu(smp_processor_id(), &msc->accessibility)); in mpam_msc_zero_mbwu_l()
1079 struct mon_cfg *ctx = m->ctx; in gen_msmon_ctl_flt_vals()
1082 * For CSU counters its implementation-defined what happens when not in gen_msmon_ctl_flt_vals()
1087 *flt_val = FIELD_PREP(MSMON_CFG_x_FLT_PARTID, ctx->partid); in gen_msmon_ctl_flt_vals()
1089 if (m->ctx->match_pmg) { in gen_msmon_ctl_flt_vals()
1091 *flt_val |= FIELD_PREP(MSMON_CFG_x_FLT_PMG, ctx->pmg); in gen_msmon_ctl_flt_vals()
1094 switch (m->type) { in gen_msmon_ctl_flt_vals()
1098 if (mpam_has_feature(mpam_feat_msmon_csu_xcl, &m->ris->props)) in gen_msmon_ctl_flt_vals()
1099 *flt_val |= FIELD_PREP(MSMON_CFG_CSU_FLT_XCL, ctx->csu_exclude_clean); in gen_msmon_ctl_flt_vals()
1107 if (mpam_has_feature(mpam_feat_msmon_mbwu_rwbw, &m->ris->props)) in gen_msmon_ctl_flt_vals()
1108 *flt_val |= FIELD_PREP(MSMON_CFG_MBWU_FLT_RWBW, ctx->opts); in gen_msmon_ctl_flt_vals()
1112 pr_warn("Unexpected monitor type %d\n", m->type); in gen_msmon_ctl_flt_vals()
1119 struct mpam_msc *msc = m->ris->vmsc->msc; in read_msmon_ctl_flt_vals()
1121 switch (m->type) { in read_msmon_ctl_flt_vals()
1133 pr_warn("Unexpected monitor type %d\n", m->type); in read_msmon_ctl_flt_vals()
1149 struct mpam_msc *msc = m->ris->vmsc->msc; in write_msmon_ctl_flt_vals()
1155 switch (m->type) { in write_msmon_ctl_flt_vals()
1169 if (m->type == mpam_feat_msmon_mbwu_31counter) in write_msmon_ctl_flt_vals()
1172 mpam_msc_zero_mbwu_l(m->ris->vmsc->msc); in write_msmon_ctl_flt_vals()
1175 pr_warn("Unexpected monitor type %d\n", m->type); in write_msmon_ctl_flt_vals()
1212 struct mon_cfg *ctx = m->ctx; in __ris_msmon_read()
1214 struct mpam_msc_ris *ris = m->ris; in __ris_msmon_read()
1216 struct mpam_msc *msc = m->ris->vmsc->msc; in __ris_msmon_read()
1220 m->err = -EIO; in __ris_msmon_read()
1223 mon_sel = FIELD_PREP(MSMON_CFG_MON_SEL_MON_SEL, ctx->mon) | in __ris_msmon_read()
1224 FIELD_PREP(MSMON_CFG_MON_SEL_RIS, ris->ris_idx); in __ris_msmon_read()
1227 switch (m->type) { in __ris_msmon_read()
1231 mbwu_state = &ris->mbwu_state[ctx->mon]; in __ris_msmon_read()
1233 reset_on_next_read = mbwu_state->reset_on_next_read; in __ris_msmon_read()
1234 mbwu_state->reset_on_next_read = false; in __ris_msmon_read()
1242 * Read the existing configuration to avoid re-writing the same values. in __ris_msmon_read()
1247 if (mpam_feat_msmon_mbwu_31counter == m->type) in __ris_msmon_read()
1249 else if (mpam_feat_msmon_mbwu_44counter == m->type || in __ris_msmon_read()
1250 mpam_feat_msmon_mbwu_63counter == m->type) in __ris_msmon_read()
1268 switch (m->type) { in __ris_msmon_read()
1274 if (mpam_has_quirk(IGNORE_CSU_NRDY, msc) && m->waited_timeout) in __ris_msmon_read()
1281 if (m->type != mpam_feat_msmon_mbwu_31counter) { in __ris_msmon_read()
1285 if (m->type == mpam_feat_msmon_mbwu_63counter) in __ris_msmon_read()
1301 mbwu_state = &ris->mbwu_state[ctx->mon]; in __ris_msmon_read()
1304 mbwu_state->correction += mpam_msmon_overflow_val(m->type, msc); in __ris_msmon_read()
1310 now += mbwu_state->correction; in __ris_msmon_read()
1313 m->err = -EINVAL; in __ris_msmon_read()
1318 m->err = -EBUSY; in __ris_msmon_read()
1320 if (m->err) in __ris_msmon_read()
1323 *m->val += now; in __ris_msmon_read()
1326 static int _msmon_read(struct mpam_component *comp, struct mon_read *arg) in _msmon_read() argument
1332 list_for_each_entry_srcu(vmsc, &comp->vmsc, comp_list, in _msmon_read()
1334 struct mpam_msc *msc = vmsc->msc; in _msmon_read()
1337 list_for_each_entry_srcu(ris, &vmsc->ris, vmsc_list, in _msmon_read()
1339 arg->ris = ris; in _msmon_read()
1341 err = smp_call_function_any(&msc->accessibility, in _msmon_read()
1344 if (!err && arg->err) in _msmon_read()
1345 err = arg->err; in _msmon_read()
1362 struct mpam_props *cprops = &class->props; in mpam_msmon_choose_counter()
1372 int mpam_msmon_read(struct mpam_component *comp, struct mon_cfg *ctx, in mpam_msmon_read() argument
1378 struct mpam_class *class = comp->class; in mpam_msmon_read()
1379 struct mpam_props *cprops = &class->props; in mpam_msmon_read()
1384 return -EIO; in mpam_msmon_read()
1387 return -EOPNOTSUPP; in mpam_msmon_read()
1399 err = _msmon_read(comp, &arg); in mpam_msmon_read()
1400 if (err == -EBUSY && class->nrdy_usec) in mpam_msmon_read()
1401 wait_jiffies = usecs_to_jiffies(class->nrdy_usec); in mpam_msmon_read()
1406 if (err == -EBUSY) { in mpam_msmon_read()
1415 err = _msmon_read(comp, &arg); in mpam_msmon_read()
1421 void mpam_msmon_reset_mbwu(struct mpam_component *comp, struct mon_cfg *ctx) in mpam_msmon_reset_mbwu() argument
1431 list_for_each_entry_srcu(vmsc, &comp->vmsc, comp_list, in mpam_msmon_reset_mbwu()
1433 if (!mpam_has_feature(mpam_feat_msmon_mbwu, &vmsc->props)) in mpam_msmon_reset_mbwu()
1436 msc = vmsc->msc; in mpam_msmon_reset_mbwu()
1437 list_for_each_entry_srcu(ris, &vmsc->ris, vmsc_list, in mpam_msmon_reset_mbwu()
1439 if (!mpam_has_feature(mpam_feat_msmon_mbwu, &ris->props)) in mpam_msmon_reset_mbwu()
1445 ris->mbwu_state[ctx->mon].correction = 0; in mpam_msmon_reset_mbwu()
1446 ris->mbwu_state[ctx->mon].reset_on_next_read = true; in mpam_msmon_reset_mbwu()
1458 lockdep_assert_held(&msc->part_sel_lock); in mpam_reset_msc_bitmap()
1464 * Write all ~0 to all but the last 32bit-word, which may in mpam_reset_msc_bitmap()
1468 for (i = 0; i < num_words - 1; i++, reg += sizeof(bm)) in mpam_reset_msc_bitmap()
1475 msb = (wd - 1) % 32; in mpam_reset_msc_bitmap()
1486 regs = t241_scratch_regs[ris->vmsc->msc->t241_id]; in mpam_apply_t241_erratum()
1514 if (mpam_has_quirk(T241_SCRUB_SHADOW_REGS, ris->vmsc->msc)) in mpam_quirk_post_config_change()
1522 res0_bits = 16 - props->bwa_wd; in mpam_wa_t241_force_mbw_min_to_one()
1523 max_hw_value = ((1 << props->bwa_wd) - 1) << res0_bits; in mpam_wa_t241_force_mbw_min_to_one()
1534 u16 delta = ((5 * MPAMCFG_MBW_MAX_MAX) / 100) - 1; in mpam_wa_t241_calc_min_from_max()
1537 max = cfg->mbw_max; in mpam_wa_t241_calc_min_from_max()
1540 max = GENMASK(15, 16 - props->bwa_wd); in mpam_wa_t241_calc_min_from_max()
1544 val = max - delta; in mpam_wa_t241_calc_min_from_max()
1554 struct mpam_msc *msc = ris->vmsc->msc; in mpam_reprogram_ris_partid()
1555 struct mpam_props *rprops = &ris->props; in mpam_reprogram_ris_partid()
1557 mutex_lock(&msc->part_sel_lock); in mpam_reprogram_ris_partid()
1558 __mpam_part_sel(ris->ris_idx, partid, msc); in mpam_reprogram_ris_partid()
1569 __mpam_intpart_sel(ris->ris_idx, partid, msc); in mpam_reprogram_ris_partid()
1574 mpam_write_partsel_reg(msc, CPBM, cfg->cpbm); in mpam_reprogram_ris_partid()
1576 mpam_reset_msc_bitmap(msc, MPAMCFG_CPBM, rprops->cpbm_wd); in mpam_reprogram_ris_partid()
1581 mpam_write_partsel_reg(msc, MBW_PBM, cfg->mbw_pbm); in mpam_reprogram_ris_partid()
1583 mpam_reset_msc_bitmap(msc, MPAMCFG_MBW_PBM, rprops->mbw_pbm_bits); in mpam_reprogram_ris_partid()
1601 mpam_write_partsel_reg(msc, MBW_MAX, cfg->mbw_max); in mpam_reprogram_ris_partid()
1623 u16 intpri = GENMASK(rprops->intpri_wd - 1, 0); in mpam_reprogram_ris_partid()
1632 u16 dspri = GENMASK(rprops->dspri_wd - 1, 0); in mpam_reprogram_ris_partid()
1645 mutex_unlock(&msc->part_sel_lock); in mpam_reprogram_ris_partid()
1655 struct mpam_class *class = ris->vmsc->comp->class; in mpam_restore_mbwu_state()
1657 for (i = 0; i < ris->props.num_mbwu_mon; i++) { in mpam_restore_mbwu_state()
1658 if (ris->mbwu_state[i].enabled) { in mpam_restore_mbwu_state()
1660 mwbu_arg.ctx = &ris->mbwu_state[i].cfg; in mpam_restore_mbwu_state()
1680 struct mpam_msc *msc = ris->vmsc->msc; in mpam_save_mbwu_state()
1682 for (i = 0; i < ris->props.num_mbwu_mon; i++) { in mpam_save_mbwu_state()
1683 mbwu_state = &ris->mbwu_state[i]; in mpam_save_mbwu_state()
1684 cfg = &mbwu_state->cfg; in mpam_save_mbwu_state()
1687 return -EIO; in mpam_save_mbwu_state()
1690 FIELD_PREP(MSMON_CFG_MON_SEL_RIS, ris->ris_idx); in mpam_save_mbwu_state()
1705 cfg->mon = i; in mpam_save_mbwu_state()
1706 cfg->pmg = FIELD_GET(MSMON_CFG_x_FLT_PMG, cur_flt); in mpam_save_mbwu_state()
1707 cfg->match_pmg = FIELD_GET(MSMON_CFG_x_CTL_MATCH_PMG, cur_ctl); in mpam_save_mbwu_state()
1708 cfg->partid = FIELD_GET(MSMON_CFG_x_FLT_PARTID, cur_flt); in mpam_save_mbwu_state()
1709 mbwu_state->correction += val; in mpam_save_mbwu_state()
1710 mbwu_state->enabled = FIELD_GET(MSMON_CFG_x_CTL_EN, cur_ctl); in mpam_save_mbwu_state()
1719 * pre-emptible. Caller must hold mpam_srcu.
1727 if (ris->in_reset_state) in mpam_reset_ris()
1748 if (cpumask_test_cpu(cpu, &msc->accessibility)) in mpam_get_msc_preferred_cpu()
1751 return cpumask_first_and(&msc->accessibility, cpu_online_mask); in mpam_get_msc_preferred_cpu()
1765 struct mpam_component *comp; member
1773 mpam_reprogram_ris_partid(c->ris, c->partid, &c->comp->cfg[c->partid]); in __write_config()
1792 mutex_lock(&msc->cfg_lock); in mpam_reprogram_msc()
1793 list_for_each_entry_srcu(ris, &msc->ris, msc_list, in mpam_reprogram_msc()
1795 if (!mpam_is_enabled() && !ris->in_reset_state) { in mpam_reprogram_msc()
1797 ris->in_reset_state = true; in mpam_reprogram_msc()
1801 arg.comp = ris->vmsc->comp; in mpam_reprogram_msc()
1805 cfg = &ris->vmsc->comp->cfg[partid]; in mpam_reprogram_msc()
1806 if (!bitmap_empty(cfg->features, MPAM_FEATURE_LAST)) in mpam_reprogram_msc()
1812 ris->in_reset_state = reset; in mpam_reprogram_msc()
1814 if (mpam_has_feature(mpam_feat_msmon_mbwu, &ris->props)) in mpam_reprogram_msc()
1817 mutex_unlock(&msc->cfg_lock); in mpam_reprogram_msc()
1834 if (!cpumask_test_cpu(cpu, &msc->accessibility)) in mpam_cpu_online()
1837 if (msc->reenable_error_ppi) in mpam_cpu_online()
1838 _enable_percpu_irq(&msc->reenable_error_ppi); in mpam_cpu_online()
1840 if (atomic_fetch_inc(&msc->online_refs) == 0) in mpam_cpu_online()
1863 if (!cpumask_test_cpu(cpu, &msc->accessibility)) in mpam_discovery_cpu_online()
1866 mutex_lock(&msc->probe_lock); in mpam_discovery_cpu_online()
1867 if (!msc->probed) in mpam_discovery_cpu_online()
1869 mutex_unlock(&msc->probe_lock); in mpam_discovery_cpu_online()
1896 if (!cpumask_test_cpu(cpu, &msc->accessibility)) in mpam_cpu_offline()
1899 if (msc->reenable_error_ppi) in mpam_cpu_offline()
1900 disable_percpu_irq(msc->reenable_error_ppi); in mpam_cpu_offline()
1902 if (atomic_dec_and_test(&msc->online_refs)) { in mpam_cpu_offline()
1905 mutex_lock(&msc->cfg_lock); in mpam_cpu_offline()
1906 list_for_each_entry_srcu(ris, &msc->ris, msc_list, in mpam_cpu_offline()
1911 * The reset state for non-zero partid may be in mpam_cpu_offline()
1914 ris->in_reset_state = false; in mpam_cpu_offline()
1919 mutex_unlock(&msc->cfg_lock); in mpam_cpu_offline()
1949 msc->error_dev_id = alloc_percpu(struct mpam_msc *); in __setup_ppi()
1950 if (!msc->error_dev_id) in __setup_ppi()
1951 return -ENOMEM; in __setup_ppi()
1953 for_each_cpu(cpu, &msc->accessibility) in __setup_ppi()
1954 *per_cpu_ptr(msc->error_dev_id, cpu) = msc; in __setup_ppi()
1963 irq = platform_get_irq_byname_optional(msc->pdev, "error"); in mpam_msc_setup_error_irq()
1972 if (!cpumask_equal(&msc->accessibility, cpu_possible_mask)) { in mpam_msc_setup_error_irq()
1974 msc->id); in mpam_msc_setup_error_irq()
1975 return -EINVAL; in mpam_msc_setup_error_irq()
1993 err = device_property_read_u32(&msc->pdev->dev, "cpu_affinity", in update_msc_accessibility()
1996 cpumask_copy(&msc->accessibility, cpu_possible_mask); in update_msc_accessibility()
1998 acpi_pptt_get_cpus_from_container(affinity_id, &msc->accessibility); in update_msc_accessibility()
2003 * class->component->vmsc->ris, or via the msc.
2008 struct platform_device *pdev = msc->pdev; in mpam_msc_destroy()
2013 list_for_each_entry_safe(ris, tmp, &msc->ris, msc_list) in mpam_msc_destroy()
2016 list_del_rcu(&msc->all_msc_list); in mpam_msc_destroy()
2042 struct device *dev = &pdev->dev; in do_mpam_msc_drv_probe()
2046 msc = devm_kzalloc(&pdev->dev, sizeof(*msc), GFP_KERNEL); in do_mpam_msc_drv_probe()
2048 return ERR_PTR(-ENOMEM); in do_mpam_msc_drv_probe()
2049 init_garbage(&msc->garbage); in do_mpam_msc_drv_probe()
2050 msc->garbage.pdev = pdev; in do_mpam_msc_drv_probe()
2052 err = devm_mutex_init(dev, &msc->probe_lock); in do_mpam_msc_drv_probe()
2056 err = devm_mutex_init(dev, &msc->part_sel_lock); in do_mpam_msc_drv_probe()
2060 err = devm_mutex_init(dev, &msc->error_irq_lock); in do_mpam_msc_drv_probe()
2064 err = devm_mutex_init(dev, &msc->cfg_lock); in do_mpam_msc_drv_probe()
2069 msc->id = pdev->id; in do_mpam_msc_drv_probe()
2070 msc->pdev = pdev; in do_mpam_msc_drv_probe()
2071 INIT_LIST_HEAD_RCU(&msc->all_msc_list); in do_mpam_msc_drv_probe()
2072 INIT_LIST_HEAD_RCU(&msc->ris); in do_mpam_msc_drv_probe()
2075 if (cpumask_empty(&msc->accessibility)) { in do_mpam_msc_drv_probe()
2077 return ERR_PTR(-EINVAL); in do_mpam_msc_drv_probe()
2084 if (device_property_read_u32(&pdev->dev, "pcc-channel", &tmp)) in do_mpam_msc_drv_probe()
2085 msc->iface = MPAM_IFACE_MMIO; in do_mpam_msc_drv_probe()
2087 msc->iface = MPAM_IFACE_PCC; in do_mpam_msc_drv_probe()
2089 if (msc->iface == MPAM_IFACE_MMIO) { in do_mpam_msc_drv_probe()
2098 msc->mapped_hwpage_sz = msc_res->end - msc_res->start; in do_mpam_msc_drv_probe()
2099 msc->mapped_hwpage = io; in do_mpam_msc_drv_probe()
2101 return ERR_PTR(-EINVAL); in do_mpam_msc_drv_probe()
2104 list_add_rcu(&msc->all_msc_list, &mpam_all_msc); in do_mpam_msc_drv_probe()
2116 void *plat_data = pdev->dev.platform_data; in mpam_msc_drv_probe()
2172 ((helper(child) && (parent)->field != (child)->field) || \
2177 ((mpam_has_feature((feat), (child)) && (parent)->field != (child)->field) || \
2189 * For non-aliasing controls, these control different resources, and the
2199 parent->cpbm_wd = child->cpbm_wd; in __props_mismatch()
2204 parent->cpbm_wd = 0; in __props_mismatch()
2208 parent->mbw_pbm_bits = child->mbw_pbm_bits; in __props_mismatch()
2213 parent->mbw_pbm_bits = 0; in __props_mismatch()
2219 parent->bwa_wd = child->bwa_wd; in __props_mismatch()
2223 parent->bwa_wd = min(parent->bwa_wd, child->bwa_wd); in __props_mismatch()
2227 parent->cmax_wd = child->cmax_wd; in __props_mismatch()
2231 parent->cmax_wd = min(parent->cmax_wd, child->cmax_wd); in __props_mismatch()
2235 parent->cassoc_wd = child->cassoc_wd; in __props_mismatch()
2240 parent->cassoc_wd = 0; in __props_mismatch()
2245 parent->num_csu_mon = child->num_csu_mon; in __props_mismatch()
2249 parent->num_csu_mon = min(parent->num_csu_mon, in __props_mismatch()
2250 child->num_csu_mon); in __props_mismatch()
2254 parent->num_mbwu_mon = child->num_mbwu_mon; in __props_mismatch()
2258 parent->num_mbwu_mon = min(parent->num_mbwu_mon, in __props_mismatch()
2259 child->num_mbwu_mon); in __props_mismatch()
2263 parent->intpri_wd = child->intpri_wd; in __props_mismatch()
2267 parent->intpri_wd = min(parent->intpri_wd, child->intpri_wd); in __props_mismatch()
2271 parent->dspri_wd = child->dspri_wd; in __props_mismatch()
2275 parent->dspri_wd = min(parent->dspri_wd, child->dspri_wd); in __props_mismatch()
2279 /* {int,ds}pri may not have differing 0-low behaviour */ in __props_mismatch()
2299 bitmap_or(parent->features, parent->features, child->features, MPAM_FEATURE_LAST); in __props_mismatch()
2302 bitmap_and(parent->features, parent->features, child->features, MPAM_FEATURE_LAST); in __props_mismatch()
2318 struct mpam_props *cprops = &class->props; in __class_props_mismatch()
2319 struct mpam_props *vprops = &vmsc->props; in __class_props_mismatch()
2320 struct device *dev = &vmsc->msc->pdev->dev; in __class_props_mismatch()
2325 (long)cprops->features, (long)vprops->features); in __class_props_mismatch()
2328 class->quirks |= vmsc->msc->quirks; in __class_props_mismatch()
2337 struct mpam_props *rprops = &ris->props; in __vmsc_props_mismatch()
2338 struct mpam_props *vprops = &vmsc->props; in __vmsc_props_mismatch()
2339 struct device *dev = &vmsc->msc->pdev->dev; in __vmsc_props_mismatch()
2344 (long)vprops->features, (long)rprops->features); in __vmsc_props_mismatch()
2347 * Merge mismatched features - Copy any features that aren't common, in __vmsc_props_mismatch()
2362 struct mpam_component *comp; in mpam_enable_init_class_features() local
2364 comp = list_first_entry(&class->components, in mpam_enable_init_class_features()
2366 vmsc = list_first_entry(&comp->vmsc, in mpam_enable_init_class_features()
2369 class->props = vmsc->props; in mpam_enable_init_class_features()
2372 static void mpam_enable_merge_vmsc_features(struct mpam_component *comp) in mpam_enable_merge_vmsc_features() argument
2376 struct mpam_class *class = comp->class; in mpam_enable_merge_vmsc_features()
2378 list_for_each_entry(vmsc, &comp->vmsc, comp_list) { in mpam_enable_merge_vmsc_features()
2379 list_for_each_entry(ris, &vmsc->ris, vmsc_list) { in mpam_enable_merge_vmsc_features()
2381 class->nrdy_usec = max(class->nrdy_usec, in mpam_enable_merge_vmsc_features()
2382 vmsc->msc->nrdy_usec); in mpam_enable_merge_vmsc_features()
2387 static void mpam_enable_merge_class_features(struct mpam_component *comp) in mpam_enable_merge_class_features() argument
2390 struct mpam_class *class = comp->class; in mpam_enable_merge_class_features()
2392 list_for_each_entry(vmsc, &comp->vmsc, comp_list) in mpam_enable_merge_class_features()
2396 mpam_clear_feature(mpam_feat_mbw_min, &class->props); in mpam_enable_merge_class_features()
2401 * vmsc features are bitwise-or'd together by mpam_enable_merge_vmsc_features()
2404 * Next the mpam_enable_merge_class_features() bitwise-and's all the vmsc
2408 * To avoid walking the whole tree twice, the class->nrdy_usec property is
2415 struct mpam_component *comp; in mpam_enable_merge_features() local
2420 list_for_each_entry(comp, &class->components, class_list) in mpam_enable_merge_features()
2421 mpam_enable_merge_vmsc_features(comp); in mpam_enable_merge_features()
2425 list_for_each_entry(comp, &class->components, class_list) in mpam_enable_merge_features()
2426 mpam_enable_merge_class_features(comp); in mpam_enable_merge_features()
2473 &msc->accessibility))) in __mpam_irq_handler()
2490 msc->id, mpam_errcode_names[errcode], partid, pmg, in __mpam_irq_handler()
2493 /* Disable this interrupt. */ in __mpam_irq_handler()
2534 irq = platform_get_irq_byname_optional(msc->pdev, "error"); in mpam_register_irqs()
2543 msc->error_dev_id); in mpam_register_irqs()
2547 msc->reenable_error_ppi = irq; in mpam_register_irqs()
2548 smp_call_function_many(&msc->accessibility, in mpam_register_irqs()
2552 err = devm_request_irq(&msc->pdev->dev, irq, in mpam_register_irqs()
2559 mutex_lock(&msc->error_irq_lock); in mpam_register_irqs()
2560 msc->error_irq_req = true; in mpam_register_irqs()
2562 msc->error_irq_hw_enabled = true; in mpam_register_irqs()
2563 mutex_unlock(&msc->error_irq_lock); in mpam_register_irqs()
2578 irq = platform_get_irq_byname_optional(msc->pdev, "error"); in mpam_unregister_irqs()
2582 mutex_lock(&msc->error_irq_lock); in mpam_unregister_irqs()
2583 if (msc->error_irq_hw_enabled) { in mpam_unregister_irqs()
2585 msc->error_irq_hw_enabled = false; in mpam_unregister_irqs()
2588 if (msc->error_irq_req) { in mpam_unregister_irqs()
2590 msc->reenable_error_ppi = 0; in mpam_unregister_irqs()
2591 free_percpu_irq(irq, msc->error_dev_id); in mpam_unregister_irqs()
2593 devm_free_irq(&msc->pdev->dev, irq, msc); in mpam_unregister_irqs()
2595 msc->error_irq_req = false; in mpam_unregister_irqs()
2597 mutex_unlock(&msc->error_irq_lock); in mpam_unregister_irqs()
2601 static void __destroy_component_cfg(struct mpam_component *comp) in __destroy_component_cfg() argument
2609 if (!comp->cfg) in __destroy_component_cfg()
2612 add_to_garbage(comp->cfg); in __destroy_component_cfg()
2613 list_for_each_entry(vmsc, &comp->vmsc, comp_list) { in __destroy_component_cfg()
2614 msc = vmsc->msc; in __destroy_component_cfg()
2617 list_for_each_entry(ris, &vmsc->ris, vmsc_list) { in __destroy_component_cfg()
2618 if (ris->mbwu_state) in __destroy_component_cfg()
2619 add_to_garbage(ris->mbwu_state); in __destroy_component_cfg()
2626 static void mpam_reset_component_cfg(struct mpam_component *comp) in mpam_reset_component_cfg() argument
2629 struct mpam_props *cprops = &comp->class->props; in mpam_reset_component_cfg()
2633 if (!comp->cfg) in mpam_reset_component_cfg()
2637 comp->cfg[i] = (struct mpam_config) {}; in mpam_reset_component_cfg()
2638 if (cprops->cpbm_wd) in mpam_reset_component_cfg()
2639 comp->cfg[i].cpbm = GENMASK(cprops->cpbm_wd - 1, 0); in mpam_reset_component_cfg()
2640 if (cprops->mbw_pbm_bits) in mpam_reset_component_cfg()
2641 comp->cfg[i].mbw_pbm = GENMASK(cprops->mbw_pbm_bits - 1, 0); in mpam_reset_component_cfg()
2642 if (cprops->bwa_wd) in mpam_reset_component_cfg()
2643 comp->cfg[i].mbw_max = GENMASK(15, 16 - cprops->bwa_wd); in mpam_reset_component_cfg()
2647 static int __allocate_component_cfg(struct mpam_component *comp) in __allocate_component_cfg() argument
2653 if (comp->cfg) in __allocate_component_cfg()
2656 comp->cfg = kzalloc_objs(*comp->cfg, mpam_partid_max + 1); in __allocate_component_cfg()
2657 if (!comp->cfg) in __allocate_component_cfg()
2658 return -ENOMEM; in __allocate_component_cfg()
2664 init_garbage(&comp->cfg[0].garbage); in __allocate_component_cfg()
2666 mpam_reset_component_cfg(comp); in __allocate_component_cfg()
2668 list_for_each_entry(vmsc, &comp->vmsc, comp_list) { in __allocate_component_cfg()
2673 if (!vmsc->props.num_mbwu_mon) in __allocate_component_cfg()
2676 msc = vmsc->msc; in __allocate_component_cfg()
2677 list_for_each_entry(ris, &vmsc->ris, vmsc_list) { in __allocate_component_cfg()
2678 if (!ris->props.num_mbwu_mon) in __allocate_component_cfg()
2681 mbwu_state = kzalloc_objs(*ris->mbwu_state, in __allocate_component_cfg()
2682 ris->props.num_mbwu_mon); in __allocate_component_cfg()
2684 __destroy_component_cfg(comp); in __allocate_component_cfg()
2685 return -ENOMEM; in __allocate_component_cfg()
2691 ris->mbwu_state = mbwu_state; in __allocate_component_cfg()
2703 struct mpam_component *comp; in mpam_allocate_config() local
2708 list_for_each_entry(comp, &class->components, class_list) { in mpam_allocate_config()
2709 int err = __allocate_component_cfg(comp); in mpam_allocate_config()
2732 * That involves cross-calling to a CPU that can reach the MSC, and in mpam_enable_once()
2777 static void mpam_reset_component_locked(struct mpam_component *comp) in mpam_reset_component_locked() argument
2784 mpam_reset_component_cfg(comp); in mpam_reset_component_locked()
2787 list_for_each_entry_srcu(vmsc, &comp->vmsc, comp_list, in mpam_reset_component_locked()
2789 struct mpam_msc *msc = vmsc->msc; in mpam_reset_component_locked()
2792 list_for_each_entry_srcu(ris, &vmsc->ris, vmsc_list, in mpam_reset_component_locked()
2794 if (!ris->in_reset_state) in mpam_reset_component_locked()
2796 ris->in_reset_state = true; in mpam_reset_component_locked()
2803 struct mpam_component *comp; in mpam_reset_class_locked() local
2808 list_for_each_entry_srcu(comp, &class->components, class_list, in mpam_reset_class_locked()
2810 mpam_reset_component_locked(comp); in mpam_reset_class_locked()
2887 mutex_lock(&msc->probe_lock); in mpam_enable()
2888 if (!msc->probed) in mpam_enable()
2890 mutex_unlock(&msc->probe_lock); in mpam_enable()
2902 (newcfg)->member != (cfg)->member) { \
2903 (cfg)->member = (newcfg)->member; \
2922 int mpam_apply_config(struct mpam_component *comp, u16 partid, in mpam_apply_config() argument
2933 WARN_ON_ONCE(&comp->cfg[partid] == cfg); in mpam_apply_config()
2935 if (!mpam_update_config(&comp->cfg[partid], cfg)) in mpam_apply_config()
2938 arg.comp = comp; in mpam_apply_config()
2942 list_for_each_entry_srcu(vmsc, &comp->vmsc, comp_list, in mpam_apply_config()
2944 msc = vmsc->msc; in mpam_apply_config()
2946 mutex_lock(&msc->cfg_lock); in mpam_apply_config()
2947 list_for_each_entry_srcu(ris, &vmsc->ris, vmsc_list, in mpam_apply_config()
2951 ris->in_reset_state = false; in mpam_apply_config()
2953 mutex_unlock(&msc->cfg_lock); in mpam_apply_config()
2962 return -EOPNOTSUPP; in mpam_msc_driver_init()
2969 return -EINVAL; in mpam_msc_driver_init()