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
 
 }
 
 /* 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;
                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);
        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;
        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))
                (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",
                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