intel_extreme: Add initial TMDS modesetting code
This commit is contained in:
@@ -452,7 +452,7 @@ struct intel_free_graphics_memory {
|
|||||||
#define DISPLAY_PLL_2X_CLOCK (1UL << 30)
|
#define DISPLAY_PLL_2X_CLOCK (1UL << 30)
|
||||||
#define DISPLAY_PLL_SYNC_LOCK_ENABLED (1UL << 29)
|
#define DISPLAY_PLL_SYNC_LOCK_ENABLED (1UL << 29)
|
||||||
#define DISPLAY_PLL_NO_VGA_CONTROL (1UL << 28)
|
#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_MODE_LVDS (2UL << 26)
|
||||||
#define DISPLAY_PLL_DIVIDE_HIGH (1UL << 24)
|
#define DISPLAY_PLL_DIVIDE_HIGH (1UL << 24)
|
||||||
#define DISPLAY_PLL_DIVIDE_4X (1UL << 23)
|
#define DISPLAY_PLL_DIVIDE_4X (1UL << 23)
|
||||||
|
|||||||
@@ -254,7 +254,7 @@ AnalogPort::SetDisplayMode(display_mode* target, uint32 colorMode)
|
|||||||
|
|
||||||
uint32 extraPLLFlags = 0;
|
uint32 extraPLLFlags = 0;
|
||||||
if (gInfo->shared_info->device_type.Generation() >= 4)
|
if (gInfo->shared_info->device_type.Generation() >= 4)
|
||||||
extraPLLFlags |= DISPLAY_PLL_MODE_ANALOG;
|
extraPLLFlags |= DISPLAY_PLL_MODE_NORMAL;
|
||||||
|
|
||||||
// Program pipe PLL's
|
// Program pipe PLL's
|
||||||
fDisplayPipe->ConfigureTimings(divisors, extraPLLFlags);
|
fDisplayPipe->ConfigureTimings(divisors, extraPLLFlags);
|
||||||
@@ -655,11 +655,53 @@ DigitalPort::_DDCRegister()
|
|||||||
addr_t
|
addr_t
|
||||||
DigitalPort::_PortRegister()
|
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;
|
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
|
// #pragma mark - HDMI
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -137,6 +137,8 @@ virtual uint32 Type() const
|
|||||||
|
|
||||||
virtual bool IsConnected();
|
virtual bool IsConnected();
|
||||||
|
|
||||||
|
virtual status_t SetDisplayMode(display_mode* mode,
|
||||||
|
uint32 colorMode);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual addr_t _DDCRegister();
|
virtual addr_t _DDCRegister();
|
||||||
|
|||||||
Reference in New Issue
Block a user