diff --git a/headers/private/graphics/intel_extreme/intel_extreme.h b/headers/private/graphics/intel_extreme/intel_extreme.h index 4534a76703..1f50ac94d1 100644 --- a/headers/private/graphics/intel_extreme/intel_extreme.h +++ b/headers/private/graphics/intel_extreme/intel_extreme.h @@ -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) diff --git a/src/add-ons/accelerants/intel_extreme/Ports.cpp b/src/add-ons/accelerants/intel_extreme/Ports.cpp index 5348cd3ff5..213a1673a5 100644 --- a/src/add-ons/accelerants/intel_extreme/Ports.cpp +++ b/src/add-ons/accelerants/intel_extreme/Ports.cpp @@ -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 diff --git a/src/add-ons/accelerants/intel_extreme/Ports.h b/src/add-ons/accelerants/intel_extreme/Ports.h index 616f705a21..58b951f7ce 100644 --- a/src/add-ons/accelerants/intel_extreme/Ports.h +++ b/src/add-ons/accelerants/intel_extreme/Ports.h @@ -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();