module_param_named_unsafe(reset, i915.reset, int, 0600);
 MODULE_PARM_DESC(reset, "Attempt GPU resets (0=disabled, 1=full gpu reset, 2=engine reset [default])");
 
+module_param_named_unsafe(vbt_firmware, i915.vbt_firmware, charp, 0400);
+MODULE_PARM_DESC(vbt_firmware,
+                "Load VBT from specified file under /lib/firmware");
+
 #if IS_ENABLED(CONFIG_DRM_I915_CAPTURE_ERROR)
 module_param_named(error_capture, i915.error_capture, bool, 0600);
 MODULE_PARM_DESC(error_capture,
 
 
 #include <linux/acpi.h>
 #include <linux/dmi.h>
+#include <linux/firmware.h>
 #include <acpi/video.h>
 
 #include <drm/drmP.h>
                memunmap(opregion->rvda);
                opregion->rvda = NULL;
        }
+       if (opregion->vbt_firmware) {
+               kfree(opregion->vbt_firmware);
+               opregion->vbt_firmware = NULL;
+       }
        opregion->header = NULL;
        opregion->acpi = NULL;
        opregion->swsci = NULL;
        { }
 };
 
+static int intel_load_vbt_firmware(struct drm_i915_private *dev_priv)
+{
+       struct intel_opregion *opregion = &dev_priv->opregion;
+       const struct firmware *fw = NULL;
+       const char *name = i915.vbt_firmware;
+       int ret;
+
+       if (!name || !*name)
+               return -ENOENT;
+
+       ret = request_firmware(&fw, name, &dev_priv->drm.pdev->dev);
+       if (ret) {
+               DRM_ERROR("Requesting VBT firmware \"%s\" failed (%d)\n",
+                         name, ret);
+               return ret;
+       }
+
+       if (intel_bios_is_valid_vbt(fw->data, fw->size)) {
+               opregion->vbt_firmware = kmemdup(fw->data, fw->size, GFP_KERNEL);
+               if (opregion->vbt_firmware) {
+                       DRM_DEBUG_KMS("Found valid VBT firmware \"%s\"\n", name);
+                       opregion->vbt = opregion->vbt_firmware;
+                       opregion->vbt_size = fw->size;
+                       ret = 0;
+               } else {
+                       ret = -ENOMEM;
+               }
+       } else {
+               DRM_DEBUG_KMS("Invalid VBT firmware \"%s\"\n", name);
+               ret = -EINVAL;
+       }
+
+       release_firmware(fw);
+
+       return ret;
+}
+
 int intel_opregion_setup(struct drm_i915_private *dev_priv)
 {
        struct intel_opregion *opregion = &dev_priv->opregion;
        if (mboxes & MBOX_ASLE_EXT)
                DRM_DEBUG_DRIVER("ASLE extension supported\n");
 
+       if (intel_load_vbt_firmware(dev_priv) == 0)
+               goto out;
+
        if (dmi_check_system(intel_no_opregion_vbt))
                goto out;