intel_extreme: Add initial TMDS modesetting code

This commit is contained in:
Alexander von Gluck IV
2015-11-09 09:26:07 -06:00
parent d442692fab
commit 92bcdd7935
3 changed files with 47 additions and 3 deletions
@@ -452,7 +452,7 @@ struct intel_free_graphics_memory {
#define DISPLAY_PLL_2X_CLOCK (1UL << 30)
#define DISPLAY_PLL_SYNC_LOCK_ENABLED (1UL << 29)
#define DISPLAY_PLL_NO_VGA_CONTROL (1UL << 28)
#define DISPLAY_PLL_MODE_ANALOG (1UL << 26)
#define DISPLAY_PLL_MODE_NORMAL (1UL << 26)
#define DISPLAY_PLL_MODE_LVDS (2UL << 26)
#define DISPLAY_PLL_DIVIDE_HIGH (1UL << 24)
#define DISPLAY_PLL_DIVIDE_4X (1UL << 23)
@@ -254,7 +254,7 @@ AnalogPort::SetDisplayMode(display_mode* target, uint32 colorMode)
uint32 extraPLLFlags = 0;
if (gInfo->shared_info->device_type.Generation() >= 4)
extraPLLFlags |= DISPLAY_PLL_MODE_ANALOG;
extraPLLFlags |= DISPLAY_PLL_MODE_NORMAL;
// Program pipe PLL's
fDisplayPipe->ConfigureTimings(divisors, extraPLLFlags);
@@ -655,11 +655,53 @@ DigitalPort::_DDCRegister()
addr_t
DigitalPort::_PortRegister()
{
ERROR("%s: %s PortRegister fallthrough\n", __func__, PortName());
switch (PortIndex()) {
case INTEL_PORT_A:
return INTEL_DIGITAL_PORT_A;
case INTEL_PORT_B:
return INTEL_DIGITAL_PORT_B;
case INTEL_PORT_C:
return INTEL_DIGITAL_PORT_C;
default:
return 0;
}
return 0;
}
status_t
DigitalPort::SetDisplayMode(display_mode* target, uint32 colorMode)
{
TRACE("%s: %s %dx%d\n", __func__, PortName(), target->virtual_width,
target->virtual_height);
if (fDisplayPipe == NULL) {
ERROR("%s: Setting display mode without assigned pipe!\n", __func__);
return B_ERROR;
}
pll_divisors divisors;
compute_pll_divisors(target, &divisors, false);
uint32 extraPLLFlags = 0;
if (gInfo->shared_info->device_type.Generation() >= 4)
extraPLLFlags |= DISPLAY_PLL_MODE_NORMAL;
// Program pipe PLL's
fDisplayPipe->ConfigureTimings(divisors, extraPLLFlags);
// Program target display mode
fDisplayPipe->Enable(target, _PortRegister());
// XXX: Crashes?
// Set fCurrentMode to our set display mode
//memcpy(fCurrentMode, target, sizeof(display_mode));
return B_OK;
}
// #pragma mark - LVDS Panel
// #pragma mark - HDMI
@@ -137,6 +137,8 @@ virtual uint32 Type() const
virtual bool IsConnected();
virtual status_t SetDisplayMode(display_mode* mode,
uint32 colorMode);
protected:
virtual addr_t _DDCRegister();