Commit fdc29a14 authored by Rohit Mathew's avatar Rohit Mathew Committed by Catalin Marinas
Browse files

arm_mpam: Probe for long/lwd mbwu counters



mpam v0.1 and versions above v1.0 support optional long counter for
memory bandwidth monitoring. The MPAMF_MBWUMON_IDR register has fields
indicating support for long counters.

Probe these feature bits.

The mpam_feat_msmon_mbwu feature is used to indicate that bandwidth
monitors are supported, instead of muddling this with which size of
bandwidth monitors, add an explicit 31 bit counter feature.

Signed-off-by: default avatarRohit Mathew <rohit.mathew@arm.com>
[ morse: Added 31bit counter feature to simplify later logic ]
Signed-off-by: default avatarJames Morse <james.morse@arm.com>
Reviewed-by: default avatarBen Horgan <ben.horgan@arm.com>
Reviewed-by: default avatarJonathan Cameron <jonathan.cameron@huawei.com>
Reviewed-by: default avatarGavin Shan <gshan@redhat.com>
Reviewed-by: default avatarShaopeng Tan <tan.shaopeng@jp.fujitsu.com>
Reviewed-by: default avatarFenghua Yu <fenghuay@nvidia.com>
Tested-by: default avatarFenghua Yu <fenghuay@nvidia.com>
Tested-by: default avatarShaopeng Tan <tan.shaopeng@jp.fujitsu.com>
Tested-by: default avatarPeter Newman <peternewman@google.com>
Tested-by: default avatarCarl Worth <carl@os.amperecomputing.com>
Tested-by: default avatarGavin Shan <gshan@redhat.com>
Tested-by: default avatarZeng Heng <zengheng4@huawei.com>
Tested-by: default avatarHanjun Guo <guohanjun@huawei.com>
Signed-off-by: default avatarBen Horgan <ben.horgan@arm.com>
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent b3536379
Loading
Loading
Loading
Loading
+23 −12
Original line number Diff line number Diff line
@@ -783,16 +783,26 @@ static void mpam_ris_hw_probe(struct mpam_msc_ris *ris)
				dev_err_once(dev, "Counters are not usable because not-ready timeout was not provided by firmware.");
		}
		if (FIELD_GET(MPAMF_MSMON_IDR_MSMON_MBWU, msmon_features)) {
			bool hw_managed;
			bool has_long, hw_managed;
			u32 mbwumon_idr = mpam_read_partsel_reg(msc, MBWUMON_IDR);

			props->num_mbwu_mon = FIELD_GET(MPAMF_MBWUMON_IDR_NUM_MON, mbwumon_idr);
			if (props->num_mbwu_mon)
			if (props->num_mbwu_mon) {
				mpam_set_feature(mpam_feat_msmon_mbwu, props);

				if (FIELD_GET(MPAMF_MBWUMON_IDR_HAS_RWBW, mbwumon_idr))
					mpam_set_feature(mpam_feat_msmon_mbwu_rwbw, props);

				has_long = FIELD_GET(MPAMF_MBWUMON_IDR_HAS_LONG, mbwumon_idr);
				if (has_long) {
					if (FIELD_GET(MPAMF_MBWUMON_IDR_LWD, mbwumon_idr))
						mpam_set_feature(mpam_feat_msmon_mbwu_63counter, props);
					else
						mpam_set_feature(mpam_feat_msmon_mbwu_44counter, props);
				} else {
					mpam_set_feature(mpam_feat_msmon_mbwu_31counter, props);
				}

				/* Is NRDY hardware managed? */
				hw_managed = mpam_ris_hw_probe_hw_nrdy(ris, MBWU);
				if (hw_managed)
@@ -804,6 +814,7 @@ static void mpam_ris_hw_probe(struct mpam_msc_ris *ris)
				 */
			}
		}
	}

	/*
	 * RIS with PARTID narrowing don't have enough storage for one
+3 −0
Original line number Diff line number Diff line
@@ -164,6 +164,9 @@ enum mpam_device_features {
	mpam_feat_msmon_csu_xcl,
	mpam_feat_msmon_csu_hw_nrdy,
	mpam_feat_msmon_mbwu,
	mpam_feat_msmon_mbwu_31counter,
	mpam_feat_msmon_mbwu_44counter,
	mpam_feat_msmon_mbwu_63counter,
	mpam_feat_msmon_mbwu_capture,
	mpam_feat_msmon_mbwu_rwbw,
	mpam_feat_msmon_mbwu_hw_nrdy,