On 26/10/2026 05:48, Amir Ayupov wrote:
A feature loads on a device when the two share any match flag. That works for device classes, where a feature wants any one of them, but not for capabilities a device may or may not have: a feature that sets a class and a capability would still load on a device of that class without the capability.
Split the match flags into CS_CFG_MATCH_CLASS_MASK for device classes and CS_CFG_MATCH_CAP_MASK for capabilities. A feature now loads on a device that shares one of its classes and has all of its capabilities. Check this once in cscfg_load_feat_csdev(), which both the feature and the device registration paths call. No capability flags are defined yet, so matching is unchanged.
Assisted-by: Devmate:Opus-5.5 Signed-off-by: Amir Ayupov aaupov@fb.com
.../hwtracing/coresight/coresight-config.h | 8 ++++ .../hwtracing/coresight/coresight-syscfg.c | 37 +++++++++++++------ 2 files changed, 34 insertions(+), 11 deletions(-)
diff --git a/drivers/hwtracing/coresight/coresight-config.h b/drivers/hwtracing/coresight/coresight-config.h index ae6295e308131..f04e73b91d9a6 100644 --- a/drivers/hwtracing/coresight/coresight-config.h +++ b/drivers/hwtracing/coresight/coresight-config.h @@ -7,6 +7,7 @@ #ifndef _CORESIGHT_CORESIGHT_CONFIG_H #define _CORESIGHT_CORESIGHT_CONFIG_H +#include <linux/bits.h> #include <linux/cleanup.h> #include <linux/coresight.h> #include <linux/types.h> @@ -30,6 +31,13 @@ */ #define CS_CFG_MATCH_CLASS_SRC_ALL 0x0001 /* match any source */ #define CS_CFG_MATCH_CLASS_SRC_ETM4 0x0002 /* match any ETMv4 device */ +#define CS_CFG_MATCH_CLASS_MASK GENMASK_U32(7, 0)
+/*
- flags defining device capabilities a feature can require. A feature loads on
- a device that matches one of its classes and has all of its capabilities.
- */
+#define CS_CFG_MATCH_CAP_MASK GENMASK_U32(15, 8) /* flags defining device instance matching - used in config match desc data. */ #define CS_CFG_MATCH_INST_ANY 0x80000000 /* any instance of a class */ diff --git a/drivers/hwtracing/coresight/coresight-syscfg.c b/drivers/hwtracing/coresight/coresight-syscfg.c index a816c22c87bc8..3ee104e94a4cd 100644 --- a/drivers/hwtracing/coresight/coresight-syscfg.c +++ b/drivers/hwtracing/coresight/coresight-syscfg.c @@ -171,8 +171,22 @@ cscfg_alloc_csdev_feat(struct coresight_device *csdev, struct cscfg_feature_desc return feat_csdev; } -/* load one feature into one coresight device */ +static bool cscfg_match_feat_csdev(u32 feat_flags, u32 csdev_flags) +{
- /* The device must be in one of the feature's classes */
- if (!(feat_flags & csdev_flags & CS_CFG_MATCH_CLASS_MASK))
return false;- /* The device must have every capability the feature requires */
- if (feat_flags & ~csdev_flags & CS_CFG_MATCH_CAP_MASK)
return false;- return true;
+}
+/* Load the feature into the device if it matches, otherwise skip it. */ static int cscfg_load_feat_csdev(struct coresight_device *csdev,
{u32 match_flags, struct cscfg_feature_desc *feat_desc, struct cscfg_csdev_feat_ops *ops)@@ -183,6 +197,9 @@ static int cscfg_load_feat_csdev(struct coresight_device *csdev, if (!ops->load_feat) return -EINVAL;
- if (!cscfg_match_feat_csdev(feat_desc->match_flags, match_flags))
return 0;- feat_csdev = cscfg_alloc_csdev_feat(csdev, feat_desc); if (!feat_csdev) return -ENOMEM;
@@ -212,11 +229,11 @@ static int cscfg_add_feat_to_csdevs(struct cscfg_feature_desc *feat_desc) int err; list_for_each_entry(csdev_item, &cscfg_mgr->csdev_desc_list, item) {
if (csdev_item->match_flags & feat_desc->match_flags) {err = cscfg_load_feat_csdev(csdev_item->csdev, feat_desc, &csdev_item->ops);if (err)return err;}
err = cscfg_load_feat_csdev(csdev_item->csdev,csdev_item->match_flags, feat_desc,&csdev_item->ops);if (err) } return 0; }return err;@@ -739,11 +756,9 @@ static int cscfg_add_feats_csdev(struct coresight_device *csdev, return -EINVAL; list_for_each_entry(feat_desc, &cscfg_mgr->feat_desc_list, item) {
if (feat_desc->match_flags & match_flags) {err = cscfg_load_feat_csdev(csdev, feat_desc, ops);if (err)break;}
err = cscfg_load_feat_csdev(csdev, match_flags, feat_desc, ops);if (err) } return err; }break;
Reviewed-by: James Clark james.clark@linaro.org