]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
platform/x86/intel/vsec: Skip absent features during initialization
authorDavid E. Box <david.e.box@linux.intel.com>
Thu, 3 Jul 2025 02:28:20 +0000 (19:28 -0700)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Thu, 3 Jul 2025 08:09:26 +0000 (11:09 +0300)
Some VSEC features depend on the presence of supplier features that may not
always be present. To prevent unnecessary retries and device linking during
initialization, introduce logic to skip attempts to link consumers to
missing suppliers.

Signed-off-by: David E. Box <david.e.box@linux.intel.com>
Link: https://lore.kernel.org/r/20250703022832.1302928-6-david.e.box@linux.intel.com
Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
drivers/platform/x86/intel/vsec.c

index aa1f7e63039d0ae6731fed7c7d6efc15b4faa792..32f777b41b337ad1fb6a7c2ee38fb7590f90524c 100644 (file)
@@ -568,11 +568,30 @@ static bool intel_vsec_get_features(struct pci_dev *pdev,
        return found;
 }
 
+static void intel_vsec_skip_missing_dependencies(struct pci_dev *pdev)
+{
+       struct vsec_priv *priv = pci_get_drvdata(pdev);
+       const struct vsec_feature_dependency *deps = priv->info->deps;
+       int consumer_id = priv->info->num_deps;
+
+       while (consumer_id--) {
+               int supplier_id;
+
+               deps = &priv->info->deps[consumer_id];
+
+               for_each_set_bit(supplier_id, &deps->supplier_bitmap, VSEC_FEATURE_COUNT) {
+                       if (!(BIT(supplier_id) & priv->found_caps))
+                               priv->state[supplier_id] = STATE_SKIP;
+               }
+       }
+}
+
 static int intel_vsec_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 {
        struct intel_vsec_platform_info *info;
        struct vsec_priv *priv;
        int num_caps, ret;
+       int run_once = 0;
        bool found_any = false;
 
        ret = pcim_enable_device(pdev);
@@ -597,6 +616,11 @@ static int intel_vsec_pci_probe(struct pci_dev *pdev, const struct pci_device_id
 
                if (priv->found_caps == info->caps)
                        break;
+
+               if (!run_once) {
+                       intel_vsec_skip_missing_dependencies(pdev);
+                       run_once = 1;
+               }
        }
 
        if (!found_any)