]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
platform/x86/intel/vsec: Skip driverless features
authorDavid E. Box <david.e.box@linux.intel.com>
Thu, 3 Jul 2025 02:28:21 +0000 (19:28 -0700)
committerIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Thu, 3 Jul 2025 08:09:28 +0000 (11:09 +0300)
If a feature lacks a corresponding driver and that feature is also a
supplier, registering it would be prevent the consumer driver from probing.
Introduces logic to skip such features during device registration.

Signed-off-by: David E. Box <david.e.box@linux.intel.com>
Link: https://lore.kernel.org/r/20250703022832.1302928-7-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 32f777b41b337ad1fb6a7c2ee38fb7590f90524c..30e558af6888770862a96f79eb12b6aaff089593 100644 (file)
@@ -123,6 +123,26 @@ get_consumer_dependencies(struct vsec_priv *priv, int cap_id)
        return NULL;
 }
 
+static bool vsec_driver_present(int cap_id)
+{
+       unsigned long bit = BIT(cap_id);
+
+       switch (bit) {
+       case VSEC_CAP_TELEMETRY:
+               return IS_ENABLED(CONFIG_INTEL_PMT_TELEMETRY);
+       case VSEC_CAP_WATCHER:
+               return IS_ENABLED(CONFIG_INTEL_PMT_WATCHER);
+       case VSEC_CAP_CRASHLOG:
+               return IS_ENABLED(CONFIG_INTEL_PMT_CRASHLOG);
+       case VSEC_CAP_SDSI:
+               return IS_ENABLED(CONFIG_INTEL_SDSI);
+       case VSEC_CAP_TPMI:
+               return IS_ENABLED(CONFIG_INTEL_TPMI);
+       default:
+               return false;
+       }
+}
+
 /*
  * Although pci_device_id table is available in the pdev, this prototype is
  * necessary because the code using it can be called by an exported API that
@@ -158,7 +178,8 @@ static int intel_vsec_link_devices(struct pci_dev *pdev, struct device *dev,
        for_each_set_bit(supplier_id, &deps->supplier_bitmap, VSEC_FEATURE_COUNT) {
                struct device_link *link;
 
-               if (state[supplier_id] != STATE_REGISTERED)
+               if (state[supplier_id] != STATE_REGISTERED ||
+                   !vsec_driver_present(supplier_id))
                        continue;
 
                if (!suppliers[supplier_id]) {
@@ -405,6 +426,11 @@ static int intel_vsec_register_device(struct pci_dev *pdev,
 
        priv->found_caps |= BIT(cap_id);
 
+       if (!vsec_driver_present(cap_id)) {
+               priv->state[cap_id] = STATE_SKIP;
+               return -ENODEV;
+       }
+
        consumer_deps = get_consumer_dependencies(priv, cap_id);
        if (!consumer_deps || suppliers_ready(priv, consumer_deps, cap_id)) {
                ret = intel_vsec_add_dev(pdev, header, info, cap_id);