summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEgbert Eich <eich@freedesktop.org>2009-11-06 12:52:34 +0100
committerEgbert Eich <eich@freedesktop.org>2009-11-06 12:52:34 +0100
commita76cee0a96f25ef229fb0d6fbf6dbe535845e6f8 (patch)
treeeefc45efa0809d3acfd724c599d30a4730fbf9fd
parent737f25912526fe69878cb01c1d150eda32da5383 (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.c34
-rw-r--r--src/rhd_atombios.h3
-rw-r--r--src/rhd_atomcrtc.c3
-rw-r--r--src/rhd_crtc.c12
-rw-r--r--src/rhd_regs.h4
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