intel_extreme: the eDP port on DDI is mostly found on port A
* for eDP a displayport output should also be found als VBT device type. * should help with #17730 Change-Id: I893bd2dabfd1730ab545336e2f9a5b15abc194a4 Reviewed-on: https://review.haiku-os.org/c/haiku/+/5299 Tested-by: Commit checker robot <[email protected]> Reviewed-by: Jérôme Duval <[email protected]>
This commit is contained in:
@@ -458,13 +458,14 @@ Port::_IsDisplayPortInVBT()
|
|||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Port::_IsInternalPanelPort()
|
Port::_IsEDPPort()
|
||||||
{
|
{
|
||||||
uint32 foundIndex = 0;
|
uint32 foundIndex = 0;
|
||||||
if (!_IsPortInVBT(&foundIndex))
|
if (!_IsPortInVBT(&foundIndex))
|
||||||
return false;
|
return false;
|
||||||
child_device_config& config = gInfo->shared_info->device_configs[foundIndex];
|
child_device_config& config = gInfo->shared_info->device_configs[foundIndex];
|
||||||
return (config.device_type & DEVICE_TYPE_INTERNAL_CONNECTOR) == DEVICE_TYPE_INTERNAL_CONNECTOR;
|
return (config.device_type & (DEVICE_TYPE_INTERNAL_CONNECTOR | DEVICE_TYPE_DISPLAYPORT_OUTPUT))
|
||||||
|
== (DEVICE_TYPE_INTERNAL_CONNECTOR | DEVICE_TYPE_DISPLAYPORT_OUTPUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -718,6 +719,7 @@ Port::_DpAuxTransfer(uint8* transmitBuffer, uint8 transmitSize,
|
|||||||
addr_t channelControl;
|
addr_t channelControl;
|
||||||
addr_t channelData[5];
|
addr_t channelData[5];
|
||||||
aux_channel channel = _DpAuxChannel();
|
aux_channel channel = _DpAuxChannel();
|
||||||
|
TRACE("%s: %s DpAuxChannel: 0x%x\n", __func__, PortName(), channel);
|
||||||
if (gInfo->shared_info->device_type.Generation() >= 9
|
if (gInfo->shared_info->device_type.Generation() >= 9
|
||||||
|| (gInfo->shared_info->pch_info != INTEL_PCH_NONE && channel == AUX_CH_A)) {
|
|| (gInfo->shared_info->pch_info != INTEL_PCH_NONE && channel == AUX_CH_A)) {
|
||||||
channelControl = DP_AUX_CH_CTL(channel);
|
channelControl = DP_AUX_CH_CTL(channel);
|
||||||
@@ -1633,7 +1635,7 @@ DisplayPort::IsConnected()
|
|||||||
bool edidDetected = HasEDID();
|
bool edidDetected = HasEDID();
|
||||||
|
|
||||||
// On laptops we always have an internal panel.. (this is on the eDP port)
|
// On laptops we always have an internal panel.. (this is on the eDP port)
|
||||||
if ((gInfo->shared_info->device_type.IsMobile() || _IsInternalPanelPort())
|
if ((gInfo->shared_info->device_type.IsMobile() || _IsEDPPort())
|
||||||
&& (PortIndex() == INTEL_PORT_A) && !edidDetected) {
|
&& (PortIndex() == INTEL_PORT_A) && !edidDetected) {
|
||||||
if (gInfo->shared_info->has_vesa_edid_info) {
|
if (gInfo->shared_info->has_vesa_edid_info) {
|
||||||
TRACE("%s: Laptop. Using VESA edid info\n", __func__);
|
TRACE("%s: Laptop. Using VESA edid info\n", __func__);
|
||||||
@@ -1899,7 +1901,7 @@ DisplayPort::SetDisplayMode(display_mode* target, uint32 colorMode)
|
|||||||
display_timing hardwareTarget = target->timing;
|
display_timing hardwareTarget = target->timing;
|
||||||
bool needsScaling = false;
|
bool needsScaling = false;
|
||||||
if ((PortIndex() == INTEL_PORT_A)
|
if ((PortIndex() == INTEL_PORT_A)
|
||||||
&& (gInfo->shared_info->device_type.IsMobile() || _IsInternalPanelPort())) {
|
&& (gInfo->shared_info->device_type.IsMobile() || _IsEDPPort())) {
|
||||||
// For internal panels, we may need to set the timings according to the panel
|
// For internal panels, we may need to set the timings according to the panel
|
||||||
// native video mode, and let the panel fitter do the scaling.
|
// native video mode, and let the panel fitter do the scaling.
|
||||||
// note: upto/including generation 5 laptop panels are still LVDS types, handled elsewhere.
|
// note: upto/including generation 5 laptop panels are still LVDS types, handled elsewhere.
|
||||||
@@ -2243,8 +2245,8 @@ DigitalDisplayInterface::IsConnected()
|
|||||||
|
|
||||||
// On laptops we always have an internal panel.. (on the eDP port on DDI systems, fixed on eDP pipe)
|
// On laptops we always have an internal panel.. (on the eDP port on DDI systems, fixed on eDP pipe)
|
||||||
uint32 pipeState = 0;
|
uint32 pipeState = 0;
|
||||||
if ((gInfo->shared_info->device_type.IsMobile() || _IsInternalPanelPort())
|
if ((gInfo->shared_info->device_type.IsMobile() || _IsEDPPort())
|
||||||
&& (PortIndex() == INTEL_PORT_E)) {
|
&& (PortIndex() == INTEL_PORT_A)) {
|
||||||
pipeState = read32(PIPE_DDI_FUNC_CTL_EDP);
|
pipeState = read32(PIPE_DDI_FUNC_CTL_EDP);
|
||||||
TRACE("%s: PIPE_DDI_FUNC_CTL_EDP: 0x%" B_PRIx32 "\n", __func__, pipeState);
|
TRACE("%s: PIPE_DDI_FUNC_CTL_EDP: 0x%" B_PRIx32 "\n", __func__, pipeState);
|
||||||
if (!(pipeState & PIPE_DDI_FUNC_CTL_ENABLE)) {
|
if (!(pipeState & PIPE_DDI_FUNC_CTL_ENABLE)) {
|
||||||
@@ -2478,8 +2480,8 @@ DigitalDisplayInterface::SetDisplayMode(display_mode* target, uint32 colorMode)
|
|||||||
|
|
||||||
display_timing hardwareTarget = target->timing;
|
display_timing hardwareTarget = target->timing;
|
||||||
bool needsScaling = false;
|
bool needsScaling = false;
|
||||||
if ((PortIndex() == INTEL_PORT_E)
|
if ((PortIndex() == INTEL_PORT_A)
|
||||||
&& (gInfo->shared_info->device_type.IsMobile() || _IsInternalPanelPort())) {
|
&& (gInfo->shared_info->device_type.IsMobile() || _IsEDPPort())) {
|
||||||
// For internal panels, we may need to set the timings according to the panel
|
// For internal panels, we may need to set the timings according to the panel
|
||||||
// native video mode, and let the panel fitter do the scaling.
|
// native video mode, and let the panel fitter do the scaling.
|
||||||
|
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ static status_t _SetI2CSignals(void* cookie, int clock,
|
|||||||
int data);
|
int data);
|
||||||
bool _IsPortInVBT(uint32* foundIndex = NULL);
|
bool _IsPortInVBT(uint32* foundIndex = NULL);
|
||||||
bool _IsDisplayPortInVBT();
|
bool _IsDisplayPortInVBT();
|
||||||
bool _IsInternalPanelPort();
|
bool _IsEDPPort();
|
||||||
status_t _SetupDpAuxI2c(struct i2c_bus *bus);
|
status_t _SetupDpAuxI2c(struct i2c_bus *bus);
|
||||||
|
|
||||||
ssize_t _DpAuxTransfer(dp_aux_msg* message);
|
ssize_t _DpAuxTransfer(dp_aux_msg* message);
|
||||||
|
|||||||
Reference in New Issue
Block a user