|
|
@@ -1462,36 +1462,35 @@ static const struct vbt_header *find_vbt(void __iomem *bios, size_t size)
|
|
|
* intel_bios_init - find VBT and initialize settings from the BIOS
|
|
|
* @dev_priv: i915 device instance
|
|
|
*
|
|
|
- * Loads the Video BIOS and checks that the VBT exists. Sets scratch registers
|
|
|
- * to appropriate values.
|
|
|
- *
|
|
|
- * Returns 0 on success, nonzero on failure.
|
|
|
+ * Parse and initialize settings from the Video BIOS Tables (VBT). If the VBT
|
|
|
+ * was not found in ACPI OpRegion, try to find it in PCI ROM first. Also
|
|
|
+ * initialize some defaults if the VBT is not present at all.
|
|
|
*/
|
|
|
-int
|
|
|
-intel_bios_init(struct drm_i915_private *dev_priv)
|
|
|
+void intel_bios_init(struct drm_i915_private *dev_priv)
|
|
|
{
|
|
|
struct pci_dev *pdev = dev_priv->drm.pdev;
|
|
|
const struct vbt_header *vbt = dev_priv->opregion.vbt;
|
|
|
const struct bdb_header *bdb;
|
|
|
u8 __iomem *bios = NULL;
|
|
|
|
|
|
- if (HAS_PCH_NOP(dev_priv))
|
|
|
- return -ENODEV;
|
|
|
+ if (HAS_PCH_NOP(dev_priv)) {
|
|
|
+ DRM_DEBUG_KMS("Skipping VBT init due to disabled display.\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
init_vbt_defaults(dev_priv);
|
|
|
|
|
|
+ /* If the OpRegion does not have VBT, look in PCI ROM. */
|
|
|
if (!vbt) {
|
|
|
size_t size;
|
|
|
|
|
|
bios = pci_map_rom(pdev, &size);
|
|
|
if (!bios)
|
|
|
- return -1;
|
|
|
+ goto out;
|
|
|
|
|
|
vbt = find_vbt(bios, size);
|
|
|
- if (!vbt) {
|
|
|
- pci_unmap_rom(pdev, bios);
|
|
|
- return -1;
|
|
|
- }
|
|
|
+ if (!vbt)
|
|
|
+ goto out;
|
|
|
|
|
|
DRM_DEBUG_KMS("Found valid VBT in PCI ROM\n");
|
|
|
}
|
|
|
@@ -1516,10 +1515,12 @@ intel_bios_init(struct drm_i915_private *dev_priv)
|
|
|
parse_mipi_sequence(dev_priv, bdb);
|
|
|
parse_ddi_ports(dev_priv, bdb);
|
|
|
|
|
|
+out:
|
|
|
+ if (!vbt)
|
|
|
+ DRM_INFO("Failed to find VBIOS tables (VBT)\n");
|
|
|
+
|
|
|
if (bios)
|
|
|
pci_unmap_rom(pdev, bios);
|
|
|
-
|
|
|
- return 0;
|
|
|
}
|
|
|
|
|
|
/**
|