Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6d139a87 authored by Bryan Freed's avatar Bryan Freed Committed by Chris Wilson
Browse files

drm/i915: Initialize panel timing registers if VBIOS did not



The time between start of the pixel clock and backlight enable is a basic
panel timing constraint.  If the Panel Power On/Off registers are found
to be 0, assume we are booting without VBIOS initialization and set these
registers to something reasonable.

Change-Id: Ibed6cc10d46bf52fd92e0beb25ae3525b5eef99d
Signed-off-by: default avatarBryan Freed <bfreed@chromium.org>
[ickle: rearranged into a separate function to distinguish its role from
simply parsing the VBIOS tables.]
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
parent e60a0b10
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -1235,7 +1235,7 @@ static int i915_load_modeset_init(struct drm_device *dev,
	 */
	dev_priv->allow_batchbuffer = 1;

	ret = intel_init_bios(dev);
	ret = intel_parse_bios(dev);
	if (ret)
		DRM_INFO("failed to find VBIOS tables\n");

@@ -2001,6 +2001,9 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
	intel_setup_gmbus(dev);
	intel_opregion_setup(dev);

	/* Make sure the bios did its job and set up vital registers */
	intel_setup_bios(dev);

	i915_gem_load(dev);

	/* Init HWS */
+19 −2
Original line number Diff line number Diff line
@@ -577,7 +577,7 @@ init_vbt_defaults(struct drm_i915_private *dev_priv)
}

/**
 * intel_init_bios - initialize VBIOS settings & find VBT
 * intel_parse_bios - find VBT and initialize settings from the BIOS
 * @dev: DRM device
 *
 * Loads the Video BIOS and checks that the VBT exists.  Sets scratch registers
@@ -586,7 +586,7 @@ init_vbt_defaults(struct drm_i915_private *dev_priv)
 * Returns 0 on success, nonzero on failure.
 */
bool
intel_init_bios(struct drm_device *dev)
intel_parse_bios(struct drm_device *dev)
{
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct pci_dev *pdev = dev->pdev;
@@ -647,3 +647,20 @@ intel_init_bios(struct drm_device *dev)

	return 0;
}

/* Ensure that vital registers have been initialised, even if the BIOS
 * is absent or just failing to do its job.
 */
void intel_setup_bios(struct drm_device *dev)
{
	struct drm_i915_private *dev_priv = dev->dev_private;

	 /* Set the Panel Power On/Off timings if uninitialized. */
	if ((I915_READ(PP_ON_DELAYS) == 0) && (I915_READ(PP_OFF_DELAYS) == 0)) {
		/* Set T2 to 40ms and T5 to 200ms */
		I915_WRITE(PP_ON_DELAYS, 0x019007d0);

		/* Set T3 to 35ms and Tx to 200ms */
		I915_WRITE(PP_OFF_DELAYS, 0x015e07d0);
	}
}
+2 −1
Original line number Diff line number Diff line
@@ -467,7 +467,8 @@ struct bdb_edp {
	struct edp_link_params link_params[16];
} __attribute__ ((packed));

bool intel_init_bios(struct drm_device *dev);
void intel_setup_bios(struct drm_device *dev);
bool intel_parse_bios(struct drm_device *dev);

/*
 * Driver<->VBIOS interaction occurs through scratch bits in