]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/i915: Expand force_probe to block probe of devices as well.
authorRodrigo Vivi <rodrigo.vivi@intel.com>
Tue, 3 Jan 2023 19:47:01 +0000 (14:47 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 24 May 2023 16:32:33 +0000 (17:32 +0100)
[ Upstream commit 157821fb3e9aaa07cf408686b08d117bf27b7de1 ]

There are new cases where we want to block i915 probe, such
as when experimenting or developing the new Xe driver.

But also, with the new hybrid cards, users or developers might
want to use i915 only on integrated and fully block the probe
of the i915 for the discrete. Or vice versa.

There are even older development and validation reasons,
like when you use some distro where the modprobe.blacklist is
not present.

But in any case, let's introduce a more granular control, but without
introducing yet another parameter, but using the existent force_probe
one.

Just by adding a ! in the begin of the id in the force_probe, like
in this case where we would block the probe for Alder Lake:

$ insmod i915.ko force_probe='!46a6'

v2: Take care of '*' and  '!*' cases as pointed out by
    Gustavo and Jani.

Cc: Jani Nikula <jani.nikula@intel.com>
Cc: Gustavo Sousa <gustavo.sousa@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Acked-by: Gustavo Sousa <gustavo.sousa@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230103194701.1492984-1-rodrigo.vivi@intel.com
Stable-dep-of: 79c901c93562 ("drm/i915: taint kernel when force probing unsupported devices")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/i915/Kconfig
drivers/gpu/drm/i915/i915_params.c
drivers/gpu/drm/i915/i915_pci.c

index 3a6e176d77aa57de4da9d609a347e22a8e896318..e04715fa5bc4c56c9ed204a6ea96398a919dcff4 100644 (file)
@@ -54,24 +54,33 @@ config DRM_I915
          If "M" is selected, the module will be called i915.
 
 config DRM_I915_FORCE_PROBE
-       string "Force probe driver for selected new Intel hardware"
+       string "Force probe i915 for selected Intel hardware IDs"
        depends on DRM_I915
        help
          This is the default value for the i915.force_probe module
          parameter. Using the module parameter overrides this option.
 
-         Force probe the driver for new Intel graphics devices that are
+         Force probe the i915 for Intel graphics devices that are
          recognized but not properly supported by this kernel version. It is
          recommended to upgrade to a kernel version with proper support as soon
          as it is available.
 
+         It can also be used to block the probe of recognized and fully
+         supported devices.
+
          Use "" to disable force probe. If in doubt, use this.
 
-         Use "<pci-id>[,<pci-id>,...]" to force probe the driver for listed
+         Use "<pci-id>[,<pci-id>,...]" to force probe the i915 for listed
          devices. For example, "4500" or "4500,4571".
 
          Use "*" to force probe the driver for all known devices.
 
+         Use "!" right before the ID to block the probe of the device. For
+         example, "4500,!4571" forces the probe of 4500 and blocks the probe of
+         4571.
+
+         Use "!*" to block the probe of the driver for all known devices.
+
 config DRM_I915_CAPTURE_ERROR
        bool "Enable capturing GPU state following a hang"
        depends on DRM_I915
index d1e4d528cb174d68d3c08a7f9d29d38ac4b2ade6..5b24dd50fb6a4c5d0741b9e73809dc73d128b22c 100644 (file)
@@ -122,7 +122,7 @@ i915_param_named_unsafe(enable_psr2_sel_fetch, bool, 0400,
        "Default: 0");
 
 i915_param_named_unsafe(force_probe, charp, 0400,
-       "Force probe the driver for specified devices. "
+       "Force probe options for specified supported devices. "
        "See CONFIG_DRM_I915_FORCE_PROBE for details.");
 
 i915_param_named_unsafe(disable_power_well, int, 0400,
index a2efc0b9d50c8c79d4cfb4eee265bf75a90c86ed..1fa4a5813683fda48368a2e6cc21b92c50bed416 100644 (file)
@@ -1252,7 +1252,7 @@ static void i915_pci_remove(struct pci_dev *pdev)
 }
 
 /* is device_id present in comma separated list of ids */
-static bool force_probe(u16 device_id, const char *devices)
+static bool device_id_in_list(u16 device_id, const char *devices, bool negative)
 {
        char *s, *p, *tok;
        bool ret;
@@ -1261,7 +1261,9 @@ static bool force_probe(u16 device_id, const char *devices)
                return false;
 
        /* match everything */
-       if (strcmp(devices, "*") == 0)
+       if (negative && strcmp(devices, "!*") == 0)
+               return true;
+       if (!negative && strcmp(devices, "*") == 0)
                return true;
 
        s = kstrdup(devices, GFP_KERNEL);
@@ -1271,6 +1273,12 @@ static bool force_probe(u16 device_id, const char *devices)
        for (p = s, ret = false; (tok = strsep(&p, ",")) != NULL; ) {
                u16 val;
 
+               if (negative && tok[0] == '!')
+                       tok++;
+               else if ((negative && tok[0] != '!') ||
+                        (!negative && tok[0] == '!'))
+                       continue;
+
                if (kstrtou16(tok, 16, &val) == 0 && val == device_id) {
                        ret = true;
                        break;
@@ -1282,6 +1290,16 @@ static bool force_probe(u16 device_id, const char *devices)
        return ret;
 }
 
+static bool id_forced(u16 device_id)
+{
+       return device_id_in_list(device_id, i915_modparams.force_probe, false);
+}
+
+static bool id_blocked(u16 device_id)
+{
+       return device_id_in_list(device_id, i915_modparams.force_probe, true);
+}
+
 bool i915_pci_resource_valid(struct pci_dev *pdev, int bar)
 {
        if (!pci_resource_flags(pdev, bar))
@@ -1309,10 +1327,9 @@ static int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                (struct intel_device_info *) ent->driver_data;
        int err;
 
-       if (intel_info->require_force_probe &&
-           !force_probe(pdev->device, i915_modparams.force_probe)) {
+       if (intel_info->require_force_probe && !id_forced(pdev->device)) {
                dev_info(&pdev->dev,
-                        "Your graphics device %04x is not properly supported by the driver in this\n"
+                        "Your graphics device %04x is not properly supported by i915 in this\n"
                         "kernel version. To force driver probe anyway, use i915.force_probe=%04x\n"
                         "module parameter or CONFIG_DRM_I915_FORCE_PROBE=%04x configuration option,\n"
                         "or (recommended) check for kernel updates.\n",
@@ -1320,6 +1337,12 @@ static int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                return -ENODEV;
        }
 
+       if (id_blocked(pdev->device)) {
+               dev_info(&pdev->dev, "I915 probe blocked for Device ID %04x.\n",
+                        pdev->device);
+               return -ENODEV;
+       }
+
        /* Only bind to function 0 of the device. Early generations
         * used function 1 as a placeholder for multi-head. This causes
         * us confusion instead, especially on the systems where both