Lines Matching refs:msc

158 static u32 __mpam_read_reg(struct mpam_msc *msc, u16 reg)  in __mpam_read_reg()  argument
160 WARN_ON_ONCE(!cpumask_test_cpu(smp_processor_id(), &msc->accessibility)); in __mpam_read_reg()
162 return readl_relaxed(msc->mapped_hwpage + reg); in __mpam_read_reg()
165 static inline u32 _mpam_read_partsel_reg(struct mpam_msc *msc, u16 reg) in _mpam_read_partsel_reg() argument
167 lockdep_assert_held_once(&msc->part_sel_lock); in _mpam_read_partsel_reg()
168 return __mpam_read_reg(msc, reg); in _mpam_read_partsel_reg()
171 #define mpam_read_partsel_reg(msc, reg) _mpam_read_partsel_reg(msc, MPAMF_##reg) argument
173 static void __mpam_write_reg(struct mpam_msc *msc, u16 reg, u32 val) in __mpam_write_reg() argument
175 WARN_ON_ONCE(reg + sizeof(u32) > msc->mapped_hwpage_sz); in __mpam_write_reg()
176 WARN_ON_ONCE(!cpumask_test_cpu(smp_processor_id(), &msc->accessibility)); in __mpam_write_reg()
178 writel_relaxed(val, msc->mapped_hwpage + reg); in __mpam_write_reg()
181 static inline void _mpam_write_partsel_reg(struct mpam_msc *msc, u16 reg, u32 val) in _mpam_write_partsel_reg() argument
183 lockdep_assert_held_once(&msc->part_sel_lock); in _mpam_write_partsel_reg()
184 __mpam_write_reg(msc, reg, val); in _mpam_write_partsel_reg()
187 #define mpam_write_partsel_reg(msc, reg, val) _mpam_write_partsel_reg(msc, MPAMCFG_##reg, val) argument
189 static inline u32 _mpam_read_monsel_reg(struct mpam_msc *msc, u16 reg) in _mpam_read_monsel_reg() argument
191 mpam_mon_sel_lock_held(msc); in _mpam_read_monsel_reg()
192 return __mpam_read_reg(msc, reg); in _mpam_read_monsel_reg()
195 #define mpam_read_monsel_reg(msc, reg) _mpam_read_monsel_reg(msc, MSMON_##reg) argument
197 static inline void _mpam_write_monsel_reg(struct mpam_msc *msc, u16 reg, u32 val) in _mpam_write_monsel_reg() argument
199 mpam_mon_sel_lock_held(msc); in _mpam_write_monsel_reg()
200 __mpam_write_reg(msc, reg, val); in _mpam_write_monsel_reg()
203 #define mpam_write_monsel_reg(msc, reg, val) _mpam_write_monsel_reg(msc, MSMON_##reg, val) argument
205 static u64 mpam_msc_read_idr(struct mpam_msc *msc) in mpam_msc_read_idr() argument
209 lockdep_assert_held(&msc->part_sel_lock); in mpam_msc_read_idr()
211 idr_low = mpam_read_partsel_reg(msc, IDR); in mpam_msc_read_idr()
213 idr_high = mpam_read_partsel_reg(msc, IDR + 4); in mpam_msc_read_idr()
218 static void mpam_msc_clear_esr(struct mpam_msc *msc) in mpam_msc_clear_esr() argument
220 u64 esr_low = __mpam_read_reg(msc, MPAMF_ESR); in mpam_msc_clear_esr()
231 if (msc->has_extd_esr) in mpam_msc_clear_esr()
232 __mpam_write_reg(msc, MPAMF_ESR + 4, 0); in mpam_msc_clear_esr()
233 __mpam_write_reg(msc, MPAMF_ESR, 0); in mpam_msc_clear_esr()
236 static u64 mpam_msc_read_esr(struct mpam_msc *msc) in mpam_msc_read_esr() argument
240 esr_low = __mpam_read_reg(msc, MPAMF_ESR); in mpam_msc_read_esr()
241 if (msc->has_extd_esr) in mpam_msc_read_esr()
242 esr_high = __mpam_read_reg(msc, MPAMF_ESR + 4); in mpam_msc_read_esr()
247 static void __mpam_part_sel_raw(u32 partsel, struct mpam_msc *msc) in __mpam_part_sel_raw() argument
249 lockdep_assert_held(&msc->part_sel_lock); in __mpam_part_sel_raw()
251 mpam_write_partsel_reg(msc, PART_SEL, partsel); in __mpam_part_sel_raw()
254 static void __mpam_part_sel(u8 ris_idx, u16 partid, struct mpam_msc *msc) in __mpam_part_sel() argument
259 __mpam_part_sel_raw(partsel, msc); in __mpam_part_sel()
262 static void __mpam_intpart_sel(u8 ris_idx, u16 intpartid, struct mpam_msc *msc) in __mpam_intpart_sel() argument
268 __mpam_part_sel_raw(partsel, msc); in __mpam_intpart_sel()
395 mpam_vmsc_alloc(struct mpam_component *comp, struct mpam_msc *msc) in mpam_vmsc_alloc() argument
409 vmsc->msc = msc; in mpam_vmsc_alloc()
430 mpam_vmsc_find(struct mpam_component *comp, struct mpam_msc *msc) in mpam_vmsc_find() argument
437 if (vmsc->msc->id == msc->id) in mpam_vmsc_find()
441 return mpam_vmsc_alloc(comp, msc); in mpam_vmsc_find()
468 static int mpam_ris_get_affinity(struct mpam_msc *msc, cpumask_t *affinity, in mpam_ris_get_affinity() argument
480 dev_warn_once(&msc->pdev->dev, in mpam_ris_get_affinity()
486 dev_warn_once(&msc->pdev->dev, "no CPUs associated with cache node\n"); in mpam_ris_get_affinity()
497 cpumask_and(affinity, affinity, &msc->accessibility); in mpam_ris_get_affinity()
502 static int mpam_ris_create_locked(struct mpam_msc *msc, u8 ris_idx, in mpam_ris_create_locked() argument
511 struct platform_device *pdev = msc->pdev; in mpam_ris_create_locked()
518 if (test_and_set_bit(ris_idx, &msc->ris_idxs)) in mpam_ris_create_locked()
521 ris = devm_kzalloc(&msc->pdev->dev, sizeof(*ris), GFP_KERNEL); in mpam_ris_create_locked()
538 vmsc = mpam_vmsc_find(comp, msc); in mpam_ris_create_locked()
545 err = mpam_ris_get_affinity(msc, &ris->affinity, type, class, comp); in mpam_ris_create_locked()
560 list_add_rcu(&ris->msc_list, &msc->ris); in mpam_ris_create_locked()
568 struct mpam_msc *msc = vmsc->msc; in mpam_ris_destroy() local
580 clear_bit(ris->ris_idx, &msc->ris_idxs); in mpam_ris_destroy()
589 int mpam_ris_create(struct mpam_msc *msc, u8 ris_idx, in mpam_ris_create() argument
595 err = mpam_ris_create_locked(msc, ris_idx, type, class_id, in mpam_ris_create()
604 static struct mpam_msc_ris *mpam_get_or_create_ris(struct mpam_msc *msc, in mpam_get_or_create_ris() argument
612 if (!test_bit(ris_idx, &msc->ris_idxs)) { in mpam_get_or_create_ris()
613 err = mpam_ris_create_locked(msc, ris_idx, MPAM_CLASS_UNKNOWN, in mpam_get_or_create_ris()
619 list_for_each_entry(ris, &msc->ris, msc_list) { in mpam_get_or_create_ris()
640 struct mpam_msc *msc = ris->vmsc->msc; in _mpam_ris_hw_probe_hw_nrdy() local
642 if (WARN_ON_ONCE(!mpam_mon_sel_lock(msc))) in _mpam_ris_hw_probe_hw_nrdy()
647 _mpam_write_monsel_reg(msc, mon_reg, mon_sel); in _mpam_ris_hw_probe_hw_nrdy()
649 _mpam_write_monsel_reg(msc, mon_reg, MSMON___NRDY); in _mpam_ris_hw_probe_hw_nrdy()
650 now = _mpam_read_monsel_reg(msc, mon_reg); in _mpam_ris_hw_probe_hw_nrdy()
653 _mpam_write_monsel_reg(msc, mon_reg, 0); in _mpam_ris_hw_probe_hw_nrdy()
654 now = _mpam_read_monsel_reg(msc, mon_reg); in _mpam_ris_hw_probe_hw_nrdy()
656 mpam_mon_sel_unlock(msc); in _mpam_ris_hw_probe_hw_nrdy()
667 struct mpam_msc *msc = ris->vmsc->msc; in mpam_ris_hw_probe() local
668 struct device *dev = &msc->pdev->dev; in mpam_ris_hw_probe()
672 lockdep_assert_held(&msc->probe_lock); in mpam_ris_hw_probe()
673 lockdep_assert_held(&msc->part_sel_lock); in mpam_ris_hw_probe()
677 u32 ccap_features = mpam_read_partsel_reg(msc, CCAP_IDR); in mpam_ris_hw_probe()
700 u32 cpor_features = mpam_read_partsel_reg(msc, CPOR_IDR); in mpam_ris_hw_probe()
709 u32 mbw_features = mpam_read_partsel_reg(msc, MBW_IDR); in mpam_ris_hw_probe()
730 u32 pri_features = mpam_read_partsel_reg(msc, PRI_IDR); in mpam_ris_hw_probe()
749 u32 msmon_features = mpam_read_partsel_reg(msc, MSMON_IDR); in mpam_ris_hw_probe()
755 err = device_property_read_u32(&msc->pdev->dev, in mpam_ris_hw_probe()
757 &msc->nrdy_usec); in mpam_ris_hw_probe()
762 csumonidr = mpam_read_partsel_reg(msc, CSUMON_IDR); in mpam_ris_hw_probe()
787 u32 mbwumon_idr = mpam_read_partsel_reg(msc, MBWUMON_IDR); in mpam_ris_hw_probe()
827 u32 nrwidr = mpam_read_partsel_reg(msc, PARTID_NRW_IDR); in mpam_ris_hw_probe()
831 msc->partid_max = min(msc->partid_max, partid_max); in mpam_ris_hw_probe()
835 static int mpam_msc_hw_probe(struct mpam_msc *msc) in mpam_msc_hw_probe() argument
841 struct device *dev = &msc->pdev->dev; in mpam_msc_hw_probe()
843 lockdep_assert_held(&msc->probe_lock); in mpam_msc_hw_probe()
845 idr = __mpam_read_reg(msc, MPAMF_AIDR); in mpam_msc_hw_probe()
852 mutex_lock(&msc->part_sel_lock); in mpam_msc_hw_probe()
853 idr = mpam_msc_read_idr(msc); in mpam_msc_hw_probe()
854 mutex_unlock(&msc->part_sel_lock); in mpam_msc_hw_probe()
856 msc->ris_max = FIELD_GET(MPAMF_IDR_RIS_MAX, idr); in mpam_msc_hw_probe()
859 msc->partid_max = FIELD_GET(MPAMF_IDR_PARTID_MAX, idr); in mpam_msc_hw_probe()
860 msc->pmg_max = FIELD_GET(MPAMF_IDR_PMG_MAX, idr); in mpam_msc_hw_probe()
862 for (ris_idx = 0; ris_idx <= msc->ris_max; ris_idx++) { in mpam_msc_hw_probe()
863 mutex_lock(&msc->part_sel_lock); in mpam_msc_hw_probe()
864 __mpam_part_sel(ris_idx, 0, msc); in mpam_msc_hw_probe()
865 idr = mpam_msc_read_idr(msc); in mpam_msc_hw_probe()
866 mutex_unlock(&msc->part_sel_lock); in mpam_msc_hw_probe()
870 msc->partid_max = min(msc->partid_max, partid_max); in mpam_msc_hw_probe()
871 msc->pmg_max = min(msc->pmg_max, pmg_max); in mpam_msc_hw_probe()
872 msc->has_extd_esr = FIELD_GET(MPAMF_IDR_HAS_EXTD_ESR, idr); in mpam_msc_hw_probe()
875 ris = mpam_get_or_create_ris(msc, ris_idx); in mpam_msc_hw_probe()
881 mutex_lock(&msc->part_sel_lock); in mpam_msc_hw_probe()
882 __mpam_part_sel(ris_idx, 0, msc); in mpam_msc_hw_probe()
884 mutex_unlock(&msc->part_sel_lock); in mpam_msc_hw_probe()
888 mpam_msc_clear_esr(msc); in mpam_msc_hw_probe()
891 mpam_partid_max = min(mpam_partid_max, msc->partid_max); in mpam_msc_hw_probe()
892 mpam_pmg_max = min(mpam_pmg_max, msc->pmg_max); in mpam_msc_hw_probe()
895 msc->probed = true; in mpam_msc_hw_probe()
914 static u64 mpam_msc_read_mbwu_l(struct mpam_msc *msc) in mpam_msc_read_mbwu_l() argument
920 mpam_mon_sel_lock_held(msc); in mpam_msc_read_mbwu_l()
922 WARN_ON_ONCE((MSMON_MBWU_L + sizeof(u64)) > msc->mapped_hwpage_sz); in mpam_msc_read_mbwu_l()
923 WARN_ON_ONCE(!cpumask_test_cpu(smp_processor_id(), &msc->accessibility)); in mpam_msc_read_mbwu_l()
925 mbwu_l_high2 = __mpam_read_reg(msc, MSMON_MBWU_L + 4); in mpam_msc_read_mbwu_l()
928 mbwu_l_low = __mpam_read_reg(msc, MSMON_MBWU_L); in mpam_msc_read_mbwu_l()
929 mbwu_l_high2 = __mpam_read_reg(msc, MSMON_MBWU_L + 4); in mpam_msc_read_mbwu_l()
941 static void mpam_msc_zero_mbwu_l(struct mpam_msc *msc) in mpam_msc_zero_mbwu_l() argument
943 mpam_mon_sel_lock_held(msc); in mpam_msc_zero_mbwu_l()
945 WARN_ON_ONCE((MSMON_MBWU_L + sizeof(u64)) > msc->mapped_hwpage_sz); in mpam_msc_zero_mbwu_l()
946 WARN_ON_ONCE(!cpumask_test_cpu(smp_processor_id(), &msc->accessibility)); in mpam_msc_zero_mbwu_l()
948 __mpam_write_reg(msc, MSMON_MBWU_L, 0); in mpam_msc_zero_mbwu_l()
949 __mpam_write_reg(msc, MSMON_MBWU_L + 4, 0); in mpam_msc_zero_mbwu_l()
995 struct mpam_msc *msc = m->ris->vmsc->msc; in read_msmon_ctl_flt_vals() local
999 *ctl_val = mpam_read_monsel_reg(msc, CFG_CSU_CTL); in read_msmon_ctl_flt_vals()
1000 *flt_val = mpam_read_monsel_reg(msc, CFG_CSU_FLT); in read_msmon_ctl_flt_vals()
1005 *ctl_val = mpam_read_monsel_reg(msc, CFG_MBWU_CTL); in read_msmon_ctl_flt_vals()
1006 *flt_val = mpam_read_monsel_reg(msc, CFG_MBWU_FLT); in read_msmon_ctl_flt_vals()
1025 struct mpam_msc *msc = m->ris->vmsc->msc; in write_msmon_ctl_flt_vals() local
1033 mpam_write_monsel_reg(msc, CFG_CSU_FLT, flt_val); in write_msmon_ctl_flt_vals()
1034 mpam_write_monsel_reg(msc, CFG_CSU_CTL, ctl_val); in write_msmon_ctl_flt_vals()
1035 mpam_write_monsel_reg(msc, CSU, 0); in write_msmon_ctl_flt_vals()
1036 mpam_write_monsel_reg(msc, CFG_CSU_CTL, ctl_val | MSMON_CFG_x_CTL_EN); in write_msmon_ctl_flt_vals()
1041 mpam_write_monsel_reg(msc, CFG_MBWU_FLT, flt_val); in write_msmon_ctl_flt_vals()
1042 mpam_write_monsel_reg(msc, CFG_MBWU_CTL, ctl_val); in write_msmon_ctl_flt_vals()
1043 mpam_write_monsel_reg(msc, CFG_MBWU_CTL, ctl_val | MSMON_CFG_x_CTL_EN); in write_msmon_ctl_flt_vals()
1046 mpam_write_monsel_reg(msc, MBWU, 0); in write_msmon_ctl_flt_vals()
1048 mpam_msc_zero_mbwu_l(m->ris->vmsc->msc); in write_msmon_ctl_flt_vals()
1082 struct mpam_msc *msc = m->ris->vmsc->msc; in __ris_msmon_read() local
1085 if (!mpam_mon_sel_lock(msc)) { in __ris_msmon_read()
1091 mpam_write_monsel_reg(msc, CFG_MON_SEL, mon_sel); in __ris_msmon_read()
1128 mpam_write_monsel_reg(msc, CFG_MBWU_CTL, in __ris_msmon_read()
1136 now = mpam_read_monsel_reg(msc, CSU); in __ris_msmon_read()
1145 now = mpam_msc_read_mbwu_l(msc); in __ris_msmon_read()
1154 now = mpam_read_monsel_reg(msc, MBWU); in __ris_msmon_read()
1177 mpam_mon_sel_unlock(msc); in __ris_msmon_read()
1196 struct mpam_msc *msc = vmsc->msc; in _msmon_read() local
1203 err = smp_call_function_any(&msc->accessibility, in _msmon_read()
1284 struct mpam_msc *msc; in mpam_msmon_reset_mbwu() local
1297 msc = vmsc->msc; in mpam_msmon_reset_mbwu()
1303 if (WARN_ON_ONCE(!mpam_mon_sel_lock(msc))) in mpam_msmon_reset_mbwu()
1308 mpam_mon_sel_unlock(msc); in mpam_msmon_reset_mbwu()
1313 static void mpam_reset_msc_bitmap(struct mpam_msc *msc, u16 reg, u16 wd) in mpam_reset_msc_bitmap() argument
1319 lockdep_assert_held(&msc->part_sel_lock); in mpam_reset_msc_bitmap()
1330 __mpam_write_reg(msc, reg, bm); in mpam_reset_msc_bitmap()
1338 __mpam_write_reg(msc, reg, bm); in mpam_reset_msc_bitmap()
1347 struct mpam_msc *msc = ris->vmsc->msc; in mpam_reprogram_ris_partid() local
1352 mutex_lock(&msc->part_sel_lock); in mpam_reprogram_ris_partid()
1353 __mpam_part_sel(ris->ris_idx, partid, msc); in mpam_reprogram_ris_partid()
1357 mpam_write_partsel_reg(msc, INTPARTID, in mpam_reprogram_ris_partid()
1364 __mpam_intpart_sel(ris->ris_idx, partid, msc); in mpam_reprogram_ris_partid()
1370 mpam_reset_msc_bitmap(msc, MPAMCFG_CPBM, rprops->cpbm_wd); in mpam_reprogram_ris_partid()
1372 mpam_write_partsel_reg(msc, CPBM, cfg->cpbm); in mpam_reprogram_ris_partid()
1378 mpam_reset_msc_bitmap(msc, MPAMCFG_MBW_PBM, rprops->mbw_pbm_bits); in mpam_reprogram_ris_partid()
1380 mpam_write_partsel_reg(msc, MBW_PBM, cfg->mbw_pbm); in mpam_reprogram_ris_partid()
1385 mpam_write_partsel_reg(msc, MBW_MIN, 0); in mpam_reprogram_ris_partid()
1390 mpam_write_partsel_reg(msc, MBW_MAX, MPAMCFG_MBW_MAX_MAX); in mpam_reprogram_ris_partid()
1392 mpam_write_partsel_reg(msc, MBW_MAX, cfg->mbw_max); in mpam_reprogram_ris_partid()
1397 mpam_write_partsel_reg(msc, MBW_PROP, 0); in mpam_reprogram_ris_partid()
1400 mpam_write_partsel_reg(msc, CMAX, cmax); in mpam_reprogram_ris_partid()
1403 mpam_write_partsel_reg(msc, CMIN, 0); in mpam_reprogram_ris_partid()
1406 mpam_write_partsel_reg(msc, CASSOC, MPAMCFG_CASSOC_CASSOC); in mpam_reprogram_ris_partid()
1421 mpam_write_partsel_reg(msc, PRI, pri_val); in mpam_reprogram_ris_partid()
1424 mutex_unlock(&msc->part_sel_lock); in mpam_reprogram_ris_partid()
1457 struct mpam_msc *msc = ris->vmsc->msc; in mpam_save_mbwu_state() local
1463 if (WARN_ON_ONCE(!mpam_mon_sel_lock(msc))) in mpam_save_mbwu_state()
1468 mpam_write_monsel_reg(msc, CFG_MON_SEL, mon_sel); in mpam_save_mbwu_state()
1470 cur_flt = mpam_read_monsel_reg(msc, CFG_MBWU_FLT); in mpam_save_mbwu_state()
1471 cur_ctl = mpam_read_monsel_reg(msc, CFG_MBWU_CTL); in mpam_save_mbwu_state()
1472 mpam_write_monsel_reg(msc, CFG_MBWU_CTL, 0); in mpam_save_mbwu_state()
1475 val = mpam_msc_read_mbwu_l(msc); in mpam_save_mbwu_state()
1476 mpam_msc_zero_mbwu_l(msc); in mpam_save_mbwu_state()
1478 val = mpam_read_monsel_reg(msc, MBWU); in mpam_save_mbwu_state()
1479 mpam_write_monsel_reg(msc, MBWU, 0); in mpam_save_mbwu_state()
1488 mpam_mon_sel_unlock(msc); in mpam_save_mbwu_state()
1533 static int mpam_get_msc_preferred_cpu(struct mpam_msc *msc) in mpam_get_msc_preferred_cpu() argument
1537 if (cpumask_test_cpu(cpu, &msc->accessibility)) in mpam_get_msc_preferred_cpu()
1540 return cpumask_first_and(&msc->accessibility, cpu_online_mask); in mpam_get_msc_preferred_cpu()
1543 static int mpam_touch_msc(struct mpam_msc *msc, int (*fn)(void *a), void *arg) in mpam_touch_msc() argument
1549 return smp_call_on_cpu(mpam_get_msc_preferred_cpu(msc), fn, arg, true); in mpam_touch_msc()
1567 static void mpam_reprogram_msc(struct mpam_msc *msc) in mpam_reprogram_msc() argument
1581 mutex_lock(&msc->cfg_lock); in mpam_reprogram_msc()
1582 list_for_each_entry_srcu(ris, &msc->ris, msc_list, in mpam_reprogram_msc()
1585 mpam_touch_msc(msc, &mpam_reset_ris, ris); in mpam_reprogram_msc()
1599 mpam_touch_msc(msc, __write_config, &arg); in mpam_reprogram_msc()
1604 mpam_touch_msc(msc, &mpam_restore_mbwu_state, ris); in mpam_reprogram_msc()
1606 mutex_unlock(&msc->cfg_lock); in mpam_reprogram_msc()
1618 struct mpam_msc *msc; in mpam_cpu_online() local
1621 list_for_each_entry_srcu(msc, &mpam_all_msc, all_msc_list, in mpam_cpu_online()
1623 if (!cpumask_test_cpu(cpu, &msc->accessibility)) in mpam_cpu_online()
1626 if (msc->reenable_error_ppi) in mpam_cpu_online()
1627 _enable_percpu_irq(&msc->reenable_error_ppi); in mpam_cpu_online()
1629 if (atomic_fetch_inc(&msc->online_refs) == 0) in mpam_cpu_online()
1630 mpam_reprogram_msc(msc); in mpam_cpu_online()
1640 struct mpam_msc *msc; in mpam_discovery_cpu_online() local
1647 list_for_each_entry_srcu(msc, &mpam_all_msc, all_msc_list, in mpam_discovery_cpu_online()
1649 if (!cpumask_test_cpu(cpu, &msc->accessibility)) in mpam_discovery_cpu_online()
1652 mutex_lock(&msc->probe_lock); in mpam_discovery_cpu_online()
1653 if (!msc->probed) in mpam_discovery_cpu_online()
1654 err = mpam_msc_hw_probe(msc); in mpam_discovery_cpu_online()
1655 mutex_unlock(&msc->probe_lock); in mpam_discovery_cpu_online()
1674 struct mpam_msc *msc; in mpam_cpu_offline() local
1677 list_for_each_entry_srcu(msc, &mpam_all_msc, all_msc_list, in mpam_cpu_offline()
1679 if (!cpumask_test_cpu(cpu, &msc->accessibility)) in mpam_cpu_offline()
1682 if (msc->reenable_error_ppi) in mpam_cpu_offline()
1683 disable_percpu_irq(msc->reenable_error_ppi); in mpam_cpu_offline()
1685 if (atomic_dec_and_test(&msc->online_refs)) { in mpam_cpu_offline()
1688 mutex_lock(&msc->cfg_lock); in mpam_cpu_offline()
1689 list_for_each_entry_srcu(ris, &msc->ris, msc_list, in mpam_cpu_offline()
1691 mpam_touch_msc(msc, &mpam_reset_ris, ris); in mpam_cpu_offline()
1700 mpam_touch_msc(msc, &mpam_save_mbwu_state, ris); in mpam_cpu_offline()
1702 mutex_unlock(&msc->cfg_lock); in mpam_cpu_offline()
1728 static int __setup_ppi(struct mpam_msc *msc) in __setup_ppi() argument
1732 msc->error_dev_id = alloc_percpu(struct mpam_msc *); in __setup_ppi()
1733 if (!msc->error_dev_id) in __setup_ppi()
1736 for_each_cpu(cpu, &msc->accessibility) in __setup_ppi()
1737 *per_cpu_ptr(msc->error_dev_id, cpu) = msc; in __setup_ppi()
1742 static int mpam_msc_setup_error_irq(struct mpam_msc *msc) in mpam_msc_setup_error_irq() argument
1746 irq = platform_get_irq_byname_optional(msc->pdev, "error"); in mpam_msc_setup_error_irq()
1752 return __setup_ppi(msc); in mpam_msc_setup_error_irq()
1755 if (!cpumask_equal(&msc->accessibility, cpu_possible_mask)) { in mpam_msc_setup_error_irq()
1757 msc->id); in mpam_msc_setup_error_irq()
1771 static void update_msc_accessibility(struct mpam_msc *msc) in update_msc_accessibility() argument
1776 err = device_property_read_u32(&msc->pdev->dev, "cpu_affinity", in update_msc_accessibility()
1779 cpumask_copy(&msc->accessibility, cpu_possible_mask); in update_msc_accessibility()
1781 acpi_pptt_get_cpus_from_container(affinity_id, &msc->accessibility); in update_msc_accessibility()
1789 static void mpam_msc_destroy(struct mpam_msc *msc) in mpam_msc_destroy() argument
1791 struct platform_device *pdev = msc->pdev; in mpam_msc_destroy()
1796 list_for_each_entry_safe(ris, tmp, &msc->ris, msc_list) in mpam_msc_destroy()
1799 list_del_rcu(&msc->all_msc_list); in mpam_msc_destroy()
1802 add_to_garbage(msc); in mpam_msc_destroy()
1807 struct mpam_msc *msc = platform_get_drvdata(pdev); in mpam_msc_drv_remove() local
1810 mpam_msc_destroy(msc); in mpam_msc_drv_remove()
1820 struct mpam_msc *msc; in do_mpam_msc_drv_probe() local
1826 msc = devm_kzalloc(&pdev->dev, sizeof(*msc), GFP_KERNEL); in do_mpam_msc_drv_probe()
1827 if (!msc) in do_mpam_msc_drv_probe()
1829 init_garbage(&msc->garbage); in do_mpam_msc_drv_probe()
1830 msc->garbage.pdev = pdev; in do_mpam_msc_drv_probe()
1832 err = devm_mutex_init(dev, &msc->probe_lock); in do_mpam_msc_drv_probe()
1836 err = devm_mutex_init(dev, &msc->part_sel_lock); in do_mpam_msc_drv_probe()
1840 err = devm_mutex_init(dev, &msc->error_irq_lock); in do_mpam_msc_drv_probe()
1844 err = devm_mutex_init(dev, &msc->cfg_lock); in do_mpam_msc_drv_probe()
1848 mpam_mon_sel_lock_init(msc); in do_mpam_msc_drv_probe()
1849 msc->id = pdev->id; in do_mpam_msc_drv_probe()
1850 msc->pdev = pdev; in do_mpam_msc_drv_probe()
1851 INIT_LIST_HEAD_RCU(&msc->all_msc_list); in do_mpam_msc_drv_probe()
1852 INIT_LIST_HEAD_RCU(&msc->ris); in do_mpam_msc_drv_probe()
1854 update_msc_accessibility(msc); in do_mpam_msc_drv_probe()
1855 if (cpumask_empty(&msc->accessibility)) { in do_mpam_msc_drv_probe()
1860 err = mpam_msc_setup_error_irq(msc); in do_mpam_msc_drv_probe()
1865 msc->iface = MPAM_IFACE_MMIO; in do_mpam_msc_drv_probe()
1867 msc->iface = MPAM_IFACE_PCC; in do_mpam_msc_drv_probe()
1869 if (msc->iface == MPAM_IFACE_MMIO) { in do_mpam_msc_drv_probe()
1878 msc->mapped_hwpage_sz = msc_res->end - msc_res->start; in do_mpam_msc_drv_probe()
1879 msc->mapped_hwpage = io; in do_mpam_msc_drv_probe()
1884 list_add_rcu(&msc->all_msc_list, &mpam_all_msc); in do_mpam_msc_drv_probe()
1885 platform_set_drvdata(pdev, msc); in do_mpam_msc_drv_probe()
1887 return msc; in do_mpam_msc_drv_probe()
1895 struct mpam_msc *msc = NULL; in mpam_msc_drv_probe() local
1899 msc = do_mpam_msc_drv_probe(pdev); in mpam_msc_drv_probe()
1902 if (IS_ERR(msc)) in mpam_msc_drv_probe()
1903 return PTR_ERR(msc); in mpam_msc_drv_probe()
1906 err = acpi_mpam_parse_resources(msc, plat_data); in mpam_msc_drv_probe()
2097 struct device *dev = &vmsc->msc->pdev->dev; in __class_props_mismatch()
2113 struct device *dev = &vmsc->msc->pdev->dev; in __vmsc_props_mismatch()
2156 vmsc->msc->nrdy_usec); in mpam_enable_merge_vmsc_features()
2219 struct mpam_msc *msc = _msc; in mpam_enable_msc_ecr() local
2221 __mpam_write_reg(msc, MPAMF_ECR, MPAMF_ECR_INTEN); in mpam_enable_msc_ecr()
2229 struct mpam_msc *msc = _msc; in mpam_disable_msc_ecr() local
2231 __mpam_write_reg(msc, MPAMF_ECR, 0); in mpam_disable_msc_ecr()
2236 static irqreturn_t __mpam_irq_handler(int irq, struct mpam_msc *msc) in __mpam_irq_handler() argument
2242 if (WARN_ON_ONCE(!msc) || in __mpam_irq_handler()
2244 &msc->accessibility))) in __mpam_irq_handler()
2247 reg = mpam_msc_read_esr(msc); in __mpam_irq_handler()
2254 mpam_msc_clear_esr(msc); in __mpam_irq_handler()
2261 msc->id, mpam_errcode_names[errcode], partid, pmg, in __mpam_irq_handler()
2265 mpam_disable_msc_ecr(msc); in __mpam_irq_handler()
2283 struct mpam_msc *msc = *(struct mpam_msc **)dev_id; in mpam_ppi_handler() local
2285 return __mpam_irq_handler(irq, msc); in mpam_ppi_handler()
2290 struct mpam_msc *msc = dev_id; in mpam_spi_handler() local
2292 return __mpam_irq_handler(irq, msc); in mpam_spi_handler()
2298 struct mpam_msc *msc; in mpam_register_irqs() local
2303 list_for_each_entry_srcu(msc, &mpam_all_msc, all_msc_list, in mpam_register_irqs()
2305 irq = platform_get_irq_byname_optional(msc->pdev, "error"); in mpam_register_irqs()
2314 msc->error_dev_id); in mpam_register_irqs()
2318 msc->reenable_error_ppi = irq; in mpam_register_irqs()
2319 smp_call_function_many(&msc->accessibility, in mpam_register_irqs()
2323 err = devm_request_irq(&msc->pdev->dev, irq, in mpam_register_irqs()
2325 "mpam:msc:error", msc); in mpam_register_irqs()
2330 mutex_lock(&msc->error_irq_lock); in mpam_register_irqs()
2331 msc->error_irq_req = true; in mpam_register_irqs()
2332 mpam_touch_msc(msc, mpam_enable_msc_ecr, msc); in mpam_register_irqs()
2333 msc->error_irq_hw_enabled = true; in mpam_register_irqs()
2334 mutex_unlock(&msc->error_irq_lock); in mpam_register_irqs()
2343 struct mpam_msc *msc; in mpam_unregister_irqs() local
2347 list_for_each_entry_srcu(msc, &mpam_all_msc, all_msc_list, in mpam_unregister_irqs()
2349 irq = platform_get_irq_byname_optional(msc->pdev, "error"); in mpam_unregister_irqs()
2353 mutex_lock(&msc->error_irq_lock); in mpam_unregister_irqs()
2354 if (msc->error_irq_hw_enabled) { in mpam_unregister_irqs()
2355 mpam_touch_msc(msc, mpam_disable_msc_ecr, msc); in mpam_unregister_irqs()
2356 msc->error_irq_hw_enabled = false; in mpam_unregister_irqs()
2359 if (msc->error_irq_req) { in mpam_unregister_irqs()
2361 msc->reenable_error_ppi = 0; in mpam_unregister_irqs()
2362 free_percpu_irq(irq, msc->error_dev_id); in mpam_unregister_irqs()
2364 devm_free_irq(&msc->pdev->dev, irq, msc); in mpam_unregister_irqs()
2366 msc->error_irq_req = false; in mpam_unregister_irqs()
2368 mutex_unlock(&msc->error_irq_lock); in mpam_unregister_irqs()
2374 struct mpam_msc *msc; in __destroy_component_cfg() local
2382 msc = vmsc->msc; in __destroy_component_cfg()
2384 if (mpam_mon_sel_lock(msc)) { in __destroy_component_cfg()
2387 mpam_mon_sel_unlock(msc); in __destroy_component_cfg()
2435 struct mpam_msc *msc; in __allocate_component_cfg() local
2442 msc = vmsc->msc; in __allocate_component_cfg()
2457 if (mpam_mon_sel_lock(msc)) { in __allocate_component_cfg()
2459 mpam_mon_sel_unlock(msc); in __allocate_component_cfg()
2549 struct mpam_msc *msc = vmsc->msc; in mpam_reset_component_locked() local
2555 mpam_touch_msc(msc, mpam_reset_ris, ris); in mpam_reset_component_locked()
2589 struct mpam_msc *msc, *tmp; in mpam_disable() local
2609 list_for_each_entry_safe(msc, tmp, &mpam_all_msc, all_msc_list) in mpam_disable()
2610 mpam_msc_destroy(msc); in mpam_disable()
2625 struct mpam_msc *msc; in mpam_enable() local
2630 list_for_each_entry_srcu(msc, &mpam_all_msc, all_msc_list, in mpam_enable()
2632 mutex_lock(&msc->probe_lock); in mpam_enable()
2633 if (!msc->probed) in mpam_enable()
2635 mutex_unlock(&msc->probe_lock); in mpam_enable()
2673 struct mpam_msc *msc; in mpam_apply_config() local
2689 msc = vmsc->msc; in mpam_apply_config()
2691 mutex_lock(&msc->cfg_lock); in mpam_apply_config()
2695 mpam_touch_msc(msc, __write_config, &arg); in mpam_apply_config()
2697 mutex_unlock(&msc->cfg_lock); in mpam_apply_config()