|
@@ -26,6 +26,7 @@
|
|
|
*/
|
|
|
|
|
|
#include <linux/acpi.h>
|
|
|
+#include <linux/dmi.h>
|
|
|
#include <acpi/video.h>
|
|
|
|
|
|
#include <drm/drmP.h>
|
|
@@ -904,6 +905,25 @@ static void swsci_setup(struct drm_device *dev)
|
|
|
static inline void swsci_setup(struct drm_device *dev) {}
|
|
|
#endif /* CONFIG_ACPI */
|
|
|
|
|
|
+static int intel_no_opregion_vbt_callback(const struct dmi_system_id *id)
|
|
|
+{
|
|
|
+ DRM_DEBUG_KMS("Falling back to manually reading VBT from "
|
|
|
+ "VBIOS ROM for %s\n", id->ident);
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+static const struct dmi_system_id intel_no_opregion_vbt[] = {
|
|
|
+ {
|
|
|
+ .callback = intel_no_opregion_vbt_callback,
|
|
|
+ .ident = "ThinkCentre A57",
|
|
|
+ .matches = {
|
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "97027RG"),
|
|
|
+ },
|
|
|
+ },
|
|
|
+ { }
|
|
|
+};
|
|
|
+
|
|
|
int intel_opregion_setup(struct drm_device *dev)
|
|
|
{
|
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
@@ -942,8 +962,6 @@ int intel_opregion_setup(struct drm_device *dev)
|
|
|
goto err_out;
|
|
|
}
|
|
|
opregion->header = base;
|
|
|
- opregion->vbt = base + OPREGION_VBT_OFFSET;
|
|
|
-
|
|
|
opregion->lid_state = base + ACPI_CLID;
|
|
|
|
|
|
mboxes = opregion->header->mboxes;
|
|
@@ -968,6 +986,9 @@ int intel_opregion_setup(struct drm_device *dev)
|
|
|
if (mboxes & MBOX_ASLE_EXT)
|
|
|
DRM_DEBUG_DRIVER("ASLE extension supported\n");
|
|
|
|
|
|
+ if (!dmi_check_system(intel_no_opregion_vbt))
|
|
|
+ opregion->vbt = base + OPREGION_VBT_OFFSET;
|
|
|
+
|
|
|
return 0;
|
|
|
|
|
|
err_out:
|