diff options
-rw-r--r-- | src/rhd_atombios.c | 34 | ||||
-rw-r--r-- | src/rhd_atombios.h | 3 | ||||
-rw-r--r-- | src/rhd_atomcrtc.c | 3 | ||||
-rw-r--r-- | src/rhd_crtc.c | 12 | ||||
-rw-r--r-- | src/rhd_regs.h | 4 |
5 files changed, 47 insertions, 9 deletions
diff --git a/src/rhd_atombios.c b/src/rhd_atombios.c index 26e32fc..be36d54 100644 --- a/src/rhd_atombios.c +++ b/src/rhd_atombios.c @@ -887,7 +887,7 @@ rhdAtomASICInitVersion(atomBiosHandlePtr handle) * */ Bool -rhdAtomSetScaler(atomBiosHandlePtr handle, enum atomScaler scalerID, enum atomScaleMode mode) +rhdAtomSetScaler(atomBiosHandlePtr handle, enum atomScaler scalerID, enum atomScaleMode mode, enum AtomTVMode tvMode) { ENABLE_SCALER_PARAMETERS scaler; AtomBiosArgRec data; @@ -917,6 +917,38 @@ rhdAtomSetScaler(atomBiosHandlePtr handle, enum atomScaler scalerID, enum atomSc scaler.ucEnable = ATOM_SCALER_MULTI_EX; break; } + switch (tvMode) { + case ATOM_TVMODE_NTSC: + scaler.ucTVStandard = ATOM_TV_NTSC; + break; + case ATOM_TVMODE_NTSCJ: + scaler.ucTVStandard = ATOM_TV_NTSCJ; + break; + case ATOM_TVMODE_PAL: + scaler.ucTVStandard = ATOM_TV_PAL; + break; + case ATOM_TVMODE_PALM: + scaler.ucTVStandard = ATOM_TV_PALM; + break; + case ATOM_TVMODE_PALCN: + scaler.ucTVStandard = ATOM_TV_PALCN; + break; + case ATOM_TVMODE_PALN: + scaler.ucTVStandard = ATOM_TV_PALN; + break; + case ATOM_TVMODE_PAL60: + scaler.ucTVStandard = ATOM_TV_PAL60; + break; + case ATOM_TVMODE_SECAM: + scaler.ucTVStandard = ATOM_TV_SECAM; + break; + case ATOM_TVMODE_CV: + scaler.ucTVStandard = ATOM_TV_CV; + break; + case ATOM_TVMODE_NONE: + scaler.ucTVStandard = 0; + break; + } data.exec.dataSpace = NULL; data.exec.index = GetIndexIntoMasterTable(COMMAND, EnableScaler); diff --git a/src/rhd_atombios.h b/src/rhd_atombios.h index 16c24f5..6c73deb 100644 --- a/src/rhd_atombios.h +++ b/src/rhd_atombios.h @@ -152,6 +152,7 @@ struct AtomDacCodeTableData }; typedef enum AtomTVMode { + ATOM_TVMODE_NONE = 0, ATOM_TVMODE_NTSC = 1 << 0, ATOM_TVMODE_NTSCJ = 1 << 1, ATOM_TVMODE_PAL = 1 << 2, @@ -526,7 +527,7 @@ extern Bool rhdAtomASICInit(atomBiosHandlePtr handle); extern struct atomCodeTableVersion rhdAtomASICInitVersion(atomBiosHandlePtr handle); # endif extern Bool rhdAtomSetScaler(atomBiosHandlePtr handle, enum atomScaler scaler, - enum atomScaleMode mode); + enum atomScaleMode mode, enum AtomTVMode tvMode); extern struct atomCodeTableVersion rhdAtomSetScalerVersion(atomBiosHandlePtr handle); extern Bool rhdAtomDigTransmitterControl(atomBiosHandlePtr handle, enum atomTransmitter id, enum atomTransmitterAction action, diff --git a/src/rhd_atomcrtc.c b/src/rhd_atomcrtc.c index 72b3d8d..e1a92e4 100644 --- a/src/rhd_atomcrtc.c +++ b/src/rhd_atomcrtc.c @@ -136,7 +136,8 @@ rhdAtomScaleSet(struct rhdCrtc *Crtc, enum rhdCrtcScaleType Type, ScaleMode = atomScaleExpand; break; } - rhdAtomSetScaler(rhdPtr->atomBIOS, Scaler, ScaleMode); + ScaleMode = atomScaleDisable; + rhdAtomSetScaler(rhdPtr->atomBIOS, Scaler, ScaleMode, ATOM_TVMODE_NONE); data.Address = NULL; RHDAtomBiosFunc(rhdPtr->scrnIndex, rhdPtr->atomBIOS, ATOM_SET_REGISTER_LIST_LOCATION, &data); diff --git a/src/rhd_crtc.c b/src/rhd_crtc.c index ea0728c..5181474 100644 --- a/src/rhd_crtc.c +++ b/src/rhd_crtc.c @@ -756,7 +756,7 @@ DxScaleSet(struct rhdCrtc *Crtc, enum rhdCrtcScaleType Type, ErrorF("None\n"); RHDRegWrite(Crtc, RegOff + D1SCL_ENABLE, 0); RHDRegWrite(Crtc, RegOff + D1SCL_TAP_CONTROL, 0); - RHDRegWrite(Crtc, RegOff + D1MODE_CENTER, 0); + RHDRegWrite(Crtc, RegOff + D1MODE_CENTER, 2); break; case RHD_CRTC_SCALE_TYPE_CENTER: /* center of the actual mode */ ErrorF("Center\n"); @@ -773,7 +773,7 @@ DxScaleSet(struct rhdCrtc *Crtc, enum rhdCrtcScaleType Type, RHDRegWrite(Crtc, RegOff + D1MODE_CENTER, 0); RHDRegWrite(Crtc, RegOff + D1SCL_UPDATE, 0); - RHDRegWrite(Crtc, RegOff + D1SCL_DITHER, 0); + RHDRegWrite(Crtc, RegOff + D1SCL_FLIP_CONTROL, 0); RHDRegWrite(Crtc, RegOff + D1SCL_ENABLE, 1); RHDRegWrite(Crtc, RegOff + D1SCL_HVSCALE, 0x00010001); /* both h/v */ @@ -980,9 +980,9 @@ D1ViewPortStart(struct rhdCrtc *Crtc, CARD16 X, CARD16 Y) X = (X + 0x02) & ~0x03; Y &= ~0x01; - RHDRegMask(Crtc, D1SCL_UPDATE, 0x00010000, 0x0001000); + RHDRegMask(Crtc, D1SCL_UPDATE, DXSCL_UPDATE_LOCK, DXSCL_UPDATE_LOCK); RHDRegWrite(Crtc, D1MODE_VIEWPORT_START, (X << 16) | Y); - RHDRegMask(Crtc, D1SCL_UPDATE, 0, 0x0001000); + RHDRegMask(Crtc, D1SCL_UPDATE, 0, DXSCL_UPDATE_LOCK); Crtc->X = X; Crtc->Y = Y; @@ -1000,9 +1000,9 @@ D2ViewPortStart(struct rhdCrtc *Crtc, CARD16 X, CARD16 Y) X = (X + 0x02) & ~0x03; Y &= ~0x01; - RHDRegMask(Crtc, D2SCL_UPDATE, 0x00010000, 0x0001000); + RHDRegMask(Crtc, D2SCL_UPDATE, DXSCL_UPDATE_LOCK, DXSCL_UPDATE_LOCK); RHDRegWrite(Crtc, D2MODE_VIEWPORT_START, (X << 16) | Y); - RHDRegMask(Crtc, D2SCL_UPDATE, 0, 0x0001000); + RHDRegMask(Crtc, D2SCL_UPDATE, 0, DXSCL_UPDATE_LOCK); Crtc->X = X; Crtc->Y = Y; diff --git a/src/rhd_regs.h b/src/rhd_regs.h index 04c3f50..a233153 100644 --- a/src/rhd_regs.h +++ b/src/rhd_regs.h @@ -407,6 +407,10 @@ enum { DC_GPIO_HPD_Y = 0x7E9C }; +enum DXSCL_UPDATE_bits { + DXSCL_UPDATE_LOCK = (1 << 16) +}; + enum CONFIG_CNTL_BITS { RS69_CFG_ATI_REV_ID_SHIFT = 8, RS69_CFG_ATI_REV_ID_MASK = 0xF << RS69_CFG_ATI_REV_ID_SHIFT |