From nobody Mon Oct 6 14:57:55 2025 Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 593CA2D9797 for ; Mon, 21 Jul 2025 12:54:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753102466; cv=none; b=H97mOvd7ms9DVRToRdU/nJh6ulquTXn3MAOKmsJTmwQa8efwnwJZEFEg3UdpOkA9AW/6lwueahVJIEraRpePM+YFwSOn0NTugdBvDjNe4Ysc4NBW4583kfKsgoIS6h1Q40WeooX66eNOD1hG61bbxa7IugwIczCNqSCodCY0n7Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1753102466; c=relaxed/simple; bh=HcXVnR5yKCRfNORZR3iRxPzjHKZSvb1q6JnGRFervYg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JWqeUDsVjycbcjLhYbp4zU3C//IW0KCTtwIAg7pS5uknMH8PpRKwtq6fvlZZSnpJyUXmBwnIjIG4q5SlH/SsB6TE/ZmWsK3vYRsQN7ZQwqsYFN+N5DVB25NSOVLd9iyfKhwheL4Rd/9TjNu2p3GsJArVRvSR5UMwhGh1PbOl+nI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=rpkK+cCQ; arc=none smtp.client-ip=209.85.128.47 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="rpkK+cCQ" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-451d41e1ad1so29743965e9.1 for ; Mon, 21 Jul 2025 05:54:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1753102462; x=1753707262; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=X2J37QCsPeLpH8uAoPKG0A+X6/GpJr1cHd3zz61k/EI=; b=rpkK+cCQAwQcVcqZqFh+prbHJdK/faMpUbiou1q1WuDWsghKLi79MO3aaU61dfsJ/t XU/l96PQIW/Z7NPD8aGjhpwE5Ll0XQRDadbwNAOjCZUBy55LgeM6ycCY6xeoILxooCAE bychNyrZK+ig7LDwXUm/rGf5PGb1ThixfSHgDa8UG+nZtBRxNPtxRkdmjbs7/TNWNqeZ owYKJpFkUEEE7ID0bkdi6nT05DCiyil49ReUi3SldcRy2NOgwuSfYQLCq1isTo+dCnJj g5t1hHK+3HfEE/BzU4lKwqQwm8f362ZvqLD8ltuvKlKAD2ukoX513OPUfMiNe5B1LYWg bM6Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1753102462; x=1753707262; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=X2J37QCsPeLpH8uAoPKG0A+X6/GpJr1cHd3zz61k/EI=; b=qdamhlubL21rIOUF/vis1YnMEbE+i5NYxH9AHUjcHj86lCmuZRJVC9rHoJp4TnRZfA rdSab5MiVgqKBZftyA115W2VqsepLX/WAB1/EtZisLDkwG1AOl0qGMf2MJ/jX1z03zo7 H10LHIq233eCaPAfciPJHQqBzdWkOrPC/mX6eOyMrO7xeG+yl2rpaenDaSARGDccvhTm /9fhSTEID9Vka92Px/7AMShAa6Ke0y2OURLbXhQ4bbYfNguBIhsNZMndMrQrWnQPZbE6 tIVoffFpNTAOp+8WiCw9IQJF541SKI1OeUlI7FCBEWgLGd5NEAy2xy43P6b64lNnyeRd aNOg== X-Forwarded-Encrypted: i=1; AJvYcCUWYl9AhAIzzO+mmPh1p+V3JprvbPA1zkWeDBuZZUkfcILQU7Ry5aChcSwiP3dpIyojrVeG513Z6pIPs7I=@vger.kernel.org X-Gm-Message-State: AOJu0Yz0e1W7lLPQo6/6u45OcDo0NO1wG77Ivm58U6ZL3OZV9G3Y/XHy YLeUV8gB1bCOhBbcClt9c4cDLLrrQSurEbbM+8q8qZX+oV2OUCrxkcfoPs3jC+3rOTU= X-Gm-Gg: ASbGncvhM7+mtwQ1ZdY8Cp0kNTfL/66UT0kt765YbaR61N1wtvsnsc7fpemhsOs74IT ZauuDbAxgzJnw/mXikiwSLtdCG4Ue4btDwlOAtIlsm25aammDyRRpd7Fmt9xdJmij2bROhtv1jQ KNYoPQB6fr9tzKMnUHx8hEp+9+2rgMAMII0HgJsEY1TZfcfVskJYXIz9iSizQ66KD/M+wNO1Ang G6SZ+LU3F0TSqweSf21d6nHYGwnr5nSCy6N9dqJ1uVDC1J504LLK3DXywhiXwyuO9d8Ixm4mOfe ELK5J8M6n2QpEWT1o+a6gF/1p0lQfczl2MfVJeR9bH/H67bdFRL05A6DTrzQBF4eVnpctj2WCCS pGkTbx7/cayXuOY4M7awhh2urw7AC1bI= X-Google-Smtp-Source: AGHT+IExeQoC0m3KaYFnYdOvvCMuyHoVYfEOTYFIg6Ej/XAKvuJw04FHWKb3N7IpronNYHvdXXGAnA== X-Received: by 2002:a05:600c:1c11:b0:43b:ca39:6c75 with SMTP id 5b1f17b1804b1-4562e274934mr218560645e9.16.1753102461521; Mon, 21 Jul 2025 05:54:21 -0700 (PDT) Received: from ho-tower-lan.lan ([185.48.76.109]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4563b75de26sm98995225e9.33.2025.07.21.05.54.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Jul 2025 05:54:21 -0700 (PDT) From: James Clark Date: Mon, 21 Jul 2025 13:53:40 +0100 Subject: [PATCH v4 09/12] perf: arm_spe: Add support for filtering on data source Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20250721-james-perf-feat_spe_eft-v4-9-0a527410f8fd@linaro.org> References: <20250721-james-perf-feat_spe_eft-v4-0-0a527410f8fd@linaro.org> In-Reply-To: <20250721-james-perf-feat_spe_eft-v4-0-0a527410f8fd@linaro.org> To: Catalin Marinas , Will Deacon , Mark Rutland , Jonathan Corbet , Marc Zyngier , Oliver Upton , Joey Gouly , Suzuki K Poulose , Zenghui Yu , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, linux-doc@vger.kernel.org, kvmarm@lists.linux.dev, Leo Yan , James Clark X-Mailer: b4 0.14.0 SPE_FEAT_FDS adds the ability to filter on the data source of packets. Like the other existing filters, enable filtering with PMSFCR_EL1.FDS when any of the filter bits are set. Each bit maps to data sources 0-63 described by bits[0:5] in the data source packet (although the full range of data source is 16 bits so higher value data sources can't be filtered on). The filter is an OR of all the bits, so for example setting bits 0 and 3 filters packets from data sources 0 OR 3. Reviewed-by: Leo Yan Tested-by: Leo Yan Signed-off-by: James Clark --- drivers/perf/arm_spe_pmu.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/drivers/perf/arm_spe_pmu.c b/drivers/perf/arm_spe_pmu.c index e69a0d170702..5729be9e5952 100644 --- a/drivers/perf/arm_spe_pmu.c +++ b/drivers/perf/arm_spe_pmu.c @@ -87,6 +87,7 @@ struct arm_spe_pmu { #define SPE_PMU_FEAT_INV_FILT_EVT (1UL << 6) #define SPE_PMU_FEAT_DISCARD (1UL << 7) #define SPE_PMU_FEAT_EFT (1UL << 8) +#define SPE_PMU_FEAT_FDS (1UL << 9) #define SPE_PMU_FEAT_DEV_PROBED (1UL << 63) u64 features; =20 @@ -251,6 +252,10 @@ static const struct attribute_group arm_spe_pmu_cap_gr= oup =3D { #define ATTR_CFG_FLD_inv_event_filter_LO 0 #define ATTR_CFG_FLD_inv_event_filter_HI 63 =20 +#define ATTR_CFG_FLD_inv_data_src_filter_CFG config4 /* inverse of PMSDSFR= _EL1 */ +#define ATTR_CFG_FLD_inv_data_src_filter_LO 0 +#define ATTR_CFG_FLD_inv_data_src_filter_HI 63 + GEN_PMU_FORMAT_ATTR(ts_enable); GEN_PMU_FORMAT_ATTR(pa_enable); GEN_PMU_FORMAT_ATTR(pct_enable); @@ -267,6 +272,7 @@ GEN_PMU_FORMAT_ATTR(float_filter); GEN_PMU_FORMAT_ATTR(float_filter_mask); GEN_PMU_FORMAT_ATTR(event_filter); GEN_PMU_FORMAT_ATTR(inv_event_filter); +GEN_PMU_FORMAT_ATTR(inv_data_src_filter); GEN_PMU_FORMAT_ATTR(min_latency); GEN_PMU_FORMAT_ATTR(discard); =20 @@ -287,6 +293,7 @@ static struct attribute *arm_spe_pmu_formats_attr[] =3D= { &format_attr_float_filter_mask.attr, &format_attr_event_filter.attr, &format_attr_inv_event_filter.attr, + &format_attr_inv_data_src_filter.attr, &format_attr_min_latency.attr, &format_attr_discard.attr, NULL, @@ -305,6 +312,10 @@ static umode_t arm_spe_pmu_format_attr_is_visible(stru= ct kobject *kobj, if (attr =3D=3D &format_attr_inv_event_filter.attr && !(spe_pmu->features= & SPE_PMU_FEAT_INV_FILT_EVT)) return 0; =20 + if (attr =3D=3D &format_attr_inv_data_src_filter.attr && + !(spe_pmu->features & SPE_PMU_FEAT_FDS)) + return 0; + if ((attr =3D=3D &format_attr_branch_filter_mask.attr || attr =3D=3D &format_attr_load_filter_mask.attr || attr =3D=3D &format_attr_store_filter_mask.attr || @@ -425,6 +436,9 @@ static u64 arm_spe_event_to_pmsfcr(struct perf_event *e= vent) if (ATTR_CFG_GET_FLD(attr, inv_event_filter)) reg |=3D PMSFCR_EL1_FnE; =20 + if (ATTR_CFG_GET_FLD(attr, inv_data_src_filter)) + reg |=3D PMSFCR_EL1_FDS; + if (ATTR_CFG_GET_FLD(attr, min_latency)) reg |=3D PMSFCR_EL1_FL; =20 @@ -449,6 +463,17 @@ static u64 arm_spe_event_to_pmslatfr(struct perf_event= *event) return FIELD_PREP(PMSLATFR_EL1_MINLAT, ATTR_CFG_GET_FLD(attr, min_latency= )); } =20 +static u64 arm_spe_event_to_pmsdsfr(struct perf_event *event) +{ + struct perf_event_attr *attr =3D &event->attr; + + /* + * Data src filter is inverted so that the default value of 0 is + * equivalent to no filtering. + */ + return ~ATTR_CFG_GET_FLD(attr, inv_data_src_filter); +} + static void arm_spe_pmu_pad_buf(struct perf_output_handle *handle, int len) { struct arm_spe_pmu_buf *buf =3D perf_get_aux(handle); @@ -786,6 +811,10 @@ static int arm_spe_pmu_event_init(struct perf_event *e= vent) if (arm_spe_event_to_pmsnevfr(event) & spe_pmu->pmsevfr_res0) return -EOPNOTSUPP; =20 + if (arm_spe_event_to_pmsdsfr(event) !=3D U64_MAX && + !(spe_pmu->features & SPE_PMU_FEAT_FDS)) + return -EOPNOTSUPP; + if (attr->exclude_idle) return -EOPNOTSUPP; =20 @@ -861,6 +890,11 @@ static void arm_spe_pmu_start(struct perf_event *event= , int flags) write_sysreg_s(reg, SYS_PMSNEVFR_EL1); } =20 + if (spe_pmu->features & SPE_PMU_FEAT_FDS) { + reg =3D arm_spe_event_to_pmsdsfr(event); + write_sysreg_s(reg, SYS_PMSDSFR_EL1); + } + reg =3D arm_spe_event_to_pmslatfr(event); write_sysreg_s(reg, SYS_PMSLATFR_EL1); =20 @@ -1120,6 +1154,9 @@ static void __arm_spe_pmu_dev_probe(void *info) if (FIELD_GET(PMSIDR_EL1_EFT, reg)) spe_pmu->features |=3D SPE_PMU_FEAT_EFT; =20 + if (FIELD_GET(PMSIDR_EL1_FDS, reg)) + spe_pmu->features |=3D SPE_PMU_FEAT_FDS; + /* This field has a spaced out encoding, so just use a look-up */ fld =3D FIELD_GET(PMSIDR_EL1_INTERVAL, reg); switch (fld) { --=20 2.34.1