diff options
author | Egbert Eich <eich@freedesktop.org> | 2009-11-06 12:52:34 +0100 |
---|---|---|
committer | Egbert Eich <eich@freedesktop.org> | 2009-11-06 12:52:34 +0100 |
commit | a76cee0a96f25ef229fb0d6fbf6dbe535845e6f8 (patch) | |
tree | eefc45efa0809d3acfd724c599d30a4730fbf9fd | |
parent | 737f25912526fe69878cb01c1d150eda32da5383 (diff) |
Scaler: Add support to send TV mode the HW scaler.
AtomBIOS takes in a TV mode to determine the correct multi tab
values. Although TV mode support has not been completed this patch
adds support for this.
It also replaces scaler register values by their symbolic names.
-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 |