* Add missing DAC code for >= r620
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@42286 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -89,8 +89,62 @@ DACGetElectrical(uint8 type, uint8 dac,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* For Cards >= r620 */
|
||||||
void
|
void
|
||||||
DACSet(uint8 dacIndex, uint32 crtid)
|
DACSetModern(uint8 dacIndex, uint32 crtid)
|
||||||
|
{
|
||||||
|
uint8 bandGap;
|
||||||
|
uint8 whiteFine;
|
||||||
|
|
||||||
|
// BIG TODO : NTSC, PAL, ETC. We assume VGA for now
|
||||||
|
uint8 standard = FORMAT_VGA; /* VGA */
|
||||||
|
uint32 mode = 2;
|
||||||
|
bool istv = false;
|
||||||
|
uint32 source = istv ? 0x2 : crtid;
|
||||||
|
|
||||||
|
DACGetElectrical(standard, dacIndex, &bandGap, &whiteFine);
|
||||||
|
|
||||||
|
uint32 mask = 0;
|
||||||
|
if (bandGap)
|
||||||
|
mask |= 0xFF << 16;
|
||||||
|
if (whiteFine)
|
||||||
|
mask |= 0xFF << 8;
|
||||||
|
|
||||||
|
uint32 dacOffset = (dacIndex == 1) ? RV620_REG_DACA_OFFSET
|
||||||
|
: RV620_REG_DACB_OFFSET;
|
||||||
|
|
||||||
|
Write32Mask(OUT, dacOffset + RV620_DACA_MACRO_CNTL, mode, 0xFF);
|
||||||
|
// no fine control yet
|
||||||
|
|
||||||
|
Write32Mask(OUT, dacOffset + RV620_DACA_SOURCE_SELECT, source, 0x00000003);
|
||||||
|
|
||||||
|
// enable tv if has TV mux(DACB) and istv
|
||||||
|
if (dacIndex)
|
||||||
|
Write32Mask(OUT, dacOffset + RV620_DACA_CONTROL2, istv << 8, 0x0100);
|
||||||
|
|
||||||
|
// use fine control from white_fine control register
|
||||||
|
Write32Mask(OUT, dacOffset + RV620_DACA_AUTO_CALIB_CONTROL, 0x0, 0x4);
|
||||||
|
Write32Mask(OUT, dacOffset + RV620_DACA_BGADJ_SRC, 0x0, 0x30);
|
||||||
|
Write32Mask(OUT, dacOffset + RV620_DACA_MACRO_CNTL,
|
||||||
|
(bandGap << 16) | (whiteFine << 8), mask);
|
||||||
|
|
||||||
|
// reset the FMT register
|
||||||
|
// TODO : ah-la external DxFMTSet
|
||||||
|
uint32 fmtOffset = (crtid == 0) ? FMT1_REG_OFFSET : FMT2_REG_OFFSET;
|
||||||
|
Write32(OUT, fmtOffset + RV620_FMT1_BIT_DEPTH_CONTROL, 0);
|
||||||
|
|
||||||
|
Write32Mask(OUT, fmtOffset + RV620_FMT1_CONTROL, 0,
|
||||||
|
RV62_FMT_PIXEL_ENCODING);
|
||||||
|
// 4:4:4 encoding
|
||||||
|
|
||||||
|
Write32(OUT, fmtOffset + RV620_FMT1_CLAMP_CNTL, 0);
|
||||||
|
// disable color clamping
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* For Cards < r620 */
|
||||||
|
void
|
||||||
|
DACSetLegacy(uint8 dacIndex, uint32 crtid)
|
||||||
{
|
{
|
||||||
bool istv = false;
|
bool istv = false;
|
||||||
uint8 bandGap;
|
uint8 bandGap;
|
||||||
@@ -140,7 +194,59 @@ DACSet(uint8 dacIndex, uint32 crtid)
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
DACPower(uint8 dacIndex, int mode)
|
DACSet(uint8 dacIndex, uint32 crtid)
|
||||||
|
{
|
||||||
|
radeon_shared_info &info = *gInfo->shared_info;
|
||||||
|
|
||||||
|
if (info.device_chipset < (RADEON_R600 | 0x20))
|
||||||
|
DACSetLegacy(dacIndex, crtid);
|
||||||
|
else
|
||||||
|
DACSetModern(dacIndex, crtid);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* For Cards >= r620 */
|
||||||
|
void
|
||||||
|
DACPowerModern(uint8 dacIndex, int mode)
|
||||||
|
{
|
||||||
|
uint32 dacOffset = (dacIndex == 1) ? RV620_REG_DACB_OFFSET
|
||||||
|
: RV620_REG_DACA_OFFSET;
|
||||||
|
uint32 powerdown;
|
||||||
|
|
||||||
|
switch (mode) {
|
||||||
|
case RHD_POWER_ON:
|
||||||
|
// TODO : SensedType Detection?
|
||||||
|
powerdown = 0;
|
||||||
|
if (!(Read32(OUT, dacOffset + RV620_DACA_ENABLE) & 0x01))
|
||||||
|
Write32Mask(OUT, dacOffset + RV620_DACA_ENABLE, 0x1, 0xff);
|
||||||
|
Write32Mask(OUT, dacOffset + RV620_DACA_FORCE_OUTPUT_CNTL,
|
||||||
|
0x01, 0x01);
|
||||||
|
Write32Mask(OUT, dacOffset + RV620_DACA_POWERDOWN, 0x0, 0xff);
|
||||||
|
snooze(20);
|
||||||
|
Write32Mask(OUT, dacOffset + RV620_DACA_POWERDOWN,
|
||||||
|
powerdown, 0xFFFFFF00);
|
||||||
|
Write32(OUT, dacOffset + RV620_DACA_FORCE_OUTPUT_CNTL, 0x0);
|
||||||
|
Write32(OUT, dacOffset + RV620_DACA_SYNC_TRISTATE_CONTROL, 0x0);
|
||||||
|
return;
|
||||||
|
case RHD_POWER_RESET:
|
||||||
|
// No action
|
||||||
|
return;
|
||||||
|
case RHD_POWER_SHUTDOWN:
|
||||||
|
default:
|
||||||
|
Write32(OUT, dacOffset + RV620_DACA_POWERDOWN, 0x01010100);
|
||||||
|
Write32(OUT, dacOffset + RV620_DACA_POWERDOWN, 0x01010101);
|
||||||
|
Write32(OUT, dacOffset + RV620_DACA_ENABLE, 0);
|
||||||
|
Write32Mask(OUT, dacOffset + RV620_DACA_FORCE_DATA, 0, 0xffff);
|
||||||
|
Write32Mask(OUT, dacOffset + RV620_DACA_FORCE_OUTPUT_CNTL,
|
||||||
|
0x701, 0x701);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* For Cards < r620 */
|
||||||
|
void
|
||||||
|
DACPowerLegacy(uint8 dacIndex, int mode)
|
||||||
{
|
{
|
||||||
uint32 dacOffset = (dacIndex == 1) ? REG_DACB_OFFSET : REG_DACA_OFFSET;
|
uint32 dacOffset = (dacIndex == 1) ? REG_DACB_OFFSET : REG_DACA_OFFSET;
|
||||||
uint32 powerdown;
|
uint32 powerdown;
|
||||||
@@ -173,3 +279,16 @@ DACPower(uint8 dacIndex, int mode)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
DACPower(uint8 dacIndex, int mode)
|
||||||
|
{
|
||||||
|
radeon_shared_info &info = *gInfo->shared_info;
|
||||||
|
|
||||||
|
if (info.device_chipset < (RADEON_R600 | 0x20))
|
||||||
|
DACPowerLegacy(dacIndex, mode);
|
||||||
|
else
|
||||||
|
DACPowerModern(dacIndex, mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user