diff --git a/src/add-ons/accelerants/intel_extreme/Ports.cpp b/src/add-ons/accelerants/intel_extreme/Ports.cpp index e69c67bcc6..41c91e5eea 100644 --- a/src/add-ons/accelerants/intel_extreme/Ports.cpp +++ b/src/add-ons/accelerants/intel_extreme/Ports.cpp @@ -1245,7 +1245,6 @@ EmbeddedDisplayPort::IsConnected() TRACE("%s: %s PortRegister: 0x%" B_PRIxADDR "\n", __func__, PortName(), portRegister); - // fixme: Skylake and up use eDP for a seperate active VGA converter chip sometimes. if (!gInfo->shared_info->device_type.IsMobile()) { TRACE("%s: skipping eDP on non-mobile GPU\n", __func__); return false; @@ -1351,7 +1350,8 @@ DigitalDisplayInterface::IsConnected() TRACE("%s: %s PortRegister: 0x%" B_PRIxADDR "\n", __func__, PortName(), portRegister); - if (portRegister == 0) + // Please note: Skylake and up (Desktop) use eDP for a seperate active VGA converter chip. + if ((portRegister == 0) && (PortIndex() != INTEL_PORT_E)) //DP protocol has no register return false; // Probe a little port info. @@ -1405,10 +1405,17 @@ DigitalDisplayInterface::IsConnected() break; } - if (((((pipeState & PIPE_DDI_SELECT_MASK) >> PIPE_DDI_SELECT_SHIFT) + 1) == (uint32)PortIndex()) - && (pipeState & PIPE_DDI_FUNC_CTL_ENABLE)) { + if ((((pipeState & PIPE_DDI_SELECT_MASK) >> PIPE_DDI_SELECT_SHIFT) + 1) == (uint32)PortIndex()) { + // See if the BIOS enabled our output as it indicates it's in use + if (pipeState & PIPE_DDI_FUNC_CTL_ENABLE) { TRACE("%s: Connected\n", __func__); return true; + } + // On laptops we always have an internal panel.. (this is on the eDP port) + if ((gInfo->shared_info->device_type.IsMobile()) && (PortIndex() == INTEL_PORT_E)) { + TRACE("%s: Laptop. Assuming internal panel is connected here\n", __func__); + return true; + } } } diff --git a/src/add-ons/accelerants/intel_extreme/accelerant.cpp b/src/add-ons/accelerants/intel_extreme/accelerant.cpp index d034a2de15..ec10f2630c 100644 --- a/src/add-ons/accelerants/intel_extreme/accelerant.cpp +++ b/src/add-ons/accelerants/intel_extreme/accelerant.cpp @@ -287,7 +287,7 @@ probe_ports() } } - // Digital Display Interface (for DP, HDMI and DVI) + // Digital Display Interface (for DP, HDMI, DVI and eDP) if (gInfo->shared_info->device_type.HasDDI()) { for (int i = INTEL_PORT_B; i <= INTEL_PORT_E; i++) { TRACE("Probing DDI %d\n", i); @@ -306,18 +306,19 @@ probe_ports() } } - // Ensure DP_A isn't already taken (or DDI) - // Please note that Skylake and up use eDP for a seperate active VGA converter chip. - TRACE("Probing eDP\n"); - if (!has_connected_port((port_index)INTEL_PORT_A, INTEL_PORT_TYPE_ANY)) { - // also always try eDP, it'll also just fail if not applicable - Port* eDPPort = new(std::nothrow) EmbeddedDisplayPort(); - if (eDPPort == NULL) - return B_NO_MEMORY; - if (eDPPort->IsConnected()) - gInfo->ports[gInfo->port_count++] = eDPPort; - else - delete eDPPort; + if (!gInfo->shared_info->device_type.HasDDI()) { + // Ensure DP_A isn't already taken + TRACE("Probing eDP\n"); + if (!has_connected_port((port_index)INTEL_PORT_A, INTEL_PORT_TYPE_ANY)) { + // also always try eDP, it'll also just fail if not applicable + Port* eDPPort = new(std::nothrow) EmbeddedDisplayPort(); + if (eDPPort == NULL) + return B_NO_MEMORY; + if (eDPPort->IsConnected()) + gInfo->ports[gInfo->port_count++] = eDPPort; + else + delete eDPPort; + } } if (!gInfo->shared_info->device_type.HasDDI()) {