mirror of
https://github.com/torvalds/linux.git
synced 2024-12-04 18:13:04 +00:00
drm/i915: Don't set up DP ports that aren't in the BIOS device table.
Use the child device array to decide whether the given DP output should be initialized. If the given DP port can't be found in child device array, it is not present and won't be initialized. Signed-off-by: Zhao Yakui <yakui.zhao@intel.com> Signed-off-by: Eric Anholt <eric@anholt.net>
This commit is contained in:
parent
fc81665523
commit
ae266c98f5
@ -35,6 +35,7 @@
|
||||
#include "i915_drv.h"
|
||||
#include "intel_dp.h"
|
||||
|
||||
|
||||
#define DP_LINK_STATUS_SIZE 6
|
||||
#define DP_LINK_CHECK_TIMEOUT (10 * 1000)
|
||||
|
||||
@ -1228,7 +1229,53 @@ intel_dp_hot_plug(struct intel_output *intel_output)
|
||||
if (dp_priv->dpms_mode == DRM_MODE_DPMS_ON)
|
||||
intel_dp_check_link_status(intel_output);
|
||||
}
|
||||
/*
|
||||
* Enumerate the child dev array parsed from VBT to check whether
|
||||
* the given DP is present.
|
||||
* If it is present, return 1.
|
||||
* If it is not present, return false.
|
||||
* If no child dev is parsed from VBT, it is assumed that the given
|
||||
* DP is present.
|
||||
*/
|
||||
int dp_is_present_in_vbt(struct drm_device *dev, int dp_reg)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
struct child_device_config *p_child;
|
||||
int i, dp_port, ret;
|
||||
|
||||
if (!dev_priv->child_dev_num)
|
||||
return 1;
|
||||
|
||||
dp_port = 0;
|
||||
if (dp_reg == DP_B || PCH_DP_B)
|
||||
dp_port = PORT_IDPB;
|
||||
else if (dp_reg == DP_C || PCH_DP_C)
|
||||
dp_port = PORT_IDPC;
|
||||
else if (dp_reg == DP_D || PCH_DP_D)
|
||||
dp_port = PORT_IDPD;
|
||||
|
||||
ret = 0;
|
||||
for (i = 0; i < dev_priv->child_dev_num; i++) {
|
||||
p_child = dev_priv->child_dev + i;
|
||||
/*
|
||||
* If the device type is not DP, continue.
|
||||
*/
|
||||
if (p_child->device_type != DEVICE_TYPE_DP &&
|
||||
p_child->device_type != DEVICE_TYPE_eDP)
|
||||
continue;
|
||||
/* Find the eDP port */
|
||||
if (dp_reg == DP_A && p_child->device_type == DEVICE_TYPE_eDP) {
|
||||
ret = 1;
|
||||
break;
|
||||
}
|
||||
/* Find the DP port */
|
||||
if (p_child->dvo_port == dp_port) {
|
||||
ret = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
void
|
||||
intel_dp_init(struct drm_device *dev, int output_reg)
|
||||
{
|
||||
@ -1238,6 +1285,10 @@ intel_dp_init(struct drm_device *dev, int output_reg)
|
||||
struct intel_dp_priv *dp_priv;
|
||||
const char *name = NULL;
|
||||
|
||||
if (!dp_is_present_in_vbt(dev, output_reg)) {
|
||||
DRM_DEBUG_KMS("DP is not present. Ignore it\n");
|
||||
return;
|
||||
}
|
||||
intel_output = kcalloc(sizeof(struct intel_output) +
|
||||
sizeof(struct intel_dp_priv), 1, GFP_KERNEL);
|
||||
if (!intel_output)
|
||||
|
Loading…
Reference in New Issue
Block a user