intel_extreme: fix pipe selection for Ivy Bridge and later

Should fix #15661 and #15662.
This commit is contained in:
Adrien Destugues
2020-02-09 15:40:52 +01:00
parent 0c1bd1b601
commit 015fbeab9c
2 changed files with 8 additions and 5 deletions
@@ -218,7 +218,7 @@ Pipe::ConfigureTimings(display_mode* target, bool hardware)
| ((uint32)target->timing.v_sync_start - 1)); | ((uint32)target->timing.v_sync_start - 1));
} }
if (gInfo->shared_info->device_type.Generation() != 6) { if (gInfo->shared_info->device_type.Generation() < 6) {
// FIXME check on which generations this register exists // FIXME check on which generations this register exists
// (it appears it would be available only for cursor planes, not // (it appears it would be available only for cursor planes, not
// display planes) // display planes)
@@ -130,6 +130,8 @@ Port::SetPipe(Pipe* pipe)
uint32 portState = read32(portRegister); uint32 portState = read32(portRegister);
// FIXME is the use of PORT_TRANS_* constants correct for Sandy Bridge /
// Cougar Point? Or is it only for Ivy Bridge / Panther point onwards?
if (gInfo->shared_info->pch_info == INTEL_PCH_CPT) { if (gInfo->shared_info->pch_info == INTEL_PCH_CPT) {
portState &= PORT_TRANS_SEL_MASK; portState &= PORT_TRANS_SEL_MASK;
if (pipe->Index() == INTEL_PIPE_A) if (pipe->Index() == INTEL_PIPE_A)
@@ -379,10 +381,10 @@ LVDSPort::PipePreference()
// Ideally we could just return INTEL_PIPE_ANY for the newer devices, but // Ideally we could just return INTEL_PIPE_ANY for the newer devices, but
// this doesn't quite work yet. // this doesn't quite work yet.
// For Ibex Point, read the existing LVDS configuration and just reuse that // For Ibex Point and Sandy Bridge, read the existing LVDS configuration
// (it seems our attempt to change it doesn't work, anyway) // and just reuse that (it seems our attempt to change it doesn't work,
if (gInfo->shared_info->pch_info == INTEL_PCH_IBX // anyway)
|| gInfo->shared_info->pch_info == INTEL_PCH_CPT) { if (gInfo->shared_info->device_type.Generation() <= 6) {
uint32 portState = read32(_PortRegister()); uint32 portState = read32(_PortRegister());
if (portState & DISPLAY_MONITOR_PIPE_B) if (portState & DISPLAY_MONITOR_PIPE_B)
return INTEL_PIPE_B; return INTEL_PIPE_B;
@@ -393,6 +395,7 @@ LVDSPort::PipePreference()
// For later PCH versions, assume pipe B for now. Note that later devices // For later PCH versions, assume pipe B for now. Note that later devices
// add a pipe C (but do they add a transcoder C?), so we'd need to handle // add a pipe C (but do they add a transcoder C?), so we'd need to handle
// that and the port register has a different format because of it. // that and the port register has a different format because of it.
// (using PORT_TRANS_*_SEL_CPT to select which transcoder to use)
return INTEL_PIPE_B; return INTEL_PIPE_B;
} }